普通窗口和对话框窗口的区别
普通窗口 - 自定义 调用 缺省函数
WndProc(...)
{
......
DefWindowProc(...);
}
对话框窗口 - 缺省调用自定义
对话框窗口
- 对话框的分类
- 模式对话框 - 当对话框显示时,会禁止本进程的其他窗口的输入等用户交互操作。
- 无模式对话框 - 在对话框显示后,其他窗口同样可以接收输入等用户交互操作。
- 对话框基本使用
- 对话框窗口处理函数(操作系统提供,因为对话框窗口类是操作系统注册的,处理函数由其负责,谁注册窗口类谁负责编写处理函数)
- 注册窗口类(可选,基本不使用)
- 创建对话框
- 对话框的关闭
- 模式对话框的使用
- 对话框窗口处理函数(并非真正对话框处理函数)
INT CALLBACK DialogProc( HWND hwndDlg, //对话框窗口句柄 UINT uMsg, //消息ID WPARAM wParam, //消息参数 LPARAM lParam //消息参数 );
返回TRUE - 表示DialogProc函数中处理了这个消息,缺省处理函数不需要处理。 返回FALSE- 表示DialogProc函数未处理这个消息,交给缺省处理函数处理。 不需要调用缺省对话框窗口处理函数。
- 创建对话框(创建模式对话框函数DialogBox())
INT DialogBox( HINSTANCE hInstance,//应用程序实例句柄 LPCTSTR lpTemplate, //对话框模板资源ID HWND hWndParent, //对话框父窗口 DLGPROC lpDialogFunc //自己定义的处理函数名 );
需要添加对话框资源。 DialogBox是一个阻塞函数,只有当对话框关闭后, 才会返回,继续执行后续代码。 返回值是通过EndDialog()函数设置。一是让对话框销毁,二就是让DialogBox()函数返回什么
- 对话框的关闭
BOOL EndDialog( HWND hDlg,//关闭的对话框窗口句柄 INT nResult //关闭的返回值 );
关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow等函数。 nResult是DialogBox函数退出时的返回值。
- 对话框的消息
WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作。
- 无模式对话框
- 对话框窗口处理函数 DialogProc(并非真正的对话框处理函数)
- 创建对话框
HWND CreateDialog( HINSTANCE hInstance, //应用程序实例句柄 LPCTSTR lpTemplate, //模板资源ID HWND hWndParent, //父窗口 DLGPROC lpDialogFunc //自己定义的函数 );
非阻塞函数,创建成功返回窗口句柄,需要使用ShowWindow函数显示对话框。
- 对话框的关闭
关闭时使用DestroyWindow销毁窗口,不能使用EndDialog关闭对话框。 - 对话框的消息
WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作。
- 对话框VS普通窗口(区别)
- 创建
模式对话框 - DialogBox,阻塞函数
无模式对话框 - CreateDialog
普通窗口 - CreateWindow/Ex - 窗口处理函数
对话框 – DialogProc(并非真正对话框处理函数,被系统处理函数调用)
普通窗口 - WindowProc,需要调用缺省窗口处理函数 - 窗口消息
普通窗口 - WM_CREATE
对话框 - WM_INITDIALOG - 窗口销毁
模式对话框 - EndDialog
无模式对话框/普通窗口 - DestroyWindow
- 创建
子控件
- 子控件
- 系统已经定义窗口类型,相应窗口的处理函数等
- 都已经由系统完成。例如 编辑框、按钮等等。
- 子控件的创建
- 不需要注册,直接使用CreateWindow/Ex
创建该类的窗口。子控件创建时,每个控件
都具有一个ID号。
- 不需要注册,直接使用CreateWindow/Ex
- 控件的消息
- 程序和子控件之间交互,都是通过消息完成。
- 控件的窗口消息 - 程序可以使用
SendMessage
向控件发送消息,获取控件的信息或设置控件。 - 控件的通知消息 - 控件有相应的事件发生后,会向所在的父窗口(处理函数)发送通知消息(
WM_COMMAND
),父窗口可以根据通知消息的ID,做相应的处理。
静态框
- 静态框相关
- 常用于显示文字和图标等。窗口类名称“STATIC”。
- 文字静态框 - 显示文字
- 图标静态框 - 显示图标,设置SS_ICON/SS_BITMAP
- 常用于显示文字和图标等。窗口类名称“STATIC”。
- 静态框的使用
创建
CreateWindow/ CreateWindowEx
风格
图标静态框 使用 SS_ICON/SS_BITMAP 风格
如果创建 图标静态框,那么窗口的名称要设置成 图标ID
例如:CreateWindowEx( 0, "STATIC", "#101"...... );
- 窗口消息
SendMessage发送到控件即可。例如:STM_SETICON
通知消息(STN_CLICKED)
需要在创建时增加SS_NOTIFY风格。
通知消息WM_COMMAND 消息附:WM_COMMAND WPARAM: LOWORD - 菜单项、加速键、控件的ID HIWORD - 对于菜单项,为0 对于加速键,为1 对于控件,是Notify-Code(通知码,表示控件发生了什么事) LPARAM: 对于菜单项、加速键为NULL 对于控件,为控件窗口句柄
``` SendMessage( (HWND) hWnd, // handle to destination window STM_SETICON, // message to send (WPARAM) wParam, // handle to icon (HICON) (LPARAM) lParam // not used; must be zero ); ``` 根据父窗口的句柄和控件的ID获取控件的句柄 ``` HWND GetDlgItem( HWND hDlg, // handle to dialog box int nIDDlgItem // control identifier ); ```
按钮相关
- 根据按钮的风格,将按钮分成4类
- 下压式按钮:BS_PUSHBUTTON/BS_DEFPUSHBUTTON
- 分组框:BS_GROUPBOX
- 复选框:
BS_CHECKBOX/BS_AUTOCHECKBOX
BS_3STATE/BS_AUTO3STATE
- 单选框:BS_RADIOBUTTON/BS_AUTORADIOBUTTON
窗口类名称 BUTTON
- 下压式按钮
1 创建按钮- 窗口消息
- 通知消息 (BN_CLICKED)
- 分组框
常用于界面上的控件分组显示,提高界面友好性。 - 复选框
- 风格和创建
BS_CHECKBOX - 点击选择时,需要自己维护选择状态
BS_AUTOCHECKBOX - 点击选择时,系统自动维护选择状态 - 窗口消息
- 获取和设置选择状态
- BM_SETCHECK:wParam-具体要设置的状态,lParam - 不使用必须为0
*BM_GETCHECK:wParam/lParam-都不使用必须为0,当前状态通过SendMessage函数的返回值获取。 - HWND hCheck = GetDlgItem(hWnd, 1005);
- LRESULT nRet = SendMessage(hCheck, BM_GETCHECK, 0, 0);
- BM_SETCHECK:wParam-具体要设置的状态,lParam - 不使用必须为0
- 获取和设置选择状态
通知消息
BN_CLICKED 按钮被点击``` void OnCommand(HWND hWnd, WPARAM wParam) { switch (LOWORD(wParam)) {case 1005: if (HIWORD(wParam) == BN_CLICKED) { HWND hCheck = GetDlgItem(hWnd, 1005); LRESULT nRet = SendMessage(hCheck, BM_GETCHECK, 0, 0); if (nRet == BST_CHECKED) {SendMessage(hCheck, BM_SETCHECK, BST_INDETERMINATE, 0); }else if (nRet == BST_INDETERMINATE) { SendMessage(hCheck, BM_SETCHECK, BST_UNCHECKED, 0); }else{ SendMessage(hCheck, BM_SETCHECK, BST_CHECKED, 0);} } break; case 1003: if (HIWORD(wParam) == BN_CLICKED) { HWND hCheck = GetDlgItem(hWnd, 1003); LRESULT nRet = SendMessage(hCheck, BM_GETCHECK, 0, 0); if (nRet == BST_CHECKED) {SendMessage(hCheck, BM_SETCHECK, BST_UNCHECKED, 0); }else{ SendMessage(hCheck, BM_SETCHECK, BST_CHECKED, 0);} } break; case 1001: if (HIWORD(wParam) == BN_CLICKED) { MessageBox(hWnd, "点了OK", "Infor", MB_OK); } break; } } ```
- 单选按钮
- 风格和创建
BS_RADIOBUTTON - 自己维护状态
BS_AUTORADIOBUTTON - 系统自动维护状态 - 窗口消息
获取和设置选择状态
BM_SETCHECK
BM_GETCHECK
每组单选框中只能同时有1个被选择。 - 通知消息
BN_CLICKED 其他
单选框分组,可以使用WS_GROUP风格分组。
从当前具有WS_GROUP风格的单选框,到下一个WS_GROUP风格单选框之前,为1组单选框下压式按钮(多态按钮)
CreateWindowEx(0, "BUTTON", "多态按钮", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE, 50, 380, 200, 20, hWnd, (HMENU)1011, g_hInstance, NULL);
当复选框对待操作单选框,可用作播放器的按钮
CreateWindowEx(0, "BUTTON", "多态按钮", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|BS_PUSHLIKE, 50, 380, 200, 20, hWnd, (HMENU)1011, g_hInstance, NULL);
编辑框
- 编辑框相关
从风格可以将编辑框分成几类:
单行编辑框 - 只能处理一行文字
多行编辑框 - 可以显示多行文字
密码编辑框 - 密码输入 ES_PASSWORD---只适合单行编辑框
数字编辑框---ES_NUMBER---只能输入数字
...在MSDN中输入Edit Styles进行查询 - 编辑框的使用
- 创建
窗口类名称 EDIT - 窗口消息
WM_GETTEXT / WM_SETTEXT / WM_GETTEXTLENGTH - 通知消息
EN_CHANGE 当编辑框内的文字被修改,通知父窗口。被存入COMMAND中的wParam的高两个字节
- 创建
设置编辑框的文本内容----WM_SETTEXT
SendMessage(
(HWND) hWnd, // 编辑框句柄
WM_SETTEXT, // 消息类型
(WPARAM) wParam, // 没用,必须置0
(LPARAM) lParam // 准备设置编辑框的文本内容的缓冲区的首地址
);
获取编辑框的文本内容----WM_GETTEXT
SendMessage(
(HWND) hWnd, //
WM_GETTEXT, // message to send
(WPARAM) wParam, // 自己开设的缓冲区的大小
(LPARAM) lParam // 缓冲区的首地址
);
获取编辑框文本内容的长度---WM_GETTEXTLENGTH
SendMessage(
(HWND) hWnd, // 编辑框句柄
WM_GETTEXTLENGTH, // message to send
(WPARAM) wParam, // 必须置0
(LPARAM) lParam // 必须置0
);
编辑框文本内容长度通过SendMessage()函数的返回值获取
设置编辑框文本内容的字体----WM_SETFONT
SendMessage(
(HWND) hWnd, // handle to destination window WM_SETFONT, // message to send
(WPARAM) wParam, // handle to font
(LPARAM) lParam // redraw option
);
设置编辑框文本内容的颜色
当一个窗口需要重绘的时候,该控件就会向父窗口发送WM_CTLCOLOREDIT,并右我们在父窗口的处理函数进行实现
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_CTLCOLOREDIT
WPARAM wParam, // 系统吧控件的绘图设备(HDC)句柄通过wParam传给父窗口的处理函数
LPARAM lParam // handle to static control (HWND)
);
HWND hEdit = GetDlgItem(hWnd, 1001);
BOOL MoveWindow(
HWND hWnd, // handle to window
int X, // horizontal position
int Y, // vertical position
int nWidth, // width
int nHeight, // height
BOOL bRepaint // repaint option
);