MFC – Dialog-based windows

Dialog Box

Dialog box là cửa sổ hình chữ nhật, vai trò chính của dialog box là container chứa các control như button, combobox, textbox,.. để tạo ra 1 GUI application.

Sử dụng MFC Wizard Template để tạo ứng dụng base Dialog

Step 1: File -> New -> Project…
Step 2:
– Templates -> Visual C++ -> MFC
– Chọn MFC Application
– Name: MFCApp – tên project
– Location: D:\C++\Project\MFC\ – đường dẫn lưu project
– Solution name: MFCApp – tên solution (1 solution có thể có nhiều project)
– Click [OK]

Step 3: Click [Next]

Step 4:
– Application type: Dialog based
– Project style: MFC standard
– Use of MFC: Use MFC in a shared DLL
– Click [Next]

Step 5: các setting trong step này là không bắt buộc, chúng ta có thể add các thuộc tính này sau khi đã tạo project.
– Main frame styles: Thick frame, System menu, About box.
– Dialog title: MFCApp
– Click [Next]

Step 6: các setting trong step này là không bắt buộc, chúng ta có thể add các thuộc tính này sau khi đã tạo project.
– Advanced features: ActiveX controls, Common Control Manifest, Support Restart Manager.
– Click [Next]

Step 7: MFC Application Wizard tạo 2 class:
1. CMFCAppApp: class kế thừa class CWinApp
2. CMFCAppDlg: frame class
– Click [Finish]

Source code

Download source code

Download

Giải thích source code

Source code MFC chia ra làm 3 phần như sau:
1. Header file

File name Description
MFCApp.h
  • Main header của project
  • Khai báo class CMFCAppApp
  • Các phương thức được định nghĩa trong file MFCApp.cpp
MFCAppDlg.h
  • Khai bao class CMFCAppDlg
  • Các phương thức được định nghĩa trong MFCAppDlg.cpp
Resource.h
  • Định nghĩa các macro
  • Các macro được sử dụng bởi MFCApp.rc
stdafx.h
  • Include các header file sử dụng chung cho project

2. Source code cpp

File cpp Description
MFCApp.cpp
  • Đây là entry point của chương trình MFC
MFCAppDlg.cpp
  • Đây là frame class của chương trình MFC khởi tạo Dialog
  • Xử lí các event khi thao tác trên Dialog-based

MFCApp.cpp

BEGIN_MESSAGE_MAP(CMFCAppApp, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

Định nghĩa bảng message xử lí event. Khi user ấn phím F1 (Open Help), phương thức CWinApp::OnHelp xử lí sự kiện

CMFCAppApp theApp;

Đây là entry point của chương trình MFC.

BOOL CMFCAppApp::InitInstance()
{
    ...
    InitCommonControlsEx(&InitCtrls);
    ...
    CMFCAppDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK) {}
    else if (nResponse == IDCANCEL) {}
    else if (nResponse == -1) {}
    ...
}

– Dòng 4: khởi tạo common control
– Dòng 6: khai báo đối tượng class CMFCAppDlg
– Dòng 7: Gán con trỏ m_pMainWnd (member của class CWinThread) tới đối tượng dlg.
– Dòng 8: Gọi phương thức Domodal() để hiển thị dialog với ID=IDD_MFCAPP_DIALOG được định nghĩa trong file MFCApp.rc
– Dòng 9 ~ 10: Bắt sự kiện khi user click vào [OK], [Cancel] button.
– Dòng 11: Phương thức DoModal() trả về -1 nếu tạo cửa sổ fail.

MFCAppDlg.cpp

class CAboutDlg : public CDialogEx
{
    ...
    enum { IDD = IDD_ABOUTBOX };
    ...
    virtual void DoDataExchange(CDataExchange* pDX); 
}

Define class CAboutDlg để hiển thị About dialog (dialog giới thiệu về thông tin application)
Phương thức DoDataExchange support cơ chế truyền dữ liệu giữa biến và control trên GUI application. Đối với about dialog, phương thức CAboutDlg::DoDataExchange đang sử dụng CDialogEx::DoDataExchange. Cơ chế DDX (Dialog Data Exchange) và DDV (Dialog Data Validation) sẽ được thảo luận trong các bài viết tiếp theo.
About dialog được hiển thị khi user click chuột vào title bar của application.

CMFCAppDlg::CMFCAppDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(IDD_MFCAPP_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

Hiển thị icon MFC trên title bar application.

BOOL CMFCAppDlg::OnInitDialog()
{
    ...
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    ...
}

Add system menu vào application. System menu được hiển thị khi user click vào title bar.

void CMFCAppDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    ...
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
	dlgAbout.DoModal();
    }
    ...
}

Phương thức OnSysCommand() được gọi khi user click vào title bar. Và khi user click vào item about dialog trong system menu, dlgAbout.DoModal() được gọi để hiện thị about dialog.

3. Resource

Resource files Description
MFCApp.ico
  • Icon MFC cho ứng dụng
MFCApp.rc
  • Resource file có các dialog, string

Để view resouce của MFC project, bạn chọn [View] -> [Other Windows] -> [Resource View] Mỗi resource (dialog, string, icon, version) được định danh bởi ID duy nhất. ID là giá trị nguyên được define ở file Resource.h

Demo

– Sử dụng Visual Studio 2015 hoặc 2017 để run project
– [Debug] -> [Start Debugging] hoặc phím F5 để run project.

Tổng kết: MFC Application Wizard là công cụ mạnh tạo bộ khung MFC application thông qua một vài step, việc thay đổi kích thước cửa sổ application cũng rất đơn giản thông qua việc chỉnh sửa trên resource. Trong các bài viết tiếp theo, chúng ta tìm hiểu các control (button, listbox, treeview,…) được đặt lên Dialog-based để tạo ra application với nhiều control.

Be the first to comment

Leave a Reply