---恢复内容开始---

 今天学习了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的消息机制。
 
关于一些小概念在这里进行一下解释
  1.  应用实例:应用只有一个,实例可以多个,比如qq一台电脑只能装一个,但可以点开多个窗口,此时多个窗口每个都是应用实例
  2. 句柄:类似于指针,保存的是地址,但是只能看内容,不能对其进行修改;
  3. 在创建窗口的过程中,屏幕的左上角为坐标原点,并且长度的单位,为像素;
  4. 前一个应用实例:比如通过微信打开qq,微信为qq的应用实例(区别于子窗口)
  5. 调用约定:是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。函数的调用约定就是描述参数是怎么传递和由谁平衡堆栈的,当然还有返回值

先放上来一个 利用win32创建窗口的程序

 1 #include<Windows.h>
 2 LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam);
 3 int CALLBACK Winmain(
 4                     HINSTANCE hInstance,
 5                     HINSTANCE hPrevInstance,
 6                     LPSTR lpCmdLine,
 7                     int nCmdShow
 8                     )
 9 {
10     MSG msg;
11     HWND hwnd;
12     WNDCLASSEX ex;
13     ex.style = CS_HREDRAW | CS_VREDRAW;
14     ex.cbSize = sizeof(ex);
15     ex.cbClsExtra = 0;
16     ex.cbWndExtra = 0;
17     ex.hInstance = hInstance;
18     ex.hIcon = NULL;
19     ex.hCursor = NULL;
20     ex.hbrBackground = CreateSolidBrush(RGB(0,255,0));
21     ex.hIconSm = NULL;
22     ex.lpfnWndProc = &MyWNDPROC;
23     ex.lpszMenuName = NULL;
24     ex.lpszClassName = "AA";
25 
26     RegisterClassEx(&ex);
27 
28     hwnd = CreateWindow(ex.lpszClassName,"你好中国",WS_OVERLAPPEDWINDOW,50,50,100,100,NULL,NULL,hInstance,NULL);
29 
30     ShowWindow(hwnd,SW_SHOW);
31 
32     while(GetMessage(&msg,NULL,0,0))
33     {
34         TranslateMessage(&msg);
35         DispatchMessage(&msg);
36     }
37 
38 
39 
40 
41     return 0;
42 }
43 LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
44 {
45     switch(message)
46         case WM_CLOSE:
47             break;
48     return DefWindowProc(hwnd,message,wparam,lparam);
49 }

2019-05-09 23:56:50 编程小菜鸟自我反省,大佬勿喷,谢谢!!!

posted on 2019-05-09 23:57  coding小菜鸟  阅读(493)  评论(0编辑  收藏  举报