視窗類
概述
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
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 | 標誌著繪圖結束 |
在指定的設備環境中畫出當前視窗 | |
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
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();
}