Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
Windows SDK 编程的一般步骤为:
1. 注册窗口类, 使用到的结构 WNDCLASSEX, 函数 RegisterClassEx.
2. 创建窗口, 函数 CreateWindowEx.
3. 消息循环, 结构 MSG, 函数 GetMessage, TranslateMessage, DispatchMessage.
4. 进入无限循环, 消息处理 :-)
下面是代码, 当然, 还有分析:
#include <windows.h> //包含 Windows 相关的 API 函数 //这里就是所谓的消息处理函数了 //CALLBACK 说明当前函数是回调函数, 就是说明调用约定 //hwnd:窗口句柄, uMsg:收到的消息, wParam, lParam:与该消息有关的参数 LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) //消息选择 { //这里我添加一个左键按下的消息 case WM_LBUTTONDOWN: MessageBox(hwnd, "左键按下", "提示", MB_OK); return 0; case WM_DESTROY: //当前窗口被销毁时 PostQuitMessage(0); //发出退出程序的消息 return 0; //如果处理了该消息, 就返回 0 来告知 Windows case WM_CLOSE: //当用户点击窗口右上角的关闭按钮时 DestroyWindow(hwnd); //销毁窗口 return 0; case WM_PAINT: //当窗口需要重绘时 { PAINTSTRUCT ps = {0}; BeginPaint(hwnd, &ps); //开始重绘 EndPaint(hwnd, &ps); //结束重绘 return 0; } } return DefWindowProc(hwnd, uMsg, wParam, lParam); //对于我们不想处理的消息, 比如鼠标在窗口上移动时发出的消息 //我们就原样传给默认的窗口消息处理函数处理, 不然应用程序会失去响应 } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //注意 Windows 程序应该使用 WinMain 入口函数了, 不再使用 main 函数 //当然, 如果不创建窗口, 不使用窗口 也可以使用 main. WNDCLASSEX wc = {0}; //窗口类结构, 为注册窗口类作准备 wc.cbClsExtra = 0; //附加的类信息, 没有, 设为0 wc.cbSize = sizeof(wc); //WNDCLASSEX结构的大小 wc.cbWndExtra = 0; //窗口额外内存, 没有, 设为0 wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //窗口背景, 这里使用灰色背景 wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); //应用程序使用的鼠标类型 wc.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); //光标类型 wc.hIconSm = NULL; //应用程序程序的小光标, 不管, 设为 NULL wc.hInstance = hInstance; //应用程序程序实例句柄, 由 WinMain 函数传递过来 wc.lpfnWndProc = WndProc; //这个很重要, 就是当前窗口的消息处理函数, 传递 WndProc 的地址 wc.lpszClassName = "vbgk_class"; //创建类时使用的类名, 可以自定义 wc.lpszMenuName = NULL; //菜单, 没有, 就使用 NULL wc.style = CS_HREDRAW | CS_VREDRAW; //类的风格, 垂直重绘, 水平重绘 if(!RegisterClassEx(&wc)) //注册窗口类 { MessageBox(NULL, "Register Class Failed!", NULL, MB_OK); return 1; } //创建窗口咯, 介绍一下 CreateWindowEx 函数的参数 HWND hWnd = CreateWindowEx( 0, //扩展窗口风格 "vbgk_class", //这里就是我们刚才创建的窗口类名 "木木ing", WS_OVERLAPPEDWINDOW,//窗口风格 CW_USEDEFAULT, //初始化时的 X 坐标 CW_USEDEFAULT, //Y坐标 320, //窗口宽度, 我们这里设为 320 240, //窗口高度 NULL, //父窗口句柄, 没有 NULL, //菜单, 没有 hInstance, //实例句柄, 来自WinMain NULL //发送 WM_CREATE 消息时的附加参数, 一般为零 ); if(!hWnd) { MessageBox(NULL, "CreateWindowEx Failed!", NULL, MB_OK); return 2; } UpdateWindow(hWnd); //更新窗口 ShowWindow(hWnd, nCmdShow); //显示窗口 MSG msg; BOOL bRet; //进入消息循环 while((bRet = GetMessage(&msg, NULL, 0, 0)) != -1) { if(bRet == 0) { break; } TranslateMessage(&msg); //翻译消息 DispatchMessage(&msg); //分发消息 } return msg.wParam; //WinMain函数结束, 整个程序退出 }