4.MFC消息映射机制如何运用ClassWizard

合集下载

MFC 设置控件字体颜色、背景透明

MFC 设置控件字体颜色、背景透明

1.打开对应对话框的类向导ClassWizard。

2.在消息映射MessageMaps中添加消息Message:WM_CTLCOLOR。

3.然后程序代码中会添加进函数:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)4.在这个函数中添加if语句,其中的条件表达式改成想要设置的控件;比如改成: if (pWnd-> GetDlgCtrlID() == IDC_STATIC1 || pWnd-> GetDlgCtrlID() == IDC_STATIC2)注意,控件ID最好改过,如果多个控件使用同个默认ID,函数则不识别。

5.在if中添加以下语句:pDC->SetTextColor(RGB(255,255,255)); //设置字体为白色pDC->SetBkMode(TRANSPARENT); //设置背景为透明整个函数的代码如下:HBRUSH CHall::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd-> GetDlgCtrlID() == IDC_STATIC1 || pWnd-> GetDlgCtrlID() ==IDC_STATIC2 || pWnd-> GetDlgCtrlID() == IDC_STATIC3){pDC->SetBkMode(TRANSPARENT); //设置背景透明pDC->SetTextColor(RGB(255,255,255));return HBRUSH(GetStockObject(HOLLOW_BRUSH));}return hbr;}。

第四课 ClassWizard的应用

第四课 ClassWizard的应用

• • •
• CPen类,RGB()返回COLORREF值,CBrush CPen类,RGB()返回COLORREF值
类 ,CRect类 CBitmap类 , CRect类 CBitmap类 • SelectObject() 可以将画笔,画刷,字体, 位图等选进设备描述表,并返回旧的, • FromHandle() GetStock程序消息映射 WindowProc(),在文件 MFC程序消息映射 WindowProc(),在文件
WinCore.cpp中,调用OnWndMsg()函数,会去子 WinCore.cpp中,调用OnWndMsg()函数,会去子 类DECLARE_MESSAGE_MAP()上看有没有声明消 DECLARE_MESSAGE_MAP()上看有没有声明消 息处理函数,如果没有则去调用父类的处理函 数,,参看MSDN 数,,参看MSDN ◆ CDC,提供和设备上下文交互的成员函数,画图 CDC,提供和设备上下文交互的成员函数,画图 等相关函数,保存了一个 HDC句柄,CDC *cDC HDC句柄,CDC =GetDC( ); CClientDC 仅访问客户区,CWindowDC 可访问整 仅访问客户区,CWindowDC 个窗口, GetParent() 返回窗口指针GetDesktopWindow() 返回窗口指针GetDesktopWindow() GetForegroundWindow

MFC简答题

MFC简答题

简述MFC消息映射机制
MFC采用消息映射来处理消息。

绝大多数消息都可由MFC的CLassWizard 来映射。

将ClassWizard对话框切换到MessaageMaps页面,选择相应的Class Name与Object IDs选项,在Messages列表中选定消息名。

双击消息在XXX 类中自动添加了该消息的处理函数。

ClassWizard消息映射包括三个方面的内容。

一是在头文件XXX.h中声明消息处理函数;其次在XXX.cpp源文件前面的消息映射入口处,添加了相应的映射宏。

最后在XXX.cpp文件中写入一个空消息处理函数的模板以便用户填入具体代码。

简述模式对话框编程的主要步骤
(1)用MFC AppWizard[exe]生成单文档
(2)在资源视图中右击Dialog文件夹插入对话框
(3)设计对话框
右击工具栏空白处打开控件工具栏
(4)测试对话框单击编排/Test或Ctrl+T
(5)创建对话框类
在对话框模板空白处双击鼠标为对话框创建新类(或Ctrl+W)
(6)创建对话框数据成员
添加与对话框控件相关联的数据成员。

目的是接收用户输入的数据。

Ctrl+W->Member Variables
(7)在程序中使用对话框
若新建的对话框类为CDlog,在程序中使用如下代码:
CDlog dlg; //对话框类对象;
dlg.DoModal();// DoModal() :模式对话框函数用于对话框的显示与终止
(8) 在XXXView.cpp中添加头文件
如: #include “Dlog.h”。

消息处理与ClassWizard使用

消息处理与ClassWizard使用
利用应用程序向导(AppWizard)工具可 以建立哪3种类型的应用程序?
如何添加一个成员变量? 如何添加一个消息处理函数? 如何添加一个新类? 试举出Windows操作系统中的几种消息类
型?
消息应用实例
该实例所要实现的功能是,当用鼠标想要 去单击对话框上的一个按钮时,这个按钮 就会跑掉,无论怎样都抓不到它。因此, 该实例的代码大部分功能应放在鼠标移动 WM_MOUSERMOVE消息中。
ClassWizard的使用
ClassWizard是Visual C++ 6.0中一个很重 要的组成部分,基本上所有的应用程序都 需要使用到该工具。在前面内容的讲解中, 一直都使用了该工具,但一直没有系统的 介绍其使用。本节将具体讲述 ClassWizard 各 个 选 项 卡 的 内 容 及 如 何 使 用它来添加类、成员等。
❖ 窗口消息是指对Windows应用程序的窗 口进行某些操作时发送的消息。Visual C++ 6.0中,包含了如下6种窗口消息。
❖ WM_CREATE:窗口被创建。 ❖ WM_DESTROY:窗口被销毁。 ❖ WM_CLOSE:窗口被关闭。 ❖ WM_MOVE:窗口发生移动。 ❖ WM_SIZE:窗口发生改变。 ❖ WM_PAINT:窗口发生重绘。
WM_LBUTTONDOWN:用户按下左键。 WM_LBUTTONUP:用户释放左键。 WM_LBUTTONDBCLICK:用户双击左键。 WM_RBUTTONDOWN:用户按下右键。 WM_RBUTTONUP:用户释放右键。 WM_RBUTTONDBCLICK:用户双击右键。
窗口消息
不管通过哪种方式,最终都会弹出 【ClassWizard】对话框。正如读者前面 所看到的,其包括5个选项卡,分别为:

MFC消息映射机制如何运用ClassWizard

MFC消息映射机制如何运用ClassWizard

M F C消息映射机制如何运用C l a s s W i z a r d The Standardization Office was revised on the afternoon of December 13, 2020画图的基本应用:Point的应用,在mfc中的很多的位置都要用到。

只是当前点的信息,xy坐标,MoveToEx 移动位置函数The MoveToEx function updates the current position to the specified point and optionally returns the previous position.LineTo 画直线的函数CDC类,作图相关的操作GetDC,cwnd::getdc 以及cdc的释放(区别hdc),两者的范围不同,调用方式不同CClientDC 不需要显示地调用getdc和releasedc,只需要声明类的定义和类的调用。

Cliendc对象里利用view指针构造,但是调用的时候用的是对象的点调用方式。

Cwnd::getparent 获得父窗口的指针,view的父窗口是frame。

注意区别view 和framework的客户区域。

Cwindowdc类和clientdc一样自动调用getdc和releasedc。

了解他的访问客户区的范围。

Getdesktopwindow 获得桌面窗口。

创建画笔:CPen 类,设置画笔的属性,包括一些类型宽度,颜色。

CDC::SelectObject 用的过程中要保存原来的画笔指针。

创建一个阴影线的笔只能是1或更小。

(其他的注意情况看msdn)。

创建画刷:CBrush 类的方法FillRect填充矩形的区域。

CRect类,几种不同的方法。

用位图填充画刷。

CBitmap 的构造函数,没有参数。

调用之前必需初始化。

透明画刷的创建:(); 画出矩形。

空画刷:GetStockObjectCBrush::FromeHandle空画刷的实现方法:CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush *oldbrush=(brush);(CRect(org,point));(oldbrush);理解消息响应的知识:MouseMove。

MFC的消息机制的实现原理和消息处理的过程

MFC的消息机制的实现原理和消息处理的过程

下面几节将分析MFC的消息机制的实现原理和消息处理的过程。

为此,首先要分析ClassWizard实现消息映射的内幕,然后讨论MFC 的窗口过程,分析MFC窗口过程是如何实现消息处理的。

1.消息映射的定义和实现1.MFC处理的三类消息根据处理函数和处理过程的不同,MFC主要处理三类消息:∙Windows消息,前缀以“WM_”打头,WM_COMMAND例外。

Windows消息直接送给MFC窗口过程处理,窗口过程调用对应的消息处理函数。

一般,由窗口对象来处理这类消息,也就是说,这类消息处理函数一般是MFC窗口类的成员函数。

∙控制通知消息,是控制子窗口送给父窗口的WM_COMMAND通知消息。

窗口过程调用对应的消息处理函数。

一般,由窗口对象来处理这类消息,也就是说,这类消息处理函数一般是MFC 窗口类的成员函数。

需要指出的是,Win32使用新的WM_NOFITY来处理复杂的通知消息。

WM_COMMAND类型的通知消息仅仅能传递一个控制窗口句柄(lparam)、控制窗ID和通知代码(wparam)。

WM_NOTIFY能传递任意复杂的信息。

∙命令消息,这是来自菜单、工具条按钮、加速键等用户接口对象的WM_COMMAND通知消息,属于应用程序自己定义的消息。

通过消息映射机制,MFC框架把命令按一定的路径分发给多种类型的对象(具备消息处理能力)处理,如文档、窗口、应用程序、文档模板等对象。

能处理消息映射的类必须从CCmdTarget类派生。

在讨论了消息的分类之后,应该是讨论各类消息如何处理的时候了。

但是,要知道怎么处理消息,首先要知道如何映射消息。

1.MFC消息映射的实现方法MFC使用ClassWizard帮助实现消息映射,它在源码中添加一些消息映射的内容,并声明和实现消息处理函数。

现在来分析这些被添加的内容。

在类的定义(头文件)里,它增加了消息处理函数声明,并添加一行声明消息映射的宏DECLARE_MESSAGE_MAP。

mfc原理和消息映射

mfc原理和消息映射

MFC思想win32程序中创建一个窗口的过程:设计窗口阶段(由WNDCLASS结构描述部分)、窗口的注册及创建显示过程、消息循环部分。

win32用标准的C语言代码实现,是面向过程的。

在MFC中采用了面向对象的思想,即用面向对象的C++思想对以上代码进行了封装,也就是说将一些对窗口进行操作的API的函数封装到了一个类中,以下我将用简短的代码来演示一下这个过程:class CWnd{public:HWND m_hWnd;BOOL Create();BOOL ShowWindow();};BOOL CWnd::Create(){WNDCLASS wndClass;wndClass.style=CS_HREDRAW;wndClass.lpfnWndProc=(WNDPROC)DefWndProc;wndClass.cbClsExtra=0;wndClass.cbWndExtra=0;wndClass.hInstance=hInstance;wndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));wndClass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));LOGBRUSH lgbr;lgbr.lbStyle=BS_SOLID;lgbr.lbColor=RGB(192,192,0);lgbr.lbHatch=0;wndClass.hbrBackground=CreateBrushIndirect(&lgbr);wndClass.lpszMenuName=NULL;wndClass.lpszClassName="mycls";RegisterClass(&wndClass);HWND hWnd;m_hWnd=CreateWindow("mycls","窗口标题",WS_OVERLAPPEDWINDOW,0,NULL,NULL,hInstance,NULL);if(m_hWnd!=NULL)return true;elsereturn false;}BOOL CWnd::ShowWindow(){return ShowWindow(hWnd,nCmdShow);}为了保证代码和以前的执行方式一样,Winmain()函数可以写成如下形式:int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){CMyWnd m_wnd;m_wnd.Create();m_wnd.ShowWindow();MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return true;}此时,如果再写一个新的类来对剩下的代码进行封装,代码如下:class CWinApp{public:CWnd * m_pMainWnd;BOOL InitInstance();BOOL Run();CWinApp ();};CWinApp:: CWinApp (){if(InitInstance())Run();}BOOL CWinApp::InitInstance(){CWnd m_wnd;m_pMainWnd=&m_wnd;m_pMainWnd->Create();m_pMainWnd->ShowWindow();return true;}BOOL CWinApp::Run(){MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return true;}CWinApp theApp;int PASCAL WinMain() {}Windows消息的产生:1用户按键或者鼠标操作可以产生消息,如WM_KEYDOWN,WM_LBUTTONDOWN等;2系统可以自己产生消息,如,创建窗口的时候会产生WM_CREATE,WM_TIMER等;3应用程序间可以定义自己的消息,在应用程序间进行消息通讯;Windows消息的分类:1窗口消息(Windows Message):通常跟窗口的移动、创建,关闭等操作有关。

ClassWizard类向导的使用

ClassWizard类向导的使用

如: if (nFlags & MK_CONTROL) MessageBox("Ctrl键按下") ; else MessageBox ("Ctrl键没有按下") ;
【例1】在视图窗口单击鼠标左键弹出一个 “Hello, the world!”消息框。
•在头文件EXAMPLE1View.h中声明消 息处理函数OnLButtonDown: protected: //{{AFX_MSG(CEXAMPLE1View) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP( )
void CShowDlg::OnClearbtn( ) // 的函数 { // TODO: Add your control notification handler code here m_Text=“ "; UpdateData(false); } void CShowDlg::OnClosebtn( ) // 的函数 { // TODO: Add your control notification handler code here CDialog::OnOK(); }
//添加代码 } point.h point.cpp
二、ClassWizard的启动 只有在打开或创建了一个项目后,在View主菜单中才会出 现ClassWizard类向导菜单项。
启动ClassWizard有两种方式: 1、通过菜单命令,如上图; 2、通过快捷键Ctrl + W。
为对话框控件添加 管理ActiveX类所支持的 ActiveX类事件 或删除成员变量

MFC的消息反射机制

MFC的消息反射机制

MFC的消息反射机制1、消息反射解释: ⽗窗⼝将⼦窗⼝发给它的通知消息,⾸先反射回⼦窗⼝进⾏处理(即给⼦窗⼝⼀个机会,让⼦窗⼝处理此消息),这样通知消息就有机会能被⼦窗⼝⾃⾝进⾏处理。

2、MFC中引⼊消息反射的原因: 在Windows的消息处理中,⼦窗⼝的发给其⽗窗⼝的通知消息只能由其⽗窗⼝进⾏处理,这使得⼦窗⼝的⾃⾝能动性⼤⼤降低(你想,它连改变⾃⼰的背景⾊,处理⼀个⾃⾝滚动问题都要其⽗窗⼝来完成),为了解决这个问题,在MFC中引⼊了反射消息 “Reflect Message”的概念,进⾏消息反射,可以使得控制⼦窗⼝能够⾃⾏处理与⾃⾝相关的⼀些消息,增强了封装性,从⽽提⾼了控制⼦窗⼝的可重⽤性。

消息反射的处理流程(不考虑OLE控制)⼀、消息反射处理流程图: 1、⽗窗⼝收到控制⼦窗⼝发来的通知消息后,调⽤它的虚函数CWnd::OnNotify.CWnd::OnNotify()主体部分:{//此时,hWndCtrl,为发送窗⼝,即⼦窗⼝的窗⼝句柄if (ReflectLastMsg(hWndCtrl, pResult))return TRUE; // ⼦窗⼝已处理了此消息AFX_NOTIFY notify;notify.pResult = pResult;notify.pNMHDR = pNMHDR;return OnCmdMsg(nID, MAKELONG(nCode, WM_NOTIFY), ¬ify, NULL);} 分析:⾸先,调⽤ReflectLastMsg(hCtrlChildWnd,...)给⼦窗⼝⼀个⾃⾝处理的机会,将消息反射给⼦窗⼝处理,函数返回 TRUE,表明⼦窗⼝处理了此消息。

反之,表⽰⼦窗⼝未处理此消息,此时,调⽤OnCmdMsg(...)由⽗窗⼝进⾏通常的处理。

2、ReflectLastMsg中: 主要是调⽤发送窗⼝的SendChildNotifyLastMsg(...)。

【初学VC讲稿】第2篇:MFC消息映射

【初学VC讲稿】第2篇:MFC消息映射

CMyApp theApp; //应用程序对象
好了,请大家按照上篇的方法运行一下修改后的程序,是不是已经响应了鼠标左键
按下的消息。
ON_WM_PAINT()//响应WM_PAINT消息
END_MESSAGE_MAP()
【3】消息响应函数[afx_msg void OnPaint();]:即处理消息的函数。
afx_msg只是将函数标记为消息响应函数,你把它去掉程序也可以正常
运行,只不过是习惯的标记罢了!
【4】当MFC程序要处理消息时,你要告诉MFC你要处理什么消息以及在
};
//消息映射表
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_PAINT()//响应WM_PAINT消息,将会调用OnPaint()
ON_WM_LBUTTONDOWN() //响应鼠标左键按下消息,ags, CPoint point)
}
这些工作你也可以手动完成(如第1篇看到的,只不过在那一篇中我们把这些
东西都放在了MyApp.cpp文件中,应该把声名放在".h"文件中,把实现放在
".CPP"文件中,VC中就是这样管理每一个类的)!
【5】MFC程序中消息的种类:
(A)窗口消息(Window Message):
这种消息一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗口等。
响应函数:
//MyApp.cpp
#include <afxwin.h>//必要的包含文件
//主窗口类
class CMyFrameWnd : public CFrameWnd

MFC常用消息-处理函数-映射

MFC常用消息-处理函数-映射

MFC常用消息-处理函数-映射常用消息1、WM_LBUTTONDOWN产生:单击。

参数:wParam:包含一个整数值,以标识鼠标键的按下状态。

鼠标的按下标识及说明:MK_LBUTTON 标识按下鼠标左键MK_MBUTTON 标识按下鼠标中键MK_RBUTTON 标识按下鼠标右键lParam:长参数lParam的低字位包含当前坐标的x坐标,在高字节包含当前坐标的Y坐标。

相似的消息有:WM_LBUTTONUP、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_LBUTTONDBLCLK、WM_RBUTTONDBLCLK2、WM_KEYDOWN产生:按下一个非系统键的时候产生该事件,系统键是指实现系统操作的组合键,例如,Alt与某个功能键的组合以实现菜单操作等。

参数:wParam:按下键的虚拟键盘码,虚拟键码用来标识按下或者释放的是哪个键,例如功能键F1的虚拟键码在windows.h文件中定义为VK_F1。

lParam:长参数中记录了按键的重复次数,扫描码、转移代码、先前键的状态等信息。

相似的消息有WM_KEYUP:放开按下的非系统键时产生的事件。

3、WM_CHAR产生:按一个非系统键时产生。

参数:wParam:所按下的键的ASCII码。

lParam:长参数中记录了按键的重复次数,扫描码、转移代码、先前键的状态等信息。

4、WM_CREATE产生:由CreateWindow函数发出,创建窗口。

参数:wParam:没用。

lParam:包含一个指向CREATESTRUCT数据结构的指针,该结构是传递给CreateWindow函数的参数的副本。

5、WM_CLOSE产生:当关闭当前窗口时产生。

参数:wParam:未用。

lParam:未用。

6、WM_DESTROY产生:当窗口要销毁时由DestroyWindow函数发出。

参数:wParam:没用到。

lParam:没用到。

7、WM_QUIT产生:退出应用程序时由PostQuitMessage函数发出。

MFC消息映射机制剖析

MFC消息映射机制剖析

一,消息映射机制1,消息响应函数:(例:在CDrawView类响应鼠标左键按下消息)1)在头文件(DrawView.h)中声明消息响应函数原型。

//{{AFX_MSG(CDrawView) //注释宏afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//}}AFX_MSG //注释宏说明:在注释宏之间的声明在VC中灰色显示。

afx_msg宏表示声明的是一个消息响应函数。

2)在源文件(DrawView.cpp)中进行消息映射。

BEGIN_MESSAGE_MAP(CDrawView, CView)//{{AFX_MSG_MAP(CDrawView)ON_WM_LBUTTONDOWN()//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()说明:在宏BEGIN_MESSAGE_MAP()与END_MESSAGE_MAP()之间进行消息映射。

宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN与它的响应函数OnLButtonDown ()相关联。

这样一旦有消息的产生,就会自动调用相关联的消息响应函数去处理。

宏ON_WM_LBUTTONDOWN()定义如下:#define ON_WM_LBUTTONDOWN() \{ WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp, \(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(UINT,CPoint))&OnLButtonDown },3)源文件中进行消息响应函数处理。

MFC消息映射机制详解

MFC消息映射机制详解

MFC消息映射机制详解分类: MFC2010-04-18 02:22 3322人阅读评论(0) 收藏举报Windows程序和MFC程序是靠消息驱动的,他们对于消息的处理本质上是相同的。

只是Windows程序对于消息处理的过程十分清晰明了,MFC程序则掩盖了消息处理的过程,以消息映射的方式呈现在开发者面前,使得开发消息的处理十分简单。

用多了mfc就想对它的消息映射机制有一个本质的了解,下面将对消息映射做详细的分析。

当然,在分析MFC消息映射之前首先对Windows程序的消息处理过程进行一个简单的描述。

1、Windows应用程序消息处理Windows程序都维护有自己的消息队列,保存了队列消息(当然也有非队列消息,它们直接发给窗口),并用过消息循环对消息进行处理。

消息循环首先通过GetMessage取得消息并从队列中移走,对于加速键会调用TranslateAccelerator函数,对其进行翻译和处理,如果处理成功就不在调用TranslateMessage。

如果不是加速键,就进行消息的转换和派发,让目的窗口的窗口过程来处理消息。

示例代码:[cpp] view plaincopyprint?1.// 主消息循环:2.while (GetMessage(&msg, NULL, 0, 0))3.{4.if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))5.{6.TranslateMessage(&msg);7.DispatchMessage(&msg);8.}9.}真正处理消息的是所谓的窗口过程(LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)),这个函数的参数记录了过程对应的窗口、消息的ID以及参数,在其内部开发者可以实现自己需要的消息处理功能。

第四课:MFC画图-MFC消息映射机制的剖析

第四课:MFC画图-MFC消息映射机制的剖析

MFC消息映射机制的剖析,讲述如何运用ClassWizard,,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。

掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。

如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。

主要介绍一些绘图方面的知识。

程序实例:新建工程:->MFC AppWizard[exe] 文件面为Draw 选择单文档的应用程序完成之后编译运行。

画直线、画图、画刷画位图、空白画刷操作步骤●明确画图的思路:按下鼠标左键画图的原点,拖动鼠标到另外一个位置松开鼠标左键画图的终点。

●画图需要消息的捕获。

捕获的对象是鼠标左键按下WM_LBUTTONDOWN和抬起WM_LBUTTONUP的消息。

●这两消息的捕获、响应在窗口类中进行,可以在框架类Frame类中也可以在视类View类中。

●要对消息进行捕获我们需要设置一些额外的函数,这些函数MFC都有提供。

如我们在CMainFrame上点击右键选择增加windows消息处理Addwindows message handler……,选择WM_LBUTTONDOWN点击“AddHandler”添加而后点击“Edit Existing”退出。

CMainFrame message handlers 在CMainFrame最底下被创建。

具体内容详见下面程序代码。

(这段代码添加的位置是在implementation of the CMainFrame class中,文件名为CMainFrame.cpp)●为了简单说明每一步的作用这个程序做出的反应,在消息响应函数中添加一个MessageBox程序代码,这个MessageBox要比先前的WinApi中使用的少一个” HWND hWnd,”参数。

MessageBox在CWnd中是属于其中的一个成员函数,他不需要句柄因为有一个数据成员保存了和这个窗口相关的句柄。

MFC的消息映射机制与命令绕行

MFC的消息映射机制与命令绕行

所有的消息在MFC 程序中都是暗潮汹涌,但是表面无波。
MFC 把消息分为三大类:
■ 命令消息(WM_COMMAND):命令消息意味着「使用者命令程序做某些动作」。
凡由UI 对象产生的消息都是这种命令消息,可能来自菜单或加速键或工具栏
按钮,并且都以WM_COMMAND 呈现。如何分辨来自各处的命令消息?SDK程序主要靠消息的wParam 辨识之,MFC 程序则主要靠菜单项目的识别码(menu ID)辨识之-- 两者其实是相同的。什么样的类别有资格接受命令消息?凡衍生自CCmdTarget 之类别,皆有资格。从command target 的字面意义可知,这是命令消息的目的地。也就是说,凡衍生自CCmdTarget 者,它的骨子里就有了一种特殊的机制。把整张MFC 类别阶层图摊开来看,几乎构造应用程序的最重要的几个类别都衍生自CCmdTarget,剩下的不能接收消息的,是像CFile、CArchive、CPoint、CDao(数据库)、Collection Classes(纯粹数据处理)、GDI 等等「非主流」类别。
三个奇怪的宏,一张巨大的网
试着思考这个问题:C++ 的继承与多态性质,使衍生类别与基础类别的成员函数之间有着特殊的关联。但这当中并没有牵扯到Windows 消息。的确,C++ 语言完全没有考虑Windows 消息这一回事(那当然)。如何让Windows 消息也能够在对象导向以及继承性质中扮演一个角色?既然语言没有支持,只好自求多福了。消息映射机制的三个相关宏就是MFC 自求多福的结果。
■ 标准消息- 除WM_COMMAND 之外,任何以WM_ 开头的都算是这一类。任何衍生自CWnd 之类别,均可接收此消息。
■ Control Notification - 这种消息由控制组件产生,为的是向其父窗口(通常是对话盒)通知某种情况。例如当你在ListBox 上选择其中一个项目,ListBox 就会产生LBN_SELCHANGE 传送给父窗口。这类消息也是以WM_COMMAND 形式呈现。

MFC期末复习简答题及答案

MFC期末复习简答题及答案

MFC 期末复习及答案1 简述MFC 应用程序的执行过程。

2 简述文档/视图与其他类对象的关系。

3 简述MFC 消息映射机制。

4 消息WM_LBUTTONDOWN 的消息映射宏和消息处理函数是什么?5 如何自定义消息?如何发送自定义消息?6 GDI 创建哪几种类型的图形输出?7 什么是设备环境?它的主要功能有哪些?8 什么是GDI,它有什么功能?MFC 将GDI 函数封装在哪个类中?9 请叙述设备无关性的含义,实现设备无关性需要哪几个环节?10 MFC 提供了哪几种设备环境类?它们各自有什么用途?11 简述传统的SDK 获取设备环境的方法。

12 简述创建和使用自定义画笔的步骤。

13 简述采用MFC 方法编程时,显示一个DDB 位图的步骤。

14 简述菜单设计的主要步骤。

15 为应用程序创建快捷菜单主要有哪些方法?16 如何动态创建菜单?17 创建工具栏的基本步骤有哪些?18 简述MFC 创建状态栏所做的工作。

19 简述创建和使用模态对话框的主要步骤。

20 如何向对话框模板资源添加控件?如何添加与控件关联的成员变量?21 什么是DDX 和DDV?编程时如何使用MFC 提供的DDX 功能?22 简述创建属性页对话框的主要步骤。

23 在应用程序中访问控件的方法有哪些?24 单选按钮控件如何成组?25 组合框与列表框相比有什么不同?如何给组合框添加初始的列表项?26 通过哪几个主要成员函数完成文档与视图之间的相互作用?并简述这些成员函数的功能。

27 简述文档序列化与一般文件处理的区别。

28.如何让用户定义的类支持序列化?1 简述MFC 应用程序的执行过程。

MFC 应用程序启动时,首先创建应用程序对象theApp。

这时将自动调用应用程序类的构造函数初始化对象theApp,然后由应用程序框架调用MFC 提供的WinMain( )主函数。

在WinMain( )主函数中,首先通过调用全局函数GetApp( )来获取theApp 的指针pApp,然后通过该指针调用theApp 的成员函数InitInstance( )来初始化应用程序。

第五章 消息处理与ClassWizard使用

第五章 消息处理与ClassWizard使用

北京源智天下科技有限公司
1-7
联系方式:
定时器消息
Windows的定时器是一种周期性消息产生装置,当用户为 一个窗口设置了定时器资源之后,系统就会按规定的时 间间隔向窗口发送定时器消息,在这个消息中就可以处 理一些需要定期处理的事情。定时器消息只有一种: WM_TIMER,其响应函数是OnTimer。
• • •
北京源智天下科技有限公司
1-4
联系方式:
鼠标消息

• • • • • • •
与键盘消息类似,鼠标消息也是Windows应用程序中使用 最为频繁的消息之一。一般来说,Windows应用程序中的 鼠标消息主要有如下几种。 WM_MOUSEMOVE:用户将鼠标移进窗口或在窗口中移动 。 WM_LBUTTONDOWN:用户按下左键。 WM_LBUTTONUP:用户释放左键。 WM_LBUTTONDBCLICK:用户双击左键。 WM_RBUTTONDOWN:用户按下右键。 WM_RBUTTONUP:用户释放右键。 WM_RBUTTONDBCLICK:用户双击右键。
北京源智天下科技有限公司
1-15
联系方式:
综合练习

创建一个应用程序,实现以下功能:当用户的窗口为活 动窗口时按下键盘的【Enter】键时,程序出现如图524所示的提示。
北京源智天下科技有限公司
1-16
联系方式:
思考和习题
• •
• • • •
北京源智天下科技有限公司
1-12

• • •
联系方式:
使用ClassWizard添加消息处理函数
添加消息函数的方法有如下两种:一种是通过Class Wizard添加,另一种是通过右击工作台来添加。

4_消息映射的实现

4_消息映射的实现

第4章消息映射的实现4.1 Windows消息概述Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。

这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。

4.1.1 消息的分类(1)队列消息和非队列消息从消息的发送途径上看,消息分两种:队列消息和非队列消息。

队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。

这里,对消息队列阐述如下:Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。

鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。

Windows 每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。

线程消息队列接收送给该线程所创建窗口的消息。

线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。

除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。

这些队列消息以外的绝大多数消息是非队列消息。

(2)系统消息和应用程序消息从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。

系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。

4.1.2 消息结构和消息处理(1)消息的结构为了从消息队列获取消息信息,需要使用MSG结构。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.
画图的基本应用:
Point的应用,在mfc中的很多的位置都要用到。

只是当前点的信息,xy坐标,MoveToEx 移动位置函数The MoveToEx function updates the current position to the specified point and optionally returns the previous position.
LineTo 画直线的函数
CDC类,作图相关的操作
GetDC,cwnd::getdc 以及cdc的释放(区别hdc),两者的范围不同,调用方式不同CClientDC 不需要显示地调用getdc和releasedc,只需要声明类的定义和类的调用。

Cliendc对象里利用view指针构造,但是调用的时候用的是对象的点调用方式。

Cwnd::getparent 获得父窗口的指针,view的父窗口是frame。

注意区别view和framework 的客户区域。

Cwindowdc类和clientdc一样自动调用getdc和releasedc。

了解他的访问客户区的范围。

Getdesktopwindow 获得桌面窗口。

创建画笔:
CPen 类,设置画笔的属性,包括一些类型宽度,颜色。

CDC::SelectObject 用的过程中要保存原来的画笔指针。

创建一个阴影线的笔只能是1或更小。

(其他的注意情况看msdn)。

创建画刷:
CBrush 类的方法
FillRect填充矩形的区域。

CRect类,几种不同的方法。

用位图填充画刷。

CBitmap 的构造函数,没有参数。

调用之前必需初始化。

透明画刷的创建:
dc.Rectangle(); 画出矩形。

空画刷:GetStockObject
CBrush::FromeHandle
空画刷的实现方法:
CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *oldbrush=dc.SelectObject(brush);
dc.Rectangle(CRect(org,point));
dc.SelectObject(oldbrush);
理解
消息响应的知识:
MouseMove
如有侵权请联系告知删除,感谢你们的配合!
精品。

相关文档
最新文档