CWnd

計算機網路中的擁塞窗口的縮寫

CWnd是計算機網路中擁塞窗口(congestion window)的簡寫。擁塞窗口的大小取決於網路速度的擁塞程度和處理數據量,並且動態地在變化加入新的執行方式。發送方讓自己的發送窗口還可能小於擁塞窗口。CWnd是MFC窗口類的基類,提供了微軟基礎類庫中所有窗口類的基本功能。

窗口類


概述

CObject
└CCmdTarget
└CWnd
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類封裝的窗口操作主要包括窗口的創建和銷毀、操作窗口風格、操作窗口狀態、窗口子類化、獲取指定窗口等。
請參閱: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 對象與這個句柄相連接,則返回NULL
DeleteTempMapCWinApp的空閑處理函數自動調用這個函數,清除由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、PasswordSQL屬性定義的
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 95Windows 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();
}