标题：CWnd
计算机网络
cwnd 又为计算机网络中拥塞窗口（congestion window）的简写。拥塞窗口的大小取决于网络的拥塞程度，并且动态地在变化。发送方让自己的发送窗口还可能小于拥塞窗口。
微软基础类库中的窗口类CWnd
CObject└CCmdTarget└CWndCWnd是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
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 对象与这个句柄相连接，则返回NULLDeleteTempMapCWinApp的空闲处理函数自动调用这个函数，清除由FromHandle创建的任何临时CWnd对象GetSafeHwnd返回m_hWnd，如果该指针为NULL，则返回NULLCreateEx创建一个Windows的可重叠窗口、弹出窗口或子窗口，并把它连接到一个CWnd对象上CreateControl创建一个OLE控件，该控件在MFC程序中由一个CWnd对象代表
4.窗口状态函数
IsWindowEnabled确定一个窗口是否允许鼠标和键盘输入EnableWindow允许或禁止鼠标和键盘输入GetActiveWindow获得激活的窗口SetActiveWindow激活窗口GetCapture获得捕获鼠标的CWndSetCapture使随后的鼠标输入都被发送到这个CWndGetFocus获得当前具有输入焦点的CWndSetFocus要求输入焦点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或控件IDGetDescendantWindow搜索所有子窗口并返回具有指定ID的窗口GetParentFrame获得CWnd对象的父框架窗口SendMessageToDescendants将消息发送给窗口的所有子窗口GetTopLevelParent获得窗口的顶层父窗口GetTopLevelOwner获得顶层窗口GetParentOwner返回子窗口的父窗口的指针GetTopLevelFrame获得窗口的顶层框架窗口UpdateDialogControls调用这个函数以更新对话框按钮和其它控件的状态UpdateData初始化对话框或获得对话框中的数据CenterWindow将窗口设置到父窗口的中央
7.更新/绘图函数BeginPaint为绘图准备CWndEndPaint标志着绘图结束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返回一组按钮中当前选中的单项按钮的IDDlgDirList用文件或目录列表填充一个列表框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当退出一个菜单模式的循环时调用该函数
默认的消息处理函数前面介绍了消息的默认处理函数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(); }
同时，对于一些特殊的消息，仅执行系统级的处理是不够的，框架必须针对消息完成一些例行的操作。例如，收到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();
}