窗口
窗口是windows操作系统应用程序的重要元素,是系统和用户交互的接口。
窗口中一般包括: 标题栏,菜单,最小化框,客户区
窗口句柄
窗口被创建后会返回一个句柄来标识该窗口(窗口的id)
Windows程序消息机制
windows程序是基于事件驱动的程序设计
windows程序和操作系统的通信都是通过消息来完成,用户有某个动作,操作系统捕获了这个动作,构造一个消息(MSG结构体)加入应用程序中(应用程序的消息队列),应用程序不停地(死循环)从这个消息队列中拿出消息来处理
消息队列:
每个应用程序都有一个消息队列,
程序中的事件都是以一个消息的形式存在被放在消息队列中,程序要通过循环不停地从消息队列中取消息进行相应响应操作
Windows 窗口创建
设计窗口类、注册窗口类
创建窗口、显示窗口、更新窗口
消息循环
消息处理
消息循环:
程序要一直运行,必定有死循环(只有当程序退出才结束)
Windows程序中就是要实现消息循环让程序一直运行
#include <Windows.h> #include <tchar.h> //设计窗口类,注册窗口类 void RegisterWndClass(); //窗口过程函数,回调函数,处理消息的 LRESULT CALLBACK MyWndProcFunc(HWND, UINT, WPARAM, LPARAM); HINSTANCE g_hInstance = NULL; /* 0000 0000 1字节 #define MAX_BOX 0000 0001 定义窗口最大化属性 #defein CLOSE_BOX 0000 0010 style= MAX_BOX | CLOSE_BOX ;0000 0011 有两个属性 style = style & ~MAX_BOX ; 去掉属性 回调函数: 系统自己调用 */ int WINAPI _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nShowCmd) { g_hInstance = hInstance; //1.设计窗口类,注册窗口类 RegisterWndClass(); //创建窗口 HWND hWnd = CreateWindow(_T("MyWndClass"), _T("wnd"), WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, 700, 200, 800, 600, NULL, NULL, g_hInstance, NULL); if (hWnd == NULL) { int err = GetLastError(); MessageBox(NULL, _T("窗口创建失败"), _T("错误"), MB_OK); return 0; } //显示更新窗口 ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); //消息循环 MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0))//从消息队列中取消息,如果消息队列中没有消息,就一直在这里阻塞,如果获得了WM_QUIT消息,程序返回false { TranslateMessage(&msg); DispatchMessage(&msg); } return 1; } void RegisterWndClass() { //设计窗口类 WNDCLASSEX wndClass; wndClass.cbClsExtra = 0;//指定紧跟在窗口类结构后的附加字节数,一般初始为0 wndClass.cbSize = sizeof(WNDCLASSEX);//WNDCLASSEX 的大小。 wndClass.cbWndExtra = 0; //指定紧跟在窗口实例的附加字节数。默认为0 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//背景画刷的句柄。 wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标的句柄。 wndClass.hIcon = NULL;//图标的句柄。 wndClass.hIconSm = NULL;//和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标。 wndClass.hInstance = g_hInstance;//本模块的实例句柄。 wndClass.lpfnWndProc = MyWndProcFunc;//窗口处理函数的指针 wndClass.lpszClassName = _T("MyWndClass");//指向类名称的指针 wndClass.lpszMenuName = NULL;//指向菜单的指针 wndClass.style = CS_HREDRAW | CS_VREDRAW; //从这个窗口类派生的窗口具有的风格 //注册窗口类 RegisterClassEx(&wndClass); } LRESULT CALLBACK MyWndProcFunc(HWND hWnd, UINT msgType, WPARAM wParam, LPARAM lParam) { switch (msgType) { case WM_CREATE: MessageBox(hWnd, L"创建窗口", L"提示", MB_OK); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostMessage(hWnd, WM_QUIT, NULL, NULL); break; default: return DefWindowProc(hWnd, msgType, wParam, lParam); break; } return 0; }