版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Windows程序设计基础,第07章,本章主要内容,几个基本概念,窗口 消息驱动 图形设备接口 资源 句柄 API和SDK,1、窗口,对话框中的按钮、 文本框等也是窗口 它们具有同等地位,2、消息驱动,消息机制,消息传递 操作系统感知事件,封装一个消息(描述事件的结构体),投递到程序的消息队列中。 应用程序从消息队列中取出消息,调用对应的消息处理过程。 消息结构 typdef struct tagMSG HWND hWnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,消息的标识,消息结构 typ
2、def 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和SDK,API应用程序编程接口 Application Programming Interface Windows操作系统提供的编程接口,多数函数原型在windows.h中声明; 1000多个函数,单词首字母大写,MSDN SDK软件开发包 So
4、ftware Development Kit Win32 SDK:微软提供的包括API函数、帮助文档、辅助工具等构成的开发包。,本章主要内容,7.2.1 API程序结构,入口函数:WinMain 创建窗口 建立消息循环 窗口过程函数 处理各种消息,创建最简单Windows程序,2 API程序设计,创建最简单Windows程序,2 API程序设计,创建最简单Windows程序,2 API程序设计,创建最简单Windows程序,2 API程序设计,创建最简单Windows程序,2 API程序设计,WinMain入口函数,WinMain原型 int WINAPI WinMain( HINSTANCE
5、 hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow );, 标识应用程序实 例的句柄 前一个实例句柄 Win32中恒为0, 传递的命令行 参数 定义窗口的初 始状态,WINAPI解析,int WINAPI WinMain(); 函数调用中,有_stdcall和_cdecl两种约定,定义参数入栈次序。 可变参数函数如printf遵循_cdecl约定,而Win32 API遵循_stdcall约定,默认的编译选项为_cdecl,在声明时需显示指定_stdcall。 为了保持兼容和便于使用 #define WINAPI
6、_stdcall #define CALLBACK _stdcall,7.2.2 创建窗口,创建窗口工作主要在WinMain中完成 设计窗口类 注册窗口类 创建窗口 显示窗口,1、设计窗口类,窗口类的概念 创建窗口的“模板”,指定将要创建窗口的特征 窗口类通过一个结构体进行描述。 typedef struct _WNDCLASS UINT style; WNDPROClpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground;
7、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 #define LRESULT long,2、注册窗口类,在使用窗口类创建窗口之前,还必须对窗口类进行注册;注册成功后才能创建窗口。 ATOM RegisterClass( CONST WNDCLAS
8、S *lpWndClass); 函数的参数为之前定义的窗口类结构体变量的地址。,3、创建窗口,使用CreateWindow创建窗口 HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID lpParam );,4、显示窗口,ShowWindow BOOL ShowWindow( HWND hWnd, int nC
9、mdShow); nCmdShow指定显示方式 SW_HIDE SW_SHOW SW_SHOWMAXIMIZED SW_SHOWMINIMIZED,5、更新窗口,UpdateWindow BOOL UpdateWindow( HWND hWnd); 工作原理 调用UpdateWindow后向指定的窗口发送消息WM_PAINT,通常会在该消息处理过程中刷新窗口的输出。,7.2.3 建立消息循环,WinMain中,创建并显示窗口后,要为窗口建立消息循环 经典结构 MSG msg; while(GetMessage( ,1、从消息队列取消息,GetMessage BOOL GetMessage( L
10、PMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); 注解 取得的消息保存在lpMsg定义的结构体中; hWnd常设置为NULL,接收所有消息; 常将最后两个参数设置为0。,while循环,消息循环的流程 GetMessage收到WM_QUIT消息后,返回0,循环结束,整个程序结束。 收到其它消息,返回非0,继续循环; 没有消息,则放弃执行,等待。,2、消息转换,TranslateMessage 按键时通常会产生WM_KEYDOWN、WM_KEYUP等消息,参数中通常保存的是虚键值和扫描码。通过TranslateMess
11、age,可以合成WM_CHAR消息,参数中保存了ASCII码。,3、分发消息,消息分发流程 OS感知消息,将消息放到应用程序消息队列; GetMessage获取消息; DispatchMessage将消息回传给OS; OS调用窗口过程函数。,1.2.4 窗口过程函数,程序的主要代码集中在窗口过程函数中 LRESULT CALLBACK WindowPro( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); 要点:窗口过程函数名称可以随意,确保窗口类中的lpfnWndProc成员指向该函数。,典型的窗口过程函数,LRESULT CALLB
12、ACK WindowPro() switch (uMsg) case WM_CLOSE: if(IDYES=MessageBox(hWnd, “是否结束”, “message”,MB_YESNO) DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_CHAR: default: return DefWindowProc(hWnd,uMsg,wParam,lParam); return 0; ,注解:MessageBox,MessageBox:弹出消息框,4个参数 参数1:指定父窗口句柄
13、参数2:指定消息正文 参数3:指定消息框标题 参数4:指定消息框中的图标和按钮 用户点击不同按钮,返回值不同,MSDN,7.2.5 完整的Window程序,1、设计窗口类,int WINAPI WinMain() WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ER
14、ROR); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=MyWinProc; wndcls.lpszClassName=xiajb; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass( ,2、创建窗口,int WINAPI WinMain() WNDCLASS wndcls; RegisterClass( ,3、消息循环,int WINAPI WinMain() RegisterClass( ,4、窗口过程,LRESULT CALLBACK
15、 MyWinProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(uMsg) case WM_CLOSE: 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
16、 CALLBACK MyWinProc( HWND hwnd, ) switch(uMsg) case WM_CHAR: char szChar40; sprintf(szChar,ASCII is %d,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
17、(hwnd,hdc); break; return 0; ,本章主要内容,7.3.1 MFC概述,关于Application FrameWork 应用程序框架是一个完整的程序模型,具备标准应用程序的基本功能;是一组紧密合作的“类”构建起来的大模型。 程序模型是确定的,程序员只是根据个人需要,进行适当修改,如改写虚函数,添加成员函数。 争议:软件创作在Application FrameWord之后逐渐成为工匠技术,程序员们逐渐成为软件装配工程的男工和女工。,为什么使用应用程序框架,软件技术发展的目标: 降低软件编写难度和复杂度、加快开发效率、增强可维护性、增加可靠性。 三大工具: raw API
18、 Class Library Application FrameWork:MFC、OWL等 使用应用程序框架的好处 开发效率和效益,API编程特点,程序主干由WinMain和WndProc两个函数构成,WinMain是Windows程序的入口函数,通常在该函数中注册、创建窗口,建立消息循环。当收到消息后调用WndProc进行处理(由系统实现的间接调用)。 在WndProc中,需要针对不同的消息(用户操作鼠标、点击菜单、按键、系统消息等)作出相应的处理。 程序员应对数以千计的Windows API函数,MFC应运而生,MFC帮助我们将繁多的API整合起来,利用面向对象原理,将其逻辑地组织起来,具
19、备封装、继承、多态、模块化特点。 将API编程中的众多的“一成不变”的内容隐藏在MFC类中,如WinMain、注册窗口、创建窗口等操作。 使用众多精妙的宏和消息映射机制,大大简化程序员的工作,增强代码模块化。 配合集成开发环境:AppWizard、ClassWizard、资源编辑器,提高编程效率,AppWizard,VC提供应用程序向导AppWizard,能快速生成应用程序框架,框架集成了几个相互作用的类。 MFC已经建立了对象与对象之间的关系,设定了消息的流动程序。当要为应用程序设计一个应用功能时,不必要知道使用者如何按键、如何点击鼠标,只要注意按键之后真正要做的功能即可。 MFC带来面向对
20、象程序设计的观念和方法,并使我们能继承这些优秀工程技术人员的成果来开发自己所需要的程序。,MFC的学习难点,API编程模式:程序结构清晰,从WinMain开始,注册窗口类、创建窗口、建立消息循环、窗口过程等,程序的流程比较清晰。 MFC程序设计:高门槛 隐藏(封装)了程序运行的基本过程,不理解 众多的类及相互关系 大量的宏及消息映射机制 框架的约束,7.3.2 AppWizard使用,生成MFC应用程序:项目类型,生成MFC应用程序:数据库选项,生成MFC应用程序:OLE选项,生成MFC应用程序:外观设置,设置基本的外观选项,生成MFC应用程序:附加选项,一般取默认值,生成MFC应用程序:变更
21、类名,一般可取默认值,效果,3 MFC程序设计,已经初具Windows程序规模, 具备菜单、工具栏、标题栏、 状态栏、窗口,构成程序的类, 双击类名,定 位到类定义处; 双击类中的成员 函数名,定位到 该函数实现处,常用的类,CFirstApp:派生自CWinApp,代表整个MFC应用程序。 CFirstView:派生自CView,代表屏幕上所看见的窗口,负责在显示设备上显示内容。 CFirstDoc:派生自CDocument,在该类中添加数据成员,以便存储数据。 CMainFrame:派生自CFrameWnd,代表程序框架,用于组织程序界面(菜单、工具栏、视图窗口) 一般应用程序都会派生自己
22、的应用程序、视图、文档和主框架类,名称和项目名称有关。,本章主要内容,7.4.1 消息处理的概念,消息处理是Windows应用程序的核心,消息通常由用户激发(也可能由操作系统),由操作系统捕获并分发到对应的程序;程序根据接收到的消息调用相应的处理过程。 MFC通常为每个消息映射一个消息处理函数,并作为某个类的成员函数。编写MFC程序的主要任务:映射消息并编写消息处理代码。,一个简单示例:显式鼠标位置,:视图类中定义成员变量,:代码分析,双击视图类CFirstView,切换至视图类定义中;在视图类中定义成员变量即可。 认识CPoint:MFC提供了许多封装成类的基本数据类型,CPoint是表示坐
23、标点的类,含两个整型数据成员x和y。 CPoint m_MousePos;用来记录鼠标移动过程中当前坐标点。,:初始化成员,:ClassWizard鼠标移动消息,:ClassWizard鼠标移动消息,双击想映射的消息,:添加消息处理代码,:代码分析,当用户在客户区移动鼠标时,系统会不断捕获WM_MOUSEMOVE消息,并将消息发送到应用程序。 当应用程序通过自己的消息循环检测到WM_MOUSEMOV消息时,便调用CFirstView的成员函数OnMouseMove。系统给该函数传递两个参数,其中point表示鼠标当前位置坐标。 Invalidate:是从CView继承来的成员函数,用于刷新整个
24、视图窗口屏幕,刷新屏幕后会自动调用OnDraw()成员函数重新绘制屏幕。,:实现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_Mo
25、usePos.x,m_MousePos.y+20,str); ,:代码分析,机制:OnDraw是CView类的纯虚函数,必须在自己的视图类CFirstView中实现该函数。 系统在视图窗口中绘图就是通过间接调用OnDraw实现的,这一机制被隐藏在MFC框架中;要画图,在OnDraw中添加具体的绘图代码即可。 熟悉CString类:MFC用CString类封装对字符串的操作,在MFC程序中应用广泛。该类的Format成员可以按指定的格式设置字符串,类似printf的用法。,:代码分析,OnDraw函数中有一个参数pDC,用来指向设备环境类对象,可以指向屏幕输出设备,也可以指向打印设备。 CDC类
26、提供了大量的成员函数,实现对视图窗口的绘图和文本输出工作。TextOut用于在指定位置输出字符串。,了解消息映射结构,消息映射的目的,将某个消息与某个类的成员函数关联起来;当收到该消息时,便自动调用与该消息关联的成员函数。 成员函数声明: class CFirstView protected: /AFX_MSG(CFirstView) afx_msg void OnMouseMove(); /AFX_MSG DECLARE_MESSAGE_MAP() ;,表示是消息映射函数 #define afx_msg,了解消息映射结构,成员函数的实现 消息映射表:在类实现文件头部 BEGIN_MESSAG
27、E_MAP(CFirstView, CView) /AFX_MSG_MAP(CFirstView) ON_WM_MOUSEMOVE() /AFX_MSG_MAP / Standard printing commands END_MESSAGE_MAP(),每映射一个消息会出现一个消息映射条目; 不能破坏注释部分,ClassWizard的使用,选择正确的类和双击所要映射的消息后,自动完成函数声明、成员函数实现、添加消息映射条目等工作,程序员根据需要扩展修改实现代码即可。,小结:MFC编程步骤、特点,使用AppWizard生成基本程序框架; 使用资源编辑器设置或变更界面外观; 使用ClassWiz
28、ard将需要映射的消息映射到特定的类中; 定位到消息处理成员函数中,编写代码,完成特定的功能。 需要不断积累:适应MFC框架对程序创建、消息传递机制的封装、简化;逐步熟悉MFC中常用基本数据类型的使用,如CPoint、CString、CRect等;了解MFC类库的结构,熟悉常用基类中所提供的可供我们继承的方法。,7.4.2 消息介绍,Windows系统中的消息有近两千种,在编写程序时,绝大多数消息并不用映射,一般只映射用户感兴趣的消息;没有映射的消息由操作系统作默认处理。 三大类消息: 标准Windows消息 控件消息:操作对话框中控件时产生的消息 命令消息:菜单和工具栏按钮产生的消息,标准Windows消息,除WM_COMMAND外,名称以WM_打头的消息都是Wi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026黑龙江哈尔滨龙江特种装备有限公司招聘10人备考题库有答案详解
- 2026贵州黔东南州黎平县卫生健康系统事业单位遴选14人备考题库带答案详解
- 2026江西南昌市社会福利院招聘备考题库含答案详解(满分必刷)
- 2026安徽芜湖无为市人才发展有限责任公司代无为市城控集团招聘2人备考题库含答案详解ab卷
- 结核菌素作用机制的分子与细胞学研究
- 2026中国科大图书馆劳务派遣岗位招聘2人备考题库【历年真题】附答案详解
- 2026重庆市万州区沙河街道办事处公益性岗位招聘1人备考题库附答案详解【巩固】
- 2026春季河北邯郸市教育局市直学校选聘博硕人才300人备考题库及参考答案详解(完整版)
- 2026广西北海市第二中学(北京八中北海分校)临聘教师招聘2人备考题库附答案详解【黄金题型】
- 纸基包装研发趋势
- 癫痫预测模型的泛化能力提升策略研究
- 小学统计与概率培训课件
- 2026届陕西省高三二模高考数学模拟试卷试题(含答案详解)
- 2025年保密知识测试试题库及答案
- 知情同意与拒绝治疗
- 【2025年】军事知识竞赛题库及答案
- 血液透析患者的血压管理
- 中国2型糖尿病防治指南(2024年版)解读
- 2025年西藏自治区中考地理试卷(含答案)
- 2025年福建法院书记员面试题(含答案)
- 2026年政治一轮复习备考策略分享
评论
0/150
提交评论