CWnd

CWnd

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

基本介紹

  • 中文名:計算機網路中擁塞視窗
  • 外文名:congestion window
  • 縮寫 :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

CWnd類的成員

初始化
對話框項函式
初始化訊息處理函式
視窗狀態函式
數據綁定函式
系統訊息處理函式
視窗大小和位置
選單函式
一般訊息處理函式
視窗訪問函式
工具提示函式
控制項訊息處理函式
更新/繪圖函式
定時器函式
輸入訊息處理函式
坐標映射函式
警告函式
非客戶區訊息處理函式
視窗文本函式
視窗訊息函式
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
當退出一個選單模式的循環時調用該函式

默認的訊息處理函式

前期發展

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

相關詞條

熱門詞條

聯絡我們