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
初始化 | 對話框項函數 | 初始化消息處理函數 |
窗口狀態函數 | 數據綁定函數 | 系統消息處理函數 |
窗口大小和位置 | 菜單函數 | 一般消息處理函數 |
窗口訪問函數 | 工具提示函數 | 控制項消息處理函數 |
更新/繪圖函數 | 定時器函數 | 輸入消息處理函數 |
坐標映射函數 | 警告函數 | 非客戶區消息處理函數 |
窗口文本函數 | 窗口消息函數 | 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 | 標誌著繪圖結束 |
在指定的設備環境中畫出當前窗口 | |
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 | 當退出一個菜單模式的循環時調用該函數 |
前面介紹了消息的默認處理函數Default(),該函數一般要調用一個默認的窗口過程,對當前消息執行默認的系統級處理。例如對於窗口的WM_LBUTTONDOWN消息,默認處理函數要為該窗口設置焦點。對於許多消息,執行這種默認的處理是完全必要的。這樣,程序員只需在消息到來之際執行相關的用戶級處理,對這些消息的系統級處理不必關心。所以,在一個消息處理函數中,如果允許當前消息正常執行,最終就應該調用默認處理函數Default()。例如,下面要控制一個CEdit控制項的接收字符集,不允許輸入0~9的數字,並將輸入的小寫字母轉換為大寫字母。程序如下:
//class CEditnew :public CEdit
{
TRACE("%c\n",nChar);
if(nChar>=''0'' && nChar<=''9'')
return; //過濾掉當前消息
if(nChar>=''a'' && nChar<=''z'')
{
nChar-=32;
//更改消息參數,重新執行該消息處理函數
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();
}