Win32-创建窗口_第1页
Win32-创建窗口_第2页
Win32-创建窗口_第3页
Win32-创建窗口_第4页
Win32-创建窗口_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、经典Win32-创建窗口WINDOWS核心编程-窗口创建3一、创建窗口3二、窗口类附加数据缓冲区5三、窗口附加数据缓冲区5四、显示窗口8五、消息循环8六、Windows常用消息10windows核心编程-窗口创建一、创建窗口windows经典机制:回调、钩子;回调(理解):自己定义的函数,自己不掉用,交给别人调用。钩子:优先勾取消息的权限,木马程序等。window经典窗口程序仓I建窗口并力口入消息循环/WinCreate.cpp:Definestheentrypointfortheapplication./#include"stdafx.h"HINSTANCEg_hinst

2、ance=0;/接收winMain的参数消息处理函数一/windows经典机制LRESULTCALLBACKWndProc(HWNDhWnd,UINTnMsg,WPARAMwParam,LPARAMlParam)switch(nMsg)caseWM_DESTROY:PostQuitMessage(O);/能够使GetMessage函数返回0break;returnDefWindowProc(hWnd,nMsg,wParam,lParam);注册窗口类BOOLRegister(LPSTRlpClassName,WNDPROCwndProc)WNDCLASSEXwce=0;wce.cbSize=s

3、izeof(wce);wce.cbClsExtra=0;wce.cbWndExtra=0;wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wce.hCursor=NULL;wce.hIcon=NULL;wce.hIconSm=NULL;wce.hInstance=g_hinstance;wce.lpfnWndProc=wndProc;wce.lpszClassName=lpClassName;wce.lpszMenuName=NULL;wce.style=CS_HREDRAW|CS_VREDRAW;ATOMnAtom=RegisterClassEx(&am

4、p;wce);/返回0代表注册失败if(nAtom=0)returnfalse;returntrue;创建主窗口HWNDCreateMain(LPSTRlpClassName,LPSTRlpWndName)HWNDhWnd=CreateWindowEx(0,/*扩展风格*/lpClassName,lpWndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,g_hinstance,NULL);returnhWnd;显示窗口voidDisplay(HWNDhWnd)S

5、howWindow(hWnd,SW_SHOW);UpdateWindow(hWnd);消息循环voidMessage()MSGnMsg=0;while(GetMessage(&nMsg,NULL,0,0)TranslateMessage(&nMsg);DispatchMessage(&nMsg);intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)TODO:PlacecodeherehInstance=g_hinstance;if(!Registe

6、r("Main",WndProc)MessageBox(NULL,"注册失败","Infor",MB_OK);return0;HWNDhWnd=CreateMain("Main","window");Display(hWnd);Message();return0;二、窗口类附加数据缓冲区缓冲区inta;/这句话开了一个4字节的缓冲区a=10;/这句话给缓冲区赋值printf(%d”,a);从缓冲区读取数据使用步骤:1中请缓冲区intcbClsExtra/一般是4的倍数。例如2002向缓冲区中写入

7、数据SetClassLong()/利用次函数向窗口附加缓冲区写入数据、3从缓冲区中读取数据GetClassLong()/SetClassLong和GetClassLong函数原型DWORDSetClassLong(HWNDhWnd/handletowindow窗口句柄intnIndex,indexofvaluetochange字节索引号,指的是从哪个字节开始存数据LONGdwNewL0ng/newvalue存入的数据);DWORDGetClassLong(HWNDhWnd/handletowindowintnIndexoffsetofvaluetoretrieve字节索引号,从哪个字节开始读取

8、数据);/返回值获取读取到的数据三、窗口附加数据缓冲区使用步骤:1中请缓冲区intcbWndExtra/一般是4的倍数2向缓冲区中写入数据SetWindowLong3读取GetWindowLongSetWindowLong和GetWindowLongLONGSetWindowLong(HWNDhWnd/handletowindow窗口句柄intnIndex,/offsetofvaluetoset字节索引号LONGdwNewLong/newvalue存入的数据);LONGGetWindowLong(HWNDhWnd/handletowindow窗口句柄intnIndexoffsetofvalue

9、toretrieve字节索弓I号);/返回值获取读取到的数据Um窗口类附加数据缓冲区:基于同一个窗口类创建出来的所有窗口共享的缓冲区窗口附加缓冲区:窗口自己私有的缓冲去,即便是基于同一个窗口类创建的窗口,相互之间也不共享。例子:/WinCreate.cpp:Definestheentrypointfortheapplication./#include"stdafx.h"HINSTANCEg_hinstance=0;/接收winMain的参数消息处理函数/windows经典机制LRESULTCALLBACKWndProc(HWNDhWnd,UINTnMsg,WPARAMwPa

10、ram,LPARAMlParam)switch(nMsg)caseWM_DESTROY:PostQuitMessage(0);/能够使GetMessage函数返回0break;returnDefWindowProc(hWnd,nMsg,wParam,lParam);注册窗口类BOOLRegister(LPSTRlpClassName,WNDPROCwndProc)WNDCLASSEXwce=0;wce.cbSize=sizeof(wce);wce.cbClsExtra=200;wce.cbWndExtra=200;wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+

11、1);wce.hCursor=NULL;wce.hIcon=NULL;wce.hIconSm=NULL;wce.hInstance=g_hinstance;wce.lpfnWndProc=wndProc;wce.lpszClassName=lpClassName;wce.lpszMenuName=NULL;wce.style=CS_HREDRAW|CS_VREDRAW;ATOMnAtom=RegisterClassEx(&wce);/返回0代表注册失败if(nAtom=0)returnfalse;returntrue;创建主窗口HWNDCreateMain(LPSTRlpClassNa

12、me,LPSTRlpWndName)HWNDhWnd=CreateWindowEx(0,/*扩展风格*/lpClassName,lpWndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,g_hinstance,NULL);returnhWnd;创建子窗口HWNDCreateChild(LPSTRlpClassName,LPSTRlpWndName,HWNDhWndParent)HWNDhChild=CreateWindowEx(0,lpClassName,lpW

13、ndName,WS_CHILD|WS_VISIBLE|WS_OVERLAPPEDWINDOW,100,100,200,200,hWndParent,NULL,g_hinstance,NULL);returnhChild;显示窗口voidDisplay(HWNDhWnd)ShowWindow(hWnd,SW_SHOW);UpdateWindow(hWnd);消息循环voidMessage()MSGnMsg=0;while(GetMessage(&nMsg,NULL,0,0)TranslateMessage(&nMsg);DispatchMessage(&nMsg);设置窗

14、口类、窗口附加缓冲区示例voidSetExtra(HWNDhWnd)ISetClassLong(hWnd,0,123456789);SetWindowLong(hWnd,0,987654321);获取窗口类、窗口附加缓冲区示例voidGetExra(HWNDhWnd)ILONGnClass=GetClassLong(hWnd,0);LONGnWnd=GetWindowLong(hWnd,0);CHARszText256=0;sprintf(szText,"窗口类:d,窗口:d",nClass,nWnd);MessageBox(NULL,szText,"Infor&

15、quot;,MB_OK);intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)/TODO:Placecodehere.hInstance=g_hinstance;if(!Register("Main",WndProc)MessageBox(NULL,"注册失败","Infor",MB_OK);return0;HWNDhWnd=CreateMain("Main","window&quo

16、t;);Register("Child",DefWindowProc);HWNDhWnd1=CreateChild("child","ch1",hWnd);HWNDhWnd2=CreateChild("child","ch2",hWnd);/HWNDhWnd2=CreateChild("CHILD2","Child2",hWnd);MoveWindow(hWnd1,300,100,200,200,TRUE);MoveWindow(hWnd2,500,100

17、,200,200,TRUE);Display(hWnd);SetExtra(hWnd1);GetExra(hWnd2);Message();return0;四、显示窗口ShowWindow(hWnd,SW_SHOW)hWnd保存窗口数据的内存按照读取到的数据将窗口绘制在显卡)五、消息循环1 .过程驱动程序的执行过程是按照预定好的顺序执行。注:多见于单片机2 .事件驱动程序的执行是无序,用户可以根据需要随机出发相应的事件。3 .Win32窗口程序就是采用事件驱动方式执行,也就是消息机制。4 .当系统通知窗口工作时,就采用消息的方式派发给窗口。派发者:DispatchMessage()函数,派发给

18、窗口处理函数。5 .消息组成窗口句柄:消息ID:消息的两个参数:消息产生的时间:消息产生时的鼠标位置:6 . MSG吉构体typedef struct tagMSG HWND hwnd;UINT messageWPARAMwParamLPARAM lParam;DWORD time ;POINT pt; MSG, *PMSG;把消息的6部分接收标识消息是属于哪个窗口标识消息的ID根据消息不同,参数也不同7.窗口处理函数原型LRESULT CALLBACK WindowProc(HWND hwnd/ handle to windowUINT uMsg/ message identifierWPA

19、RAMwParam / first message parameterLPARAM lParam / second message parameter );每个窗口都必须具有窗口处理函数。当系统通知窗口时,会调用窗口处理函数(由 同时,将消息ID和消息参数传递给窗口处理函数DispatchMessage调用窗口处理函数过程伪代码:DispatchMessage()调用)。DispatchMessage(&nMsg) 1 .nMsg.hWnd-保存窗口数据的内存 得到窗口类名称;2 .根据得到的窗口类名称,到操作系统中匹配窗口类名称3 .根据匹配到的内存,找到窗口处理函数的地址4 .调用

20、窗口类中保存的函数WndProc(nMsg.hWnd,nMsg.message,nMsg.wParam,nMsg.lParam)DispatchMessage 函数原型LRESULT DispatchMessage(CONST MSG* 1Pmsg / message information);在窗口处理函数中,不处理的消息,使用缺省窗口处理函数,例如DefWindowProco8. GetMessage -获取消息函数作用、参数、返回值分析BOOL GetMessage(LPMSG lpMsg,/ message informationHWND hWnd / handle to window UINT wMsgFilterMin , / first message UINT wMsgFilterMax / last message);/返回值 只要是 WM_QUIT返回值得就是存放获取到的消息buffer窗口句柄获取消息的最小ID 0获取消息的最大ID 00,其他的都是非0。后三个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论