Advance Window Programming 游子宜
MFC 類別函式庫 MFC(Microsoft Foundation Class Library) 是一套 整合在 VC++ 中供開發視窗程式用的類別函式庫, 提供了豐富的類別函式供程式設計師來開發各類 的視窗應用程式。
使用 MFC 開發視窗程式的優點 一、程式架構簡單 二、各類別功能涵蓋範圍廣 三、 簡化使用 Windows API 來開發程式的難度
應用程式與視窗物件 應用程式 物件 在應用程式 物件中生成 主視窗物件
快速鍵 滑鼠游標 功能表 工具列 對話方塊
視窗程式開發兩種架構 一 、使用 Windows API 二、使用 MFC 使用 MFC 來開發程式比較簡單,並且在 MFC 程式中 亦可直接呼叫使用 Windows API 中的函式。 不過在程式的執行效能上,使用 Windows API 所開發 出的程式在執行速度上則會比較快,對於講求執行速 度的程式,如遊戲程式,通常會以 Windows API 來做 為程式開發的基礎。
應用程式 MFCWindows API
處理事件訊息的概念 事件 按下滑鼠左鍵 移動滑鼠 發出訊息 訊息定義在訊息 表中 訊息末定義在訊 息表中 執行對應的 處理函式 不處理 訊息表
Create a MFC Project Create a MFC Project – 1. 建立一個空專案並設定該專案使用 MFC 。 – 2. 使用 MFC 專案精靈建立專案。 何謂訊息 (message) 何謂訊息 (message) –Standard System Message –Command Message 訊息處理的方法 訊息處理的方法 訊息處理的方法 –Using Macro: BEGIN_MESSAGE_MAP … … END_MESSAGE_MAP () 鍵盤與滑鼠訊息處理 鍵盤與滑鼠訊息處理 鍵盤與滑鼠訊息處理 Message Handle
訊息處理函式 訊息的類型大致可分為兩種: 一、物件上可能產生的事件所發出的訊息 二、指令訊息 我們可執行 ClassWizard 來查看所有的訊息類型 與指定要處理的訊息:
訊息處理的方法 在類別的定義檔中先宣告訊息表與訊 息處理函式。 在類別的定義檔中先宣告訊息表與訊 息處理函式。 在類別的實作檔中定義訊息表的內容 ( 包含所要處理的訊息並指定處理函式 ) 。 在類別的實作檔中定義訊息表的內容 ( 包含所要處理的訊息並指定處理函式 ) 。 使用訊息表的原則
1
.NET Message
2
How to work on Message BEGIN_MESSAGE_MAP( …, … ) ON_WM_MOUSEMOVE() ON_COMMAND(ID,Function) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP( …, … ) ON_WM_MOUSEMOVE() ON_COMMAND(ID,Function) END_MESSAGE_MAP() afx_msg void classname::OnMouseMove(UINT nFlags, CPoint point) { //implement how you like your app works when mouse move } afx_msg void classname::OnMouseMove(UINT nFlags, CPoint point) { //implement how you like your app works when mouse move } afx_msg void Function() { … } afx_msg void Function() { … }
利用 ClassWizard 的功能,只要在某一 個所要處理的訊息上快按滑鼠兩下,便 可在程式中設定處理該訊息。 或是利用 Add Class 方法亦可加入新類別 。
新增訊息處理函式 假設現在程式要處理使用者在視窗中按 下滑鼠左鍵的訊息,那麼可在 ClassWizard 中選 擇要處理的訊息為「 WM_LBUTTONDOWN 」,該訊息代表在視窗中按下滑鼠左鍵:
指令訊息處理函式
指令訊息處理函式
刪除訊息處理函式
基本的滑鼠訊息類型 請仔細的思考當使用滑鼠來進行視窗螢幕 的操作時會有那些動作? 下表列出各個滑鼠訊息與相關處理函式: 鍵盤與滑鼠訊息處理
滑鼠訊息處理函式說明 WM_LBUTTONDBCLKOnLButtonDblClk 雙按滑鼠左鍵 WM_LBUTTONDOWNOnLButtonDown 按下滑鼠左鍵 WM_LBUTTONUPOnLButtonUp 鬆開滑鼠左鍵 WM_RBUTTONDBCLKOnRButtonDblClk 雙按滑鼠右鍵 WM_RBUTTONDOWNOnRButtonDown 按下滑鼠右鍵 WM_RBUTTONUPOnRButtonUp 鬆開滑鼠右鍵 WM_MOUSEMOVEOnMouseMove 滑鼠移動 WM_MOUSEWHEELOnMouseWheel 捲動滾輪
虛擬碼 虛擬碼說明 MK_CONTROL 按下 Ctrl 鍵 MK_LBUTTON 按下滑鼠左鍵 MK_MBUTTON 按下滑鼠中鍵 MK_RBUTTON 按下滑鼠右鍵 MK_SHIFT 按下 Shift 鍵
擷取視窗的滑鼠訊息 若程式本身必須監控滑鼠在螢幕上任何地方,即使 是在程式視窗外所發出的訊息,可以呼叫下面的這 個函式: CWnd* SetCapture( );
擷取視窗的滑鼠訊息 傳回目前取得滑鼠訊息接收權之視窗的指標,可以 呼叫下面的這個函式: CWnd* GetCapture( ); if (this == GetCapture())
若要釋放視窗監控滑鼠在視窗發 出訊息的權利,則必須呼叫下面 的這個 Windows API 函式: BOOL ReleaseCapture(VOID);
基本的鍵盤訊息類型 幾個常見的鍵盤訊息類型與對應的處理函式: 鍵盤訊息處理函式說明 WM_KEYDOWNOnKeyDown 按下鍵盤按鍵 WM_KEYUPOnKeyUp 鬆開鍵盤按鍵 WM_CHAROnChar 按下鍵盤按鍵,並傳回按鍵字元
指令介紹 int CWnd::MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT Ntype = MB_OK); int CWnd::MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT Ntype = MB_OK); CClientDC aDC(this); // 建立畫布 CClientDC aDC(this); // 建立畫布 aDC.SetPixel(point, RGB(r,g,b)); aDC.SetPixel(point, RGB(r,g,b)); COLORREF CDC::SetPixel(int x, int y, COLORREF crCOlor); COLORREF CDC::SetPixel(int x, int y, COLORREF crCOlor); COLORREF CDC::SetPixel(POINT point, COLORREF crCOlor); COLORREF CDC::SetPixel(POINT point, COLORREF crCOlor);
範例練習 課本的範例 課本的範例 實作範例 實作範例