從頭開始學MFC

2021-10-22 03:45:06 字數 2658 閱讀 8339

一、win32專案設計

類似於console控制台程式,win32視窗程式的入口函式類似於main()函式,稱之為winmain函式:

int

winapi wwinmain(

hinstance hinstance,   //例項控制代碼

hinstance hprevinstance,//前乙個例項控制代碼

pwstr pcmdline,      //命令列引數,字串指標

int ncmdshow)       //視窗顯示方法,一系列的巨集

在此函式之中執行以下的步驟進行乙個win32專案視窗的建立

1.設計視窗

wndclass wndcls;

wndcls.cbcl***tra = 0

; wndcls.cbwndextra = 0;//

附加記憶體

wndcls.hbrbackground = (hbrush)getstockobject(black_brush);//

背景 wndcls.hcursor = loadcursor(null, idc_cross);//

游標 wndcls.hinstance = hinstance;//

例項控制代碼

wndcls.lpfnwndproc = winmyproc;//

視窗過程,訊息處理函式

wndcls.lpszclassname = text("類名");

wndcls.hicon = loadicon(null, idi_error);//

圖示 wndcls.lpszmenuname = null;//

選單 wndcls.style = cs_hredraw | cs_vredraw;//

水平垂直重畫

2.註冊視窗 

registerclass(&wndcls);

3.建立視窗

void createwindoww(lpclassname,lpwindowname,dwstyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpparam);

hwnd hwnd = createwindow(text("類名

"), text("標題

4.顯示與更新視窗

//顯示視窗

showwindow(hwnd, sw_shownormal);

updatewindow(hwnd);

5.訊息迴圈

//

取得訊息,分發訊息

msg msg;

while (getmessage(&msg, hwnd, 0, 0

))

windows處理訊息過程:

訊息發出:

os:維護乙個訊息佇列,將訊息加入佇列

os:視窗過程,訊息處理 winmyproc

二、mfc單文件與win32程式的對映

利用嚮導生成mfc專案自動生成的四個類:

cmainframe  //框架類

cmydoc    //文件類

cmyview    //檢視類

其中,mainframe和view檢視類都繼承於cwnd類,view類為整個窗體的子視窗,frame作為框架使用,包含選單和工具欄。

mfc作為了封裝了win32的程式的框架,同樣遵從上述的視窗建立過程的方法,只不過在程式中我們無法檢視。

mfc視窗的建立過程:

2.進入winmain函式(在mfc源**中可查到)

3.winmain() -> afxwinmain(),winmain()函式中向下調函式

4.afxwinmain() -> initinstance() ,利用父類指標呼叫虛函式,多型性使得子類方法得以呼叫

5.initinstance會調一些父類方法實現了視窗的設計

6.接下來進入視窗的註冊,這部分在frame類中的precreatewindow中得以體現,調基類方法註冊視窗

7.進入cframe的create方法中,多次呼叫createex函式建立了整個窗體(包含工具和選單)

8.create中調precreatewindow方法,多型性使得其呼叫子類方法

9.繼而在mainwnd中進行showwindow和updatewindow

mfc的訊息迴圈:

mfc程式設計中,新增乙個訊息處理函式的過程中,1會在類中(.h)宣告乙個訊息處理函式,2會在(.cpp)中實現,3會在(.cpp)中

begin_message_map()

on_wm_create()

end_message_map()

之間新增巨集。

訊息對映,為了解決大規模虛表的問題。

mfc的訊息對映:主要是在winthread::run中體現

控制代碼    關聯  物件指標       <----->乙個靜態函式可以通過控制代碼獲取該物件指標

物件指標  傳      基類        

基類    呼叫  wdnproc(虛函式)  <---->訊息迴圈

wndproc內部由onwndmsg實現,主要關注兩個方面1.是否存在訊息函式。2.是否存在map中的巨集

如果存在的話,調子類的訊息處理函式,否則執行預設視窗過程。

從頭開始學JDK String

目錄 string 倒序 string 建構函式 string equals string 記憶體 string hashcode string startswith string endwith string indexof string lastindexof string substring ...

從頭開始學Redis

第一章 概述 1.1 redis之簡介 1.2 redis之安裝 第二章 api 2.1 redisapi之簡介 2.2 redisapi之string 2.3 redisapi之hash 2.4 redisapi之list 2.5 redisapi之set 2.6 redisapi之zset 第三...

從頭開始學演算法 快速排序

需求 給定陣列從小到大排序快速排序 思路 1 選定第乙個數字為標識flag,將陣列分成兩部分,一部分比flag大,一部分比flag小,2 再將得到的兩部分分別進行1,直到完成 第一步實現 1 從後向前,找到比flag小的,放到空中,自身空出來 2 從前向後,找到比flag大的,放到空中,自身空出來 ...