第3章Windows编程基础

上传人:cn****1 文档编号:567925039 上传时间:2024-07-22 格式:PPT 页数:73 大小:943KB
返回 下载 相关 举报
第3章Windows编程基础_第1页
第1页 / 共73页
第3章Windows编程基础_第2页
第2页 / 共73页
第3章Windows编程基础_第3页
第3页 / 共73页
第3章Windows编程基础_第4页
第4页 / 共73页
第3章Windows编程基础_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《第3章Windows编程基础》由会员分享,可在线阅读,更多相关《第3章Windows编程基础(73页珍藏版)》请在金锄头文库上搜索。

1、 前一页 休息 前一页 休息 前一页 休息第3章 Windows编程基础编程基础河北经贸大学信息技术学院VC+程序设计1 前一页 休息本章导读本章导读uWindows操作系统是一个多任务、面向对象的图形操作系统。u在Windows操作环境中, Windows应用程序采用“基于消息的事件驱动基于消息的事件驱动”运行机制,这是它与过去的面向过程的应用程序机制的不同之处。l面向过程的编程方式:程序执行的流程遵从程序员预先规定的路径.l面向对象的Windows程序执行顺序取决于事件事件和消息发生的顺序和消息发生的顺序。uWindows应用程序设计的重点是编写事件和编写事件和消息的处理程序消息的处理程序

2、。2 前一页 休息本章主要内容本章主要内容v事件驱动与事件驱动与windows消息系统消息系统 vWindows窗口窗口vwin32 程序开发流程程序开发流程 vMFC概述概述 vMFC应用程序框架结构应用程序框架结构 vMFC消息处理消息处理3 前一页 休息3.1事件驱动与事件驱动与windows消息系统消息系统 程序开始程序结束消息源1消息源2消息源n是否退出派送消息捕获消息处理消息是否.图图3.1 事件驱动的程序模型事件驱动的程序模型4 前一页 休息Windows消息消息 vWindows消息消息 v消息来源消息来源 5 前一页 休息Windows消息系统消息系统v消息队列消息队列 v消

3、息驱动模型消息驱动模型 v句柄句柄v消息的格式消息的格式 v创建消息循环创建消息循环 窗口1窗口函数WndPros用户交互内核USER消息队列窗口2窗口函数WndPros消息队列消息1 消息2 消息3图图3.2 消息驱动模型消息驱动模型6 前一页 休息编写编写Windows应用程序必须首先了解以下内容:应用程序必须首先了解以下内容:(1)窗口的概念窗口的概念 (2)事件驱动的概念事件驱动的概念(3)消息消息 (4) 句柄句柄 对象是对象是Windows的规范部件的规范部件窗口窗口菜单菜单按钮按钮对话框对话框程序模块程序模块编写编写Windows程序相当一部分工程序相当一部分工作是在创建对象和作

4、是在创建对象和为对象属性赋值为对象属性赋值对象特征:具有规范形态和操作模式对象特征:具有规范形态和操作模式编程方法编程方法传统编写法传统编写法-API交互式方法交互式方法-MFC3.2 Windows窗口窗口 7一个应用程序的窗口一般包含下列组成部分:一个应用程序的窗口一般包含下列组成部分:窗口边界窗口边界工作区工作区控制菜单框控制菜单框下拉菜单下拉菜单水平滚动条水平滚动条垂直滚动条垂直滚动条最大化按钮最大化按钮最小化按钮最小化按钮标题栏标题栏1. 窗口窗口8 前一页 休息v窗口是由应用程序创建的一个用于接收用户接收用户输入和显示输出的矩形区域输入和显示输出的矩形区域。是系统管理应用程序的基本

5、单位。v窗口由“非客户区”和“客户区”组成。v非客户区由系统绘制,包括菜单、工具栏、最大化按钮等。客户区由应用程序绘制,用于输出数据和接受用户的输入。v编写一个Windows应用程序首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换数据处理与数据交换的过程。窗口窗口9 前一页 休息Windows程序设计是针对事件或程序设计是针对事件或消息消息的处理进行的处理进行 。 消息是描述事件发消息是描述事件发生的信息生的信息如按下鼠标或键盘如按下鼠标或键盘Windows对消息有一套严格的定义对消息有一套严格的定义,并在其产生时并在其产生时将

6、其发送给所有相关的应用程序将其发送给所有相关的应用程序,这些消息用于驱这些消息用于驱动应用程序运行以实现一定的功能。动应用程序运行以实现一定的功能。Windows程序的执行顺序取决于程序的执行顺序取决于事件发生的顺序事件发生的顺序,程序的执行顺序是由顺序产生的消息驱动的,但是程序的执行顺序是由顺序产生的消息驱动的,但是消息的产生往往并不要求有次序之分。消息的产生往往并不要求有次序之分。事件驱动事件驱动10 前一页 休息消息驱动机制派送消息消息源1消息源2消息源n否程序开始程序结束捕获消息是否退出消息是处理消息11 前一页 休息3 消息v消息的含义v消息来源v消息队列v消息的结构消息是关于所发生

7、的事件的通知.事件是一个动作,如按下鼠标、选择菜单输入消息、控制消息、系统消息、用户消息USER用户交互内核 来管理12 前一页 休息 Windows应用程序的结构是基于消息驱动模型基于消息驱动模型,程序的,程序的任何一个动作都是在接收到一条消息后发生的任何一个动作都是在接收到一条消息后发生的,如:WM_KEYDOWN WM_KEYUP WM_CHAR WM_LBUTTONDOWN WM_LBUTTONUP WM_PAINT WM_COMMAND等,每条消息都可以带有参数(wParam,lParam)。 大部分的消息都关联到某个窗口,每个窗口都有一个消息处理过程(函数),属于某个窗口的消息都将

8、由相应的消息处理过程来进行处理。 每个Windows应用程序都有一个消息队列,Windows系统会把属于各个应用程序的消息放入各自的消息队列,应用程序不断地从自己的消息队列中获取消息并把它们发送到相应的窗口处理过程。这个循环(取消息-处理消息)一直到用户以某种方式(如:关闭应用程序的主窗口)结束程序而终止。下面给出了Windows应用程序的一个框架:消息的含义消息的含义13消息队列消息队列 应用程序1窗口函数WndProc消息映射默认窗口函数DefWndowProcApp1消息队列 App2消息队列 App3消息队列 系统队列输入消息系统消息postpostMessageMessageSend

9、SendMessageMessageUSER用户交互内核14 前一页 休息消息的结构定义:消息的结构定义:typedeftypedef structstruct tagMSGtagMSG HWND hwnd;接收消息的接收消息的窗口句柄,为窗口句柄,为null,则可检索所有驻留在消息队列中的消息则可检索所有驻留在消息队列中的消息 UINT message;UINT message;消息值,由消息值,由Windows.h头文件中的宏定义来标识头文件中的宏定义来标识 WPARAM wParam;32WPARAM wParam;32位位消息的附加信息消息的附加信息wParam和和lParam,不同消

10、息其值有所不同不同消息其值有所不同 LPARAM LPARAM lParamlParam; ; DWORD time; DWORD time; 指定消息送至队列的时间指定消息送至队列的时间 POINT pt;POINT pt;指定消息发送时屏幕光标的位置,指定消息发送时屏幕光标的位置, 其数据类型其数据类型POINT是一个结构体是一个结构体MSG;MSG;消息号消息号:由事先定义好的消息名标识由事先定义好的消息名标识字参数字参数(wParam),长字参数长字参数(lParam) : 用用 于提供消息的于提供消息的附加信息附加信息消消息息附加信息附加信息与具体消息号的值有关,与具体消息号的值有关

11、,对于控件,对于控件,typedeftypedef structstruct tagPOINTtagPOINT LONG xLONG x; LONG y;LONG y; POINT; POINT;消息的结构消息的结构15 前一页 休息常用句柄类型及其说明常用句柄类型及其说明句柄是一个句柄是一个4字节长的数值,用于标识字节长的数值,用于标识应用程序中不同的应用程序中不同的对象对象和和同类对象中不同类对象中不同的实例同的实例窗口窗口按钮按钮图标图标滚动条滚动条输出设备输出设备控制控制文件文件应用程序通过应用程序通过句柄访问相应句柄访问相应的对象信息的对象信息HWNDHWND窗口句柄窗口句柄HDCH

12、DC 设备环境句柄设备环境句柄HBITMAPHBITMAP 位图句柄位图句柄HCURSOR HCURSOR 光标句柄光标句柄HICONHICON图标句柄图标句柄HFONTHFONT 字体句柄字体句柄HMENUHMENU菜单句柄菜单句柄HPENHPEN 画笔句柄画笔句柄HFILEHFILE文件句柄文件句柄HBRUSHHBRUSH 画刷句柄画刷句柄HINSTANCEHINSTANCE当前实例句柄当前实例句柄句柄句柄16 前一页 休息一个完整的一个完整的Windows应用程序应用程序通常由通常由四种类型四种类型的的文件组成。文件组成。1.C1.C语言源程序文件语言源程序文件2.2.头文件头文件3.3

13、.资源描述文件资源描述文件4.4.项目文件项目文件3.3 win32 程序开发流程程序开发流程 一个一个一个一个windowswindows应用程序常具有以下特性:应用程序常具有以下特性:应用程序常具有以下特性:应用程序常具有以下特性:(1 1)消息驱动机制)消息驱动机制)消息驱动机制)消息驱动机制 (2 2)图形设备界面()图形设备界面()图形设备界面()图形设备界面(GDIGDI) (3 3)基于资源的程序设计基于资源的程序设计基于资源的程序设计基于资源的程序设计 (4 4) 动态链接库动态链接库动态链接库动态链接库17 前一页 休息入口函数入口函数WinMain窗口函数窗口函数WndPr

14、ocWndProcWindows应用程序应用程序构成基构成基本框架本框架包含各种包含各种数据类型、数据类型、数据结构数据结构与函数等与函数等源程序组成结构源程序组成结构18 前一页 休息(1) WinMain函数函数三个基本的组成部分:三个基本的组成部分:函数说明函数说明、初始化初始化和和消息循环消息循环功功能能注册窗口类,建立窗口及执行必要的初始化注册窗口类,建立窗口及执行必要的初始化进入消息循环,根据接受的消息调用相应的处理过程进入消息循环,根据接受的消息调用相应的处理过程当消息循环检索到当消息循环检索到WM_QUIT时终止程序运行时终止程序运行WinMain()()函数,相当于函数,相当

15、于main()19 前一页 休息 WndProc函数由一个或多个函数由一个或多个switch语句组成。每语句组成。每一条一条case语句对应一种消息,当应用程序接收到一个语句对应一种消息,当应用程序接收到一个消息时,相应的消息时,相应的case语句被激活并执行相应的响应程语句被激活并执行相应的响应程序模块。序模块。WndProc包含了对各种可能接收到的消息的处理过程包含了对各种可能接收到的消息的处理过程定义定义了应用程序对接收到的不同消息的响应了应用程序对接收到的不同消息的响应(2) 窗口函数窗口函数WndProc和消息处理和消息处理20 前一页 休息开始执行初始化应用初始化和创建应用窗口进入

16、消息循环并从消息队列得到一个消息当前消息是否WM_QUIY?终止执行程序是否定义了对此消息的处理进行默认处理处理消息NNYYWindowsWindows应用程序的执行过程应用程序的执行过程应用程序的执行过程应用程序的执行过程21 前一页 休息 在在Windows.hWindows.h中中定义了定义了WindowsWindows 应用程序中包含种类繁多应用程序中包含种类繁多的数据类型的数据类型数据类型数据类型22 前一页 休息MSG:包含一个消息的全部信息,是消息发送的格式包含一个消息的全部信息,是消息发送的格式WNDCLASS:包含一个窗口类的全部信息及属性包含一个窗口类的全部信息及属性POI

17、NT:定义了屏幕上或窗口中的一个点的定义了屏幕上或窗口中的一个点的X和和 Y坐标坐标RECT:定义了一个矩形区域及其左上角和右下角的坐标定义了一个矩形区域及其左上角和右下角的坐标几几种种重重要要的的结结构构一些重要的数据结构一些重要的数据结构23 前一页 休息Windows API编程举例#include #include #include int GetRoot(float a, float b, float c, double *root)/ 求一元二次方程的根,函数返回实根的值 double delta, deltasqrt; delta = b*b - 4.0 * a * c; if

18、(delta0.0) return 0;/ 无实根 deltasqrt = sqrt(delta); if (a!=0.0) root0 = (-b + deltasqrt)/(2.0 * a);root1 = (-b - deltasqrt)/(2.0 * a); elsereturn 0; if (root0 = root1) return 1; else return 2;LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); /声明窗口过程24 前一页 休息WinMain()()函数函数vint WINAPI WinMain (HI

19、NSTANCE hInstance, HINSTANCE hPrevInstance,v LPSTR lpCmdLine, int nCmdShow)vv HWND hwnd ;/ 窗口句柄窗口句柄v MSG msg ;/ 消息消息v WNDCLASSwndclass ;/ 窗口类窗口类v wndclass.style = CS_HREDRAW | CS_VREDRAW ;v wndclass.lpfnWndProc = WndProc ;v wndclass.cbClsExtra = 0 ;v wndclass.cbWndExtra = 0 ;v wndclass.hInstance = h

20、Instance ;v wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;v wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;v wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;v wndclass.lpszMenuName = NULL ;v wndclass.lpszClassName = SDKWin;/ 窗口类名窗口类名v if (!RegisterClass (&wndclass)/ 注册窗口注册窗口v

21、v MessageBox (NULL, 窗口注册失败!窗口注册失败!, HelloWin, 0) ;v return 0 ;v 与窗口函数关联25 前一页 休息v/ 创建窗口创建窗口v hwnd = CreateWindow (SDKWin, / 窗口类名窗口类名v 实验实验1Windows编程基础编程基础,/ 窗口标题窗口标题v WS_OVERLAPPEDWINDOW, / 窗口样式窗口样式v CW_USEDEFAULT, / 窗口最初的窗口最初的 x 位置位置v CW_USEDEFAULT, / 窗口最初的窗口最初的 y 位置位置v CW_USEDEFAULT, / 窗口最初的窗口最初的

22、x 大小大小v CW_USEDEFAULT, / 窗口最初的窗口最初的 y 大小大小v NULL, / 父窗口句柄父窗口句柄v NULL, / 窗口菜单句柄窗口菜单句柄v hInstance, / 应用程序实例句柄应用程序实例句柄v NULL) ; / 创建窗口的参数创建窗口的参数v ShowWindow (hwnd, nCmdShow) ;/ 显示窗口显示窗口v UpdateWindow (hwnd) ;/ 更新窗口,包括窗口的客户区更新窗口,包括窗口的客户区v while (GetMessage (&msg, NULL, 0, 0) v vTranslateMessage (&msg) ;

23、/ 转换某些键盘消息转换某些键盘消息v DispatchMessage (&msg) ;/ 将消息发送给窗口过程,这里是将消息发送给窗口过程,这里是WndProcv v return msg.wParam ;v进入消息循环,并将消息发送给窗口过程WndProc26 前一页 休息窗口函数WndProc( )vLRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)vv HDChdc; /设备环境设备环境v PAINTSTRUCTps; /绘图结构绘图结构v staticHWNDhwndButt

24、on, hwndEdit; /按钮、编辑框句柄按钮、编辑框句柄v charstrEdit80, strA380, strHint80, str80=“”; /提示信息提示信息v floata3; /方程的方程的3个系数个系数v doubleroot2; /方程的方程的2个实根个实根v inti, j, k, m; /循环变量,计数器循环变量,计数器v switch (message)v v case WM_CREATE:/ 窗口创建产生的消息窗口创建产生的消息v hwndEdit = CreateWindow(“edit”, NULL, /创建编辑框创建编辑框v W S_CHILD|WS_VI

25、SIBLE|WS_BORDER,10, 60, 200, 25, v hwnd, NULL, NULL, NULL );v hwndButton = CreateWindow(“button”, “计计 算算”, /创建按钮创建按钮v WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 240, 60, 80, 25,v hwnd, NULL, NULL, NULL );v return 0 ; v case WM_DESTROY:/ 当窗口关闭时产生的消息当窗口关闭时产生的消息v PostQuitMessage (0) ;v return 0 ;27 前一页 休息v cas

26、e WM_COMMAND:/ 命令消息,控件产生的通知代码在命令消息,控件产生的通知代码在wParam的高字中的高字中vif (HWND)lParam = hwndButton )&( HIWORD(wParam) = BN_CLICKED )v / 按下按钮按下按钮 / 获取编辑框控件的内容获取编辑框控件的内容,并将其转换成并将其转换成float数值数值vGetWindowText( hwndEdit, strEdit, 80); / 获取编辑框内容获取编辑框内容vk = 0;m = 0;vfor (j=0; j80; j+)vv if (strEditj = ,) k+; m = 0;v

27、else vstrAkm = strEditj;vm+;v v vfor (i=0; i3; i+)v ai = (float)atof(strAi);/ 将字符串转换成将字符串转换成float数值数值vint n = GetRoot(a0, a1, a2, root); /调用调用GetRoot函数,计算方程根函数,计算方程根vif (nInitInstance()调 用 ProcessShellCommand()创建主框架窗口对象、视图对象、文档对象,创建主框架窗口和视图窗口并显示CWinThread:Run()WM_QUIT消息循 环结束pApp- Run()CHelloApp theA

28、ppCWinApp *pApp=AfxGetApp();WinMainpApp-InitApplication();37 前一页 休息利用AppWizard生成MFC应用程序 v创建工程创建工程:用VisualC+的MFC AppWIzard创建应用程序的基本框架v可视化设计可视化设计:用VC+ 自带的工具软件Wizards,制作Windows风格的图形用户界面和各种控件。v编写程序代码编写程序代码:用MFCClassWizard添加消息相应函数,然后编写函数代码。38 前一页 休息单文档应用程序 Ex_SDIHello的建立v创建工程 “File/New/Project/MFC AppWiz

29、ard(exe)”Project name:” Ex_SDIHello ”;Location:”d:MyVC”根据向导选择:Single document中文中国None其它接受默认设置,最后单击“ Finish”,显示“New Project Information”窗口。 39 前一页 休息Ex_SDIHello应用程序 v编写程序代码编写程序代码“Workspace/FileView/Ex_SDIHello View.cpp”找到函数OnDraw(CDC *pDC),在其中添加显示字符串:pDC-TextOut(100,80,” Hello,Visual C+6.0 ! !”);40 前

30、一页 休息Ex_SDIHello应用程序 v编译运行编译运行 编译: “Build/Build Ex_SDIHello.exe” 运行:“Build/Execute Ex_SDIHello.exe”v 关闭:关闭运行窗口41 前一页 休息Ex_SDIHello应用程序分析 打开“Workspace”窗口中的”Class View( 类视图),MFC生成5个类CAboutDlgCMainFrameCEx_SDIHelloAppCEx_SDIHelloDocCEx_SDIHelloView 对于每个类MFC生成两个文件:.h:定义了类和它的各种变量、函数原形;.cpp:生成类对象、实现这个类的函数

31、体。42 前一页 休息Ex_SDIHello应用程序分析 CEx_SDIHelloApp类:类:派生于MFC的CWinApp类,作用是初始化应用程序及运行该程序的所需的成员函数。Ex_SDIHello.h:声明了CEx_SDIHelloApp类,虚函数InitInstance()的作用:设置注册数据库,载入标准设置(最近打开的文件列表等)、注册文档模板,其中在注册文档模板时隐含创建了主窗口接下来处理命令行参数,显示窗口,然后返回、进入消息循环。43 前一页 休息Ex_SDIHello应用程序分析 CMainFrame类:类:派生于MFC的CFrameWnd类,作用是管理应用程序的窗口,显示标题

32、栏、状态栏、工具栏等,同时处理针对窗口操作的信息。MainFrm.h:声明了两个主要函数PreCreateWindow()和OnCreate()及两个对象m_wndStatusBar(管理状态栏)和m_wndToolBar(管理工具栏) 44 前一页 休息Ex_SDIHello应用程序分析 CEx_SDIHelloDoc类类:派生于MFC的CDocument类,作用是存放应用程序的数据以及文件的保存加载功能。文档类要通过视图类来实现与用户的交互。CEx_SDIHelloDoc.h:声明了三个主要函数OnNewDocument()用于初始化文档 Serialize()串行化(保存和装入)文档 D

33、ump()用于调试诊断。45 前一页 休息Ex_SDIHello应用程序分析 CEx_SDIHelloView类:类:派生于MFC的CView类,作用是管理视图窗口,它对应的对象在框架窗口中实现用户数据的显示和打印。Ex_SDIHelloView.h:声明了三个函数用于实现数据打印OnPreparePrinting()/ OnBeginPrinting()/ OnEndPrinting()。 GetDocument():返回CMyHelloDoc指针,获取文档指针 OnDraw():实现视图数据的显示和刷新。46 前一页 休息Ex_SDIHello应用程序分析 预编译头文件预编译头文件stda

34、fx.h:用于建立一个预编译的头文件Ex_SDIHello.pch和一个预定义的类型文件stdafx.obj,加速编译过程。资源文件:Resource.h Ex_SDIHello.ioc:应用程序的图标 Ex_SDIHello.rc2:不可直接编辑的资源 Toolbar.bmp:工具栏用到的位图资源 Ex_SDIHelloDov.ico:生成文档的图标 ReadMe.txt47 前一页 休息3.6 MFC消息处理vMFC应用程序与其他任何 Windows 程序一样,也使用消息驱动机制,但 MFC 提供的消息处理机制使得消息的处理更加容易。vMFC中消息可以分为三类: Windows 消息(窗口

35、消息):包括以 WM_开头的消息,但 WM_COMMAND 除外。Windows消息由窗口和视图处理。这种消息通常附带一些参数传递给处理函数,这些参数为处理函数正确地处理消息提供了必要的信息。控件通知消息控件通知消息:当控件的状态发生改变(例如用户利用控件进行输入)时,控件就会向其父窗口发送控件通知消息。MFC对控件通知消息的传递方式与其他以WM_开头的 Windows 消息一样,但 BN_CLICKED 是个例外,该消息的传递方式与命令消息的传递机制一样。命令消息命令消息:包括来自于菜单、工具栏中的按钮和加速键等用户界面对象的WM_COMMAND 通知消息。48 前一页 休息消息映射v声明

36、宏 DECLEAR_MESSAGE_MAP() (.h文件) BEGIN_MESSAGE_MAP() /实现(.cpp) . ON_Message(ID, ClassMethod) END_MESSAGE_MAP()v消息映射项 ON_Message(ID, ClassMethod) 窗口消息、命令消息、控件通知消息的消息映射项不同v消息处理方法 afx_msg void ClassMethod();v发送消息SendMessage() 直接调用窗口函数v寄送消息PostMessage()到队列49 前一页 休息 VC中存在几种系统定义的消息分类,不同的前缀符号经常中存在几种系统定义的消息分类

37、,不同的前缀符号经常用于消息宏识别消息附属的分类,系统定义的消息宏前缀如下:用于消息宏识别消息附属的分类,系统定义的消息宏前缀如下:BN按钮控制消息按钮控制消息CBN组合框控制消息组合框控制消息DN默认下压式按钮控制消息默认下压式按钮控制消息EN编辑控制消息编辑控制消息LBN列表框控制消息列表框控制消息SBN滚动条控制消息滚动条控制消息WM窗口消息窗口消息窗口管理消息窗口管理消息初始化消息初始化消息输入消息输入消息系统消息系统消息剪贴板消息剪贴板消息控制处理消息控制处理消息控制通知消息控制通知消息滚动条通知消息滚动条通知消息非用户区消息非用户区消息MDI消息消息DDE消息消息应用程序自定义的消

38、应用程序自定义的消息息Windows编编程常用消息程常用消息50 前一页 休息鼠标作为定位输入设备,通过鼠标单击、双击和拖鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以很容易地操作基于动功能,用户可以很容易地操作基于Windows图形图形界面的应用程序。界面的应用程序。常用鼠标消息常用鼠标消息:鼠标消息处理51 前一页 休息鼠标鼠标消息消息lParam包含了鼠标位置包含了鼠标位置低位包含鼠标位置的低位包含鼠标位置的x坐标值坐标值高位包含鼠标位置的高位包含鼠标位置的y坐标坐标wParam包含了指示各种虚键状态的值包含了指示各种虚键状态的值相当于窗口的左上相当于窗口的左上角为原点的坐

39、标值角为原点的坐标值52 前一页 休息对于鼠标消息的处理对于鼠标消息的处理要对要对Shift和和Ctrl键进行监测键进行监测case WM_LBUTTONDOWN: /按下鼠标左键按下鼠标左键 if(wParam&MK_CONTROL)&(wParam&MK_SHIFT) / wParam包含了包含了Shift和和Ctrl键值键值, /即即Shift和和Ctrl键都被按下键都被按下 break;case WM_LBUTTONUP: /释放鼠标左键释放鼠标左键 break; 不监测不监测Shift和和Ctrl键键case WM_LBUTTONDOWN: /按下按下鼠标左键鼠标左键 break;

40、case WM_LBUTTONUP:/释放鼠标左键释放鼠标左键 break; 53 前一页 休息鼠标应用程序实例鼠标应用程序实例v鼠标消息处理程序鼠标消息处理程序当用户对鼠标进行操作时,会产生响应的消息,系统将把此消息发送到对应的窗口54 前一页 休息v新建一个AppWizard(exe) MFC应用程序MyHello,其它接受默认设置 v为视图类的添加数据成员: CString m_MousePoint; /存储鼠标的方式和位置 55 前一页 休息鼠标应用程序实例鼠标应用程序实例方法:在MyHelloView.h中protected: 处 CString m_MousePoint;或右击CM

41、yHelloView类,”Add Member Variable”v在视图类的构造函数中初始化 m_MousePoint=“ “;(在MyHelloView.cpp中)v修改屏幕重画函数修改屏幕重画函数OnDraw() pDC-Textout(100.100,m_MousePoint);(在MyHelloView.cpp中或双击OnDraw()56 前一页 休息鼠标应用程序实例鼠标应用程序实例v添加鼠标消息WM_LBUTTONDOWN响应函数 类向导 菜单ViewClassWizardMessage MapsClassName:CmyHelloView(选择); Object IDs:CMyH

42、elloView (选择); Messages:WM_LBUTTONDOWN(选择);单击“Add Function” 同样方法,在CMyHelloView类中,添加鼠标消息WM_LBUTTONUP 和WM_MOUSEMOVE的响应函数vClassWizard自动为应用程序作了三件事:57 前一页 休息鼠标应用程序实例鼠标应用程序实例(1)在CMyHelloView类中添加了三个成员方法,即在MyHelloView.h 中添加了三个响应函数的原型说明 afx_msg void OnLButtonDown(UNIT nFlags,Cpoint point); afx_msg void OnLBu

43、ttonUp(UNIT nFlags,Cpoint point); afx_msg void OnMouseMove(UNIT nFlags,Cpoint point);(2)在MyHelloView.cpp中添加了个消息映射ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE()(3)在MyHelloView.cpp中添加了个响应函数的空函数体void CMyHelloView:OnLButtonDown(UNIT nFlags,Cpoint point) void CMyHelloView: OnLButtonUp(UNIT nFlag

44、s,Cpoint point ) void CMyHelloView: OnMouseMove(UNIT nFlags,Cpoint point )58 前一页 休息鼠标应用程序实例鼠标应用程序实例v编写消息响应函数代码void CMyHelloView:OnLButtonDown(UNIT nFlags,Cpoint point)m_MousePoint.Format(“鼠标左键在点(%d,%d)按下”,point.x,point.y); Invalidate();/使系统让用户区无效,从而调用重画函数OnDraw() void CMyHelloView: OnLButtonUp(UNIT

45、nFlags,Cpoint point ) m_MousePoint=“鼠标左键被释放”; Invalidate(); 59 前一页 休息鼠标应用程序实例鼠标应用程序实例void CMyHelloView: OnMouseMove(UNIT nFlags,Cpoint point )m_MousePoint.Format(“鼠标位于点(%d,%d)按下”,point.x,point.y); Invalidate();v查看结果(演示)60 前一页 休息键盘消息处理程序当用户对键盘进行操作时,会产生响应的消息,系统将把此消息发送到对应的窗口改造MyHello程序,添加相应键盘的字符输入v声明视图

46、类的数据成员 int m_nLine;/存储回车次数 CString m_strDisplay;/存储当前行输入的字符v在视图类的构造函数中初始化 m_nLine=0;v添加键盘消息WM_CHAR响应函数 “View/ClassWizard/Message Maps(消息映射)” ClassName:CmyHelloView; Object IDs:CMyHelloView; Messages:WM_CHAR; 单击“Add Function”,在CMyHelloView类中,添加键盘消息WM_CHAR 的响应函数 61 前一页 休息(1)在CMyHelloView类中添加了一个成员方法,即在

47、MyHelloView.h 中添加了一个响应函数的原型说明 afx_msg void OnChar(UNIT nChar,UINT nReCnt,Unit nFlags);(2)在MyHelloView.cpp中添加了一个消息映射ON_WM_CHAR()(3)MyHelloView.cpp中添加了一个响应函数的空函数体void CMyHelloView: OnChar(UNIT nChar,UINT nReCnt,Unit nFlags) 键盘消息处理实例键盘消息处理实例ClassWizard自动为应用程序作了三件事62 前一页 休息v编写消息响应函数代码void CMyHelloView:

48、OnChar(UNIT nChar,UINT nReCnt,Unit nFlags) if(nChar=VK_RETURN)/如按回车键 m_strDisplay.Empty();/清空变量 m_nLine+;/行数加一 else m_strDisplay+=nChar; /将输入的字符添加到变量m_strDisplay的尾端 CClientDC dc(this); /获取客户区设备环境 dc.TextOut(0,m_nLine*20,m_strDisplay); Cview:OnChar(nChar,nRepCnt,nFlags); 按键的字符代码值重复击键的次数扫描码和键转换后的状态键盘消

49、息处理实例键盘消息处理实例63 前一页 休息查看结果(演示)键盘消息处理实例键盘消息处理实例64 前一页 休息v技术要点对应位含义07扫描码8扩展键910未使用1112Windows内部使用13组合状态14前一个键的状态15释放/按下状态常用虚拟键盘码虚拟键名称对应键盘键VK_UP光标上移VK_DOWN光标下移VK_LEFT光标左移VK_RIGHT光标右移VK_HOMEHomeVK_ENDEndVK_PRIORPageUpVK_NEXTPageDownVK_RETURN 回车nFlag功能描述表功能描述表键盘消息处理实例键盘消息处理实例65 前一页 休息v技术要点 1、定义用户消息的ID co

50、nst WM_USERMSG=WM_USER+n; 2、消息处理函数(声明与定义) 3、消息映射 4、用户消息的发送-在某函数中发送自定义消息 BOOL PostMessage(HWND hWnd,UNIT Msg,WPARAM wParam,LPARAM lParam)调用 :PostMessage(hWnd,WM_USERMSG,0,0);自定义消息处理实例自定义消息处理实例最好从100开始66 前一页 休息自定义消息处理自定义消息处理v例如在MyHello.exe程序中添加如下功能当用户单击光标上移键时,程序发出用户自定义消息,在对应的消息响应函数中,弹出消息对话框。(演示)改造MyHe

51、llo程序,添加相应键盘的字符输入v定义用户消息和消息响应函数 (1) 在MyHelloView.h中类的声明上面加入如下声明 const WM_USEMSG=WM_USER+100; /定义用户消息的ID(标识符) (2) 在MyHelloView.h中的公有段添加 void OnMyFunction(); /声明用户消息响应函数 在MyHelloView.cpp中编写OnMyFunction()代码 void CMyHelloView: OnMyFunction() MessageBox(“恭喜你,消息发送成功!”);67 前一页 休息自定义消息处理实例自定义消息处理实例v(3) 添加消息

52、映射在CMyHelloView.cpp的类的消息映射中加入有关语句 ON_MESSAGE(WM_USERMSG,OnMyFunction) v(4)用户消息的发送v 当用户按下光标上移键时,程序发出用户自定义消息,在对应的消息响应函数中,弹出消息对话框。v 添加WM_KEYDOWN消息响应函数 “View/ClassWizard/Message Maps(消息映射)” ClassName:CmyHelloView; Object IDs:CMyHelloView; Messages:WM_KEYDOWN; 单击“Add Function”v 编写发送自定义消息代码 void CMyHelloV

53、iew: OnKeyDown(UNIT nChar,UINT nReCnt,Unit nFlags) HWND hWnd=GetSafeHwnd(); if(nChar=VK_UP) :PostMessage(hWnd,WM_USERMSG,0,0); return; 68 前一页 休息自定义消息处理实例自定义消息处理实例查看结果(演示) 69 前一页 休息PostMessage()vThe PostMessage function places (posts) a message in the message queue associated with the thread that cre

54、ated the specified window and then returns without waiting for the thread to process the message. Messages in a message queue are retrieved by calls to the GetMessage or PeekMessage function. vBOOL PostMessage( HWND hWnd, / handle of destination window vUINT Msg, / message to post vWPARAM wParam, /

55、first message parameter vLPARAM lParam / second message parameter ); v其中其中vhWnd Handle to the window whose window procedure is to receive the message. Two values have special meanings: ValueMeaningHWND_BROADCASTThe message is posted to all top-level windows in the system, including disabled or invis

56、ible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.NULLThe function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.vMsg Specifies the message to be posted. vwParam Specifies addi

57、tional message-specific information. vlParam Specifies additional message-specific information. vReturn ValuesvIf the function succeeds, the return value is nonzero.vIf the function fails, the return value is zero. To get extended error information, call GetLastError. 70 前一页 休息CWnd:PostMessagevBOOL

58、PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );vReturn ValuevNonzero if the message is posted; otherwise 0.vParametersvmessagevSpecifies the message to be posted.vwParamvSpecifies additional message information. The content of this parameter depends on the message being posted.vlP

59、aramvSpecifies additional message information. The content of this parameter depends on the message being posted.71 前一页 休息CWindow:SendMessagevLRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );vstatic LRESULT SendMessage( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )

60、 说明vSends the specified message to this window. The SendMessage member function calls the window procedure directly and does not return until that window procedure has processed the message. This is in contrast to the PostMessage member function, which places the message into the windows message queue and returns immediately. 7273

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号