(详解入门)Windows 应用程序的 简单窗口创建
以及关键函数详细解释
。
前言(有必要了解):
Windows API
就是Windows应用程序接口,是针对Microsoft Windows操作系统家族的系统编程接口,为搭建各种图形界面提供库函数。实际上如果我们要开发出更灵活、更实用、更具效率的应用程序,虽然类库和控件使应用程序的开发简单的多,但它们只提供Windows的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。
MFC
是微软公司提供的一个类库,以C++类的形式封装了Windows API,并且包含应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
其中32位Windows操作系统的编程接口称为
Win32 API
,以便与以前16位版本Windows编程接口(16位Windows API)区别开来。
一、简单窗口的创建
1.演示(以Dev C++为例,其他编译器也差不多)
选择文件----新建----项目----WindowsApplication----确定
2.完成以上操作会自行生成以下代码(有解释)
// 包括头文件
#include <windows.h>
// 消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd, // hwnd是要处理窗口的句柄,
UINT Message, // message是消息ID,代表了不同的消息类型
WPARAM wParam, // wParam的值为按下按键的虚拟键码
LPARAM lParam) // lParam则存储按键的相关状态信息
{
switch(Message) {
case WM_DESTROY: { // 处理窗口结束消息
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
lParam则存储按键的相关状态信息(比如当鼠标消息发出时,wParam值为鼠标按键的信息,而lParam则储存鼠标的坐标,高字节代表y坐标,低字节代表x坐标。
// WinMain函数是应用程序的入口,相当DOS程序的main函数
int WINAPI WinMain(HINSTANCE hInstance, // 当前实例句柄
HINSTANCE hPrevInstance, // 前一个实例句柄
LPSTR lpCmdLine, // 指向命令行参数的指针
int nCmdShow) // 窗口的显示状态
{
// 注册窗口
WNDCLASSEX wc; // 定义窗口类
HWND hwnd; // 窗口句柄
MSG msg; // 定义消息
memset(&wc,0,sizeof(wc)); // 为新申请的内存做初始化
wc.cbSize = sizeof(WNDCLASSEX); // WNDCLASSEX的大小
wc.lpfnWndProc = WndProc; // 指定消息处理函数
wc.hInstance = hInstance; // 实例句柄
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标句柄
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // 背景画刷的句柄
wc.lpszClassName = "WindowClass"; // 窗口类名
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 图标句柄
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //和窗口类关联的小图标
if(!RegisterClassEx(&wc)) { // 注册窗口
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
// 创建窗口
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT, 640,480, NULL,NULL,hInstance,NULL);
if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
ShowWindow(hwnd,nCmdShow); // 显示窗口
UpdateWindow(hwnd); // 更新窗口
// 消息循环
while(GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg); // 翻译消息
DispatchMessage(&msg); // 将消息发送给WndProc处理
}
return msg.wParam;
}
3.代码运行结果(如图)
二、关键函数的详解
1.注册窗口 RegisterClassEx
注册一个窗口类,以便在调用 CreateWindow或 CreateWindowEx函数时使用。
函数原型:
ATOM WINAPI RegisterClassEx(
_In_ const WNDCLASSEX *lpwcx
);
参数解释:
参数
lpwcx [in]
类型:const WNDCLASSEX *
指向WNDCLASSEX结构的指针 。在将结构传递给函数之前,必须使用适当的类属性填充结构。
注意:RegisterClass 函数己经被 RegisterClassEx 函数代替。然而,如果你不需要设置类的小图标,你仍然可以使用 RegisterClass 函数。
2.创建窗口 CreateWindowEx
函数原型 :
HWND CreateWindowEx(
DWORD dwExStyle, // 窗口的扩展风格
LPCTSTR lpClassName, // 已经注册的窗口类名称
LPCTSTR lpWindowName, // 窗口标题栏的名字
DWORD dwStyle, // 窗口的基本风格
int x, // 窗口左上角水平坐标位置
int y, // 窗口左上角垂直坐标位置
int nWidth, // 窗口的宽度
int nHeight, // 窗口的高度
HWND hWndParent, // 窗口的父窗口句柄
HMENU hMenu, // 窗口菜单句柄
HINSTANCE hInstance, // 应用程序实例句柄
LPVOID lpParam // 窗口创建时附加参数
); // 创建成功返回窗口句柄
参数解释 :
参数一:dwExStyle 指定窗口的扩展风格
dwExStyle窗口的扩展风格 | 含义 |
---|---|
WS_EX_NODRAG: | 防止窗口被移动 |
WS_EX_ACCEPTFILES: | 指定以该风格创建的窗口接受一个拖拽文件。 |
WS_EX_APPWINDOW: | 当窗口可见时,将一个顶层窗口放置到任务条上。 |
WS_EX_CLIENTEDGE: | 指定窗口有一个带阴影的边界。 |
WS_EX_CONTEXTHELP: | 在窗口的标题条包含一个问号标志。当用户点击了问号时,鼠标光标变为一个问号的指针、如果点击了一个子窗口,则子窗口接收到WM_HELP消息。子窗口应该将这个消息传递给父窗口过程,父窗口再通过HELP_WM_HELP命令调用WinHelp函数。这个Help应用程序显示一个包含子窗口帮助信息的弹出式窗口。WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX和WS_MINIMIZEBOX同时使用。 |
WS_EX_CONTROLPARENT: | 允许用户使用Tab键在窗口的子窗口间搜索。 |
WS_EX_DLGMODALFRAME: | 创建一个带双边的窗口;该窗口可以在dwStyle中指定WS_CAPTION风格来创建一个标题栏。 |
WS_EX_LEFT: | 窗口具有左对齐属性,这是缺省设置的。 |
WS_EX_LEFTSCROLLBAR: | 如果外壳语言是如Hebrew,Arabic,或其他支持reading order alignment的语言,则标题条(如果存在)则在客户区的左部分。若是其他语言,在该风格被忽略并且不作为错误处理。 |
WS_EX_LTRREADING: | 窗口文本以LEFT到RIGHT(自左向右)属性的顺序显示。这是缺省设置的。 |
WS_EX_MDICHILD: | 创建一个MDI子窗口。 |
WS_EX_NOPATARENTNOTIFY: | 指明以这个风格创建的窗口在被创建和销毁时不向父窗口发送WM_PARENTNOTFY消息。 |
WS_EX_OVERLAPPEDWINDOW: | WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE的组合。 |
WS_EX_PALETTEWINDOW: | WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW和WS_WX_TOPMOST风格的组合 |
WS_EX_RIGHT: | 窗口具有普通的右对齐属性,这依赖于窗口类。只有在外壳语言是如Hebrew,Arabic或其他支持读顺序对齐(reading order alignment)的语言时该风格才有效,否则,忽略该标志并且不作为错误处理。 |
WS_EX_RIGHTSCROLLBAR: | 垂直滚动条在窗口的右边界。这是缺省设置的。 |
WS_EX_RTLREADING: | 如果外壳语言是如Hebrew,Arabic,或其他支持读顺序对齐(reading order alignment)的语言,则窗口文本是一自左向右)RIGHT到LEFT顺序的读出顺序。若是其他语言,在该风格被忽略并且不作为错误处理。 |
WS_EX_STATICEDGE: | 为不接受用户输入的项创建一个3一维边界风格 |
WS_EX_TOOLWINDOW: | 创建工具窗口,即窗口是一个游动的工具条。工具窗口的标题条比一般窗口的标题条短,并且窗口标题以小字体显示。工具窗口不在任务栏里显示,当用户按下alt+Tab键时工具窗口不在对话框里显示。如果工具窗口有一个系统菜单,它的图标也不会显示在标题栏里,但是,可以通过点击鼠标右键或Alt+Space来显示菜单。 |
WS_EX_TOPMOST: | 指明以该风格创建的窗口应放置在所有非最高层窗口的上面并且停留在其L,即使窗口未被激活。使用函数SetWindowPos来设置和移去这个风格。 |
WS_EX_TRANSPARENT: | 指定以这个风格创建的窗口在窗口下的同属窗口已重画时,该窗口才可以重画。由于其下的同属窗口已被重画,该窗口是透明的。 |
参数二:lpClassName 已经注册的窗口类名称
- 窗口类名称,可以是一个指向 NULL 结束的字符串或一个整型数值
- 如果是字符串,它指定了窗口的类名。这个类名可以是任何用函数 RegisterClass 注册的类名,或是任何预定义的控制类名
- 如是一个整型量,它是由此前调用 theGlobalAddAtom 函数产生的全局量。这个小于 0xC000 的 16 位数必须是 lpClassName 参数字的低 16 位,该参数的高位必须是 0
参数三:lpWindowName 窗口标题栏的名字
- 窗口标题,一个指向 NULL 结束的字符串指针
- 如果窗口风格指定了标题条,由 lpWindowName 指向的窗口标题将显示在标题条上
- 当使用 Createwindow 函数来创建控制例如按钮,选择框和静态控制时,可使用 lpWindowName 来指定控制文本
参数四:dwStyle 窗口的基本风格
dwStyle窗口的基本风格 | 含义 |
---|---|
WS_BORDER: | 创建一个带边框的窗口。 |
WS_CAPTION: | 创建一个有标题框的窗口(包括WS_BODER风格)。 |
WS_CHILD: | 创建一个子窗口。这个风格不能与WS_POPUP风格合用。 |
WS_CHILDWINDOW: | 与WS_CHILD相同。 |
WS_CLIPCHILDREN: | 当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。 |
WS_CLIPSIBLINGS: | 排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到WM_PAINT消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定WS_CLIPSIBLINGS风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口。 |
WS_DISABLED: | 创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息。 |
WS_DLGFRAME: | 创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条。 |
WS_GROUP: | 指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,自第二个控制开始每个控制,具有WS_GROUP风格,每个组的第一个控制带有WS_TABSTOP风格,从而使用户可以在组间移动。用户随后可以使用光标在组内的控制间改变键盘焦点。 |
WS_HSCROLL: | 创建一个有水平滚动条的窗口。 |
WS_ICONIC: | 创建一个初始状态为最小化状态的窗口。与WS_MINIMIZE风格相同。 |
WS_MAXIMIZE: | 创建一个初始状态为最大化状态的窗口。 |
WS_MAXIMIZEBOX: | 创建一个具有最大化按钮的窗口。该风格不能与WS_EX_CONTEXTHELP风格同时出现,同时必须指定WS_SYSMENU风格。 |
WS_OVERLAPPED: | 产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与WS_TILED风格相同。 |
WS_OVERLAPPEDWINDOW: | 创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU - WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口,与WS_TILEDWINDOW风格相同。 |
WS_POPUP: | 创建一个弹出式窗口。该风格不能与WS_CHILD风格同时使用。 |
WS_POPUPWINDOW: | 创建一个具有WS_BORDER,WS_POPUP,WS_SYSMENU风格的窗口,WS_CAPTION和WS_POPUPWINDOW必须同时设定才能使窗口某单可见。 |
WS_SIZEBOX: | 创建一个可调边框的窗口,与WS_THICKFRAME风格相同。 |
WS_SYSMENU: | 创建一个在标题条上带有窗口菜单的窗口,必须同时设定WS_CAPTION风格。 |
WS_TABSTOP: | 创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制。 |
WS_THICKFRAME: | 创建一个具有可调边框的窗口,与WS_SIZEBOX风格相同。 |
WS_TILED: | 产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与WS_OVERLAPPED风格相同。 |
WS_TILEDWINDOW: | 创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU, WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口。与WS_OVERLAPPEDWINDOW风格相同。 |
WS_VISIBLE: | 创建一个初始状态为可见的窗口。 |
WS_VSCROLL: | 创建一个有垂直滚动条的窗口。 |
参数五:x 初始窗口左上角水平坐标位置
- 指定窗口的初始水平位置(x 坐标)
- 对一个层叠或弹出式窗口,x 参数是屏幕坐标系的窗口的左上角的初始 x 坐标
- 对于子窗口,x 是子窗口左上角相对父窗口客户区左上角的初始 x 坐标
- 如果该参数被设为 CW_USEDEFAULT 则系统为窗口选择缺省的左上角坐标并忽略 y 参数,CW_USEDEFAULT 只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则 x 和 y 参数被设为零。
参数六: y 初始窗口左上角垂直坐标位置
- 指定窗口的初始垂直位置(y 坐标)
- 对一个层叠或弹出式窗口,y 参数是屏幕坐标系的窗口的左上角的初始 y 坐标
- 对于子窗口,y 是子窗口左上角相对父窗口客户区左上角的初始 y 坐标
- 对于列表框,y 是列表框客户区左上角相对父窗口客户区左上角的初始 y 坐标
- 如果层叠窗口是使用 WS_VISIBLE 风格位创建的并且 x 参数被设为 CW_USEDEFAULT,则系统将忽略 y 参数
参数七:nWidth 初始窗口的宽度
- 以设备单元指明窗口的宽度
- 对于层叠窗口,nWidth 的值或是屏幕坐标的窗口宽度或是 CW_USEDEFAULT
- 若 nWidth 是 CW_USEDEFAULT,则系统为窗口选择一个默认的高度和宽度(默认宽度为从初始 x 坐标开始到屏幕的右边界,缺省高度为从初始 y 坐标开始到目标区域的顶部。),CW_USEDEFAULT 只对层叠窗口有效,如果为弹出式窗口和子窗口设定 CW_USEDEFAULT 标志则 nWidth 和 nHeight 被设为零
参数八:nHeight 初始窗口的高度
- 以设备单元指明窗口的高度
- 对于层叠窗口,nHeight 是屏幕坐标的窗口宽度
- 若 nWidth 被设为 CW_USEDEFAULT,则系统忽略 nHeight 参数,自动为 nWidth 和 nHeight 设置默认参数
参数九: hWndParent 窗口的父窗口句柄
- 指向被创建窗口的父窗口或所有者窗口的句柄
- 若要创建一个子窗口或一个从属窗口,需提供一个有效的窗口句柄
- 创建一个单纯的消息窗口,可以提供 HWND_MESSAGE 或提供一个己存在的消息窗口的句柄
参数十: hMenu 窗口菜单句柄
- 指向窗口菜单句柄,或依据窗口风格指明一个子窗口标识
- 对于层叠或弹出式窗口,hMenu 指定窗口使用的菜单:如果使用了菜单类,则 hMenu 可以为 NULL
- 对于子窗口,hMenu 指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的
参数十一: hInstance 应用程序实例句柄
- 与窗口相关联的模块实例的句柄
参数十二:lpParam窗口创建时附加参数
- 指向一个值的指针,该值传递给窗口 WM_CREATE 消息。该值通过在 IParam 参数中的 CREATESTRUCT 结构传递
- 如果应用程序调用 CreateWindow 创建一个 MDI 客户窗口,则 lpParam 必须指向一个 CLIENTCREATESTRUCT 结构
3.显示窗口 ShowWindow
函数原型:
BOOL WINAPI ShowWindow(
_In_ HWND hWnd,
_In_ int nCmdShow
);
参数解释:
hWnd [in]
类型:HWND
窗户的句柄。
nCmdShow [in]
输入:int
控制窗口的显示方式。如果启动应用程序的程序提供STARTUPINFO结构,则在 应用程序第一次调用ShowWindow时会忽略此参数。否则,第一次调用ShowWindow时,该值应该是WinMain函数在其nCmdShow参数中获取的值 。在后续调用中,此参数可以是以下值之一。
返回值:
返回值
类型:BOOL
如果窗口先前可见,则返回值为非零。
如果窗口先前已隐藏,则返回值为零。
nCmdShow值 | 含义 |
---|---|
SW_FORCEMINIMIZE 11 | 最小化窗口,即使拥有窗口的线程没有响应。仅在最小化来自不同线程的窗口时才应使用此标志。 |
SW_HIDE 0 | 隐藏窗口并激活另一个窗口。 |
SW_MAXIMIZE 3 | 最大化指定的窗口。 |
SW_MINIMIZE 6 | 最小化指定的窗口并激活Z顺序中的下一个顶级窗口。 |
SW_RESTORE 9 | 激活并显示窗口。如果窗口最小化或最大化,系统会将其恢复到原始大小和位置。应用程序应在还原最小化窗口时指定此标志。 |
SW_SHOW 5 | 激活窗口并以当前大小和位置显示它。 |
SW_SHOWDEFAULT 10 | 根据启动应用程序的程序传递给CreateProcess函数的STARTUPINFO结构中 指定的SW_值设置show状态 。 |
SW_SHOWMAXIMIZED 3 | 激活窗口并将其显示为最大化窗口。 |
SW_SHOWMINIMIZED 2 | 激活窗口并将其显示为最小化窗口。 |
SW_SHOWMINNOACTIVE 7 | 将窗口显示为最小化窗口。此值类似于SW_SHOWMINIMIZED,但窗口未激活。 |
SW_SHOWNA8 | 以当前大小和位置显示窗口。此值类似于SW_SHOW,但窗口未激活。 |
SW_SHOWNOACTIVATE 4 | 显示最近大小和位置的窗口。此值类似于SW_SHOWNORMAL,但窗口未激活。 |
SW_SHOWNORMAL 1 | 激活并显示一个窗口。如果窗口最小化或最大化,系统会将其恢复到原始大小和位置。应用程序应在首次显示窗口时指定此标志。 |
4.更新窗口 UpdateWindow
如果窗口的更新区域不为空,则UpdateWindow函数通过向窗口发送WM_PAINT消息来更新指定窗口的客户区域 。该函数将WM_PAINT消息直接发送到指定窗口的窗口过程,绕过应用程序队列。如果更新区域为空,则不发送任何消息。
函数原型:
BOOL UpdateWindow(
_In_ HWND hWnd
);
参数解释:
参数
hWnd [in]
处理要更新的窗口。
返回值:
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为零。
5.显示模式对话框MessageBox
显示模式对话框,其中包含系统图标,一组按钮和简要的特定于应用程序的消息,例如状态或错误信息。消息框返回一个整数值,指示用户单击的按钮。
函数原型:
int WINAPI MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);
参数解释:
参数
hWnd
要创建的消息框的所有者窗口的句柄。如果此参数为NULL,则消息框没有所有者窗口。
lpText
要显示的消息。如果字符串由多行组成,则可以使用每行之间的回车符和/或换行符分隔行。
lpCaption
对话框标题。如果此参数为NULL,则默认标题为“ 错误”。
uType
对话框的内容和行为。此参数可以是来自以下标志组的标志的组合。
消息框中显示的按钮值 | 含义 |
---|---|
MB_ABORTRETRYIGNORE 0x00000002L | 消息框包含三个按钮:Abort,Retry和Ignore。 |
MB_CANCELTRYCONTINUE 0x00000006L | 消息框包含三个按钮:取消,再试一次,继续。使用此消息框类型而不是MB_ABORTRETRYIGNORE。 |
MB_HELP 0x00004000L | 在消息框中添加“ 帮助”按钮。当用户单击“ 帮助”按钮或按F1时,系统会向所有者发送 WM_HELP消息。 |
MB_OK 0x00000000L | 消息框包含一个按钮:确定。这是默认值。 |
MB_OKCANCEL 0x00000001L | 消息框包含两个按钮:确定和取消。 |
MB_RETRYCANCEL 0x00000005L | 消息框包含两个按钮:重试和取消。 |
MB_YESNO 0x00000004L | 消息框包含两个按钮:是和否。 |
MB_YESNOCANCEL 0x00000003L | 消息框包含三个按钮:是,否和取消。 |
消息框中显示图标 | 含义 |
---|---|
MB_ICONEXCLAMATION 0x00000030L | 消息框中会出现一个惊叹号图标。 |
MB_ICONWARNING 0x00000030L | 消息框中会出现一个惊叹号图标。 |
MB_ICONINFORMATION 0x00000040L | 消息框中将出现一个由圆圈中的小写字母i组成的图标。 |
MB_ICONASTERISK 0x00000040L | 消息框中将出现一个由圆圈中的小写字母i组成的图标。 |
MB_ICONQUESTION0x00000020L | 消息框中会出现一个问号图标。不再推荐使用问号消息图标,因为它不能清楚地表示特定类型的消息,并且因为作为问题的消息的措辞可以应用于任何消息类型。此外,用户可以将消息符号问号与帮助信息混淆。因此,请勿在消息框中使用此问号消息符号。系统继续支持其仅包含向后兼容性。 |
MB_ICONSTOP 0x00000010L | 消息框中会出现一个停止标志图标。 |
MB_ICONERROR 0x00000010L | 消息框中会出现一个停止标志图标。 |
MB_ICONHAND 0x00000010L | 消息框中会出现一个停止标志图标。 |
默认按钮 | 含义 |
---|---|
MB_DEFBUTTON1 0x00000000L | 第一个按钮是默认按钮。MB_DEFBUTTON1是默认值,除非指定了MB_DEFBUTTON2,MB_DEFBUTTON3或MB_DEFBUTTON4。 |
MB_DEFBUTTON2 0x00000100L | 第二个按钮是默认按钮。 |
MB_DEFBUTTON3 0x00000200L | 第三个按钮是默认按钮。 |
MB_DEFBUTTON4 0x00000300L | 第四个按钮是默认按钮。 |
返回值:
返回代码/值 | 描述 |
---|---|
IDABORT 3 | 的中止按钮被选中。 |
IDCANCEL 2 | “ 取消”按钮已被选中。 |
IDCONTINUE 11 | 该继续按钮被选中。 |
IDIGNORE 5 | “ 忽略”按钮已被选中。 |
IDNO 7 | 在没有按钮被选中。 |
IDOK 1 | 在OK按钮被选中。 |
IDRETRY 4 | 选择了“ 重试”按钮。 |
IDTRYAGAIN 10 | 选中了“ 再试一次”按钮。 |
IDYES 6 | 该是按钮被选中。 |
6.检索消息GetMessage
从调用线程的消息队列中检索消息。该函数调度传入的已发送消息,直到发布的消息可供检索。
与GetMessage不同, PeekMessage函数不会在返回之前等待发布消息。
函数原型:
BOOL WINAPI GetMessage(
_Out_ LPMSG lpMsg,
_In_opt_ HWND hWnd,
_In_ UINT wMsgFilterMin,
_In_ UINT wMsgFilterMax
);
参数解释:
lpMsg
指向MSG结构的指针,该 结构从线程的消息队列接收消息信息。
hWnd
要检索其消息的窗口句柄。该窗口必须属于当前线程。
如果hWnd为NULL,则GetMessage将检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中hwnd值为NULL的任何消息(请参阅 MSG结构)。因此,如果hWnd为NULL,则处理窗口消息和线程消息。
如果hWnd为-1,则GetMessage仅检索当前线程的hwnd值为NULL的消息队列中的消息,即PostMessage发布的线程消息 (当hWnd参数为NULL时)或PostThreadMessage。
wMsgFilterMin
要检索的最低消息值的整数值。使用WM_KEYFIRST(0x0100)指定第一个键盘消息或使用WM_MOUSEFIRST(0x0200)指定第一个鼠标消息。
在此处和wMsgFilterMax中使用 WM_INPUT仅指定WM_INPUT消息。
如果wMsgFilterMin和wMsgFilterMax都为零,则GetMessage将返回所有可用消息(即,不执行范围过滤)。
wMsgFilterMax
要检索的最高消息值的整数值。使用WM_KEYLAST指定最后一个键盘消息,或使用WM_MOUSELAST指定最后一条鼠标消息。
在此处和wMsgFilterMin中使用 WM_INPUT仅指定WM_INPUT消息。
如果wMsgFilterMin和wMsgFilterMax都为零,则GetMessage将返回所有可用消息(即,不执行范围过滤)。
返回值:
类型:BOOL
如果函数检索WM_QUIT以外的消息 ,则返回值为非零值。
如果函数检索 WM_QUIT消息,则返回值为零。
如果有错误,则返回值为-1。
7.翻译消息TranslateMessage
将虚拟密钥消息转换为字符消息。字符消息被发布到调用线程的消息队列,以便在线程下次调用GetMessage或 PeekMessage函数时读取 。
函数原型:
BOOL WINAPI TranslateMessage(
_In_ const MSG *lpMsg
);
参数解释:
lpMsg
类型:const MSG *
指向MSG结构的指针,该 结构包含使用GetMessage或 PeekMessage函数从调用线程的消息队列中检索的消息信息 。
返回值:
类型:BOOL
如果消息被转换(即,字符消息被发布到线程的消息队列中),则返回值非零。
如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN或 WM_SYSKEYUP,则无论转换如何,返回值都是非零的。
如果消息未被转换(即,字符消息未发布到线程的消息队列中),则返回值为零。
8.传递消息 DispatchMessage
该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得或者TranslateMessage函数传递的。消息被分发到回调函数(过程函数),作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息。
函数原型:
LONG DispatchMessage(CONST MSG*lpmsg);
参数解释:
lpmsg:指向含有消息的MSG结构的指针。
返回值:
返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。
三、补充
1. WIndow API 函数大全(方便查找):
链接:https://blog.csdn.net/qq_27361833/article/details/78192526
2.CreateWindowEx和CreateWindow的区别
链接:https://blog.csdn.net/ohmygol/article/details/6135897
作者说:
从中午一直写到现在,晚饭都还没有呢,我发现自己总结再写出来后,这样记得更牢固,效率高了很多。最大的好处就是方便自己以后查找相关知识。
这篇知识总结是windows 应用程序编程和win32的敲门砖,认真看完理解后,能很快进入windows 应用程序的编程。
注:下一篇将是VS的Win32 应用程序创建,用于补充这篇未涉及的内容。
参考1:Win32学习笔记 - CreateWindowEx()函数
参考2:CreateWindow函数详解
参考3:msdn官网
参考4:《数据结构课程设计编程实例----基于Win32 API编程 厉旭杰、赵汉理编著