版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 曲棍球场租赁合同
- 体育产业二手房交易合同样本
- 大型能源设施运输协议
- 学校食堂经营权租赁协议
- 水处理工程承包协议
- 标准化厂房建项目投标书
- 2025出口商品生产中短期借贷合同范文
- 2025前期物业管理合同书
- 低空经济产业园项目可持续发展前景分析
- 产教融合的背景与发展现状
- 《HSK标准教程2》第1课课件
- 心力衰竭-英文版课件
- 耐高温硬密封球阀的设计
- 2023年深圳市盐田港集团有限公司校园招聘笔试模拟试题及答案解析
- IConn-参数详解(中文版)培训讲学课件
- 国开人力资源管理1-13章自测试题及答案
- 新能源小客车购车充电条件确认书
- 部编版六年级语文上第八单元复习课件
- 湖南省娄底市各县区乡镇行政村村庄村名居民村民委员会明细及行政区划代码
- 《灭火器维修》GA95-2015(全文)
- 慢性肾功能衰竭合并心力衰竭护理
评论
0/150
提交评论