一,创建一个新的Win32项目,将自带的代码去除,只留下一个入口函数
1 #include "stdafx.h" 2 #include "Win32Project1.h"
13 int APIENTRY wWinMain(_In_ HINSTANCE hInstance, //实例句柄 14 _In_opt_ HINSTANCE hPrevInstance,//NULL 15 _In_ LPWSTR lpCmdLine,//命令行 启动参数 16 _In_ int nCmdShow)//显示方式 17 { 18 19 return (int) 0; 20 }
1 WNDCLASS MyMnd = { 0 }; 2 MyMnd.lpszClassName = TEXT("MyMnd"); 3 MyMnd.hbrBackground = (HBRUSH)COLOR_BACKGROUND; 4 MyMnd.lpfnWndProc = WindowProc; 5 MyMnd.hInstance = hInstance; // calsswnd 分三类 系统类、全局窗口类、局部窗口类,区别每块相同名字的DLL 就是看他的实例句柄 6 7 RegisterClass(&MyMnd); //注册窗口信息到系统 8 9 HWND hwindow = CreateWindow(TEXT("MyMnd"), TEXT("Han"), WS_OVERLAPPEDWINDOW,0,0,500,100,NULL,NULL, hInstance,NULL); 10 ShowWindow(hwindow, nCmdShow); 11 UpdateWindow(hwindow);//立刻更新窗口 12 13 MSG msg = { 0 }; 14 while (GetMessage(&msg,0,0,0)) 15 { 16 TranslateMessage(&msg); 17 DispatchMessage(&msg); 18 } 19 20 return (int) 0;
WindowProc()函数
Windows程序最主要的两个函数除了WinMain()函数外还有一个叫消息处理函数即
WindowProc()函数 ,它的作用是等候事件发生的消息,具体说就是:什么键按下了?
或定时器的消息是否发生了?然后再决定去执行哪个程序块。
WindowProc()函数
WindowProc()函数的基本形式(即原型prototype)是:
LRESULT CALLBACK WindowProc ( HWND hWnd, UINT message,
WPARAM wParam, LParam);
返回类型是LRESULT,是由Windows所定义的数据类型,通常相当于 long 型。
因为此函数被Windows调用是通过指针进行的(你在WinMain()中的WNDCLASSEX结构设定
的指针),你必须证实函数为CALLBACK. 这是另一个由Windows所定义的说明符,它决定
了函数的参数如何处理。4个参数的传递提供了引起函数被调用的具体消息的情况。每个
参数的意义如下:
HWND hWnd : 事件引起消息发生的那个窗口。
UINT message: 消息的ID,它是32位值,指明了消息类型。
WPARAM wParam : 32位值,包含附加信息,决定于消息的种类。例如键盘的哪个键代码。
LPARAM lParam: 32位值,同上。例如,前16位=重复数
接着8位:扫描码(决定于厂家)
第24位:为1时表示扩展键。
第25到28位:保留区
第29位为1时=alt按下,否则为0。
第30位为1时=消息前按下,否则为0。
第31位为1时=正在被释放,否则为0。
当用户按下一个键时。那是什么键,由这最后两个变量来说明。
消息的符号常数以WM_开头,例如WM_PAINT,相应于要求窗口的用户区部分重绘。又如
WM_LBUTTONDOWN表示鼠标左键被按下。可参考MSDN Library.
除了上述函数原型之外,还有Windows消息解码用的switch语句,其中又有case语句,
绘制窗口消息的响应及其结束,关闭应用程序等处理过程。这样才构成完整的WindowProc()
函数。
注意 窗口基本完成后需要用到注册项将窗口信息进行注册。
RegisterClass(&MyMnd);
如果发生退出子程序,获取窗口队列不退出程序的情况:
while (GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在获取窗口消息的时候,退出调用了PostQuitMessage(0);//退出子程序窗口
就会出现获取消息循环结束不了,返回不了为0 的情况。
这样我们可以把GetMessage(&msg,hwnd,0,0)第二个参数置为0;
GetMessage(&msg,0,0,0)
如果需要创建全局窗口类,那么只需要在局部窗口类中加一个风格定义即可:
MyMnd.style = CS_GLOBALCLASS;
创建窗口先查找局部窗口类,如果没找到则找全局窗口类,如果还没找到则找系统表,如果三个都没找到则返回创建失败!
加入UpdateWindow(hwindow);//立刻更新窗口 主要目的是提高消息处理的优先级;
下面是本课的全部代码
// Win32Project1.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "Win32Project1.h" LRESULT CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { WNDCLASS MyMnd = { 0 }; MyMnd.lpszClassName = TEXT("MyMnd"); MyMnd.hbrBackground = (HBRUSH)COLOR_BACKGROUND; MyMnd.lpfnWndProc = WindowProc; MyMnd.hInstance = hInstance; // calsswnd 分三类 系统类、全局窗口类、局部窗口类,区别每块相同名字的DLL 就是看他的实例句柄 RegisterClass(&MyMnd); //注册窗口信息到系统 HWND hwindow = CreateWindow(TEXT("MyMnd"), TEXT("Han"), WS_OVERLAPPEDWINDOW,0,0,500,100,NULL,NULL, hInstance,NULL); ShowWindow(hwindow, nCmdShow); UpdateWindow(hwindow);//立刻更新窗口 MSG msg = { 0 }; while (GetMessage(&msg,0,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) 0; } LRESULT CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { switch (uMsg) { case WM_CLOSE: PostQuitMessage(0);//退出子程序窗口 break; case WM_CREATE: break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }