MFC – Lession4: Làm việc với dialog

Bạn đã làm quen và tạo ra được các ứng dụng kiểu hộp thoại (dialog), bạn cũng có thể gọi dialog thông điệp (MessageBox) của hệ thống để hiển thị các thông tin cần thiết. Có thể thấy rằng dialog là một thành phần không thể thiếu trong các ứng dụng. Bạn dùng dialog để hiển thị thông báo, yêu cầu một xác nhận từ người dùng, nhập dữ liệu, chứa các thành phần khác hoặc để thiết lập các tùy chọn,… Trong bài viết này, bạn sẽ hiểu rõ hơn về cách sử dụng các loại dialog và làm sao để tạo ra được một dialog tương tự.

Download sourcecode

Thêm Dialog vào dự án

Chuyển qua thẻ ResourceView nhấn phải vào mục Dialog chọn Insert Dialog, đặt tên cho dialog mới là IDD_MyDialog. Mở bảng ClassWizard của dialog mới tạo bạn sẽ thấy hộp thoại ‘Adding a Class’ yêu cầu tạo lớp cho dialog này (vì dialog này chỉ là resource). Chọn mặc định là ‘Create a new class’ và nhấn OK.

AddingClass

Adding a Class

Trong hộp thoại ‘New Class’ kế tiếp gõ CMyDialog vào mục Name rồi nhấn OK.

NewClass

New Class

Thiết kế

Tạo dự án MFC AppWizard(exe) mới với tên ExDialog. Thiết kế hộp thoại ExDialog và MyDialog như hình dưới.

ExDialog

ExDialog

Đối tượng Thuộc tính Giá trị
Edit Box ID
Styles > Read-only
IDC_NAME
Checked
Edit Box ID
Styles > Read-only
IDC_GENDER
Checked
Edit Box ID
Styles > Read-only
Styles > Multiline
IDC_LANGUAGE
Checked
Checked
Button ID
Caption
IDC_OPENDIALOG
Open Dialog
Button ID
Caption
IDC_EXIT
Exit

MyDialog

Đối tượng Thuộc tính Giá trị Biến
Edit Box ID IDC_NAME CString m_sName
Radio Button IDGroup IDC_OPMALEChecked int m_iGender
Radio Button ID IDC_OPFEMALE
Check Box ID IDC_ENGLISH BOOL m_bEnglish
Check Box ID IDC_VIETNAMESE BOOL m_bVietnamese

Hai nút OK và Cancel bạn vẫn giữ nguyên trong hộp thoại này.

Viết mã lệnh

Bạn chỉ cần viết mã lệnh cho ExDialog còn MyDialog chỉ có nhiệm vụ lấy dữ liệu từ người dùng nên bạn sẽ không cần viết thêm bất kì mã lệnh gì cho nó.

Để sử dụng được lớp CMyDialog, bạn cần phải thêm thư viện MyDialog.h vào đầu tập tin ExDialogDlg.cpp.

Trong thẻ FileView ở WorkSpace, tìm và mở tập tin ExDialogDlg.cpp, cuộn lên trên cùng và thêm lệnh #include được tô đậm như sau:

#include "stdafx.h"

#include "ExDialog.h"

#include "ExDialogDlg.h"

#include "MyDialog.h"

Mở giao diện thiết kế của IDD_EXDIALOG_DIALOG, bạn thêm sự kiện Click cho button ‘Open Dialog’ bằng cách click đôi chuột và viết mã lệnh cho sự kiện này như sau:


void CExDialogDlg::OnOpendialog()

{

// TODO: Add your control notification handler code here

CMyDialog* dlg=new CMyDialog();

if(dlg->DoModal()==IDOK)

{

SetDlgItemText(IDC_NAME,dlg->m_sName);

CString sGender;

sGender=(dlg->m_iGender==0)?"Male":"Female";

SetDlgItemText(IDC_GENDER,sGender);

CString sLanguage;

if(dlg->m_bEnglish)

sLanguage="English\r\n";

if(dlg->m_bVietnamese)

sLanguage+="Vietnamese\r\n";

SetDlgItemText(IDC_LANGUAGE,sLanguage);

}

}

Để hiển thị một dialog lên ta gọi hàm DoModal() và nhận giá trị trả về kiểu int dựa theo button mà người dùng nhấn để đóng hộp thoại. Ở MyDialog bạn giữ nguyên hai button có ID là IDOK và IDCANCEL, đây là hai ID được hộp thoại xử lý mặc định để trả về các giá trị tương ứng cho cửa sổ cha sau khi gọi hàm DoModal(), cũng tương tự như hai hàm OnOK() và OnCancel() bạn gọi một cách tường minh.

Trong đoạn mã trên ta tạo ra một đối tượng CMyDialog và gọi DoModal() để hiển thị hộp thoại. Nếu người dùng nhấn button IDOK của MyDialog thì phần lệnh trong if sẽ được thực hiện.

Lớp CDialog cung cấp hàm SetDlgItemText() để gán văn bản cho một control trên hộp thoại dựa vào ID của nó. Các biến bạn từ ClassWizard đều có kiểu truy xuất là public nên ta có thể lấy được giá trị của chúng bằng cách dùng toán tử -> (vì biến dlg là con trỏ).

Trong Edit Box IDC_LANGUAGE, ta hiển thị mỗi ngôn ngữ mà người dùng chọn trên một dòng, để thêm một dòng ra thêm chuỗi “\r\n” vào cuối mỗi dòng.

Tiếp theo là mã lệnh cho button IDC_EXIT, bạn chỉ cần gọi hàm OnOK() để đóng hộp thoại.


void CExDialogDlg::OnExit()

{

// TODO: Add your control notification handler code here

OnOK();

}

Bây giờ bạn có thể chạy thử chương trình, nhấn nút Open Dialog và nhập một vài thông tin vào MyDialog sau đó nhấn OK. Các thông tin mà bạn nhập sẽ được hiển thị trên các Edit Box của ExDialog.

Modal và Modaless dialog

Với ví dụ trên bạn thấy rằng khi hộp thoại MyDialog được mở ra, bạn không thể thao tác với hộp thoại cha ExDialog cho đến khi MyDialog được đóng lại. Thuật ngữ được dùng để chỉ hộp thoại này là Modal. Ngược lại nếu bạn vẫn có thể thao tác với ExDialog khi MyDialog được mở ra thì đó là kiểu hộp thoại Modaless.

Không có gì khác biệt nhiều trong việc thiết kế Modal và Modaless dialog ngoại trừ cách gọi hàm để chúng hiển thị. Như ví dụ trên, bạn dùng DoModal() để hiển thị một hộp thoại kiểu Modal và khi nhấn IDOK thì hộp thoại cha có thể truy xuất các giá trị của nó.

Đối với Modaless dialog, bạn phải dùng các phương thức Create() và ShowWindow(), đồng thời phải viết các sự kiện trên hộp thoại con để truy xuất và thao tác với các thành viên trong  hộp thoại cha. Phần này bạn có thể tìm hiểu chi tiết hơn trong các hướng dẫn về lập trình Win32 API.

Phần kết

Phần này khá ngắn gọn vì bạn chỉ cần nắm được phương pháp gọi hộp thoại và truy xuất các biến của chúng. Ngoài các hộp thoại tự tạo, MFC cung cấp những common dialog để sử dụng cho những mục đích thông dụng như mở, ghi tập tin, chọn màu, in,… mà bạn đã rất quen thuộc khi dùng các ứng dụng trên Windows. Tuy nhiên để làm việc với các hộp thoại này bạn phải nắm được những kiến thức liên quan như về đồ họa, đọc ghi tập tin, xử lý văn bản… nên nằm ngoài phạm vi bài viết này.

https://yinyangit.wordpress.com

Advertisements

3 thoughts on “MFC – Lession4: Làm việc với dialog

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s