文档章节

MFC中的几个常用类——CWnd

zhangyujsj
 zhangyujsj
发布于 2014/12/08 10:24
字数 8044
阅读 66
收藏 0

1 窗口类

1.1 概述

CObject
└CCmdTarget
└CWnd
CWnd是MFC窗口类的 基类,提供了微软基础类库中所有窗口类的基本功能。
CWnd对象与Windows的窗口不同,但是两者有紧密联系。CWnd对象是由CWnd的 构造函数析构函数创建或销毁的。另一方面,Windows的窗口是Windows的一种内部 数据结构,它是由CWnd的Create成员函数创建的,而由CWnd的虚拟 析构函数销毁。DestroyWindow函数销毁Windows的窗口,但是不销毁对象。
CWnd类和 消息映射机制隐藏了WndProc函数。接收到的Windows通知消息通过消息映射被自动发送到适当的CWnd OnMessage成员函数。你可以在 派生类重载OnMessage成员函数以处理成员的特定消息。
CWnd类同时还使你能够为 应用程序创建Windows的子窗口。先从CWnd继承一个类,然后在 派生类中加入 成员变量以保存与你的 应用程序有关的数据。在 派生类中实现消息处理成员函数和消息映射,以指定当消息被发送到窗口时应该如何动作。
你可以经过两个步骤来创建一个子窗口。首先,调用 构造函数CWnd以创建一个CWnd对象,然后调用Create成员函数以创建子窗口并将它连接到CWnd对象。当用户关闭你的子窗口时,应销毁CWnd对象,或者调用DestroyWindow成员函数以清除窗口并销毁它的 数据结构
窗口操作是Windows编程的核心内容,它派生于CCmdTarget类,是最基本的GUI对象。我们在 屏幕上看到的一切对象都与窗口有关,它们或者派生于CWnd,属继承关系,如对话框、 工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象的关系,如图标、 菜单、显示设备。从CWnd派生的控件类,如CButton,可以被直接使用,也可以被进一步派生出其它类来。
窗口类CWnd与Windows 操作系统管理是显示(或隐藏)给用户的,作为 应用程序的一种表现形式的窗口是两个概念。前者通过一个窗口句柄操作后者,不同的操作被 封装为不同的成员函数。而后者, 操作系统为其开辟了一个内存区,存储一个 数据结构,进行管理。后者包括窗口风格、 窗口类、当前状态等信息。其实我们可以理解为CWnd是MFC中所有组件对象的父类,GetDlgItem()可以通过组件的ID号得到组件对象的地址,这里是以父类 指针CWnd*返回,如果需要使用可以强转,CWnd类封装的窗口操作主要包括窗口的创建和销毁、操作窗口风格、操作窗口状态、窗口 子类化、获取指定窗口等。
#include <afxwin.h>
请参阅: CFrameWnd, CView

1.2 CWnd类的成员

初始化
对话框项函数
初始化消息处理函数
窗口状态函数
数据绑定函数
系统消息处理函数
窗口大小和位置
菜单函数
一般消息处理函数
窗口访问函数
工具提示函数
控件消息处理函数
更新/绘图函数
定时器函数
输入消息处理函数
坐标映射函数
警告函数
非客户区消息处理函数
窗口文本函数
窗口消息函数
MDI消息处理函数
滚动函数
剪贴板函数
剪贴板消息处理函数
拖放函数
OLE控件
菜单循环通知
插字符号函数
可重载函数

下面提供CWnd的函数,以供参考和查阅。

1.数据成员

m_hWnd
指明与这个CWnd对象相关联的HWND句柄

2.构造和析构

CWnd
构造一个CWnd对象
DestroyWindow
销毁相关联的Windows窗口

3.初始化

Create
创建并初始化与CWnd对象相关联的子窗口
PreCreateWindow
在与CWnd对象相关联的窗口被创建之前调用
CalcWindowRect
调用这个函数以计算窗口客户区的矩形
GetStyle
返回当前的窗口风格
GetExStyle
返回窗口的扩展风格
Attach
将Windows句柄与CWnd对象相连接
Detach
将一个Windows句柄从CWnd对象上分离并返回这个句柄
PreSubclassWindow
在调用SubclassWindow之前,允许其它必要的子类化工作
SubclassWindow
将窗口与CWnd对象相连接,并使它通过CWnd的消息映射转发消息
UnsubclassWindow
将窗口与CWnd对象分离
FromHandle
当给定一个窗口的句柄时,返回CWnd对象的指针。如果没有CWnd对象与这个句柄相连接,则创建一个临时的CWnd对象并与之相连接
FromHandlePermanent
当给定一个窗口的句柄时,返回CWnd对象的指针。如果没有CWnd 对象与这个句柄相连接,则返回NULL
DeleteTempMap
CWinApp的空闲处理函数自动调用这个函数,清除由FromHandle创建的任何临时CWnd对象
GetSafeHwnd
返回m_hWnd,如果该指针为NULL,则返回NULL
CreateEx
创建一个Windows的可重叠窗口、弹出窗口或子窗口,并把它连接到一个CWnd对象上
CreateControl
创建一个OLE控件,该控件在MFC程序中由一个CWnd对象代表

4.窗口状态函数

IsWindowEnabled
确定一个窗口是否允许鼠标和键盘输入
EnableWindow
允许或禁止鼠标和键盘输入
GetActiveWindow
获得激活的窗口
SetActiveWindow
激活窗口
GetCapture
获得捕获鼠标的CWnd
SetCapture
使随后的鼠标输入都被发送到这个CWnd
GetFocus
获得当前具有输入焦点的CWnd
SetFocus
要求输入焦点
GetDesktopWindow
获得Windows的桌面窗口
GetForegroundWindow
返回前台窗口的指针(顶层窗口,用户正在其中工作)
SetForegroundWindow
使创建窗口的线程变为前台并激活窗口
GetIcon
获得图标的句柄
SetIcon
设置指定图标的句柄
GetWindowContextHelpId
获得帮助上下文的标识符
SetWindowContextHelpId
设置帮助上下文的标识符
ModifyStyle
修改当前的窗口风格
ModifyStyleEx
修改窗口的扩展风格

5.窗口大小和位置

GetWindowPlacement
获得窗口的显示状态以及正常(还原)的、最大化和最小化的位置
SetWindowPlacement
设置窗口的显示状态以及正常(还原)的、最大化和最小化的位置
GetWindowRgn
获得窗口的窗口区域的一个拷贝
SetWindowRgn
设置窗口的区域
IsIconic
确定CWnd是否被最小化(图标化)
IsZoomed
确定CWnd是否被最大化
MoveWindow
改变CWnd的位置和大小
SetWindowPos
改变子窗口、弹出窗口和顶层窗口的大小、位置以及顺序
ArrangeIconicWindows
排列所有最小化(图标化)的子窗口
BringWindowToTop
使CWnd到达重叠窗口堆栈的顶部
GetWindowRect
获得CWnd的屏幕坐标
GetClientRect
获得CWnd客户区域的大小

6.窗口访问函数

ChildWindowFromPoint
确定哪个子窗口包含指定的点,如果有的话
FindWindow
返回由窗口名或窗口类标识的窗口的句柄
GetNextWindow
返回窗口管理器列表中的下一个(或前一个)窗口
GetOwner
获得CWnd的拥有者的指针
SetOwner
改变CWnd的拥有者
GetTopWindow
返回CWnd所属的第一个子窗口
GetWindow
返回与窗口有特定关系的窗口
GetLastActivePopup
确定CWnd拥有的弹出窗口是否最近被激活
IsChild
指明CWnd是指定窗口的一个子窗口还是其它子对象
GetParent
获得CWnd的父窗口(如果有)
GetSafeOwner
获得给定窗口的安全拥有者
SetParent
改变父窗口
WindowFromPoint
标明包含给定点的窗口
GetDlgItem
获得指定的对话框中具有指定ID的控件
GetDlgCtrlID
如果CWnd是一个子窗口,则用这个函数来返回它的ID值
SetDlgCtrlID
为窗口(可以是任意子窗口,不仅是对话框中的控件)设置窗口ID或控件ID
GetDescendantWindow
搜索所有子窗口并返回具有指定ID的窗口
GetParentFrame
获得CWnd对象的父框架窗口
SendMessageToDescendants
将消息发送给窗口的所有子窗口
GetTopLevelParent
获得窗口的顶层父窗口
GetTopLevelOwner
获得顶层窗口
GetParentOwner
返回子窗口的父窗口的指针
GetTopLevelFrame
获得窗口的顶层框架窗口
UpdateDialogControls
调用这个函数以更新对话框按钮和其它控件的状态
UpdateData
初始化对话框或获得对话框中的数据
CenterWindow
将窗口设置到父窗口的中央

7.更新/绘图函数

BeginPaint
为绘图准备CWnd
EndPaint
标志着绘图结束
Print
在指定的设备环境中画出当前窗口
PrintClient
在指定的设备环境(通常是打印机设备环境)中画出任何窗口
LockWindowUpdate
禁止或恢复在给定窗口中的绘图
UnlockWindowUpdate
解锁用CWnd::LockWindowUpdate锁定的窗口
GetDC
获得客户区的设备环境
GetDCEx
获得客户区的显示设备环境,允许在绘图的时候进行剪裁
RedrawWindow
更新客户区中的指定矩形或区域
GetWindowDC
获得整个窗口的显示环境,包括标题条、菜单和滚动条
ReleaseDC
是否客户和窗口设备环境,使其它应用程序能够使用它们
UpdateWindow
更新客户区
SetRedraw
使CWnd的变化能够被重画,或者禁止重画发生的变化
GetUpdateRect
获得完全封闭了CWnd中更新区域的最小矩形的坐标
GetUpdateRgn
获得CWnd的更新区域
Invalidate
使整个客户区无效
InvalidateRect
在当前的更新区域中加入给定的矩形,使客户区的给定矩形无效
InvalidateRgn
在当前的更新区域中加入给定的区域,使客户区的给定区域无效
ValidateRect
在当前的更新区域中删除给定的矩形,使客户区的给定矩形有效
ValidateRgn
在当前的更新区域中删除给定的区域,使客户区的给定区域有效
ShowWindow
显示或隐藏窗口
IsWindowVisible
确定窗口是否可见
ShowOwnedPopups
显示或隐藏该窗口拥有的所有弹出窗口
EnableScrollBar
允许或禁止滚动条的一个或两个箭头

8.坐标映射函数

MapWindowPoints
将一些坐标从CWnd的坐标空间转换(映射)到其它窗口的坐标空间
ClientToScreen
将给定点或显示器上矩形的客户区坐标转换为屏幕坐标
ScreenToClient
将给定点或显示器上矩形的屏幕坐标转换为客户坐标

9.窗口文本函数

SetWindowText
将窗口的文本或标题文字(如果有)设为指定的文本
GetWindowText
返回窗口的文本或标题文字(如果有)
GetWindowTextLength
返回窗口文本或标题文字的长度
SetFont
设置当前字体
GetFont
获得当前字体

10.滚动函数

GetScrollPos
获得滚动块的当前位置
GetScrollRange
复制指定滚动条的最大和最小滚动条位置
ScrollWindow
滚动客户区的内容
ScrollWindowEx
滚动客户区的内容,与ScrollWindow类似,还有其它功能
GetScrollInfo
获得SCROLLINFO结构维护的滚动条信息
GetScrollLimit
获得滚动条的限制
SetScrollInfo
设置滚动条信息
SetScrollPos
设置滚动块的当前位置,如果指定,并重画滚动条以反映新的位置
SetScrollRange
设置指定滚动条的最小和最大位置值
ShowScrollBar
显示或隐藏滚动条
EnableScrollBarCtrl
允许或禁止一个滚动条控件
GetScrollBarCtrl
返回滚动条控件
RepositionBars
重新设定客户区中控制条的位置

11.拖放函数

DragAcceptFiles
指明该窗口将接收拖来的文件

12.插字符号函数

CreateCaret
为系统插字符创建一个新的形状并获得它的所有权
CreateSolidCaret
为系统插字符创建一个实心块并获得它的所有权
CreateGrayCaret
为系统插字符创建一个灰色块并获得它的所有权
GetCaretPos
获得插字符当前位置的客户区坐标
SetCaretPos
将插字符移动到指定的位置
HideCaret
通过将插字符移出显示屏幕而隐藏它
ShowCaret
在插字符的当前位置显示插字符。一旦被显示,插字符就会自动闪烁

13.对话框项函数

CheckDlgButton
在按钮控件旁放置或者清除检查标记
CheckRadioButton
选中指定的单项按钮并清除指定的按钮组中其它所有单项按钮的检查标记
GetCheckedRadioButton
返回一组按钮中当前选中的单项按钮的ID
DlgDirList
用文件或目录列表填充一个列表框
DlgDirListComboBox
用文件或目录列表填充一个组合框中的列表框
DlgDirSelect
获得列表框的当前选择
DlgDirSelectComboBox
获得组合框中列表框的当前选择
GetDlgItemInt
将给定对话框中控件的文本转换为整数
GetDlgItemText
获得与控件相关的标题或文本
GetNextDlgGroupItem
在一组控件内搜索下一个(或上一个)控件
GetNextDlgTabItem
获得指定的控件之后(或之前)具有WS_TABSTOP风格的第一个控件
IsDlgButtonChecked
确定按钮控件是否有检查标记
IsDialogMessage
确定给定的消息是否是送往无模式对话框的,如果是,则处理它
SendDlgItemMessage
向指定的控件发送一条消息
SetDlgItemInt
将控件的文本设为代表一个整数的字符串
SetDlgItemText
设置指定的对话框中的控件的标题或文本
SubclassDlgItem
将一个Windows控件与CWnd对象连接,然后使它通过CWnd的消息映射转发消息
ExecuteDlgInit
初始化对话框资源
RunModalLoop
获得、转换或分派来自模式窗口的消息
ContinueModal
继续一个窗口的模式状态
EndModalLoop
结束一个窗口的模式状态

14.数据绑定函数

BindDefaultProperty
像类型库中标记的那样,将调用对象的缺省的简单移动属性和与数据源控件相关的游标绑定在一起
BindProperty
将一个游标移动属性与数据移动控件绑定在一起,然后在MFC的绑定管理器中注册这种联系
GetDSCCursor
获得游标的指针,该游标是通过数据源控件的DataSource、UserName、Password和SQL属性定义的

15.菜单函数

GetMenu
获得指定菜单的指针
SetMenu
将菜单设为指定的菜单
DrawMenuBar
重画菜单条
GetSystemMenu
允许应用程序访问控制菜单,用于拷贝和修改
HiliteMenuItem
加亮显示一个顶层(菜单条)菜单项,或者取消加亮显示

16.工具提示函数

EnableToolTips
允许工具提示控件
CancelToolTips
禁止工具提示控件
FilterToolTipMessage
获得与对话框中控件相关的标题和文本
OnToolHitTest
确定一个点是否位于指定工具的边界矩形之中并获得工具的信息

17.定时器函数

SetTimer
安装一个系统定时器,当它被激活时,发送一个WM_TIMER消息
KillTimer
销毁一个系统定时器

18.警告函数

FlashWindow
使窗口闪烁一次
MessageBox
创建并显示一个窗口,其中包含了应用程序提供的消息和标题

19.窗口消息函数

GetCurrentMessage
返回这个窗口当前处理的消息的指针。只应该在OnMessage消息处理函数内部调用
Default
调用缺省的窗口过程,它提供了对应用程序没有处理的任何窗口消息的缺省处理
PreTranslateMessage
在消息被发送到Windows函数TranslateMessage和DispatchMessage之前,CWinApp使用这个函数来过滤窗口消息
SendMessage
向CWnd对象发送一个消息,直到这条消息被处理之后才返回
PostMessage
将一条消息放入应用程序的消息队列,然后不等窗口处理这条消息直接返回
SendNotifyMessage
将一条消息发送到窗口并尽快返回,返回的速度取决于该窗口是否是由调用线程所创建

20.剪贴板函数

ChangeClipboardChain
将CWnd从剪贴板观察器的链中清除
SetClipboardViewer
将CWnd加入一个窗口链,每当剪贴板的内容发生变化时,就会通知这些窗口
OpenClipboard
打开剪贴板。其它应用程序将不能修改剪贴板,直到调用Windows的CloseClipboard函数
GetClipboardOwner
获得指向剪贴板的当前拥有者的指针
GetOpenClipboardWindow
获得当前打开剪贴板的窗口的指针
GetClipboardViewer
获得剪贴板观察器链中的第一个窗口的指针

21.OLE控件

SetProperty
设置OLE控件的属性
OnAmbientProperty
实现周围属性值
GetControlUnknown
获得指向未知OLE控件的指针
GetProperty
获得OLE控件的属性
InvokeHelper
激活OLE控件的方法或属性

22.可重载函数

WindowProc
为CWnd对象提供了窗口过程。缺省的窗口过程通过消息映射分派消息
DefWindowProc
调用缺省的窗口过程,它提供了对应用程序没有处理的任何窗口消息的缺省处理
PostNcDestroy
这个虚拟函数在窗口被销毁以后被缺省的OnNcDestroy函数所调用
OnNotify
框架调用这个函数以通知父窗口,在它的一个控件发生了一个事件,或该控件需要消息
OnChildNotify
父窗口调用这个函数,给被通知的控件一个响应控件通知消息的机会
DoDataExchange
用于对话框数据交换和校验。由UpdateData调用

23.初始化消息处理函数

OnInitMenu
当菜单要被激活时调用这个函数
OnInitMenuPopup
当弹出菜单要被激活时调用这个函数

24.系统消息处理函数

OnSysChar
当一次击键被转换为系统字符消息时调用这个函数
OnSysCommand
当用户从控制菜单中选择命令,或者当用户选择了最大化或最小化按钮时,调用这个函数
OnSysDeadChar
当一次击键被转换为系统死键(例如重音字符)消息时调用这个函数
OnSysKeyDown
当用户按住ALT键并按下其它键时调用这个函数
OnSysKeyUp
当用户放开一个键,而此时ALT键被按下,则调用这个函数
OnCompacting
当Windows检测到系统内存很少时,就调用这个函数
OnDevModeChange
当用户改变了设备模式设置时,就为顶层窗口调用这个函数
OnFontChange
当字体资源池发生变化时调用这个函数
OnPaletteIsChanging
当应用程序将要实现其逻辑调色板时通知其它应用程序
OnPaletteChanged
调用这个函数时使用调色板的所有窗口能够实现它们的逻辑调色板并更新它们的客户区
OnSysColorChange
当系统颜色设置发生改变时为所有的顶层窗口调用这个函数
OnWindowPosChanging
由于调用了SetWindowPos函数或其它的窗口管理函数,因而窗口的大小、位置和次序将要发生变化时,就调用这个函数
OnWindowPosChanged
由于调用了SetWindowPos函数或其它的窗口管理函数,因而当窗口的大小、位置和次序发生了变化时,就调用这个函数
OnDropFiles
当用户在注册为可以接收拖放文件的窗口上方释放鼠标左键时,这个函数就被调用
OnSpoolerStatus
每当一个作业被加入或移出打印管理器的队列时,打印管理器就调用这个函数
OnTimeChange
在系统时间改变之后,为所有的顶层窗口调用这个函数
OnWinIniChange
在Windows的初始化文件WIN.INI改变之后为所有的顶层窗口调用这个函数

25.一般消息处理函数

OnCommand
当用户选择了一个命令时调用这个函数
OnActivate
当CWnd要被激活或退出激活状态时调用这个函数
OnActivateApp
当应用程序要被激活或退出激活状态时调用这个函数

26.一般消息处理函数

OnCancelMode
调用这个函数以允许CWnd取消任何内部模式,比如鼠标捕获状态
OnChildActivate
当CWnd的大小和位置发生变化或者CWnd被激活时,就为多文档界面(MDI)的子窗口调用这个函数
OnClose
调用这个函数,作为关闭CWnd的信号
OnCopyData
从一个应用程序复制数据到另一个应用程序
OnCreate
作为窗口创建过程的一部分来调用
OnCtlColor
如果CWnd是一个控件的父窗口,当控件要被重画时就调用这个函数
OnDestroy
当CWnd要被销毁时就调用这个函数
OnEnable
当CWnd被允许或禁止时调用这个函数
OnEndSession
当会话将要结束时调用这个函数
OnEnterIdle
调用这个函数以通知应用程序的主窗口过程,模式对话框或菜单正在进入空闲状态
OnEraseBkgnd
当需要擦除窗口的背景时调用这个函数
OnGetMinMaxInfo
每当Windows需要知道最大化的位置和大小,或者最小或最大跟踪尺寸时,就调用这个函数
OnIconEraseBkgnd
当CWnd被最小化(图标化),并且在画出图标之前,必须填充图标的背景时调用这个函数
OnKillFocus
当CWnd失去输入焦点时立即调用这个函数
OnMenuChar
当用户按下一个菜单助记字符,但是不能与当前菜单中任何预定义的助记符相匹配时,就调用这个函数
OnMenuSelect
当用户选择了一个菜单项时就调用这个函数
OnMove
当CWnd的位置发生变化时调用这个函数
OnMoving
指明用户正在移动CWnd对象
OnDeviceChange
通知应用程序或设备驱动程序,设备或计算机的硬件配置发生了变化
OnStyleChanged
指明Windows的::SetWindowLong函数已经改变了一个或多个窗口风格
OnStyleChanging
指明Windows的::SetWindowLong函数将要改变一个或多个窗口风格
OnPaint
调用这个函数以重画窗口的一部分
OnParentNotify
当创建或销毁一个子窗口,或者当用户在子窗口上方点击了鼠标键时调用这个函数
OnQueryDragIcon
当一个最小化(图标化)的CWnd要被用户拖拉时就调用这个函数
OnQueryEndSession
当用户选择结束Windows会话时就调用这个函数
OnQueryNewPalette
通知CWnd它将接收输入焦点
OnQueryOpen
当CWnd是一个图标并且用户请求打开这个图标时就调用这个函数

27.一般消息处理函数

OnSetFocus
当CWnd获得输入焦点时调用这个函数
OnShowWindow
当CWnd被隐藏或显示时调用这个函数
OnSize
当CWnd的大小被改变以后调用这个函数
OnSizing
指明用户正在改变矩形的大小
OnStyleChanged
指明窗口的一个或多个风格已经被改变
OnStyleChanging
指明窗口的一个或多个风格将被改变

28.控件消息处理函数

OnCharToItem
这个函数被具有LBS_WANTKEYBOARDINPUT风格的子列表框调用,用以响应WM_CHAR消息
OnCompareItem
调用这个函数以确定排序的自画组合框或列表框中新项的相对位置
OnDeleteItem
当一个自画子列表框或组合框中将被销毁时,或者从控件中删除项时调用这个函数
OnDrawItem
当自画子按钮控件、组合框控件、列表框控件或菜单的可视部分需要被画出时调用这个函数
OnDSCNotify
在响应数据源控件引发的事件时调用,该事件是当与数据源控件绑定的控件修改或将要修改游标时产生的
OnGetDlgCode
为控件调用这个函数,使控件能够自己处理输入的箭头键和TAB键
OnMeasureItem
当控件被创建时为自画子组合框,列表框或菜单项调用这个函数。CWnd通知Windows该控件的大小
SendChildNotifyLastMsg
提供了从父窗口到子窗口的通知消息,使子窗口能够处理一个任务
ReflectChildNotify
将消息向它的来源反映的帮助函数
OnWndMsg
指明一个窗口消息是否已被处理
ReflectLastMsg
将上一个消息反映到子窗口
OnVKeyToItem
由CWnd所拥有的列表框调用,用于响应WM_KEYDOWN消息

29.输入消息处理函数

OnChar
当一次击键被转换为非系统字符时调用这个函数
OnDeadChar
当一次击键被转换为非系统死键(例如重音字符)时调用这个函数
OnHScroll
当用户点击了CWnd的水平滚动条时调用这个函数
OnKeyDown
当按下了一个非系统键时调用这个函数
OnKeyUp
当放开一个非系统键时调用这个函数
OnLButtonDblClk
当用户双击鼠标左键时调用这个函数

30.输入消息处理函数

OnLButtonDown
当用户按下鼠标左键时调用这个函数
OnLButtonUp
当用户放开鼠标左键时调用这个函数
OnMButtonDblClk
当用户双击鼠标中键时调用这个函数
OnMButtonDown
当用户按下鼠标中键时调用这个函数
OnMButtonUp
当用户放开鼠标中键时调用这个函数
OnMouseActivate
当鼠标位于非活动窗口,并且用户按下鼠标键时调用这个函数
OnMouseMove
当鼠标光标移动时调用这个函数
OnMouseWheel
当用户旋转鼠标轮时调用这个函数。使用WindowsNT4.0的消息处理
OnRegisteredMouseWheel
当用户旋转鼠标轮的时候调用这个函数。使用Windows 95和Windows NT 3.51的消息处理
OnRButtonDblClk
当用户双击鼠标右键时调用这个函数
OnRButtonDown
当用户按下鼠标右键时调用这个函数
OnRButtonUp
当用户放开鼠标右键时调用这个函数
OnSetCursor
如果没有捕获鼠标输入并且鼠标导致光标在窗口内移动时,就调用这个函数
OnTimer
当达到SetTimer指定的时间间隔时调用这个函数
OnVScroll
当用户点击窗口的垂直滚动条时调用这个函数
OnCaptureChanged
向失去鼠标捕获的窗口发送一条消息

31.非客户区消息处理函数

OnNcActivate
当需要改变非客户区以指明活动或非活动状态时调用这个函数
OnNcCalcSize
当需要计算非客户区的大小和位置时调用这个函数
OnNcCreate
在OnCreate之前,当要创建非客户区时调用这个函数
OnNcDestroy
当非客户区要被销毁的时候调用这个函数
OnNcHitTest
如果CWnd中包含了光标,或者用SetCapture捕获了鼠标输入时,每当鼠标移动时,Windows调用这个函数
OnNcLButtonDblClk
当光标位于CWnd的非客户区,用户双击鼠标左键时,就调用这个函数
OnNcLButtonDown
当光标位于CWnd的非客户区,用户按下鼠标左键时,就调用这个函数
OnNcLButtonUp
当光标位于CWnd的非客户区,用户放开鼠标左键时,就调用这个函数
OnNcMButtonDblClk
当光标位于CWnd的非客户区,用户双击鼠标中键时,就调用这个函数
OnNcMButtonDown
当光标位于CWnd的非客户区,用户按下鼠标中键时,就调用这个函数
OnNcMButtonUp
当光标位于CWnd的非客户区,用户放开鼠标中键时,就调用这个函数

32.非客户区消息处理函数

OnNcMouseMove
当光标在CWnd的非客户区中移动时就调用这个函数
OnNcPaint
当非客户区需要重画时调用这个函数
OnNcRButtonDblClk
当光标位于CWnd的非客户区,用户双击鼠标右键时,就调用这个函数
OnNcRButtonDown
当光标位于CWnd的非客户区,用户按下鼠标右键时,就调用这个函数
OnNcRButtonUp
当光标位于CWnd的非客户区,用户放开鼠标右键时,就调用这个函数

33.MDI消息处理函数

OnMDIActivate
当MDI子窗口被激活或失去活动状态时调用这个函数

34.剪贴板消息处理函数

OnAskCbFormatName
当剪贴板的拥有者将显示剪贴板内容时,剪贴板观察程序就调用这个函数
OnChangeCbChain
通知指定的窗口将从链中删除
OnDestroyClipboard
当通过Windows的EmptyClipboard函数清空剪贴板时调用这个函数
OnDrawClipboard
当内容变化时调用这个函数
OnHScrollClipboard
当剪贴板的拥有者要滚动剪贴板的图像、使适当的部分无效以及更新滚动条值的时候调用这个函数
OnPaintClipboard
当剪贴板观察器的客户区需要重画的时候调用这个函数
OnRenderAllFormats
当拥有者应用程序将被销毁且需要提交它的所有格式时调用这个函数
OnRenderFormat
当一种延迟提交的格式需要被提交时为剪贴板拥有者调用这个函数
OnSizeClipboard
当剪贴板观察器窗口的客户区大小发生变化时调用这个函数
OnVScrollClipboard
当拥有者要滚动剪贴板的图像、使适当的部分无效以及更新滚动条值的时候调用这个函数

35.菜单循环通知

OnEnterMenuLoop
进入一个菜单模式的循环时调用该函数
OnExitMenuLoop
当退出一个菜单模式的循环时调用该函数

2默认的消息处理函数

2.1 前期发展

前面介绍了消息的默认处理函数Default(),该函数一般要调用一个默认的窗口过程,对当前消息执行默认的系统级处理。例如对于窗口的 WM_LBUTTONDOWN消息,默认处理函数要为该窗口设置焦点。对于许多消息,执行这种默认的处理是完全必要的。这样,程序员只需在消息到来之际执行相关的用户级处理,对这些消息的系统级处理不必关心。所以,在一个消息处理函数中,如果允许当前消息正常执行,最终就应该调用默认处理函数Default()。例如,下面要控制一个CEdit控件的接收 字符集,不允许输入0~9的数字,并将输入的小写字母转换为大写字母。程序如下:
//class CEditnew :public CEdit
void CEditnew::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
TRACE("%c\n",nChar);
if(nChar>=''0'' && nChar<=''9'')
return; //过滤掉当前消息
if(nChar>=''a'' && nChar<=''z'')
{
nChar-=32;
LPARAM lpara=nFlags<<16|nRepCnt;
//更改消息参数,重新执行该消息处理函数
SendMessage(WM_CHAR,(WPARAM)nChar,lpara);
return;
}
//执行默认的处理过程,将当前字符追加到控件的文本中
Default();
}
然而,在实际的编程中,很少直接调用Default(),更多是调用 基类的消息处理函数。例如在上例中,以 CEdit::OnChar(nChar, nRepCnt, nFlags);
代替Default()要更合理。因为针对大部分消息,CWnd类已经定义了相应的处理函数,封装对Default()的调用。例如,针对WM_CHAR消息的处理函数这样定义:
void CWnd::OnChar(UINT, UINT, UINT)
{ Default(); }

2.2 后期发展

同时,对于一些特殊的消息,仅执行系统级的处理是不够的,框架必须针对消息完成一些例行的操作。例如,收到WM_SYSCOLORCHANGE消息后,要将系统颜色的变化通知所有子窗口;收到WM_NCDESTROY消息,要做必要的清理工作,并使MFC 窗口对象与已经关闭的窗口分离。针对这些消息,CWnd类也定义了相应的处理函数,封装框架的例行处理。下面是针对WM_SYSCOLORCHANGE消息的处理函数。
void CWnd::OnSysColorChange()
{
CWinApp* pApp = AfxGetApp();
if (pApp != NULL && pApp->m_pMainWnd == this)
{
//调整主窗口的 控制条工具条、状态条等)颜色
afxData.UpdateSysColors();
}
#ifndef _AFX_NO_CTL3D_SUPPORT
if (!afxContextIsDLL)
{
if (AfxGetThread() != NULL && AfxGetThread()->m_pMainWnd == this)
{
_AFX_CTL3D_STATE* pCtl3dState = _afxCtl3dState;
//调整3D显示
if (pCtl3dState->m_pfnColorChange != NULL)
(*pCtl3dState->m_pfnColorChange)();
}
}
#endif
//通知所有的子窗口
if (!(GetStyle() & WS_CHILD))
SendMessageToDescendants(WM_SYSCOLORCHANGE, 0, 0L, TRUE, TRUE);
//最后执行默认处理
Default();
}

本文转载自:http://baike.baidu.com/view/1856627.htm?fr=aladdin

zhangyujsj
粉丝 24
博文 358
码字总数 224241
作品 0
广州
私信 提问
PreTranslateMessage用法及ID--HANDLE--HWND三者之间的互相转换

利用PreTranslateMessage,响应按钮控件的按下(WMLBUTTONDOWN)和松开(WMLBUTTONUP) VC的button控制只有两个事件,一个是单击事件,一个事双击事件。在这个方面VB就方便多了。但是我们有其...

IMGTN
2012/06/05
0
0
CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow的区别

MFC(VC6.0)的CWnd及其子类中,有如下三个函数: 让人很不容易区分,不知道它们究竟干了些什么,在什么情况下要改写哪个函数? 想知道改写函数?让我先告诉你哪个不能改写,那就是SubclassWin...

ryany
2010/12/20
0
0
深入浅出MFC学习笔记(第6章 :MFC程序的生死因果)

第六章 :MFC程序的生死因果 本章主要是从MFC程序代码中,找出一个windows程序原本该有的程序入口点、窗口类注册、窗口产生、消息循环、窗口函数等操作。抽丝剥茧彻底理解一个MFC程序的诞生与...

长平狐
2012/10/08
121
0
深入浅出MFC学习笔记(第9章:消息映射与命令传递。)

第九章:消息映射与命令传递。 本章将会对MFC的消息映射和 命令传递机制做深入探讨。 MFC规定了消息传递的路线,消息会按照这个路线传递下去,找不到归宿的话就交给DefWindowProc。 在产生窗...

长平狐
2012/10/08
422
1
CWnd 不能直接响应menus, toolbar buttons, and acceler...

CWnd 不能直接响应menus, toolbar buttons, and accelerator keys产生的消息,这种消息称为Command messages ,Command messages 在MFC应用程序框架下这类消息只能被Command Targets接收到,...

IMGTN
2013/05/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot+jpa 错误信息org.springframework.beans.factory.BeanCreationException

报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/a......

冥焱
7分钟前
0
0
威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙。我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名。 Xulu并不是第一个攻击...

迷你芊宝宝
14分钟前
0
0
十大经典排序算法动画与解析

排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大,一次不能容纳全部的排序记...

夜黑人模糊灬
18分钟前
2
0
7. java枚举

1. 枚举是什么 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便 2. 为什么不用静态常量来替代枚举类呢? 3. 常用方式 3.1 方式1 枚举类: package cn.ali.tencent...

20190513
19分钟前
0
0
elasticsearch – 弹性搜索:“Term”,“Match Phrase”和“Query String”之间的差异

术语查询匹配单个术语,因为它是:不分析值。 所以,它不必根据你索引的情况而降低。 如果您在索引时间提供Bennett并且未分析该值,则以下查询将不返回任何内容: { "query": { "te...

xiaomin0322
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部