MFC中的幾個經常使用類——CWnd

1 窗口類

1.1 概述

CObject
└CCmdTarget
└CWnd
CWnd是MFC窗口類的 基類,提供了微軟基礎類庫中全部窗口類的基本功能。
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

1.2 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
當退出一個菜單模式的循環時調用該函數

2默認的消息處理函數

2.1 前期發展

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

2.2 後期發展

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