CWnd

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類封裝的視窗操作主要包括視窗的創建和銷毀、操作視窗風格、操作視窗狀態、視窗子類化、獲取指定視窗等。

#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 標誌著繪圖結束
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控制項的方法或屬性

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();

}

相關詞條

相關搜尋

熱門詞條

聯絡我們