程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 『VC++技術內幕』學習筆記(5)

『VC++技術內幕』學習筆記(5)

編輯:vc教程

     第五篇:基本事件處理

   我們已經知道MFC庫應用程序框架調用CView視圖類的虛函數OnDraw來完成屏幕顯示。其實CView和CWnd類包含了幾百個成員函數,在MSDN中可以看到這些成員函數,其中有許多On開頭的,例如第二篇的例子就有一個OnLButtonDown,它們都是應用程序框架響應各種事件所需調用的函數。
   OnDraw便是當窗口發生變化是被調用的,OnLButtonDown是鼠標左鍵被按下時調用,還有OnKeyDown是鍵盤被按下時調用等等。

   當用戶在視窗中按下鼠標左鍵時,Windows會自動發送WM_LBUTTONDOWN消息給該視窗,當然你可以什麼都不做象我們第3篇的例子一樣,如果你想要讓程序對此消息做出反應就必須在視圖類給出相應的函數,類似下面這樣:
void CMyView::OnLButtonDown(UINT nFlags,CPoint point)
{
//做些事情的代碼
}

還需要在類頭文件包含相應的函數原型說明
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);

afx_msg只是說明該函數原型是針對消息映射函數。下一步在代碼文件中還需要有一個消息映射宏,作用是把OnLButtonDown函數和應用程序框架聯系在一起。
BEGIN_MESSAGE_MAP(CMyView,CView)
ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()

最後在類庫的頭文件還需包含:
DECLARE_MESSAGE_MAP()

   函數和Windows消息的對應關系可以從MSDN中找到在MSDN中索引輸入(WM_ Messages)便會列出所有的Windows消息和消息控制函數原型。在實際的編程過程中我們不可能全部都用手工的添加或編制消息控制函數。除了一些特殊的,我們一般是借助Class Wizard來自動編制消息映射函數。這又是MFC應用程序框架比起SDK來的有一個便捷的地方。

   MFC庫對140種windows消息直接提供了消息控制函數,並且我們還可以自己定義自己的消息,下面列出的五種消息是我們應該特別注意的(MSDN上有更詳細的內容)。

WM_CREATE

   該消息是Windows發給視圖的第一個消息。當應用程序框架調用create函數時該消息便會被發送,此時窗口還未創建完成,不可見,因此在消息控制函數OnCreate內不能調用那些依賴窗口處於完全激活狀態的Windows函數。如果需要可以在重載的OnInitialUpdate函數內調用。不過注意在SDI應用程序OnInitialUpdate函數可能被多次調用。
WM_CLOSE

   當用戶關閉窗口時,系統會發送WM_CLOSE消息。如果派生類重新定義了OnClose函數,就可以完全控制關閉過程,可以將提醒用戶存盤之類的工作放在這裡完成。我們可以通過重載
CDocument::SaveModified

虛函數達到相同的目的。
WM_QUERYENDSESSION

   從字面的意思看就可以看出,當用戶退出Windows時,或者調用了ExitWindows 函數時。Windows會發送WM_QUERYENDSESSION消息給所有的正在運行的應用程序,由OnQueryEndSession消息映射函數對消息進行處理。在它之後應該是WM_ENDSESSION 消息。

   WM_DESTROY在Windows發送WM_CLOSE消息後,緊接著會發送WM_DESTROY消息,雖然窗口已經Close但實際上並沒有完全清除,在任務管理器中還可以看見應用程序的進程(我想很多木馬或病毒都是無窗口的程序,它們的做法是生成了已經活動狀態的窗口但不顯示出來),利用這個消息控制函數便可以對依賴於當前窗口存在的東西做清除工作,不過一定要注意,應該調用基類的OnDestroy函數,而不能在用戶自己的視圖的OnDestroy函數中終止窗口的析構過程,終止析構過程應該在OnClose函數中。

WM_NCDESTROY

   當窗口被取消所發送的最後一個消息就是這個消息。我們可以在OnNcDestroy函數中做一些不依賴該窗口是否處於活動狀態的最後的處理工作,(我實在想不出還需要做什麼?那位朋友能給個例子),注意一定要調用基類中的OnNcDestroy函數。

   我們可以做一個小惡作劇程序:當在窗口內單擊鼠標右鍵(注意是右鍵)時退出所有的正在運行的應用程序。
void CMy007View::OnDraw(CDC* pDC)
{
CMy007Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut (100,100,"請不要單擊鼠標右鍵,否則後果自負!");
}
void CMy007View::OnRButtonDown(UINT nFlags, CPoint point)
{
::MessageBox (NULL,"你確定要這樣做嗎?","警告",1);
::ExitWindows ();
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved