第3章 编写Windows应用程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如:#define WM_MOUSEMOVE 0x0200 //Mouse移动
#define WM_LBUTTONDOWN 0x0201 //Mouse左键按下 Windows消息的类型:
1、 KB消息;2、Mouse消息;3、系统消息;
1~3的系统预定义消息取值范围为0x0000~0x03ff和0x8000~0xbfff4 (Windows系统保留使用)。
参数说明: nChar-ANSI字符集代码[wParam] 若用KeyDown消息处理函数,则nChar参数为按键的虚键码。 注:虚键码(Virtual Key)是Windows OS内部建立的与设备无关 的键盘代码;
nRepCnt-按键重复次数[lParam参数的0~15bit: (LOW)lParam]
(二) 用ClassWizard(类向导)建立消息映射 在编写基于框架结构的MFC Windows程序中,使用 最 频 繁 的 工 具 就 是 ClassWizard 。 程 序 员 利 用 ClassWizard填写实施细节,选择把哪些消息映射给哪 些类的对象,然后实现这些映射,即利用它管理类和 Windows消息。
3.4 消息的检测
例:运行VC++的[Spy++]间谍程序,看看消息的检测。 操作步骤: Step 1 : [ 开 始 ]->[ 程 序 ]->[Microsoft Visual Studio 6.0]-> [Microsoft Visual Studio 6.0 Tools]->单击[Spy++]。 Step 2:[Spy]->[Messages…],弹出[Message Option]对话框,将 [靶]状图形(Finder Tool:右边的图形)拖到接收消息的窗口。 现将其拖到桌面,即让桌面接收消息。 Step 3:单击[Ok]钮关闭[Message Option]对话框。
常见的RGB颜色组合罗列如下:
颜色
红 兰 紫
RGB宏
RGB(255,0,0) 绿 RGB(0,0,255) 黄 RGB(255,0,255) 青 RGB(0,255,0) RGB(255,255,0) RGB(0,255,255)
灰 白
RGB(128,128,128) RGB(255,255,255)
接着,操作Mouse就可在[Messages]对话框中看到产生的消息 了。
3.5 VC预定义的Windows程序扩充数 据类型
3.5.1 常用基本数据类型
1.BOOL(int)
32位布尔值,真用TRUE表示,假用FALSE表示。 2.INT(int) 32位带符号整数。 3.BYTE(unsigned char)
nFlags-按键标志
b15~b5 b4 b3 b2 b1 b0
该标志取值可以是:
⊙MK_CONTROL(b3) 标志[Ctrl]键按下。 ⊙MK_LBUTTON(b0) 标志MOUSE左键按下。 ⊙MK_MBUTTON(b4) 标志MOUSE中键按下。 ⊙MK_RBUTTON(b1) 标志MOUSE右键按下。 ⊙MK_SHIFT(b2) 标志[Shift]键按下。
开始 生成应用程序对象 WinMain 初始化实例 消息循环
CWinApp::Initinstance
CWinApp::Run Message Pump
WM_QUIT?
CWinApp::ExitInstance 结束
退出应用程序
开始 有可用的 消息吗? N 空闲处理 Y
CWinThread::PumpMessage
Get/Trans/DispatchMessage
Y
有可用的 消息吗? N Y 有空闲 任务吗?
N 等待直到产生消息
Leabharlann Baidu
图:MFC Windows消息循环执行顺序流程图 MFC Windows消息循环由CWinApp::Run函数实现,消息循环执 行顺序见图所示。
3.3 MFC Windows应用程序消息处 理机制的建立
4、用户自定义消息
内部消息:0x0400~0x7fff
如:#define WM_USER 0x400 外部消息:0xc000~0xffff
○图形设备接口
GDI(图形设备接口:Graphical Device Interface)与设备驱动程序 实现了与设备无关的操作。(见图所示) 应用程序
DC
物理硬件
0~15bit:记录键被按下的次数。
nFlags-按键标志[lParam 参数的16~31bit: (HIGH)lParam] 16~23bit:OEM扫描码(OEM:Original Equipment Manufacturer),各厂商可能不同。
//单击Mouse处理 void CMainFrame::OnLButtonDown(UINT nFlags,CPoint point) { if((nFlags&MK_SHIFT)&&(nFlags&MK_CONTROL)) {//同时按下[Ctrl]、[Shift]键的处理 CString str="[Ctrl]、[Shift]、Mouse同时按下"; MessageBox(str); } CFrameWnd::OnLButtonDown(nFlags,point); }
利用ClassWizard可以往AppWizard所产生的应用程 序框架中添加新的类和函数,也可以对现存的类进行 修改及创建类成员变量等。
ClassWizard允许程序员浏览自己应用程序中所有与 用户接口对象相关的消息,并且允许为这些消息快速 地定义消息处理函数,同时ClassWizard会自动更新消 息映射。用户接口对象的类型可分为三类,它们与相 应的消息一一对应(见表)。
GDI
设备驱动程序
图形物理设备
图:图形设备接口 图中,DC(设备环境/设备上下文:Device Context)是物理设备 (如显示器、打印机等)的逻辑模型,GDI是DC和设备驱动程序 之间的隔离层(或叫做抽象接口)。
在MFC程序设计中,文字和图形的输出可由CDC和 CgdiObject类的相关成员函数实现。 ○基于资源的程序设计 ○动态链接库技术 许 多 Windows 应 用 程 序 广 泛 采 用 DLL ( 动 态 链 接 库 : Dynamic Linking Library)技术。DLL的实质是一个可执行模块,但它本身 不能自己运行,使用时将它驻留内存由其它应用程序调用,使用 完毕可将其从内存中释放。 *.DLL文件的位置可以是: 1、 Windows/System文件夹 2、 PATH所指定的文件夹 3、 当前应用程序所在的文件夹
表:对象类型与对应的消息 对象类型
窗口类
对应消息
窗口消息
如WM_PRECREATEWINDOW WM_CREATE
菜单或加速键标识符
WM_COMMAND消息
(命令处理消息)
WM_UPDATE_COMMAND_UI消息 (更新命令用户接口消息) 控件标识符 选中的控件类型的通知消息 S如EN_CHANGE消息(P138表4.10)
3.1 Windows程序的特点
○消息驱动机制 消息(Message)就是关于发生事件的信息。 从程序的观点度看,消息驱动就是由消息来驱动/响应某个函数, 消息驱动程序设计是围绕着消息的产生与处理而展开的。而DOS 程序则是过程驱动的。 Windows 系 统 中 已 预 定 义 了 7000 多 条 消 息 , 用 户 可 在 VC 的 winuser.h中找到这些消息宏定义。
黑
RGB(0,0,0)
5.LPARAM(long) 作为参数传给窗口函数的32位整数(MSG结构第4个数据项)。
6.WPARAM(unsigned int)
作为参数传给窗口函数的32位无符号整数(MSG结构第3个数据项)。 7.LONG(long)
32位带符号整数。
8.UINT(unsigned int) 32位无符号整数。 9.LPSTR(char *) 指向字符串的32位指针。 10.LPCTSTR(const char *) 指向字符串常量的32位指针。
在MFC Windows应用程序中,必须正确地建立消息处理机制。
(一) 建立消息处理机制步骤如下(可归纳为三步曲):
1、 声明消息映射 若希望能进行消息处理的类具有接收消息的能力,需要在该类的 末尾加入消息映射说明。 格式:DECLARE_MESSAGE_MAP() 2、 建立消息与处理函数之间的映射 格式:BEGIN_MESSAGE_MAP(子类名,父类名) //消息映射宏定义或消息映射语句(根据使用消息的多少,一般 有若干个) ON_…([消息名或控制号,处理函数名]) END_MESSAGE_MAP()
○多任务机制 Windows中多任务机制使用进程(Process)和线程(Thread)的概 念。
○内存管理技术
MS DOS和Windows3.2等16Bit操作系统使用分段体系结构进行内 存管理。Win32(Windows 95及以上版本)采用线性体系结构进 行内存管理。
3.2 MFC Windows应用程序典型 执行顺序流程图
Win32 OS中,有三个动态链接库构成了Win32 API的核心:
1、 USER32.DLL 负责窗口管理,包括:消息、菜单、光标、通信、定时器及 其它控制显示窗口的函数。 2、 GDI32.DLL 管理用户界面的生成和图形绘制,主要包括设备环境、字体、 位图等。 3、 KERNEL32.DLL Windows的核心,它管理内存调度、进程调度等底层功能。 扩展的DLL如OPENGL32.DLL(它有15个基本3D API函数), 许多厂商以OPENGL32为基础开发出了自己的特色产品,比较著 名的有:3D Studio MAX动画制作软件、Open Inventor仿真软件、 ProEngineer CAM软件、ARC Info GIS软件。
8位无符号数。
4.COLORREF(unsigned long) 用作表示颜色的32位值。 在Windows API中有一个RGB宏,它返回的就是这种类 型。 格式:COLORREF RGB(BYTE r,BYTE g,BYTE b) 返回:用作颜色的32位值(真彩色)。
说明:r、g、b分别用于指定红、绿、兰基色的亮度(r、 g、b取值范围为0~255且为整数)。
3.5.2 常用公用句柄类型
句柄是对象的标识或是对资源的间接引用(常用资源如MOUSE 光标、菜单等)。 1.HCURSOR MOUSE光标句柄。 2.HICON 图标句柄。 3.HMENU 菜单句柄。 4.HWND 窗口句柄。此数据类型常表示Windows环境中所打开的窗口句 柄,使用该句柄相当于引用该窗口。 5.HBRUSH
point-MOUSE光标的位置坐标 坐标值通常以窗口的左上角为原点计算。
例2:当按下键盘非系统键时,依次产生三个消息
(WM_KEYDOWN:键按下,WM_CHAR:字符消 息,WM_KEYUP:键松开)。 WM_CHAR所对应的消息处理函数原型为: afx_msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);
11.LPVOID(void *) 指向未定义类型的32位指针。 12.LRESULT(long) 来自窗口函数或回调函数的32位整数。 注:由Windows OS直接调用的函数叫回调函数。 13.WORD(unsigned short) 16位无符号整数。 14.DWORD(unsigned int) 32位无符号整数。 15.FARPROC 32位指向函数的指针。
注:消息映射宏定义将一个消息与一个处理函数关联起来,以便 对消息作出响应。
3、 在进行消息处理的类中定义各消息处理函数
消息处理函数原型为:
afx_msg 类型 函数名(WPARAM wParam,LPARAM lParam);
例1:
MOUSE左键按下消息处理函数原型为:
afx_msg void OnLButtonDown(UINT nFlags,CPoint point); 参数说明:
//键盘按键处理 void CMainFrame::OnChar(UINT nFlags) { if(nChar=='Y'||nChar=='y') nChar,UINT nRepCnt,UINT
{
CString str="[y]键按下"; MessageBox(str);
}
CFrameWnd::OnChar(nChar,nRepCnt,nFlags); }