第一节 创建应用程序主窗体
1 创建消息处理函数
LRESULT CALLBACK fWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg){
case WM_CLOSE: //处理关闭按钮消息
DestroyWindow(hWnd); //销毁窗口
break;
case WM_DESTROY:
PostQuitMessage(0); //发送退出消息
break;
}
//将不处理的函数交给系统默认处理
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
这个函数不用自己调用,赋值给窗体后会自动调用这个函数
关键是第二个参数,这个参数是获取到的消息标识
本例只处理两个消息:
(1) 当按下窗体右上角的关闭按钮时的消息: WM_CLOSE
(2) 当窗体进行真正销毁时:WM_DESTROY
消息队列只有在收到:WM_QUIT GetMessage()函数才会返回false值.因此必须要有一个行为能够发送这个消息.
此例中,我们在接到受到销毁窗口时发送这个消息:PostQuitMessage(0)
本例中消息处理函数:
LRESULT CALLBACK fWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg){
case WM_CLOSE: //处理关闭按钮消息
DestroyWindow(hWnd); //销毁窗口
break;
case WM_DESTROY:
PostQuitMessage(0); //发送退出消息
break;
}
//将不处理的函数交给系统默认处理
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
返回值类型为: LRESULT
限定词CALLBACK作用同WINAPI 用来设定参数的入栈方式(从右往左,以及参数的管理者:调用者)
第一个参数: 窗体句柄
第二个参数: 消息事件标识ID
第三个参数: 附加消息
第四个参数: 附加消息
返回值: 系统消息处理函数(对于不处理的消息,交回给系统处理,并返回调用结果的返回值
2 创建窗体结构体实例并设置相关属性
2.1 窗体结构体: WNDCLASS
WNDCLASS wc;
2.2 设置窗体实例属性
所有属性都要设置
typedef struct tagWNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;
2.2.1 窗体显示风格
UINT style
style的值为下列值的组合
值 | 描述 |
---|---|
CS_DBLCLKS | 接受双击事件的窗体 |
CS_HREDRAW | 调整大小后自动重绘的窗体 |
CS_NOCLOSE | 禁用窗口菜单上的关闭按钮 |
CS_PARENTDC | |
CS_VREDRAW | 客户区移动或大小调整后重绘 |
CS_SAVEBITS | 保存被窗体挡住部分的图像,以便恢复 |
可以上以上风格的任意组合,用(|) 连接即可
本例中设置为:
wc.style = CS_VREDRAW | CS_HREDRAW;