创建Windows窗口不难,可以简要的概括为:
1,# 注册一个窗口类
填充WNDCLASS结构
书写窗口消息处理函数WinProc
2,# 创建一个窗口
填写基本的窗口信息
3,# 显示窗口
4,# 循环处理窗口信息
相关函数:
注册窗口类(重点是填充WNDCLASS结构)
ATOM RegisterClass (CONST WNDCLASS *lpWndClass)
WNDCLASS结构
// 也不很清楚,就值知道几个重要的,其他的照葫芦画瓢写的. Wnd.cbClsExtra = NULL; Wnd.cbWndExtra = NULL; Wnd.hbrBackground = (HBRUSH)COLOR_WINDOW; Wnd.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(IDC_ARROW)); Wnd.hIcon = NULL; Wnd.hInstance = hInstance; Wnd.lpszClassName = sz_ClassName; //类名 Wnd.lpszMenuName = NULL; //菜单 Wnd.style = CS_HREDRAW | CS_VREDRAW; //类的类型 CS_type Wnd.lpfnWndProc = WndProc; //窗口处理函数
创建窗口
HWND CreateWindow( LPCTSTR lpClassName, //基于那个类的窗口 LPCTSTR lpWindowName, //窗口标题 DWORD dwStyle, //窗口风格 WS_*** int x, //左上角 int y, //右上角 int nWidth, //宽 int nHeight, //高 HWND hWndParent, //父窗口句柄 HMENU hMenu, //菜单句柄,注意,如果是"BOTTON"类的窗口,那么此参数为按钮ID,与处理消息有关 HINSTANCE hInstance, //窗口实例,我不是很清楚干嘛的,不过WinMain函数参数,就有一个hInstance LPVOID lpParam //不是很清楚,貌似是窗口创造前要发送的消息(发送窗口处理函数)WM_CREATE 消息 ); //窗口创造就会给处理函数发送一个WM_CREATE消息 //如果我们不需要处理的消息可以交个DefWindowProc()函数处理,并返回.
窗口处理函数(需要自己写 然后交给windows取调用的. 在RgisterClass中传递给Windows)
//记得消息处理函数要有 CALLBACK 声明 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //uMsg可以初步判断消息 //有的消息我们直接通过uMsg就可以直接获取,但是有些还需要结合wParam,lParam switch(uMsg){ case WM_CREATE: //窗口创造前执行. break; case WM_LBUTTONDOWN: // 鼠标左键被点下 break; case WM_PAINT: hDc = BeginPaint(hWnd,&paint); //绘画消息触发 EndPaint(hWnd,&paint); break; case WM_CLOSE: //标题框的关闭按钮被按下 PostQuitMessage(WM_QUIT); break; case WM_COMMAND: if(LOWORD(wParam) == BOTTON_ID && HIWORD(wParam) == BN_CLICKED){ //按钮被按下 //LOWORD(wParam) 低位 HIWORD(wParam) 高位 } break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); //我们不需要处理的消息都默认让系统帮我们处理 } return 0; }
显示窗口
ShowWindow(hWND,nCmdShow); //hWND是CreateWindow返回的窗口句柄,nCmdShow是显示窗口的方式(可以直接用WinMain函数的最后一个参数nCmdShow) UpdateWindow(hWND); //=一个WM_PAINT消息来刷新窗口
消息循环
//处理窗口消息 while(GetMessage(&Msg,NULL,0,0)){ TranslateMessage(&Msg); DispatchMessage(&Msg); } // emmmm...直接Copy VS项目的代码的,还把一些删了,但是,貌似也没错.