




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Windows程序设计基础第07章本章主要内容7.2 Win32 SDK程序分析7.1 Win32程序设计基础7.3 MFC程序设计基础7.4 消息及消息映射几个基本概念窗口消息驱动图形设备接口资源句柄API和SDK1、窗口对话框中的按钮、文本框等也是窗口它们具有同等地位2、消息驱动消息机制消息传递操作系统感知事件,封装一个消息(描述事件的结构体),投递到程序的消息队列中。应用程序从消息队列中取出消息,调用对应的消息处理过程。消息结构typdef struct tagMSG HWND hWnd; UINT message;WPARAM wParam; LPARAM lParam;DWORD t
2、ime; POINT pt;MSG;消息的标识消息结构typdef struct tagMSG UINT message;MSG;Message成员是标识消息的整数,不同的消息数值不同。为了便于表达,定义形同WM_XXX的消息宏,如WM_KEYDOWN。特殊的数据类型3、图形设备接口4、资源程序的构成程序代码UI(用户接口)资源,对话框、菜单、图标等资源的描述资源如图标(.ico)、位图(.bmp)以二进制文件存在;资源描述文件(.rc)描述所有资源。资源编译器将所有资源集中生成.res文件,最终的目标代码集成形成.exe文件。实现界面和代码的分离5、句柄Windows程序中,窗口和各种资源(
3、图标、菜单、光标等)都使用句柄进行标识。系统在创建资源时,会为它们分配内存并返回句柄以作为标识,同种资源的不同实例标识不同。句柄本质上就是一个32位无符号整数值。假设屏幕上有10个窗口,Windows将它们编号为110,当又创建一个窗口时,将其编号为11。当应用程序读到11时,并知道11代表什么,但将11传递给Windows后,Windows自然知道是哪个窗口了。5、API和SDKAPI应用程序编程接口Application Programming InterfaceWindows操作系统提供的编程接口,多数函数原型在windows.h中声明;1000多个函数,单词首字母大写,MSDNSDK软
4、件开发包Software Development KitWin32 SDK:微软提供的包括API函数、帮助文档、辅助工具等构成的开发包。本章主要内容7.2 Win32 SDK程序分析7.1 Win32程序设计基础7.3 MFC程序设计基础7.4 消息及消息映射7.2.1 API程序结构入口函数:WinMain创建窗口建立消息循环窗口过程函数处理各种消息创建最简单Windows程序2 API程序设计创建最简单Windows程序2 API程序设计创建最简单Windows程序2 API程序设计创建最简单Windows程序2 API程序设计创建最简单Windows程序2 API程序设计WinMain入
5、口函数WinMain原型int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); 标识应用程序实 例的句柄 前一个实例句柄 Win32中恒为0 传递的命令行 参数 定义窗口的初 始状态WINAPI解析int WINAPI WinMain();函数调用中,有_stdcall和_cdecl两种约定,定义参数入栈次序。可变参数函数如printf遵循_cdecl约定,而Win32 API遵循_stdcall约定,默认的编译选项为_cdecl,在声明时需显示指定_std
6、call。为了保持兼容和便于使用#define WINAPI _stdcall#define CALLBACK _stdcall7.2.2 创建窗口创建窗口工作主要在WinMain中完成设计窗口类注册窗口类创建窗口显示窗口1、设计窗口类窗口类的概念创建窗口的“模板”,指定将要创建窗口的特征窗口类通过一个结构体进行描述。typedef struct _WNDCLASS UINT style; WNDPROClpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBR
7、USH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS; 常用属性介绍style成员定义窗口的样式,如CS_NOCLOSE、CS_VREDRAW等位标志,CS_NOCLOSE值为0 x0200,CS_VREDRAW的值为0 x0001,只有1位为1。组合属性style= CS_NOCLOSE|CS_VREDRAW去除属性style&=CS_VREDRAW常用属性介绍lpfnWndProc回调函数:函数指针,Windows将消息交给该指针所指向函数处理。每个Windows程序,都必须提供一个窗口过程函数,并
8、将函数地址赋值给窗口类的lpfnWndProc成员。typedef LRESULT (CALLBACK * WNDPROC)(HWND, UINT, WPARAM,LPARAM);#define LRESULT long2、注册窗口类在使用窗口类创建窗口之前,还必须对窗口类进行注册;注册成功后才能创建窗口。ATOM RegisterClass(CONST WNDCLASS *lpWndClass);函数的参数为之前定义的窗口类结构体变量的地址。3、创建窗口使用CreateWindow创建窗口HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWind
9、owName,DWORD dwStyle, int x, int y,int nWidth, int nHeight,HWND hWndParent, HMENU hMenu,HANDLE hInstance,LPVOID lpParam);4、显示窗口ShowWindowBOOL ShowWindow(HWND hWnd, int nCmdShow);nCmdShow指定显示方式SW_HIDESW_SHOWSW_SHOWMAXIMIZEDSW_SHOWMINIMIZED5、更新窗口UpdateWindowBOOL UpdateWindow(HWND hWnd);工作原理调用UpdateWin
10、dow后向指定的窗口发送消息WM_PAINT,通常会在该消息处理过程中刷新窗口的输出。7.2.3 建立消息循环WinMain中,创建并显示窗口后,要为窗口建立消息循环经典结构MSG msg;while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);1、从消息队列取消息GetMessageBOOL GetMessage(LPMSG lpMsg, HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax);注解取得的消息保存在lpMsg定义的结构体中;hWnd常设置为
11、NULL,接收所有消息;常将最后两个参数设置为0。while循环消息循环的流程GetMessage收到WM_QUIT消息后,返回0,循环结束,整个程序结束。收到其它消息,返回非0,继续循环;没有消息,则放弃执行,等待。2、消息转换TranslateMessage按键时通常会产生WM_KEYDOWN、WM_KEYUP等消息,参数中通常保存的是虚键值和扫描码。通过TranslateMessage,可以合成WM_CHAR消息,参数中保存了ASCII码。3、分发消息消息分发流程OS感知消息,将消息放到应用程序消息队列;GetMessage获取消息;DispatchMessage将消息回传给OS;OS调
12、用窗口过程函数。1.2.4 窗口过程函数程序的主要代码集中在窗口过程函数中LRESULT CALLBACK WindowPro(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);要点:窗口过程函数名称可以随意,确保窗口类中的lpfnWndProc成员指向该函数。典型的窗口过程函数LRESULT CALLBACK WindowPro() switch (uMsg)case WM_CLOSE: if(IDYES=MessageBox(hWnd, “是否结束”,“message”,MB_YESNO) DestroyWindow(hWnd); break
13、;case WM_DESTROY: PostQuitMessage(0); break;case WM_CHAR: default: return DefWindowProc(hWnd,uMsg,wParam,lParam);return 0;注解:MessageBoxMessageBox:弹出消息框,4个参数参数1:指定父窗口句柄参数2:指定消息正文参数3:指定消息框标题参数4:指定消息框中的图标和按钮用户点击不同按钮,返回值不同,MSDN7.2.5 完整的Window程序1、设计窗口类int WINAPI WinMain()WNDCLASS wndcls;wndcls.cbClsExtra
14、=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);wndcls.hInstance=hInstance;wndcls.lpfnWndProc=MyWinProc;wndcls.lpszClassName=xiajb;wndcls.lpszMenuName=NULL;wndcls.style=CS_HREDRAW | CS_VRE
15、DRAW;RegisterClass(&wndcls); 2、创建窗口int WINAPI WinMain()WNDCLASS wndcls;RegisterClass(&wndcls); HWND hwnd;hwnd=CreateWindow(“xiajb”,“我的第一个简单程序”,WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);3、消息循环int WINAPI WinMain()RegisterClass(&wndcls);
16、 HWND hwnd;hwnd=CreateWindow(“xiajb”,“我的第一个简单程序”,);ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);MSG msg;while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return 0;4、窗口过程LRESULT CALLBACK MyWinProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch(uMsg)case WM_C
17、LOSE:if(IDYES=MessageBox(hwnd,“是否真的结束?”,确认结束程序,MB_YESNO)DestroyWindow(hwnd);break;case WM_DESTROY:PostQuitMessage(0);break;case default:return DefWindowProc(hwnd,uMsg,wParam,lParam);return 0;窗口过程LRESULT CALLBACK MyWinProc( HWND hwnd, )switch(uMsg)case WM_CHAR:char szChar40;sprintf(szChar,ASCII is %d
18、,wParam);MessageBox(hwnd,szChar,“按键通知”,0); break;case WM_LBUTTONDOWN:MessageBox(hwnd,mouse clicked,鼠标单击通知,0);HDC hdc; hdc=GetDC(hwnd);TextOut(hdc,0,50,Hello World,strlen(Hello World);ReleaseDC(hwnd,hdc);break;return 0;本章主要内容7.2 Win32 SDK程序分析7.1 Win32程序设计基础7.3 MFC程序设计基础7.4 消息及消息映射7.3.1 MFC概述关于Applica
19、tion FrameWork应用程序框架是一个完整的程序模型,具备标准应用程序的基本功能;是一组紧密合作的“类”构建起来的大模型。程序模型是确定的,程序员只是根据个人需要,进行适当修改,如改写虚函数,添加成员函数。争议:软件创作在Application FrameWord之后逐渐成为工匠技术,程序员们逐渐成为软件装配工程的男工和女工。为什么使用应用程序框架软件技术发展的目标:降低软件编写难度和复杂度、加快开发效率、增强可维护性、增加可靠性。三大工具:raw APIClass LibraryApplication FrameWork:MFC、OWL等使用应用程序框架的好处开发效率和效益API编程
20、特点程序主干由WinMain和WndProc两个函数构成,WinMain是Windows程序的入口函数,通常在该函数中注册、创建窗口,建立消息循环。当收到消息后调用WndProc进行处理(由系统实现的间接调用)。在WndProc中,需要针对不同的消息(用户操作鼠标、点击菜单、按键、系统消息等)作出相应的处理。程序员应对数以千计的Windows API函数MFC应运而生MFC帮助我们将繁多的API整合起来,利用面向对象原理,将其逻辑地组织起来,具备封装、继承、多态、模块化特点。将API编程中的众多的“一成不变”的内容隐藏在MFC类中,如WinMain、注册窗口、创建窗口等操作。使用众多精妙的宏和
21、消息映射机制,大大简化程序员的工作,增强代码模块化。配合集成开发环境:AppWizard、ClassWizard、资源编辑器,提高编程效率AppWizardVC提供应用程序向导AppWizard,能快速生成应用程序框架,框架集成了几个相互作用的类。 MFC已经建立了对象与对象之间的关系,设定了消息的流动程序。当要为应用程序设计一个应用功能时,不必要知道使用者如何按键、如何点击鼠标,只要注意按键之后真正要做的功能即可。MFC带来面向对象程序设计的观念和方法,并使我们能继承这些优秀工程技术人员的成果来开发自己所需要的程序。MFC的学习难点API编程模式:程序结构清晰,从WinMain开始,注册窗口
22、类、创建窗口、建立消息循环、窗口过程等,程序的流程比较清晰。MFC程序设计:高门槛隐藏(封装)了程序运行的基本过程,不理解众多的类及相互关系大量的宏及消息映射机制框架的约束7.3.2 AppWizard使用生成MFC应用程序:项目类型 三种项目类型 单文档 多文档 基于对话框生成MFC应用程序:数据库选项 选择数据支持方式生成MFC应用程序:OLE选项 设置OLE复合文档选项,简单程序选None生成MFC应用程序:外观设置 设置基本的外观选项生成MFC应用程序:附加选项 一般取默认值生成MFC应用程序:变更类名 一般可取默认值效果3 MFC程序设计已经初具Windows程序规模,具备菜单、工具
23、栏、标题栏、状态栏、窗口构成程序的类 双击类名,定 位到类定义处; 双击类中的成员 函数名,定位到 该函数实现处常用的类CFirstApp:派生自CWinApp,代表整个MFC应用程序。CFirstView:派生自CView,代表屏幕上所看见的窗口,负责在显示设备上显示内容。CFirstDoc:派生自CDocument,在该类中添加数据成员,以便存储数据。CMainFrame:派生自CFrameWnd,代表程序框架,用于组织程序界面(菜单、工具栏、视图窗口)一般应用程序都会派生自己的应用程序、视图、文档和主框架类,名称和项目名称有关。本章主要内容7.2 Win32 SDK程序分析7.1 Win
24、32程序设计基础7.3 MFC程序设计基础7.4 消息及消息映射7.4.1 消息处理的概念消息处理是Windows应用程序的核心,消息通常由用户激发(也可能由操作系统),由操作系统捕获并分发到对应的程序;程序根据接收到的消息调用相应的处理过程。MFC通常为每个消息映射一个消息处理函数,并作为某个类的成员函数。编写MFC程序的主要任务:映射消息并编写消息处理代码。一个简单示例:显式鼠标位置:视图类中定义成员变量:代码分析双击视图类CFirstView,切换至视图类定义中;在视图类中定义成员变量即可。认识CPoint:MFC提供了许多封装成类的基本数据类型,CPoint是表示坐标点的类,含两个整型
25、数据成员x和y。CPoint m_MousePos;用来记录鼠标移动过程中当前坐标点。:初始化成员:ClassWizard鼠标移动消息:ClassWizard鼠标移动消息双击想映射的消息:添加消息处理代码:代码分析当用户在客户区移动鼠标时,系统会不断捕获WM_MOUSEMOVE消息,并将消息发送到应用程序。当应用程序通过自己的消息循环检测到WM_MOUSEMOV消息时,便调用CFirstView的成员函数OnMouseMove。系统给该函数传递两个参数,其中point表示鼠标当前位置坐标。Invalidate:是从CView继承来的成员函数,用于刷新整个视图窗口屏幕,刷新屏幕后会自动调用OnD
26、raw()成员函数重新绘制屏幕。:实现OnDraw虚函数双击鼠标定位到OnDraw函数体:函数代码void CFirstView:OnDraw(CDC* pDC)CFirstDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CString str;str.Format(X位置:%d,m_MousePos.x);pDC-TextOut(m_MousePos.x,m_MousePos.y,str);str.Format(Y位置:%d,m_MousePos.y);pDC-TextOut(m_MousePos.x,m_MousePos.y+20,str);:代码
27、分析机制:OnDraw是CView类的纯虚函数,必须在自己的视图类CFirstView中实现该函数。系统在视图窗口中绘图就是通过间接调用OnDraw实现的,这一机制被隐藏在MFC框架中;要画图,在OnDraw中添加具体的绘图代码即可。熟悉CString类:MFC用CString类封装对字符串的操作,在MFC程序中应用广泛。该类的Format成员可以按指定的格式设置字符串,类似printf的用法。:代码分析OnDraw函数中有一个参数pDC,用来指向设备环境类对象,可以指向屏幕输出设备,也可以指向打印设备。CDC类提供了大量的成员函数,实现对视图窗口的绘图和文本输出工作。TextOut用于在指定
28、位置输出字符串。了解消息映射结构消息映射的目的,将某个消息与某个类的成员函数关联起来;当收到该消息时,便自动调用与该消息关联的成员函数。成员函数声明:class CFirstViewprotected:/AFX_MSG(CFirstView)afx_msg void OnMouseMove();/AFX_MSGDECLARE_MESSAGE_MAP();表示是消息映射函数#define afx_msg 了解消息映射结构成员函数的实现消息映射表:在类实现文件头部BEGIN_MESSAGE_MAP(CFirstView, CView)/AFX_MSG_MAP(CFirstView)ON_WM_MO
29、USEMOVE()/AFX_MSG_MAP/ Standard printing commandsEND_MESSAGE_MAP()每映射一个消息会出现一个消息映射条目;不能破坏注释部分 ClassWizard的使用选择正确的类和双击所要映射的消息后,自动完成函数声明、成员函数实现、添加消息映射条目等工作,程序员根据需要扩展修改实现代码即可。小结:MFC编程步骤、特点使用AppWizard生成基本程序框架;使用资源编辑器设置或变更界面外观;使用ClassWizard将需要映射的消息映射到特定的类中;定位到消息处理成员函数中,编写代码,完成特定的功能。需要不断积累:适应MFC框架对程序创建、消息传递机制的封装、简化;逐步熟悉MFC中常用基本数据类型的使用,如CPoint、CString、CRect等;了解MFC类库的结构,熟悉常用基类中所提供的可供我们继承的方法。7.4.2 消息介绍Windows系统中的消息有近两千种,在编写程序时,绝大多数消息并不用映射,一般只映射用户感兴趣的消息;没有映射的消息由操作系统作默认处理。三大类消息:标准Windows消息控件消息:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 监理工程师应试准备试题及答案
- 合同管理变革四种情景预测
- Unit 2 Section B 1a–1d教学设计2024-2025学年人教版(2024)七年级英语上册
- 体育培训机构运营
- 2017秋岳麓版九年级历史上册第六单元教学设计第23课 第一次世界大战
- Unit 11 Wheres the cat(教学设计)-2024-2025学年湘少版(三起)英语四年级上册
- 2033三年级数学下册 六 长方形和正方形的面积第5课时 面积单位间的进率教学实录 苏教版
- 安防监控培训课件
- 第1课时:有趣的纸世界选题课(教学设计)-2023-2024学年五年级下册综合实践活动粤教版001
- 语文园地一 教学设计-2024-2025学年统编版语文一年级下册001
- 2024年中国源网荷储一体化行业政策、市场规模、前景研究报告
- 【异丙苯法生产苯酚的工艺设计18000字(论文)】
- 宠物饲料项目可行性研究报告(2024-2030)
- 2024年交管12123学法减分考试题库和答案
- 《HSK标准教程2》06你怎么不吃了
- 动物生产与流通环节检疫(动物防疫检疫课件)
- 2024年西藏初中学业水平考试生物试题(原卷版)
- 市场营销策划(本)-形考任务一(第一 ~ 四章)-国开(CQ)-参考资料
- 2024年人工智能医学与精准治疗
- 谭其骧历史地理十讲
- 新版DFMEA基础知识解析与运用-培训教材
评论
0/150
提交评论