---恢复内容开始---
今天学习了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创建窗口的程序
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 编程小菜鸟自我反省,大佬勿喷,谢谢!!!