




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows程序设计基础 第四章Windows图形界面 4 1基础知识 创建主窗口 创建Win32工程 创建其他工程 intAPIENTRYWinMain HINSTANCEhInstance 本模块的实例句柄HINSTANCEhPrevInstance Win16时代句柄LPSTRlpCmdLine 命令行参数intnCmdShow 主窗口初始化时的显示方式 TODO Placecodehere return0 入口函数 lpCmdLine nCmdShow的值都是由CreateProcess函数的参数lpCommandLine dwCreationFlags指定 创建窗口后 就要对窗口的行为负责 操作系统不断的向应用程序发送消息 通知它发生了什么事情 当Windows向程序发送消息时 它调用程序中的一个函数 这个函数的参数精确地描述了Windows发送的消息 在程序中称其为窗口函数或消息处理函数 它是一个自定义的回调函数 原形如下 LRESULTCALLBACKWindowProc HWNDhwnd UINTuMsg WPARAMwParam LPARAMlParam Windows的消息驱动 4 2消息驱动 回调函数 回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数 一般用于截获消息 获取系统信息或处理异步事件 应用程序把回调函数的地址指针告诉DLL 而DLL在适当的时候会调用该函数 回调函数必须遵守事先规定好的参数格式和传递方式 否则DLL一调用它就会引起程序或系统的崩溃 通常情况下 回调函数采用标准WindowsAPI的调用方式 即 stdcall 当然 DLL编制者可以自己定义调用方式 但客户程序也必须遵守相同的规定 在 stdcall方式下 函数的参数按从右到左的顺序压入堆栈 除了明确指明是指针或引用外 参数都按值传递 函数返回之前自己负责把参数从堆栈中弹出 intmain intargc char argv HWNDhWnd FindWindow NULL 无标题 记事本 if hWnd NULL SendMessage hWnd WM CLOSE 0 0 return0 示例 消息简单的说就是指通过输入设备向程序发出指令要执行某个操作 具体的某个操作是你写的一系列代码 称为消息处理函数 在SDK中消息其实非常容易理解 当窗口建立后便会有一个函数 窗口处理函数 开始执行一个消息循环 我们还可以清楚的看到消息处理的脉络 一个switchcase语句就可以搞定 消息循环直到遇到WM QUIT消息才会结束 其余的消息均被拦截后调用相应的处理函数 但在封装了API的MFC中 消息似乎变的有些复杂了 我们看不到熟悉的switchcase语句了 取而代之的是一个叫消息映射的东西 消息 在现在的程序开发活动中 一个程序是否拥有多个窗体 主窗口就算只有一个 那菜单 工具条 控件这些都是子窗口 需要写很多个switchcase 并且还要为每个消息分配一个消息处理函数 这样做非常复杂 因此MFC采用了一种新的机制 利用一个数组 将窗口消息和相对应的消息处理函数进行映射 你可以理解成这是一个表 这种机制就是消息映射 这张表在窗口基类CWnd定义 派生类的消息映射表如果你没有动作它是空的 也就是说如果你不手工的增加消息处理函数 则当派生窗口接受一个消息时会执行父类的消息处理函数 这样做显然是高效的 消息映射 1 Windows消息此类消息主要包括以前缀WM 开头的消息 WM COMMAND除外 Windows消息由窗口和视图处理 此类消息往往带有用于确定如何处理消息的参数 消息类别 2 控件通知此类消息包括从控件和其他子窗口发送到其父窗口的WM COMMAND通知消息 例如 当用户在编辑控件 EditControl 中执行可能更改文本的操作后 该编辑控件 EditControl 将向其父级发送包含EN CHANGE控件通知代码的WM COMMAND消息 该消息的窗口处理程序以某种适当的方式响应此通知消息 例如在控件中检索该文本 框架像传送其他WM 消息一样传送控件通知消息 但是有一个例外的情况 即当用户单击按钮时由按钮发送的BN CLICKED控件通知消息 该消息被作为命令消息特别处理 并像其他命令一样传送 消息类别 3 命令消息此类消息包括用户界面对象 菜单 工具栏按钮和快捷键 发出的WM COMMAND通知消息 框架处理命令的方式与处理其他消息不同 可以使用更多种类的对象处理命令 消息类别 Windows消息和控件通知消息由窗口来处理 窗口是从CWnd类派生的类的对象 包括CFrameWnd CMDIFrameWnd CMDIChildWnd CView CDialog以及从这些基类派生的您自己的类 这些对象封装了HWND Windows窗口的句柄 命令消息可以由范围更广的对象 文档 文档模板以及应用程序对象本身 处理 而不仅仅由窗口和视图处理 当某一命令直接影响到某个特定对象时 应当让该对象处理此命令 例如 文件 菜单中的 打开 命令在逻辑上与应用程序相关联 该应用程序接收到此命令时会打开指定的文档 因此 打开 命令的处理程序是应用程序类的成员函数 命令消息比较常见的便是菜单项和工具条了 它的消息映射宏和窗口消息不太一样 一般的形式是这样的ON COMMAND id memberFxn 消息处理 还有一种消息叫通知消息 例如树型控件的等一些复杂的控件在单击后需要传递更多的信息 例如光标的位置和当前项的一个结构 所以MFC为控件的每个通知消息也定义了一个宏 它如下 ON CONTROL EN CHANGE id memberFxn 消息处理 MFC定义了下面的两个主要结构 AFX MSGMAP ENTRYstructAFX MSGMAP ENTRY UINTnMessage Windows消息的ID号UINTnCode 控制消息的通知UINTnID Windows控制消息的IDUINTnLastID 表示是一个指定范围的消息被映射的范围UINTnSig 表示消息的动作标识AFX PMSGpfn 指向消息处理函数的指针 MFC提供的消息结构 AFX MSGMAPstructAFX MSGMAP ifdef AFXDLLconstAFX MSGMAP PASCAL pfnGetBaseMap elseconstAFX MSGMAP pBaseMap endifconstAFX MSGMAP ENTRY lpEntries AFX MSGMAP可以得到基类的消息映射入口地址和得到 本身的消息映射入口地址 1 AfxCbtFilterHook截获消息 这是一个钩子函数 2 AfxCbtFilterHook把窗口过程设定为AfxWndProc 3 函数AfxWndProc接收Windows操作系统发送的消息 4 函数AfxWndProc调用函数AfxCallWndProc进行消息处理 5 函数AfxCallWndProc调用CWnd类的方法WindowProc进行消息处理 MFC下消息的处理过程 一个标准的消息处理程序是这个样子的在CWnd类中预定义了标准Windows消息 WM XXXXWM是WINDOWMESSAGE的缩写 的默认处理程序 类库基于消息名命名这些处理程序 例如 WM PAINT消息的处理程序在CWnd中被声明为 afx msgvoidOnPaint afx msg关键字通过使这些处理程序区别于其他CWnd成员函数来表明C virtual关键字的作用 但是请注意 这些函数实际上并不是虚拟的 而是通过消息映射实现的 所有能够进行消息处理的类都是基于CCmdTarget类的 也就是说CCmdTarget类是所有可以进行消息处理类的父类 CCmdTarget类是MFC处理命令消息的基础和核心 如何添加自己的消息 若要重写基类中定义的处理程序 只需在派生类中定义一个具有相同原型的函数 并创建此处理程序的消息映射项 通过ClassWizard可以建立大多数窗口消息或自定义的消息 通过ClassWizard可以自动建立消息映射 和消息处理函数的框架 我们只需要把我们要做的事情填空 添加你要做的事情到处理函数 但是也许需要添加一些ClassWizard不支持的窗口消息或自定义消息 那么就需要亲自动手建立消息映射和消息处理的框架 通常步骤如下 步骤 第一步 定义消息 Microsoft推荐用户自定义消息至少是WM USER 100 因为很多新控件也要使用WM USER消息 defineWM MYMESSAGE WM USER 100 第二步 实现消息处理函数 该函数使用WPRAM和LPARAM参数并返回LPESULT LPESULTCMainFrame OnMyMessage WPARAMwParam LPARAMlParam TODO 处理用户自定义消息 填空就是要填到这里 return0 第三步 在类头文件的AFX MSG块中说明消息处理函数 AFX MSG CMainFrame afx msgLRESULTOnMyMessage WPARAMwParam LPARAMlParam AFX MSGDECLARE MESSAGE MAP 第四步 在用户类的消息块中 使用ON MESSAGE宏指令将消息映射到消息处理函数中 ON MESSAGE WM MYMESSAGE OnMyMessage 可以看出 用户自定义的消息和我们通过ClassWizard添加的消息一样 都是利用了ON MESSAGE宏 建立的消息映射 步骤 1 注册窗口类RegisterClassEx2 创建窗口CreateWindowEx3 在桌面显示窗口ShowWindow4 更新窗口客户区UpdateWindow5 进入无限的消息获取和处理的循环 首先是获取消息GetMessage 如果有消息到达 则将消息分派到回调函数处理DispatchMessage 如果是WM QUIT 则GetMessage函数返回FALSE 整个消息循环结束 消息的具体处理过程在MainWndProc函数中进行 显示一个窗口的具体步骤 1 注册窗口类RegisterClassEx2 创建窗口CreateWindowEx3 在桌面显示窗口ShowWindow4 更新窗口客户区UpdateWindow5 进入无限的消息获取和处理的循环 首先是获取消息GetMessage 如果有消息到达 则将消息分派到回调函数处理DispatchMessage 如果是WM QUIT 则GetMessage函数返回FALSE 整个消息循环结束 消息的具体处理过程在MainWndProc函数中进行 显示一个窗口的具体步骤 typedefstructtagMSG HWNDhwnd 消息要发送的窗口句柄UINTmessage 消息标识符 以WM 开头的预定义值WPARAMwParam 消息的参数之一LPARAMlParam 消息的参数之二DWORDtime 消息放入消息队列的时间POINTpt 这是一个POINT数据结构 表示消息放入消息队 列时的鼠标位置 MSG PMSG MSG结构 使用资源菜单和图标接受键盘输入接受鼠标输入设置文本颜色和背景色 4 3一个简单打字程序 图形设备接口 GDI GraphicsDeviceInterface 是Windows的子系统 它负责在视频显示器和打印机上显示图形和格式化的文本 设备环境 DeviceContext 4 4GDI基本图形 获取设备环境是应用程序输出图形的先决条件 常用的两种方法是调用函数BeginPaint或GetDC 应用程序响应WM PAINT消息进行图形刷新时 主要通过调用BeginPaint函数获取设备环境hdc BeginPaint hwnd 调用BeginPaint函数 由BeginPaint函数获取的设备环境要用EndPaint函数释放BOOLEndPaint HWNDhwnd PAINTSTRUCT ps 如果绘图工作并非由WM PAINT消息驱动 则调用GetDC函数获取设备环境 hdc GetDC hwnd 调用GetDC函数 由GetDC函数获取的设备环境必须用ReleaseDC函数释放voidReleaseDC HWNDhwnd GDI包括几百个函数调用和结构 大概可以分为如下几个大类 获取和释放设备描述表的函数前面的章节已经较详细地介绍过这类函数 例如 函数GetDC和BeginPaint用于获取设备描述表句柄 函数Release和EndPaint用于释放该描述表句柄 获得设备描述表信息的函数这类函数最接近硬件 为了使设计的程序有更好的适用性和可移植性 最好能在编写程序时了解硬件设备信息 使编写出的程序受硬件的限制和影响尽可能小 读者已经接触过这类函数 如GetDeviceCaps用于获取有关设备描述表信息 GetTextMetric用于获取设备描述表中的字体的信息 GDI函数简介 使用GDI对象的函数WindowsGDI有6种可创建的GDI对象 它们是画笔 画刷 位图 字体 区域和调色板 有许多用于创建这些对象的函数和结构 例如 函数CreatePen用于创建逻辑画笔 函数CreateBitmap用于创建GDI位图 画笔 画刷和字体这三种GDI对象已经介绍过 在以后的章节将接触到其他三种GDI对象 设置和获取设备描述表属性的函数设备描述表的属性决定有关绘图函数如何工作的细节 并且涉及到程序绘图的各个方面 这些属性对应用程序的输出结果影响很大 使用时要多加斟酌 设置合适的设备描述表属性 GDI绘图函数这些函数是程序执行绘图工作的真正部分 前面介绍的各类GDI函数和属性的使用都是在为使用这类函数做准备 当然 这类函数也很多 有画点 画线 绘制矩形和椭圆等 Windows中的几种坐标体系1 屏幕坐标屏幕坐标描述物理设备 显示器 打印机等 的一种坐标体系 坐标原点在屏幕的左上角 X轴向右为正 Y轴向下为正 度量单位是象素 原点 坐标轴方向 度量单位都是不能够改变的 2 设备坐标 又称物理坐标 设备坐标是描述在屏幕和打印机显示或打印的窗体的一种坐标体系 默认的坐标原点是在其客户区的左上角 X轴向右为正 Y轴向下为正 度量单位为象素 原点和坐标轴方向可以改变 但是度量单位不可以改变 3 逻辑坐标逻辑坐标是在程序中控制显示 打印使用的坐标体系 该坐标系与定义的映射模式密切相关 默认的映射模式是MM TEXT 我们可以通过设置不同的映射模式来改变该坐标体系的默认行为 映像模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和y方向 程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况 映射模式 窗口 对应逻辑坐标系上程序员设定的区域视口 对应实际输出设备上程序员设定的区域 坐标系统 逻辑坐标系统 设备坐标系统 应用程序可获取设备环境的当前映像模式 并根据需要设置映像模式 相关函数 设置设备环境的映像模式SetMapMode hdc nMapMode nMapMode为映像模式的整型标识符 获取当前设备环境的映像模式nMapMode GetMapMode hdc 窗口区域的定义由SetWindowExtEx函数完成 其函数原型形为 BOOLSetWindowExtEx HDChdc intnHeight intnWidth 以逻辑单位表示的窗口区域高宽度LPSIZElpSize 函数调用前窗口区域尺寸的SIZE结构地址 视口区域的定义由SetViewportExtEx函数完成 函数原型为 BOOLSetViewportExtEx HDChdc intnHeight 定义域 intnWidth 值域 以物理设备单位表示的新视口区域高宽度LPSIZElpSize 只有在映射模式为MM ANISOTROPIC和MM ISOTROPIC时才有意义 视口的缺省原点和窗口的缺省原点均为 0 0 可通过调用函数SetViewportOrgEx和SetWindowOrgEx设定窗口与视口的原点 SetWindowOrgEx函数的原形为 BOOLSetWindowOrgEx HDChdc intX Y 以逻辑单位表示的窗口原点坐标LPPOINTlpPoint 函数调用前原点坐标的POINT结构的地址 绘图工具与颜色 1 画笔 1 画笔的创建使用画笔之前必须事先定义一个画笔句柄 形式如下 HPENhP 然后调用函数GetStockObject获取Windows系统定义的四种画笔例如获取画笔BLACK PEN的形式如下 hP HPEN GetStockObject BLACK PEN WHITE PENBLACK PENDC PENNULL PEN 2 创建新画笔 形式如下 hP CreatePen intnPenStyle 确定画笔样式intnWidth 画笔宽度COLORREFrgbColor 画笔颜色 创建画笔后 必须调用SelectObject函数将其选入设备环境 SelectObject hdc hP hP为所创建或获取的画笔句柄 不再使用当前画笔时 需删除画笔 以免占内存DeleteObject hP PS DASH 虚线PS DASHDOT 点划线PS DASHDOTDOT 双点划线PS DOT 点线PS INSIDEFRAME 实线PS NULL 无PS SOLID 实线 2 画刷画刷的创建与应用与画笔很相似 操作画刷也包括创建 选入设备环境和删除 1 画刷的创建使用画刷需事先定义一个画刷句柄 形式如下 HBRUSHhBr hBr为画刷句柄然后调用函数GetStockObject获取Windows系统提供的7种画刷hBr HBRUSH GetStockObject nBrushStyle 画刷样式 BLACK BRUSH黑色画刷DKGRAY BRUSH深灰色画刷GRAY BRUSH灰色画刷HOLLOW BRUSH虚画刷LTGRAY BRUSH亮灰色画刷NULL BRUSH空画刷WHITE BRUSH白色画刷 指定颜色画刷如何获得 可调用函数CreateSolidBrush和CreateHatchBrush创建画刷 hBr CreateSolidBrush rgbColor 创建具有指定颜色的单色画刷 创建指定阴影图案和颜色的画刷 2 选入设备环境创建画刷后 通过SelectObject hdc hBr 将其选入设备环境 3 删除画刷不使用画刷时 可用DeleteObject hBr 删除画刷 释放内存 3 颜色 Windows使用宏RGB定义绘图的颜色 其形式为 RGB nRed nGreen nBlue 红色值 蓝色值 绿色值 RGB 255 0 0 RGB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年天津市宝坻区事业单位招聘39人笔试备考题库及参考答案详解
- 纺织服饰创意设计创作规定
- 水利工程水质监测规定
- 楼盘销售渠道营销计划制定
- 人身保险价格制度
- 嵌入式系统模块化设计原则
- 冲床模具设计手册
- 离婚后子女抚养权及财产分割执行细则协议
- 煤矿开采承包合同及地质勘查服务协议
- 知识产权归属与保密协议范本(适用于软件开发)
- 制鞋工艺流程
- 土石方工程运输合同
- 国际伤口治疗师汇报
- 《电工基础(第2版)》中职全套教学课件
- 河道清淤与水生态恢复方案
- 2024-2025大学英语考试六级汉译英中英对照
- 铂类化疗药物配置
- 2024-2025学年广东省深圳实验学校高中园高一(上)第一次段考数学试卷(含答案)
- 2024-2025学年天津市和平区双菱中学七年级(上)第一次月考数学试卷
- ISO9001-2015质量管理体系内审培训课件
- 《无线电失效程序》课件
评论
0/150
提交评论