Win32学习笔记(四)窗口创建具体解析
一、系统窗口类
不需要注册,直接使用窗口类即可。系统已经注册好了
如:button、edit
#include
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {//在内存创建窗口HWND hWnd = CreateWindow("Button", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)) {TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理。}return 0;
}
运行结果如下(Button和Edit):


二、全局及局部窗口类
注册窗口类的函数
*ATOM RegisterClass(CONST WNDCLASS lpWndClass//窗口类的数据);//注册成功后,返回一个数字标识。


// 1.设计一个窗口类WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.lpfnWndProc = WndProc;wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wcex.lpszMenuName = NULL;wcex.lpszClassName = g_lpszClassName;wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

加强版不会用到窗口的扩展风格!
HWND hWnd = CreateWindowEx(NULL, g_lpszClassName, g_lpszWindowName, WS_OVERLAPPEDWINDOW, 10, 10, 800, 800, NULL, NULL, hInstance, NULL);
使用WS_OVERLAPPEDWINDOW的理由:
WS_OVERLAPPEDWINDOW
Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles. Same as the WS_TILEDWINDOW style.
包含了很多风格
消息的概念和作用
在这里插入图片描述
如果找到窗口类,申请一大块内存,将窗口的数据信息存入这块内存中。如果没有,返回null。
2.1窗口进程没有停止
原因:
//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)) {TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理。}
解决:
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM IParam) {switch (msgID) {case WM_DESTROY:PostQuitMessage(0);break;}
};
三、子窗口创建过程
实现以下两句子
1.创建时要设置窗口句柄
2.创建分格要增加WS_CHILD | WS_VISIBLE
#include LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM IParam)
{switch (msgID) {case WM_DESTROY:PostQuitMessage(0);break;}return DefWindowProc(hWnd, msgID, wParam, IParam);
}int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {WNDCLASS wc = { 0 };wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = NULL;wc.hIcon = NULL;wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName = "Main";wc.lpszMenuName = NULL;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc); //将以上所有赋值全部写入操作系统中//在内存创建窗口HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//注册窗口类wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = NULL;wc.hIcon = NULL;wc.hInstance = hIns;wc.lpfnWndProc = DefWindowProc;//微软最近提供的默认处理类wc.lpszClassName = "Child";//基于它创建子窗口wc.lpszMenuName = NULL;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc); //将以上所有赋值全部写入操作系统中//创建子窗口HWND hChild1 = CreateWindowEx(0, "Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, hWnd, NULL, hIns, NULL);HWND hChild2 = CreateWindowEx(0, "Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 200, 0, 200, 200, hWnd, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)) { //抓消息TranslateMessage(&nMsg);//翻译消息DispatchMessage(&nMsg);//派发消息:将消息交给窗口处理函数来处理。}return 0;
}
//需要在任务管理器中退出线程!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
