--- 恢复内容开始 ---
今天学习了 win32 的相关知识, 首先 win32 是指是指可以在 32 位或以上 Windows 系统中运行的程序, 我学习的主要利用 c/c++ 语言编写的 win32 程序,
首先在 win32 中开始一个项目需要经历 1. 窗口设计 2. 注册 3. 创建 4. 显示五个部分, 其中的难点就在于窗口设计中 lpfnWndProc 消息处理函数的编写, win32 的精髓就在于它的消息机制,
在百度百科中关于消息机制是这样阐述的:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Windows 的消息系统是由 3 个部分组成的:
. 消息队列. Windows 能够为所有的应用程序维护一个消息队列. 应用程序必须从消息队列中获取
消息, 然后分派给某个窗口.
. 消息循环. 通过这个循环机制应用程序从消息队列中检索消息, 再把它分派给适当的窗口, 然
后继续从消息队列中检索下一条消息, 再分派给适当的窗口, 依次进行.
. 窗口过程. 每个窗口都有一个窗口过程来接收传递给窗口的消息, 它的任务就是获取消息然后
响应它. 窗口过程是一个回调函数; 处理了一个消息后, 它通常要返回一个值给 Windows.
注意回调函数是程序中的一种函数, 它是由 Windows 或外部模块调用的.
一个消息从产生到被一个窗口响应, 其中有 5 个步骤:
1) 系统中发生了某个事件.
2) Windows 把这个事件翻译为消息, 然后把它放到消息队列中.
3) 应用程序从消息队列中接收到这个消息, 把它存放在 TMsg 记录中.
4) 应用程序把消息传递给一个适当的窗口的窗口过程.
5) 窗口过程响应这个消息并进行处理.
----------------------------------------------------------------------------------------
这是一个很全面的一个解释了, 就相当于一个比方, 在一个屋子里, 每个人都拥有自己的桌子, 然后此时快递在外面排着队进来, 严格遵守排队秩序, 然后一个快递来了之后, 我们拆开看是否位自己需要的, 如果需要的话就接受它, 如果不需要的话另行处理 (不是销毁). 那么在这段比喻中, 每个人都是一个窗口, 快递就是消息, 这里的消息就是敲击键盘, 点击鼠标等一系列外设动作, 那么这些消息按照队列的数据结构进行排列, 然后通过循环的方式让每个窗口都能找到属于自己的消息, 这就是 win32 的消息机制.
关于一些小概念在这里进行一下解释
应用实例: 应用只有一个, 实例可以多个, 比如 qq 一台电脑只能装一个, 但可以点开多个窗口, 此时多个窗口每个都是应用实例
句柄: 类似于指针, 保存的是地址, 但是只能看内容, 不能对其进行修改;
在创建窗口的过程中, 屏幕的左上角为坐标原点, 并且长度的单位, 为像素;
前一个应用实例: 比如通过微信打开 qq, 微信为 qq 的应用实例 (区别于子窗口)
调用约定: 是指当一个函数被调用时, 函数的参数会被传递给被调用的函数和返回值会被返回给调用函数. 函数的调用约定就是描述参数是怎么传递和由谁平衡堆栈的, 当然还有返回值
先放上来一个 利用 win32 创建窗口的程序
- #include
- LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam);
- int CALLBACK Winmain(
- HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow
- )
- {
- MSG msg;
- HWND hwnd;
- WNDCLASSEX ex;
- ex.style = CS_HREDRAW | CS_VREDRAW;
- ex.cbSize = sizeof(ex);
- ex.cbClsExtra = 0;
- ex.cbWndExtra = 0;
- ex.hInstance = hInstance;
- ex.hIcon = NULL;
- ex.hCursor = NULL;
- ex.hbrBackground = CreateSolidBrush(RGB(0,255,0));
- ex.hIconSm = NULL;
- ex.lpfnWndProc = &MyWNDPROC;
- ex.lpszMenuName = NULL;
- ex.lpszClassName = "AA";
- RegisterClassEx(&ex);
- hwnd = CreateWindow(ex.lpszClassName,"你好中国",WS_OVERLAPPEDWINDOW,50,50,100,100,NULL,NULL,hInstance,NULL);
- ShowWindow(hwnd,SW_SHOW);
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return 0;
- }
- LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
- {
- switch(message)
- case WM_CLOSE:
- break;
- return DefWindowProc(hwnd,message,wparam,lparam);
- }
2019-05-09 23:56:50 编程小菜鸟自我反省, 大佬勿喷, 谢谢!!!
来源: http://www.bubuko.com/infodetail-3053327.html