收藏 分享(赏)

Windows程序设计基础.ppt

上传人:dzzj200808 文档编号:4299611 上传时间:2018-12-21 格式:PPT 页数:85 大小:2.79MB
下载 相关 举报
Windows程序设计基础.ppt_第1页
第1页 / 共85页
Windows程序设计基础.ppt_第2页
第2页 / 共85页
Windows程序设计基础.ppt_第3页
第3页 / 共85页
Windows程序设计基础.ppt_第4页
第4页 / 共85页
Windows程序设计基础.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

1、Windows程序设计基础,第08章,本章主要内容,几个基本概念,窗口 消息驱动 图形设备接口 资源 句柄 API和SDK,1、窗口,对话框中的按钮、 文本框等也是窗口 它们具有同等地位,2、消息驱动,消息机制,消息传递 操作系统感知事件,封装一个消息(描述事件的结构体),投递到程序的消息队列中。 应用程序从消息队列中取出消息,调用对应的消息处理过程。 消息结构typdef struct tagMSG HWND hWnd; UINT message;WPARAM wParam; LPARAM lParam;DWORD time; POINT pt;MSG;,消息的标识,消息结构typdef s

2、truct 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自然知道是哪个窗口了。,6、API和SDK,API应用程序编程接口 Application Programming Interface Windows操作系统提供的编程接口,多数函数原型在windows.h中声明; 1000多个函数,单词首字母大写,MSDN SDK软件开发包 Software

4、 Development Kit Win32 SDK:微软提供的包括API函数、帮助文档、辅助工具等构成的开发包。,本章主要内容,8.2.1 API程序结构,入口函数:WinMain 创建窗口 建立消息循环 窗口过程函数 处理各种消息,创建最简单Windows程序,创建最简单Windows程序,创建最简单Windows程序,创建最简单Windows程序,创建最简单Windows程序,WinMain入口函数,WinMain原型 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int n

5、CmdShow );, 标识应用程序实例的句柄 前一个实例句柄Win32中恒为0, 传递的命令行参数 定义窗口的初始状态,WINAPI解析,int WINAPI WinMain(); 函数调用中,有_stdcall和_cdecl两种约定,定义参数入栈次序。 可变参数函数如printf遵循_cdecl约定,而Win32 API遵循_stdcall约定,默认的编译选项为_cdecl,在声明时需显示指定_stdcall。 为了保持兼容和便于使用#define WINAPI _stdcall#define CALLBACK _stdcall,8.2.2 创建窗口,创建窗口工作主要在WinMain中完成

6、 设计窗口类 注册窗口类 创建窗口 显示窗口,1、设计窗口类,窗口类的概念 创建窗口的“模板”,指定将要创建窗口的特征 窗口类通过一个结构体进行描述。 typedef struct _WNDCLASS UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS;,常用属性介绍,st

7、yle成员 定义窗口的样式,如CS_NOCLOSE、CS_VREDRAW等 位标志,CS_NOCLOSE值为0x0200,CS_VREDRAW的值为0x0001,只有1位为1。 组合属性style=CS_NOCLOSE|CS_VREDRAW 去除属性style&=CS_VREDRAW,常用属性介绍,lpfnWndProc 回调函数:函数指针,Windows将消息交给该指针所指向函数处理。 每个Windows程序,都必须提供一个窗口过程函数,并将函数地址赋值给窗口类的lpfnWndProc成员。 typedef LRESULT (CALLBACK * WNDPROC)(HWND, UINT, W

8、PARAM,LPARAM); #define LRESULT long,2、注册窗口类,在使用窗口类创建窗口之前,还必须对窗口类进行注册;注册成功后才能创建窗口。ATOM RegisterClass(CONST WNDCLASS *lpWndClass); 函数的参数为之前定义的窗口类结构体变量的地址。,3、创建窗口,使用CreateWindow创建窗口 HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle, int x, int y,int nWidth, int nHeight,HWND hWndP

9、arent, HMENU hMenu,HANDLE hInstance,LPVOID lpParam );,4、显示窗口,ShowWindow BOOL ShowWindow(HWND hWnd, int nCmdShow); nCmdShow指定显示方式 SW_HIDE SW_SHOW SW_SHOWMAXIMIZED SW_SHOWMINIMIZED,5、更新窗口,UpdateWindow BOOL UpdateWindow(HWND hWnd); 工作原理 调用UpdateWindow后向指定的窗口发送消息WM_PAINT,通常会在该消息处理过程中刷新窗口的输出。,8.2.3 建立消息循

10、环,WinMain中,创建并显示窗口后,要为窗口建立消息循环 经典结构 MSG msg; while(GetMessage( ,1、从消息队列取消息,GetMessage BOOL GetMessage(LPMSG lpMsg, HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); 注解 取得的消息保存在lpMsg定义的结构体中; hWnd常设置为NULL,接收所有消息; 常将最后两个参数设置为0。,while循环,消息循环的流程 GetMessage收到WM_QUIT消息后,返回0,循环结束,整个程序结束。 收到其它消息,返回非0,继续循环; 没

11、有消息,则放弃执行,等待。,2、消息转换,TranslateMessage 按键时通常会产生WM_KEYDOWN、WM_KEYUP等消息,参数中通常保存的是虚键值和扫描码。通过TranslateMessage,可以合成WM_CHAR消息,参数中保存了ASCII码。,3、分发消息,消息分发流程 OS感知消息,将消息放到应用程序消息队列; GetMessage获取消息; DispatchMessage将消息回传给OS; OS调用窗口过程函数。,1.2.4 窗口过程函数,程序的主要代码集中在窗口过程函数中 LRESULT CALLBACK WindowPro(HWND hWnd,UINT uMsg,

12、WPARAM wParam,LPARAM lParam ); 要点:窗口过程函数名称可以随意,确保窗口类中的lpfnWndProc成员指向该函数。,典型的窗口过程函数,LRESULT CALLBACK 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 DefWindowP

13、roc(hWnd,uMsg,wParam,lParam);return 0; ,注解:MessageBox,MessageBox:弹出消息框,4个参数 参数1:指定父窗口句柄 参数2:指定消息正文 参数3:指定消息框标题 参数4:指定消息框中的图标和按钮 用户点击不同按钮,返回值不同,MSDN,8.2.5 完整的Window程序,1、设计窗口类,int WINAPI WinMain() WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE

14、_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_VREDRAW;RegisterClass( ,2、创建窗口,int WINAPI WinMain() WNDCLASS wndcls;Regis

15、terClass( ,3、消息循环,int WINAPI WinMain() RegisterClass( ,4、窗口过程,LRESULT CALLBACK 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 defaul

16、t: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“,wParam);MessageBox(hwnd,szChar,“按键通知”,0); break;case WM_LBUTTONDOWN:MessageBox(hwnd,“mouse clicked“,“鼠标单击通知“,0);HDC hdc; hdc=Ge

17、tDC(hwnd);TextOut(hdc,0,50,“Hello World“,strlen(“Hello World“);ReleaseDC(hwnd,hdc);break;return 0; ,本章主要内容,8.3.1 MFC概述,关于Application FrameWork 应用程序框架是一个完整的程序模型,具备标准应用程序的基本功能;是一组紧密合作的“类”构建起来的大模型。 程序模型是确定的,程序员只是根据个人需要,进行适当修改,如改写虚函数,添加成员函数。 争议:软件创作在Application FrameWord之后逐渐成为工匠技术,程序员们逐渐成为软件装配工程的男工和女工。,

18、为什么使用应用程序框架,软件技术发展的目标: 降低软件编写难度和复杂度、加快开发效率、增强可维护性、增加可靠性。 三大工具: raw API Class Library Application FrameWork:MFC、OWL等 使用应用程序框架的好处 开发效率和效益,API编程特点,程序主干由WinMain和WndProc两个函数构成,WinMain是Windows程序的入口函数,通常在该函数中注册、创建窗口,建立消息循环。当收到消息后调用WndProc进行处理(由系统实现的间接调用)。 在WndProc中,需要针对不同的消息(用户操作鼠标、点击菜单、按键、系统消息等)作出相应的处理。 程

19、序员应对数以千计的Windows API函数,MFC应运而生,MFC帮助我们将繁多的API整合起来,利用面向对象原理,将其逻辑地组织起来,具备封装、继承、多态、模块化特点。 将API编程中的众多的“一成不变”的内容隐藏在MFC类中,如WinMain、注册窗口、创建窗口等操作。 使用众多精妙的宏和消息映射机制,大大简化程序员的工作,增强代码模块化。 配合集成开发环境:AppWizard、ClassWizard、资源编辑器,提高编程效率,AppWizard,VC提供应用程序向导AppWizard,能快速生成应用程序框架,框架集成了几个相互作用的类。 MFC已经建立了对象与对象之间的关系,设定了消息

20、的流动程序。当要为应用程序设计一个应用功能时,不必要知道使用者如何按键、如何点击鼠标,只要注意按键之后真正要做的功能即可。 MFC带来面向对象程序设计的观念和方法,并使我们能继承这些优秀工程技术人员的成果来开发自己所需要的程序。,MFC的学习难点,API编程模式:程序结构清晰,从WinMain开始,注册窗口类、创建窗口、建立消息循环、窗口过程等,程序的流程比较清晰。 MFC程序设计:高门槛 隐藏(封装)了程序运行的基本过程,不理解 众多的类及相互关系 大量的宏及消息映射机制 框架的约束,8.3.2 AppWizard使用,生成MFC应用程序:项目类型,生成MFC应用程序:数据库选项,生成MFC

21、应用程序:OLE选项,生成MFC应用程序:外观设置,设置基本的外观选项,生成MFC应用程序:附加选项,一般取默认值,生成MFC应用程序:变更类名,一般可取默认值,效果,已经初具Windows程序规模, 具备菜单、工具栏、标题栏、 状态栏、窗口,构成程序的类, 双击类名,定位到类定义处; 双击类中的成员函数名,定位到该函数实现处,常用的类,CFirstApp:派生自CWinApp,代表整个MFC应用程序。 CFirstView:派生自CView,代表屏幕上所看见的窗口,负责在显示设备上显示内容。 CFirstDoc:派生自CDocument,在该类中添加数据成员,以便存储数据。 CMainFra

22、me:派生自CFrameWnd,代表程序框架,用于组织程序界面(菜单、工具栏、视图窗口) 一般应用程序都会派生自己的应用程序、视图、文档和主框架类,名称和项目名称有关。,本章主要内容,8.4.1 消息处理的概念,消息处理是Windows应用程序的核心,消息通常由用户激发(也可能由操作系统),由操作系统捕获并分发到对应的程序;程序根据接收到的消息调用相应的处理过程。 MFC通常为每个消息映射一个消息处理函数,并作为某个类的成员函数。编写MFC程序的主要任务:映射消息并编写消息处理代码。,一个简单示例:显式鼠标位置,:视图类中定义成员变量,:代码分析,双击视图类CFirstView,切换至视图类定

23、义中;在视图类中定义成员变量即可。 认识CPoint:MFC提供了许多封装成类的基本数据类型,CPoint是表示坐标点的类,含两个整型数据成员x和y。 CPoint m_MousePos;用来记录鼠标移动过程中当前坐标点。,:初始化成员,:ClassWizard鼠标移动消息,:ClassWizard鼠标移动消息,双击想映射的消息,:添加消息处理代码,:代码分析,当用户在客户区移动鼠标时,系统会不断捕获WM_MOUSEMOVE消息,并将消息发送到应用程序。 当应用程序通过自己的消息循环检测到WM_MOUSEMOV消息时,便调用CFirstView的成员函数OnMouseMove。系统给该函数传递

24、两个参数,其中point表示鼠标当前位置坐标。 Invalidate:是从CView继承来的成员函数,用于刷新整个视图窗口屏幕,刷新屏幕后会自动调用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,st

25、r);str.Format(“Y位置:%d“,m_MousePos.y);pDC-TextOut(m_MousePos.x,m_MousePos.y+20,str); ,:代码分析,机制:OnDraw是CView类的纯虚函数,必须在自己的视图类CFirstView中实现该函数。 系统在视图窗口中绘图就是通过间接调用OnDraw实现的,这一机制被隐藏在MFC框架中;要画图,在OnDraw中添加具体的绘图代码即可。 熟悉CString类:MFC用CString类封装对字符串的操作,在MFC程序中应用广泛。该类的Format成员可以按指定的格式设置字符串,类似printf的用法。,:代码分析,OnD

26、raw函数中有一个参数pDC,用来指向设备环境类对象,可以指向屏幕输出设备,也可以指向打印设备。 CDC类提供了大量的成员函数,实现对视图窗口的绘图和文本输出工作。TextOut用于在指定位置输出字符串。,了解消息映射结构,消息映射的目的,将某个消息与某个类的成员函数关联起来;当收到该消息时,便自动调用与该消息关联的成员函数。 成员函数声明: class CFirstView protected:/AFX_MSG(CFirstView)afx_msg void OnMouseMove();/AFX_MSGDECLARE_MESSAGE_MAP() ;,表示是消息映射函数 #define afx

27、_msg,了解消息映射结构,成员函数的实现 消息映射表:在类实现文件头部 BEGIN_MESSAGE_MAP(CFirstView, CView)/AFX_MSG_MAP(CFirstView)ON_WM_MOUSEMOVE()/AFX_MSG_MAP/ Standard printing commands END_MESSAGE_MAP(),每映射一个消息会出现一个消息映射条目; 不能破坏注释部分,ClassWizard的使用,选择正确的类和双击所要映射的消息后,自动完成函数声明、成员函数实现、添加消息映射条目等工作,程序员根据需要扩展修改实现代码即可。,小结:MFC编程步骤、特点,使用Ap

28、pWizard生成基本程序框架; 使用资源编辑器设置或变更界面外观; 使用ClassWizard将需要映射的消息映射到特定的类中; 定位到消息处理成员函数中,编写代码,完成特定的功能。 需要不断积累:适应MFC框架对程序创建、消息传递机制的封装、简化;逐步熟悉MFC中常用基本数据类型的使用,如CPoint、CString、CRect等;了解MFC类库的结构,熟悉常用基类中所提供的可供我们继承的方法。,8.4.2 消息介绍,Windows系统中的消息有近两千种,在编写程序时,绝大多数消息并不用映射,一般只映射用户感兴趣的消息;没有映射的消息由操作系统作默认处理。 三大类消息: 标准Windows

29、消息 控件消息:操作对话框中控件时产生的消息 命令消息:菜单和工具栏按钮产生的消息,标准Windows消息,除WM_COMMAND外,名称以WM_打头的消息都是Windows消息。 Windows消息都有默认的处理函数,通常封装在CWnd(CView类的基类)中,消息处理函数名称都以“On”开头,都是事先约定的,如OnMouseMove。 在我们的派生类中CFirstView,我们可以进行消息映射,以覆盖基类中的OnMouseMove成员;也可以不进行消息映射,接受基类的默认“行为”。,常见的标准Windows消息,键盘消息:WM_CHAR,消息处理函数为OnChar 鼠标消息:移动鼠标对应W

30、M_MOUSEMOVE,处理函数为OnMouseMove;单击鼠标对应WM_LBUTTONDOWN,处理函数为OnLButtonDown; 窗口消息:所有窗口状态的变化都会激发该消息,如用户移动窗口、改变窗口大小、滚动窗口内容;常见的有WM_SIZE、WM_PAINT,标准Windows消息的传递,标准Windows消息只能发送给CWnd或其派生类;每个窗口类都有自己的消息映射表。 一般将需要映射的标准Windows消息映射到派生的视图类,如CFirstView中。 标准Windows消息首先会传递到派生的视图类中,检测视图类的消息映射表,如果找到匹配项,调用消息处理函数并结束消息传递。如果没

31、找到匹配项,检测基类的消息映射表,如此直到找到消息映射项为止。通常在CWnd类中有绝大多数Windows消息的默认映射并提供消息处理函数。,控件消息,控件消息通常由对话框中的控件产生,当用户通过键盘或鼠标操作这些控件时,会激发控件通知消息,这些消息会传送到包含控件的父窗口中。 通常情况下,每一个对话框总要和一个派生自CDialog类的对话框类关联,控件消息要映射到派生的对话框类下。,命令消息,命令消息是由菜单项、工具栏按钮、加速键等用户界面元素所激发的,所有的命令消息名称都是WM_COMMAND。 为了区分不同的菜单消息,对这些界面元素用唯一的ID号进行标识,同时在发送WM_COMMAND消息时,包含该ID号,从而也标识了是哪个菜单项的命令消息。,实习任务,熟悉AppWizard和ClassWiard用法 模仿示例程序,显示鼠标当前位置; 映射其它消息,如通过MessageBox显示右击鼠标位置,显示通过键盘按下的某个建值。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > windows相关

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报