一、Windows訊息機制
1.1視窗
一個Windows應用程式中至少有一個視窗,稱為主視窗,我們在客戶區進行圖案的繪制,
1.2句柄
一個Windows應用程式是包含圖示、游標等許多部件(資源),系統在為這些部件(資源)分配記憶體后會回傳他們的標識號,也就是所謂的句柄,比如在Windows應用程式中,使用視窗句柄來標識每一個視窗,對視窗進行操作時候,首先就是得到這個視窗的標識,
1.3訊息與訊息佇列
Windows是事件驅動方式的程式設計,當一個Windows應用程式開始執行的時候,系統會產生一個訊息佇列,用于保存這個視窗的訊息,eg:當你自己在一個視窗中按下鍵盤時候(事件),系統會收集到這個按下鍵盤事情(事件),然后包裝成訊息,放到這個視窗的訊息佇列中(視窗程序),因為佇列的先進先出的特點,這時候視窗會一個一個的讀取訊息,然后進行相應的執行處理,
1.4WinMain函式
控制臺DOS中的入口是mian函式,而WinMain函式就是Windows程式的入口函式,啟動一個應用程式時候就開始先呼叫WinMain函式
1.5Windows編程模型
一個應用程式的功能是:創建一個視窗,然后回應鍵盤或者滑鼠訊息,
- WinMain函式的定義
- 創建視窗
- 訊息回圈
- 視窗程序
二、MFC的簡單使用
2.1MFC簡介
MFC是微軟基礎類別庫,以C++類的形式封裝了Windows API,并且包含一個應用程式框架,類中包含了大量的windows句柄封裝類和很多windows的組件和內建控制元件的封裝類,MFC把Windows SDK API函式包裝成了幾百個類,MFC給Windows系統提供面向物件的介面,支持可重用性、自包含性以及OPP原則,
2.2MFC程式入口
MFC.h
//mfc頭檔案
#include<afxwin.h>
//1、應用程式類CWinApp,MyAPP派生類
class MyApp : public CWinApp{
public:
//父類的虛函式,需要派生類進行重寫
//也是MFC函式的入口函式
virtual BOOL InitInstance();
};
//2、框架類CFrameWnd,MyFrame派生類
class MyFrame : public CFrameWnd{
public:
//建構式
MyFrame();
}
MFC.cpp
//對應類的頭檔案
#include "mfc.h"
//有且只有一個的全域應用程式類的物件
MyApp app;
//程式入口
BOOL MyApp::InitInstance(){
//1、創建類框架
MyFrame *frame = new MyFrame;
//2、顯示視窗
frame -> ShowWindow(SW_SHOWNORMAL);
//3、更新視窗
frame -> UpdateWindow();
//4、保存框架類物件指標
m_pMainWnd = frame;
return TRUE;
}
//重寫建構式
MyFrame::MyFrame(){
//創建視窗
Create(NULL,TEXT("mfc"));
}
2.3MFC的訊息映射
息映射就是將訊息和成員函式相互關聯的表,比如,Windows將一個滑鼠左擊訊息放到一個框架視窗訊息佇列中,然后這個視窗取到這個訊息時候,MFC將搜索該視窗的訊息映射,如果存在一個處理滑鼠左擊訊息(WM_LBUTTONDOWN)的處理程式,就呼叫,
下面是如何在一個類中撰寫一個訊息映射
- 在操作的類中宣告訊息宏
- 通過放置標識訊息的宏來執行訊息映射,相應的類將對BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的呼叫之間處理訊息
mfc.h
class MyFrame : public CFrameWnd{
public:
MyFrame();
//宣告訊息宏
DECLARE_MESSAGE_MAP()
}
mfc.cpp
//定義訊息宏,在類中實作(派生類,父類)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()
//重寫建構式
MyFrame::MyFrame(){
//創建視窗
Create(NULL,TEXT("mfc"));
}
對應的處理函式分別在類中宣告,類外定義
mfc.h
//框架類CFrameWnd,MyFrame派生類
class MyFrame : public CFrameWnd{
public:
//建構式
MyFrame();
//宣告訊息宏
DECLARE_MESSAGE_MAP()
//函式宣告
dfx_msg void OnLButtonDown(UINT,CPoint);
}
mfc.cpp
//定義訊息宏,在類中實作(派生類,父類)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()
//重寫建構式
MyFrame::MyFrame(){
//創建視窗
Create(NULL,TEXT("mfc"));
}
//定義具體函式的實作
void OnLButtonDown(UINT,CPoint){
.......
.......
}
2.4創建專案時候使用MFC模板
創建之后,會產生下面的幾個類

其中要記住,我們的處理函式就是在視圖類中撰寫,可以理解原來的框架類是作為底圖,現在的視圖類是疊加在上面的一個白板區域,就在這上面繪制渲染
2.5VS2019中的類向導使用
ctrl+shift+x可以快速調出類向導,所謂類向導,就是幫助你快速的產生訊息映射,再也不用像上面一樣自己手寫開始宏,結束宏…會自動幫你生成這些,

三、MFC的繪圖簡介
3.1MFC繪圖基本介紹
Windows GDI 是Windows提供的影像設備介面,可以將圖形繪制在顯示幕上
MFC是提供2個類來支持呼叫GDI:
- DC類:用來設定繪圖屬性和繪制圖形
- 繪圖物件類:封裝了各種GDI繪圖物件,包括畫筆,刷子,字體…
而在MFC中影像設備介面被抽象為CDC類,CDC類封裝了所有的GDI函式,所以使用CDC類繪圖,而視窗操作在CWnd類,
CDC類中又有4個子類
- CClientDC 操作用戶區,在滑鼠繪圖,繪制文本時候要用到它
- CMetaFileDC 設備環境類,在構造期間執行BeginPaint,析構期間執行EndPaint
- CPaintDC
- CWindowsDC
3.2CDC類
GetDC、releaseDC是CWnd類的成員函式
CreateDC、DeleteDC是CDC類的成員函式
下面是展示三種獲取設備環境物件的方法、
void CDrawTestView::Draw(CDC *pDC)
{
//使用傳入CDC的物件指標繪圖指標
pDC -> LineTo(200,100);
//構造CClientDC設備環境物件指標
CClientDC dc(this);
dc.LineTo(200,200)
//通過GetDC函式獲得設備環境物件指標
CDC* p = this ->GetDC();
p->LineTo(100,200);
//利用GetDC函式獲得的設備環境物件必須使用ReleaseDC函式釋放
this->ReleaseDC(p);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/170525.html
標籤:其他
上一篇:最后的宣戰 by ducati
