Trong chương này, chúng ta sẽ đề cập đến các Hộp thoại. Các ứng dụng dành cho Windows thường xuyên giao tiếp với người dùng thông qua các hộp thoại. Lớp CDialog cung cấp một giao diện để quản lý các hộp thoại. Trình chỉnh sửa hộp thoại Visual C++ giúp dễ dàng thiết kế hộp thoại và tạo tài nguyên mẫu hộp thoại của chúng.
- Tạo một đối tượng hộp thoại là một hoạt động gồm hai giai đoạn –
- Xây dựng đối tượng hộp thoại.
- Tạo cửa sổ hộp thoại.
Chúng ta hãy xem xét một ví dụ đơn giản bằng cách tạo một dự án Win32 mới.
Bước 1 – Mở Visual studio và nhấp vào tùy chọn menu Tệp → Mới → Dự án.
Bước 2 – Bây giờ bạn có thể thấy hộp thoại Dự án mới.
Bước 3 – Từ ngăn bên trái, chọn Mẫu → Visual C++ → Win32.
Bước 4 – Trong ngăn giữa, chọn Dự án Win32.Bước 5 – Nhập tên dự án ‘MFCDialogDemo’ vào trường Tên và nhấp vào OK để tiếp tục. Bạn sẽ thấy hộp thoại sau.
Bước 6 – Nhấp vào Tiếp theo.
Bước 7 – Chọn các tùy chọn được hiển thị trong hộp thoại ở trên và nhấp vào Kết thúc.
Bước 8 – Một dự án trống được tạo.
Bước 9 – Để biến nó thành dự án MFC, nhấp chuột phải vào dự án và chọn Thuộc tính.
Bước 10 – Trong phần bên trái, nhấp vào Thuộc tính cấu hình → Chung.
Bước 11 – Chọn tùy chọn Use MFC in Shared DLL trong phần Project Defaults và nhấp vào OK.
Bước 12 – Thêm tệp nguồn mới.
Bước 13 – Nhấp chuột phải vào Dự án của bạn và chọn Thêm → Mục mới.
Bước 14 – Trong phần Mẫu, nhấp vào Tệp C++ (.cpp)
Bước 15 – Đặt Tên là Ví dụ và nhấp vào Thêm.Bước 16 – Để tạo một ứng dụng, chúng ta cần thêm một lớp và lấy nó từ CWinApp của MFC.
#include <afxwin.h>
class CExample : public CWinApp {
public:
BOOL InitInstance();
};
Tạo hộp thoại
Bước 1 − Để tạo hộp thoại, nhấp chuột phải vào thư mục Tệp tài nguyên trong trình khám phá giải pháp và chọn Thêm → Tài nguyên.
Bước 2 – Trong hộp thoại Thêm tài nguyên, chọn Hộp thoại và nhấp vào Mới.
Bước 3 – Một hộp thoại yêu cầu một số chuẩn bị trước khi thực sự tạo nó theo chương trình.
Bước 4 – Trước tiên, một hộp thoại có thể được tạo thủ công dưới dạng tệp văn bản (trong tệp tài nguyên).
Bước 5 – Bây giờ bạn có thể thấy tệp MFCDialogDemo.rc được tạo trong Tệp tài nguyên.
Bước 6 – Tệp tài nguyên được mở trong designer. Điều tương tự có thể được mở dưới dạng tệp văn bản. Nhấp chuột phải vào tệp tài nguyên và chọn Mở bằng.
Bước 7 – Chọn trình chỉnh sửa Mã nguồn (Văn bản) và nhấp vào nút Thêm.
Bước 8 – Quay lại trình thiết kế và nhấp chuột phải vào hộp thoại và chọn Thuộc tính.
Bước 9 – Bạn cần chọn trong số nhiều tùy chọn.
Bước 10 – Giống như hầu hết các điều khiển khác, hộp thoại phải được xác định. Mã định danh (ID) của hộp thoại thường bắt đầu bằng IDD_, Hãy để chúng tôi thay đổi ID thành IDD_EXAMPLE_DLG.
Vị trí hộp thoại
Một hộp thoại phải được đặt “thực tế” trên một ứng dụng. Bởi vì hộp thoại thường được tạo dưới dạng cấp độ gốc của các điều khiển khác, nên vị trí của nó phụ thuộc vào mối quan hệ của nó với cửa sổ cấp độ gốc hoặc với màn hình nền.
Nếu bạn nhìn và cửa sổ Thuộc tính, bạn sẽ thấy hai trường X Pos và Y Pos.
- X là khoảng cách từ viền trái của màn hình đến viền trái của hộp thoại.
- Y là khoảng cách từ viền trên của màn hình đến viền trên của hộp thoại.
Theo mặc định, các trường này được đặt thành không. Bạn cũng có thể thay đổi như hình trên.
Nếu bạn chỉ định hai kích thước này là 0, thì đường viền bên trái và trên cùng của hộp thoại sẽ được đặt để đối tượng xuất hiện ở giữa màn hình.
Kích thước hộp thoại
Kích thước của một hộp thoại đề cập đến chiều rộng và chiều cao của nó. Bạn có thể thay đổi kích thước chiều rộng và chiều cao với sự trợ giúp của chuột trong cửa sổ thiết kế.
Bạn có thể thấy những thay đổi về chiều rộng và chiều cao trên Thanh trạng thái.
Phương pháp hộp thoại
Lớp cơ sở dùng để hiển thị hộp thoại trên màn hình là lớp CDialog. Để tạo một hộp thoại, chúng ta cần lấy một lớp từ CDialog. Bản thân lớp CDialog cung cấp ba hàm tạo như sau –
CDialog();
CDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);
CDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
Hãy để chúng tôi tạo một lớp CExampleDlg khác và lấy nó từ CDialog. Chúng tôi sẽ triển khai hàm hủy hàm tạo mặc định của nó như trong đoạn mã sau.
class CExampleDlg : public CDialog {
public:
enum { IDD = IDD_EXAMPLE_DLG };
CExampleDlg();
~CExampleDlg();
};
CExampleDlg::CExampleDlg():CDialog(CExampleDlg::IDD) {
}
CExampleDlg::~CExampleDlg() {
}
Chúng ta cần khởi tạo hộp thoại này trên phương thức CExample::InitInstance() như trong đoạn mã sau.
BOOL CExample::InitInstance() {
CExampleDlg myDlg;
m_pMainWnd = &myDlg;
return TRUE;
}
Hộp thoại phương thức
Có hai loại hộp thoại – modeless và modal . Các hộp thoại modal và modeless khác nhau bởi quy trình được sử dụng để tạo và hiển thị chúng.
Hộp thoại Modeless
- Đối với hộp thoại không chế độ, bạn phải cung cấp hàm tạo công khai của riêng mình trong lớp hộp thoại của mình.
- Để tạo một hộp thoại không chế độ, hãy gọi hàm tạo công khai của bạn và sau đó gọi hàm Tạo thành viên của đối tượng hộp thoại để tải tài nguyên hộp thoại.
- Bạn có thể gọi Tạo trong hoặc sau khi gọi hàm tạo. Nếu tài nguyên hộp thoại có thuộc tính WS_VISIBLE, hộp thoại sẽ xuất hiện ngay lập tức.
- Nếu không, bạn phải gọi hàm thành viên ShowWindow của nó.
Hộp thoại phương thức
- Để tạo hộp thoại phương thức, hãy gọi một trong hai hàm tạo công khai được khai báo trong CDialog.
- Tiếp theo, gọi hàm thành viên DoModal của đối tượng hộp thoại để hiển thị hộp thoại và quản lý tương tác với nó cho đến khi người dùng chọn OK hoặc Hủy.
- Sự quản lý này của DoModal là điều làm cho hộp thoại trở nên có phương thức. Đối với hộp thoại phương thức, DoModal tải tài nguyên hộp thoại.
Bước 1 − Để hiển thị hộp thoại dưới dạng phương thức, trong sự kiện CExample::InitInstance() gọi phương thức DoModal() sử dụng biến hộp thoại của bạn −
BOOL CExample::InitInstance() {
CExampleDlg myDlg;
m_pMainWnd = &myDlg;
myDlg.DoModal();
return TRUE;
}
Bước 2 – Đây là phần triển khai hoàn chỉnh của tệp Example.cpp.
#include <afxwin.h>
#include "resource.h"
class CExample : public CWinApp {
public:
BOOL InitInstance();
};
class CExampleDlg : public CDialog {
public:
enum { IDD = IDD_EXAMPLE_DLG };
CExampleDlg();
~CExampleDlg();
};
CExampleDlg::CExampleDlg():CDialog(CExampleDlg::IDD) {
}
CExampleDlg::~CExampleDlg() {
}
BOOL CExample::InitInstance() {
CExampleDlg myDlg;
m_pMainWnd = &myDlg;
myDlg.DoModal();
return TRUE;
}
CExample MyApp;
Bước 3 – Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy hộp thoại sau.