340 likes | 474 Views
Advance Window Programming. 游子宜. MFC 類別函式庫 MFC(Microsoft Foundation Class Library) 是一套整合在 VC++ 中供開發視窗程式用的類別函式庫,提供了豐富的類別函式供程式設計師來開發各類的視窗應用程式。. 使用 MFC 開發視窗程式的優點 一、程式架構簡單 二、各類別功能涵蓋範圍廣 三、 簡化使用 Windows API 來開發程式的難度. 應用程式與視窗物件. 應用程式物件. 在應用程式物件中生成主視窗物件. 快速鍵 滑鼠游標 功能表 工具列 對話方塊. 視窗程式開發兩種架構
E N D
MFC類別函式庫 • MFC(Microsoft Foundation Class Library)是一套整合在VC++中供開發視窗程式用的類別函式庫,提供了豐富的類別函式供程式設計師來開發各類的視窗應用程式。
使用MFC開發視窗程式的優點 • 一、程式架構簡單 • 二、各類別功能涵蓋範圍廣 • 三、簡化使用Windows API來開發程式的難度
應用程式與視窗物件 應用程式物件 在應用程式物件中生成主視窗物件
快速鍵 滑鼠游標 功能表 工具列 對話方塊
視窗程式開發兩種架構 • 一、使用Windows API • 二、使用MFC • 使用MFC來開發程式比較簡單,並且在MFC程式中亦可直接呼叫使用Windows API中的函式。 • 不過在程式的執行效能上,使用Windows API所開發出的程式在執行速度上則會比較快,對於講求執行速度的程式,如遊戲程式,通常會以Windows API來做為程式開發的基礎。
WindowsAPI MFC 應用程式
訊息表 事件 按下滑鼠左鍵 移動滑鼠 訊息定義在訊息表中 執行對應的處理函式 不處理 發出訊息 發出訊息 訊息末定義在訊息表中 處理事件訊息的概念
Message Handle • Create a MFC Project • 1.建立一個空專案並設定該專案使用MFC。 • 2.使用MFC專案精靈建立專案。 • 何謂訊息(message) • Standard System Message • Command Message • 訊息處理的方法 • Using Macro: BEGIN_MESSAGE_MAP……END_MESSAGE_MAP () • 鍵盤與滑鼠訊息處理
訊息處理函式 • 訊息的類型大致可分為兩種: 一、物件上可能產生的事件所發出的訊息 二、指令訊息 • 我們可執行ClassWizard來查看所有的訊息類型與指定要處理的訊息:
訊息處理的方法 使用訊息表的原則 • 在類別的定義檔中先宣告訊息表與訊息處理函式。 • 在類別的實作檔中定義訊息表的內容(包含所要處理的訊息並指定處理函式)。
How to work on Message • 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 Function() { … }
利用ClassWizard的功能,只要在某一個所要處理的訊息上快按滑鼠兩下,便可在程式中設定處理該訊息。 或是利用 Add Class方法亦可加入新類別。
新增訊息處理函式 • 假設現在程式要處理使用者在視窗中按下滑鼠左鍵的訊息,那麼可在ClassWizard中選擇要處理的訊息為「WM_LBUTTONDOWN」,該訊息代表在視窗中按下滑鼠左鍵:
鍵盤與滑鼠訊息處理 • 基本的滑鼠訊息類型 • 請仔細的思考當使用滑鼠來進行視窗螢幕的操作時會有那些動作? • 下表列出各個滑鼠訊息與相關處理函式:
滑鼠訊息 處理函式 說明 WM_LBUTTONDBCLK OnLButtonDblClk 雙按滑鼠左鍵 WM_LBUTTONDOWN OnLButtonDown 按下滑鼠左鍵 WM_LBUTTONUP OnLButtonUp 鬆開滑鼠左鍵 WM_RBUTTONDBCLK OnRButtonDblClk 雙按滑鼠右鍵 WM_RBUTTONDOWN OnRButtonDown 按下滑鼠右鍵 WM_RBUTTONUP OnRButtonUp 鬆開滑鼠右鍵 WM_MOUSEMOVE OnMouseMove 滑鼠移動 WM_MOUSEWHEEL OnMouseWheel 捲動滾輪
虛擬碼 說明 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_KEYDOWN OnKeyDown 按下鍵盤按鍵 WM_KEYUP OnKeyUp 鬆開鍵盤按鍵 WM_CHAR OnChar 按下鍵盤按鍵,並傳回按鍵字元 • 基本的鍵盤訊息類型 • 幾個常見的鍵盤訊息類型與對應的處理函式:
指令介紹 • int CWnd::MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT Ntype = MB_OK); • CClientDC aDC(this); //建立畫布 • aDC.SetPixel(point, RGB(r,g,b)); • COLORREF CDC::SetPixel(int x, int y, COLORREF crCOlor); • COLORREF CDC::SetPixel(POINT point, COLORREF crCOlor);
範例練習 • 課本的範例 • 實作範例