複製鏈接
請複製以下鏈接發送給好友

CWnd

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

CWnd窗口類

CWnd內容簡介

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類封裝的窗口操作主要包括窗口的創建和銷燬、操作窗口風格、操作窗口狀態、窗口子類化、獲取指定窗口等。
#include <afxwin.h>
請參閲:CFrameWnd, CView

CWndCWnd類的成員

初始化
對話框項函數
初始化消息處理函數
窗口狀態函數
數據綁定函數
系統消息處理函數
窗口大小和位置
菜單函數
一般消息處理函數
窗口訪問函數
工具提示函數
控件消息處理函數
更新/繪圖函數
定時器函數
輸入消息處理函數
座標映射函數
警告函數
非客户區消息處理函數
窗口文本函數
窗口消息函數
MDI消息處理函數
滾動函數
剪貼板函數
剪貼板消息處理函數
拖放函數
OLE控件
菜單循環通知
插字符號函數
可重載函數

下面提供CWnd的函數,以供參考和查閲。
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控件的方法或屬性
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
當退出一個菜單模式的循環時調用該函數

CWnd默認的消息處理函數

CWnd前期發展

前面介紹了消息的默認處理函數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(); }

CWnd後期發展

同時,對於一些特殊的消息,僅執行系統級的處理是不夠的,框架必須針對消息完成一些例行的操作。例如,收到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();
}