二维码
找好货

扫一扫关注

当前位置: 首页 » 资讯 » 专题 » 正文

C++ Window API 学习笔记 - 窗口创建,注销和刷新消息

放大字体  缩小字体 发布日期:2022-09-23 12:18:28    作者:life    浏览次数:4537    评论:0
导读

C++ Window API 学习笔记 - 窗口创建,注销和刷新消息一;创建窗口消息创建窗口消息为“WM_NCCREATE”消息和“WM_CREATE”消息。该消息是由函数"CreateWindow()"产生的,在程序执行"CreateWi

C++ Window API 学习笔记 - 窗口创建,注销和刷新消息一;创建窗口消息

创建窗口消息为“WM_NCCREATE”消息和“WM_CREATE”消息。该消息是由函数"CreateWindow()"产生的,在程序执行"CreateWindow()"函数的时候,首先发出消息“WM_NCCREATE”,紧接着是“WM_CREATE”。消息“WM_NCCREATE”是由函数"CreateWindow()"直接发送至窗口过程。如果程序针对“WM_NCCREATE”消息进行处理,则需要返回True以继续创建窗口。如果执行返回Flase 则返回一个NULL句柄。“WM_CREATE”消息在窗口创建成功并且返回之前发送“WM_CREATE”消息,可以在该消息下初始化窗口,如:子窗口,控件,等等。

二;注销窗口消息

注销窗口所使用的消息为“WM_DESTROY”,"WM_NCDESTROY"。它们是由函数DestroyWindow函数产生。

三;刷新窗口消息

窗口刷新消息为“WM_PAINT”。

在Windows系统中,所有的东西都是绘制的,包括窗口,按钮,对话框,图片,甚至是文字。“WM_PAINT”消息就是在绘制这些对象的时候系统发送的消息。如果处理该消息,应用程序返回零。

具体如下操作会触发WM_PAINT消息。

  • 程序启动,UpdateWindow函数发送WM_PAINT消息来更新指定窗口的客户去。
  • 鼠标窗口调整大小。
  • 最小化窗口状态时,还原触发。
  • 最大化触发。
  • 当向屏幕外拖动窗口时,不会触发,拉回则触发。
  • InvalidateRect函数触发。
四;案例1;创建窗口程序执行逻辑
  • 程序在执行至函数CreateWindow()会产生两条消息“WM_NCCREATE”,“WM_CREATE”。该消息是直接发送到窗口过程并不是存入消息队列。
  • 窗口过程中MyWindowProc() 匹配到该消息,并且进行处理,执行SetWindowTextA()函数,对窗口进行初始化。
2;注销窗口程序执行逻辑
  • 首先,在用户在窗口界面会点击关闭按钮,产生消息“WM_CLOSE”。
  • 窗口过程中,匹配到“WM_CLOSE”,执行其中代码函数DestroyWindow()。
  • 函数DestroyWindow()会产生销毁窗口的消息“WM_DESTROY”,"WM_NCDESTROY"。
  • 同样在窗口过程中,匹配到消息,调用函数PostQuitMessage()。
  • PostQuitMessage()函数会产生消息“WM_QUIT”。该消息由默认处理函数DefWindowProc() 函数处理用来退出消息循环。

程序执行逻辑图:

3;更新窗口程序执行逻辑
  • 施行触发“WM_PAINT”消息行为。
  • 窗口过程中,匹配至该消息,通过函数BeginPaint() 和EndPaint() 函数来控制多次触发WM_PAINT”消息。

#include <Windows.h> #include <stdio.h> //自定义消息 #define WM_AAA WM_USER+1 //自定义窗口过程 LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT MSG, WPARAM wParam, LPARAM IParam) { switch (Msg) { case WM_AAA: MessageBoxA(NULL, "窗口过程:WM_AAA", "测试", MB_OK); return 0; /// /////////////////// 创建窗口消息 /////////////////////// case WM_NCCREATE: //CreateWindow() 函数产生的消息 //OutputDebugStringA("WM_NCCREATE 消息!!!n"); return true; case WM_CREATE: { //CreateWindow函数在窗口创建成功并且在返回之前直接发送WM_CREATE消息给窗口过程函数。 CREATESTRUCT* P = (CREATESTRUCT*)IParam; //IParam是指向CREATESTRUCT结构的指针,其中包含了有关正在创建的窗口信息。 SetWindowTextA(hWnd, "你好 天象独行"); //OutputDebugStringA("WM_CREATE 消息!!!n"); return true; } /// /////////////////// 注销窗口消息 /////////////////////// case WM_CLOSE: DestroyWindow(hWnd); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_NCDESTROY: return 0; /// /////////////////// 刷新窗口消息 /////////////////////// case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); static int i = 0; char str[64]; sprintf_s(str, "第%d次产生WM_PAINT!!!n", ++i); OutputDebugStringA(str); //return 0; //break; EndPaint(hWnd, &ps); return 0; } default: return DefWindowProcW(hWnd, Msg, wParam, IParam); } return 0; } //主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow) //int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { //注册窗口类 WNDCLASS wind; wind.cbClsExtra = 0; wind.cbWndExtra = 0; wind.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));// 设定背景色 wind.hCursor = LoadCursor(NULL, IDC_ARROW); //光标 wind.hIcon = LoadCursor(NULL, IDI_APPLICATION);//图标 wind.lpfnWndProc = MyWindowProc; //自定义的窗口过程函数 wind.lpszClassName = L"Aaron.xu"; //窗口类名 wind.lpszMenuName = NULL; // 菜单资源名称 wind.style = CS_HREDRAW;//窗口类,样式 wind.hInstance = hInstance;//实例句柄 RegisterClass(&wind); //注册窗口类 //创建窗口 HWND hWnd = CreateWindow(L"Aaron.xu", L"天象独行", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL); //显示窗口 //ShowWindow(hWnd, nShowCmd); ShowWindow(hWnd, nCmdShow); //更新窗口 UpdateWindow(hWnd); //创建窗口2 //消息循环(收到WM_QUIT消息退出) MSG msg; while (GetMessage(&msg, NULL, 0, 0)) //GetMessage()从消息队列取出消息 { if (msg.message == WM_LBUTTONDOWN) { //接收用户窗口双击产生的消息,并且发送WM_AAA消息。 //SendMessage()函数将消息直接发送给窗口过程,并且阻塞,除非被窗口过程处理才返回。 SendMessage(hWnd, WM_AAA, 0, 0); //PostQuitMessage(0); //int a = 100; } TranslateMessage(&msg); //将虚拟键消息转换为字符消息 DispatchMessage(&msg); //将WM_AAA消息分配窗口过程MyWindowProc } }

 
关键词: hicon
(文/life)
打赏
免责声明
• 
本文为life原创作品,作者: life。欢迎转载,转载请注明原文出处:https://www.114618.com/news/168105.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们。
0相关评论
 

(c)2008-2018 找好货 B2B SYSTEM All Rights Reserved

京ICP备2022008976号-2