前言
- 各位师傅大家好,我是qmx_07,今天给大家讲解对话框的相关知识点,就此SDK学习告一段落,之后会更新相关项目内容
 

创建对话框
- 项目->添加 ->资源->Dialog->修改对话框ID->拖拉尺寸设置对话框大小

 
通过菜单绑定 模态对话框

 
- 通过点击菜单栏,呼唤 对话框窗口
 
INT_PTR CALLBACK Dialog1WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
    {
        return (INT_PTR)TRUE;
    }
    case WM_CLOSE:
    {
        EndDialog(hWnd, 0);
        break;
    }
    default:
        break;
    }
    return 0;
}
 
    case WM_COMMAND:
        {
        switch (LOWORD(wParam))
        {
            //模态对话框
        case ID_DLG1:
        {
            DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_ONE),hWnd, Dialog1WndProc);
        }
 
- DiaglogBox创建模态对话框,并绑定对话框过程函数
 - Diaglog和EndDiaglog配套使用
 - 对话框也属于一个窗口,有自己的过程处理函数,函数作用:处理对话框产生的消息,处理返回TRUE,不处理返回FALSE由系统进行内定处理
画面演示:

 - 模态对话框会阻塞父窗口的原因:
 - 模态对话框内部自建消息循环
 - 对话框初始化的时候,显示对话框之前发送【WM_INITDIALOG】进行初始化,调用了EnableWindows 禁用了父窗口你的鼠标和键盘输入
 - 对话框创建完成后不能如CreateWindow创建的那般缩放 窗口大小
 
相关API讲解
- DialogBox:函数用于创建一个基于模板资源的模态(模式)对话框
 - 需要调用 EndDialog 函数终止模态对话框
 
int DialogBox(  
    HINSTANCE hInstance,
    LPCTSTR   lpTemplate, 
    HWND 	  hWndParent, 
  	DLGPROC   lpDialogFunc
  ); 
 

- DialogWndProc:用于处理模态对话框 或者 非模态对话框的消息处理
 
BOOL CALLBACK DialogWndProc(
    HWND 	hwndDlg,	//指向该对话框的句柄
    UINT 	uMsg,		//消息ID
    WPARAM  wParam,		//其他消息
    LPARAM 	lParam		//其他消息
    );
 
- GetModuleHandle:获取模块句柄,模块必须为DLL文件,如果参数为NULL GetModuleHandle返回对用于创建调用进程的文件的句柄(exe文件)
 
HMODULE GetModuleHandle(   LPCTSTR lpModuleName);
 
通过菜单绑定非模态对话框

 
    case WM_COMMAND:
        {
        switch (LOWORD(wParam))
        {
        //非模态对话框
        case ID_DLG2:
        {
            HWND hDlg2 = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_TWO), hWnd, Dialog2WndProc);
            ShowWindow(hDlg2, SW_SHOW);
        }
        }
 
INT_PTR CALLBACK Dialog2WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
    {
        return (INT_PTR)TRUE;
    }
    case WM_CLOSE:
    {
        EndDialog(hWnd, 0);
        break;
    }
    default:
        break;
    }
    return 0;
}
 
- CreateDialog创建对话框,并绑定对话框过程函数,返回值为指向该非模态对话框的窗口句柄。
搭配EndDialog来关闭非模态窗口 - 非模态对话框需要调用showWindow来显示窗口
 - 非模态对话框 可以操作父窗口
画面演示:

 
相关API讲解
CreateDidlog:从对话框模板资源创建一个非模态对话框,需要通过showWindow来显示窗口
HWND CreateDialog( 
    HINSTANCE hInstance,		
    LPCTSTR lpTemplate, 
    HWND hWndParent,  
    DLGPROC lpDialogFunc
    ); 
 
总结
- 介绍了SDK 模态对话框 和 非模态对话框的区别,相关API讲解,及画面演示
 



















