第2讲 SDK与MFC编程基础_第1页
第2讲 SDK与MFC编程基础_第2页
第2讲 SDK与MFC编程基础_第3页
第2讲 SDK与MFC编程基础_第4页
第2讲 SDK与MFC编程基础_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计培训高级(goj)讲义游戏修改器设计(1)共八十五页第2讲 SDK与MFC编程基础(jch)共八十五页(1)抢占式多任务操作系统(co zu x tn)(多用户多任务);(2)图形用户界面(GUI - Graphical User Interface)(3)使用GDI对屏幕、打印机等进行图像输出操作(4)建立了硬件抽象层,开发人员无需同硬件直接打交道;(5)使用键盘和鼠标交互;1.Windows环境(hunjng)简介共八十五页 windows三大核心模块:大多数典型的Windows程序的函数调用是对应到这三个模块之一的。 (1)Kernel(KERNEL32.DLL)处理所有在

2、传统上由操作系统核心处理的事务内存管理、文件I/O和多任务管理。 (2)User(USER32.DLL)指用户界面,建立所有窗口运行机制。 (3)GDI( GDI32.DLL)是一个图形处理模块,允许(ynx)程序在屏幕和打印机上显示文字和图形。1.Windows环境(hunjng)简介共八十五页API(Application Programming Interface)对于(duy)软件开发而言,操作系统是由本身的API定义的。API包含了所有应用程序能够使用的系统函数调用,同时包含了相关的数据类型和结构。Windows API 的从Windows开始主要是功能和数量上变化,但是最大的一次变

3、化是由16位操作系统变为32位操作系统时,产生的变化Windows API是采用向下兼容的方式工作。但对于95、98和NT的工作方式有所不同。1.Windows环境(hunjng)简介共八十五页2.Windows编程环境(hunjng)开发工具: 对于Windows软件开发而言,可以使用各种语言对Windows API进行操作,比较方便的是使用Microsoft Visual C+编程工具 Microsoft Visual C+ 软件中包括C编译器和其他编译及连结Windows程序所需的文件和工具等。它还包括Visual C+ Developer Studio,一个可编辑原始码、可视化的资源(

4、如图像(t xin)和对话框)以及编辑、编译、执行和测试程序的环境。共八十五页(1)Windows控制台程序(chngx):最简单的控制台C语言程序:#include void main () printf (hello, worldn) ; 2.Windows编程环境(hunjng)共八十五页(2)Windows窗口(chungku):单文档窗口2.Windows编程环境(hunjng)标题栏菜单栏工具条状态栏客户区应用程序图标共八十五页(2)Windows窗口(chungku):多文档窗口2.Windows编程环境(hunjng)共八十五页(3)Windows窗口(chungku):对话框

5、窗口2.Windows编程环境(hunjng)控件工具共八十五页Windows对应(duyng)的窗口类:CFrameWnd:单文档CMDIFrameWnd:多文档CDialog:对话框所有Window可视界面对象,都属于Windows的窗口,从CWnd类继承。可以(ky)响应Windows窗口消息,鼠标/光标等2.Windows编程环境共八十五页Windows程序开发的两种方式(fngsh):(1)SDK:Development Kits(2)Visual Studio C+:Microsoft Fundation Class (MFC)3.SDK开发(kif)基础共八十五页(1)包含头文件

6、:WINDOWS.HWINDOWS.H是最主要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。这些头文件中最重要的和最基本的是:WINDEF.H 基本类型定义。 WINNT.H 支持(zhch)Unicode的类型定义。 WINBASE.H Kernel函数定义。 WINUSER.H 用户界面函数定义。 WINGDI.H 图形设备接口函数定义。 这些头文件定义了Windows的所有数据类型、函数调用方式、结构和常数,它们是Windows文件中的一个重要部分。3.SDK开发(kif)基础共八十五页int WINAPI WinMain ( HINSTANCE hIn

7、stance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) MessageBox (NULL, Hello, World!, HelloMsg, 0); return 0 ; (2)定义入口(r ku)函数: WinMain 3.SDK开发(kif)基础共八十五页在Windows系统中,创建窗口非常简单,只需调用CreateWindow函数。在Windows系统中,应用程序窗口分为两类:应用程序窗口它包含标题、菜单等各项。对话框 一般只包含标题,不使用菜单。窗口内还可以包含各种控件,如按钮、编辑框等。用户同窗口的交互(jioh

8、)是通过键盘和鼠标进行的。窗口以消息的方式接收窗口的输入,并且窗口也用消息与其他窗口通讯 每一个窗口都有相关消息处理函数(3)创建(chungjin)Windows窗口:3.SDK开发基础共八十五页Windows消息机制: Windows程序是靠消息驱动的。系统为每一个应用程序窗口创建一个消息队列。这个队列用来存放该程序可能需要的各种不同的窗口消息。程序中有一小段叫做(jiozu)消息循环的代码,用来从队列中取出讯息,并且将它们发送给相应的窗口消息处理函数。但是有些消息是直接发送给窗口消息处理函数的,不用放入消息队列中。(4)处理窗口(chungku)消息:3.SDK开发基础共八十五页例子:S

9、DK建立(jinl)一个窗口程序HelloWin程序(chngx):(1)定义程序入口函数和消息处理函数(2)注册窗口类型(3)创建、显示窗口(4)消息循环处理(5)处理消息WM_CREATEWM_DESTROYWM_PAINT共八十五页建立一个窗口(chungku)程序(1)定义程序入口(r ku)函数和消息处理函数WinMain函数的定义int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR pszCmdLine, int nCmdShow);窗口消息回调函数的定义LRESULT CALLBACK Wind

10、owProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);共八十五页建立(jinl)一个窗口程序(2)注册窗口(chungku)类型定义WNDCLASS调用RegisterCalss在系统中注册改窗口类型窗口类型 结构说明WNDCLASS系统定义了两个版本,即普通ASCII和Unicode版本结构定义共八十五页注册窗口(chungku)类型 WNDCLASS结构说明结构定义共八十五页建立一个窗口(chungku)程序(3)创建窗口(chungku)、显示窗口(chungku)定义HWND窗口句柄调用CreateWindow函数创建该窗

11、口共八十五页(3)创建窗口、显示窗口使用ShowWindow函数显示所创建的窗口函数定义:BOOLShowWindow(HWNDhWnd, intnCmdShow )当CreateWindow创建窗口后,窗口并没有显示出来,必须通过调用该函数显示出窗口。使用UpdateWindow刷新窗口函数定义:BOOL UpdateWindow( HWND hWnd ) 对于(duy)以SW_SHOWNORMAL参数显示的窗口来说,调用该函数刷新显示。共八十五页(4)消息循环处理消息循环实际就是一个while循环的消息处理代码while( GetMessage ( &msg, NULL, 0, 0 ) )

12、 使用GetMessage函数从消息队列中获得消息函数定义:BOOLGetMessage(LPMSGlpMsg, HWNDhWnd, UINTwMsgFilterMin, UINTwMsgFilterMax ); 通过该函数,从消息队列中提取(tq)属于该窗口类的消息,只要不是接收到WM_QUIT消息,其返回值都是非零值。共八十五页(4)消息循环处理(chl) 消息循环MSG结构定义共八十五页(4)消息循环处理使用TranslateMessage函数对消息进行解析(ji x) BOOLTranslateMessage(const MSG*lpMsg )使用DispatchMessage函数发送

13、消息到消息处理函数,由系统调用该窗口的消息处理函数LRESULTDispatchMessage(const MSG*lpmsg )消息调用方式:在Windows中窗口中发生的一切都以消息的方式传给窗口消息处理函数。然後,窗口消息处理函数以某种方式响应这个消息,或者将消息传给DefWindowProc,进行系统内部缺省处理。共八十五页队列化的消息:是由Windows放入消息队列中的,消息被“发送”给消息队列。基本上由用户输入的产生,例如:按键(如WM_KEYDOWN和WM_KEYUP消息)、按键产生的字符(WM_CHAR消息)、鼠标移动(WM_MOUSEMOVE消息)和鼠标按键(WM_LBUTT

14、ONDOWN消息)时钟消息(WM_TIMER消息)、更新消息(WM_PAINT消息)和退出消息(WM_QUIT消息)而非队列化的消息则“发送”给窗口(chungku)消息处理程序,来自调用特定的Windows函数。例如:当WinMain调用CreateWindow时,Windows给窗口消息处理函数发送一个WM_CREATE消息。当WinMain调用ShowWindow时,Windows将给窗口消息处理函数发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain调用UpdateWindow时,Windows发送WM_PAINT消息。菜单选择产生的消息WM_COMMAND。队列(du

15、li)化消息与非队列(duli)化消息共八十五页Hello Windows完整(wnzhng)例子 helloWin.c共八十五页共八十五页共八十五页总结(zngji)一个基于(jy)窗口的Windows应用程序:应用程序窗口窗口过程消息循环用户输入共八十五页练习(linx)练习(linx)1调试HelloWin程序,熟悉SDK程序构架。共八十五页4.MFC程序开发基础(jch)(1)什么是MFC? Microsoft 提供的 C+ 库,它位于任何 Windows API 之上,是对API有效的封装。能够使程序员的工作更容易。该库的主要优点是效率高。它减少了大量在建立 Windows 程序时必

16、须编写的代码。同时它还提供了所有一般 C+ 编程的优点,例如继承和封装。MFC 是可移植的,因此,MFC是很值得(zh d)推荐的开发Windows 应用程序的方法。共八十五页4.MFC程序开发基础(jch)(2)MFC构架(u ji) 类向导创建程序框架编译/链接生成可执行程序Visual StudioCApp类CFrame类CDoc类CView类修改框架菜单工具条定制添加新类消息函数定制共八十五页4.MFC程序开发基础(jch)(3)MFC单文档构架(u ji) 共八十五页4.MFC程序开发基础(jch)(3)MFC单文档创建(chungjin)步骤共八十五页类结构(jigu)视图资源(z

17、yun)结构视图文件结构视图共八十五页MFC类结构:应用程序管理(gunl)类CHelloApp:public CWinApp主类,负责程序入口,创建边框、文档、视图等。文档管理类CHelloDoc:public CDocument管理应用程序的文档和数据应用程序视图类CHelloView:public CView管理客户区的视图显示边框类CMainFrame:public CFrameWnd管理程序边框:菜单、工具条、状态栏等。4.MFC程序开发基础(jch)共八十五页CWinApp程序(chngx)入口函数共八十五页CWinApp程序入口(r ku)函数InitInstance()CWin

18、App程序出口(ch ku)函数ExitInstance()共八十五页CMainFrame类:边框(binkung)管理Mainfrm.hCMainFrame类:OnCreate()共八十五页CView类:视图类(客户区绘图)几个(j )重要的消息函数WM_SIZE消息:窗口(chungku)大小改变WM_PAINT消息:窗口重绘(刷新)WM_LBUTTONDOWN消息:鼠标左键按下WM_LBUTTONUP消息:鼠标左键放开共八十五页WM_RBUTTONDOWN消息(xio xi):鼠标右键按下WM_RBUTTONUP消息(xio xi):鼠标右键放开WM_MUSEMOVE消息:鼠标移动WM_

19、LBUTTONDBLCLK消息:鼠标左键双击WM_RBUTTONDBLCLK消息:鼠标右键双击CDoc文档类:应用程序文件及数据管理文档类序列化函数Serialize():从文件载入数据和保存数据到文件共八十五页练习:通过MFC向导创建单文档、多文档和对话框窗口程序(chngx)。理解分析MFC应用程序执行机制。共八十五页MFC绘图基础实例:MFC简单(jindn)绘图程序(1)创建一个单文档程序(chngx),绘制以下图形共八十五页实例:MFC简单绘图(hu t)程序(1)MFC绘图(hu t)基本知识:MFC的设备DC(Device Context):设备上下文或者设备环境,设备描述表。类

20、似于画家绘图的工具箱,包括了绘图所需的画笔、颜料及相关的工具。MFC的DC类包括:常量定义、绘图函数。MFC绘图必备:窗口对象和DC。 凡是可见的界面元素都是从Windows的窗口基类CWnd派生,都可作为绘图的窗口对象 共八十五页 DC对象的获取: CDC *pDC = M.GetDC(); (此处M是一个Windows可视对象,如CView类,CDialog类。省略表示当前窗口对象) CClientDC dc(this); /this指针表示当前窗口 CDC类的绘图函数: Rectangle(int x1,int y1,int x2,int y2);/绘矩形 MoveTo(int x1,i

21、nt y1);LineTo(int x2,int y2); /绘直线 Ellipse(int x1,int y1,int x2,int y2);/绘制(huzh)园/椭圆 SelectObject(GdiObject *); /使用GDI对象,如画笔,画刷,位图等共八十五页重要的结构体类CRect:矩形对象类 CRect的四个成员:int left;int right;int top;int bottom; 获取对象窗口大小(dxio): M.GetClientRect(CRect *);/M为一窗口对象,默认为当前窗口共八十五页绘图重要的消息(xio xi)函数WM_PAINT:窗口更新、覆

22、盖遮挡、最大化最小化等发生时,可能引起窗口内容的改变,系统发送WM_PAINT消息给窗口,通知窗口重绘。WINDOWS默认的重窗口绘方式是用背景填充(tinchng)窗口。如果窗口刷新时希望绘制自己的图形,需要重载WM_PAINT消息函数,并在消息函数中绘制图形。CView类的WM_PAINT消息函数已映射到OnDraw()中实现,不需要另外再添加。共八十五页映射消息函数(hnsh)过程12.选择(xunz)类3.选择类4.选择消息5.添加消息函数共八十五页在OnDraw函数(hnsh)中绘图窗口对象:CView视图类DC设备:从消息(xio xi)WM_PAINT中获取,并传递到OnDraw

23、(CDC *pDC)共八十五页练习:通过MFC向导(xingdo)创建单文档应用程序,完成以上简单绘图。共八十五页应用程序资源(zyun):菜单、工具条、光标、图标使用资源步骤:(1)使用资源面板创建(chungjin)&编辑资源(如菜单、工具条);(2)映射菜单/工具条相应的函数;(3)编辑函数。共八十五页实例(shl):MFC简单绘图程序(2)使用鼠标在屏幕上绘制折线、矩形、圆(椭圆),并保持(boch)到文件,而且可以从保存的文件中打开绘制。要求:(1)通过菜单或者工具条选择绘制状态(2)不同的绘制状态显示不同的光标,鼠标双击或右键结束绘制。(3)通过“打开和另存为”菜单将绘制图形保存到

24、文件,或者从文件读入重绘。共八十五页实现(shxin)步骤:(1)创建菜单(ci dn)、工具条和光标(2)添加直线、矩形和园(椭圆)数据结构与类(3)定义图形对象数组(4)OnDraw中绘制图形数组(5)映射菜单工具条函数,切换鼠标状态。(6)重载OnMouseMove操作,实现动态可视绘制过程;(7)响应右键结束绘制,添加图形到数组(8)响应打开与另存为菜单;共八十五页实现(shxin)步骤:(2)添加直线、矩形和园(椭圆)数据结构与类。CPline:折线类;CRectObj:矩形类;CEllipseObj:椭圆类一个动态数组保存(bocn)三种(或多种)对象,并且按统一接口实现不同对象的

25、绘制、保存(bocn)及载入等操作,需采用虚函数以多态方式实现。创建基类CDrawObj:定义纯虚函数。共八十五页折线(zhxin)类:矩形(jxng)类:共八十五页共八十五页共八十五页创建菜单与工具条:(1)创建资源(2)映射消息函数 COMMAND消息:响应点击(din j)菜单命令 UPDATE_COMMAND_UI消息:响应菜单状态更新(checked,enable/disable)文档类定义(dngy)图形数组:HelloDoc.h共八十五页响应鼠标函数(1)WM_LBUTTONDOWN /鼠标左键按下 获取(huq)一个点坐标,保存到临时CPLine对象共八十五页(2)WM_RBU

26、TTONDOWN: 鼠标右键按下,添加(tin ji)CPline对象到数组中。共八十五页在OnDraw中绘制(huzh):CHelloView.cpp共八十五页文档类中修改Serialize(.)函数(hnsh),实现从文件打开与保存共八十五页共八十五页修改光标:(1)创建光标资源(zyun):资源视图-Insert Resource-Cursor(2)载入光标资源:/载入自定义光标资源HCURSOR LoadCursor(int resource_id);/载入系统定义的光标HCURSOR LoadStandardCursor(int resource_id);共八十五页(3)重载消息函数

27、OnSetCursor(.):如果光标不在客户区内(q ni),缺省的实现将光标设为箭头;如果是在客户区内(q ni),则将光标设为注册的类光标。SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)hCursor)/设置当前窗口光标共八十五页连接线的动态显示:在绘制过程中,动态显示连接线。以绘制直线(zhxin)为例。在折线绘制模式下:(1)第1个鼠标点下,不显示任何线。(2)鼠标移动中,显示上一次鼠标点与当前鼠标位置直线(3)鼠标移动中,只能显示一条动态线,显示当前动态线之前,需擦除上一次显示的动态线。/定义两个点分别记录第1次和第2次光标位置CPo

28、int m_p1,m_p2;/开始绘制前,为两点赋初始状态值m_p1 = m_p2 = CPoint(-1,-1);/鼠标左键按下,m_p1赋值m_p1 = point;移动时,判断m_p1是否为空,不为空开始绘制当前连接线MoveTo(m_p1); LineTo(point);/判断m_p2是否为空,不为空则擦除上次的连接线m_p1至m_p2;绘制完后保存当前连接线留待下次擦除m_p2 = point;共八十五页擦除的实现:采用异或绘图模式。异或模式:绘制中,将当前画笔颜色(yns)与屏幕颜色(yns)进行计算。然后用计算后的颜色(yns)作为绘制颜色(yns)。同一种颜色(yns)在屏幕上

29、绘制两次则实现擦除。设置绘图模式:CDC:SetROP2(int mode);R2_COPYPEN 直接模式R2_NOTXORPEN 异或模式共八十五页MFC对话框(1)对话框资源(zyun):面板和控件。(2)对话框类:CDialog共八十五页静态(jngti)文本StaticText组合(zh)框GroupBox复选框CheckBox下拉框ComboBox滚动条Scroll BarTree Control树形控件微调按钮Spin滑动条Slider列表控件List Control标签页Tab ControlPicture图片EditBox编辑框Button按钮Radio单选钮List Box

30、列表框VScrollBar垂直滚动条Progress进度条共八十五页对话框应用(yngyng)例子通过菜单,弹出对话框窗口,对当前绘制(huzh)的线型(实线|虚线|点划线)、粗细和颜色进行设置默认按钮默认按钮组合框静态文本输入框下拉框PictureCStatic控件共八十五页对话框应用(yngyng)例子(1)创建对话框资源及控件(2)创建对话框类class CLineSetDlg : public CDialog映射(yngsh)控件变量:通过ClassWizard类向导,把控件和变量关联起来对话框资源ID颜色框控件下拉框控件线宽度两种变量类型:值类型,控件类型共八十五页对话框应用(yngyng)例子(3)映射(yngsh)对话框消息函数BOOL CLineSetDlg:OnInitDialog() 添加到下拉列表共八十五页(4)映射颜色框控件消息(xio xi)函数需要先修改控件ID名称(默认为IDC_STATIC)修改控件Styles属性:勾选Notify映射Event消息:BN_CLICKED共八十五页(5)添加OK按钮命令函数直接双击按钮添加消息函数并修改重要的对话框函数UpdateData(.)UpdateD

温馨提示

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

评论

0/150

提交评论