MFC(筆記備忘)

2021-06-19 06:47:28 字數 4686 閱讀 8630

mfc應用程式程式設計

一 mfc的發展

vc 1.0->vc 5.0->vc 6.0->vc2008 sp1)->vs2010

二 mfc基礎

1 mfc 微軟基礎類庫 

採用類的方式,將win32 api等進行封裝,

形成的庫.

2 mfc相關的標頭檔案

afxwin.h  (類似於windows.h)

afxext.h  mfc擴充套件標頭檔案

...三 mfc應用程式

1 mfc的控制台程式

1.1 包含afx系列的標頭檔案

封裝了應用程式的啟動過程.

1.3 afxwininit mfc初始化函式 

將應用程式的資訊初始化.

2 mfc的動態庫和靜態庫

2.1 靜態庫 - 增加了mfc的支援

2.2 動態庫

2.2.1 mfc規則dll

2.2.1.1 使用mfc靜態庫的規則dll

2.2.1.2 使用mfc動態庫的規則dll

2.2.2 mfc擴充套件dll

2.3 不同

2.3.1 mfc相關的afx標頭檔案

宣告了該類的全域性變數.

3 mfc應用程式

3.1 單文件檢視應用程式

3.1.2 cmainframe類

3.1.3 cview的乙個子類

3.1.4 cdocument的乙個子類

3.2 多文件檢視應用程式

3.2.2 cmainframe類

3.2.3 cview的乙個子類

3.2.4 cdocument的乙個子類

3.2.5 cchildframe 子框架視窗

3.3 對話方塊應用程式

3.3.2 對話方塊類

四 mfc中的類

1 cobject類

mfc類的基礎,大部分mfc類都是它的子類.

cobject封裝了mfc的基礎的機制

1.1 new和delete

1.2 assert

1.3 執行式資訊

1.4 動態建立

1.5 序列化

2 應用程式框架

應用程式啟動相關資訊,以及mfc訊息對映

機制。3 視窗支援類

封裝了視窗操作的api,各種控制項及視窗的

框架.4 繪圖類

提供了繪圖api的封裝,以及相關的gdi裝置

封裝.5 mfc的集合類

提供了陣列、鍊錶、對映的資料結構的操作.

6 資料庫支援類

odbc支援類和dao的支援類。

dao的類已作廢.

7 同步類

臨界區/事件/互斥/訊號量的封裝

8 socket類

封裝了socket的程式設計.

9 常用資料結構

cstring crect cpoint等.

五 第乙個mfc程式

1 環境設定

1.1 修改標頭檔案

1.2 在setting中增加mfc庫支援

2.2 新增initinstance函式

是在程式啟動過程中,會被呼叫,我們可以

在這個函式中,建立視窗或者各種初始化

操作.3 視窗

3.1 新增cframewnd的子類cmyframewnd

物件3.3 建立視窗(create)並顯示(showwindow)

m_pmainwnd = pwnd;

3.5 在cmyframewnd中新增視窗處理函式

windowproc,在windowproc中處理訊息

#include "stdafx.h"

//框架視窗類

class cmyframwnd : public cframewnd

;lresult cmyframwnd::windowproc(uint message, wparam wparam, lparam lparam)

;hdc hdc = ::beginpaint(

m_hwnd

, &ps );

//視窗自帶控制代碼引數, ::beginpaint-全域性系統api函式

textout(hdc, 200, 200, "hello world!",11);

endpaint(&ps);}}

return cframewnd::windowproc(message, wparam, lparam);

}//應用程式類;

六 mfc應用程式的啟動

mfc應用程式與win32程式一樣,都需要程式

的入口函式.

應用程式類,封裝了應用程式的相關資訊,

可以提供初始化 訊息迴圈等處理.

1.1 將this指標儲存到threadstate中. 

m_pcurrentwinthread = this

1.2 將this指標儲存到modulestate中

1.3 各種的成員變數的初始化

2 程式的入口函式

2.1 winmain函式,與win32程式一致.

2.2 在winmain函式中,呼叫了afxwinmain

函式.2.3 afxwinmain函式

2.3.1 呼叫afxwininit初始化應用程式

初始mfc內部資料

2.3.3 呼叫cwinthread的initinstance

函式做初始化操作

2.3.4 呼叫cwinthread的run函式進行

訊息迴圈

2.3.5 呼叫afxwinterm函式做退出處理.

3 程式的啟動

指標分別儲存到全域性變數中.

3.2 在afxwinmain執行中,首先從全域性變數

初始化.我們在initinstance函式中,建立

視窗等初始化操作.

3.4 呼叫run函式,進行訊息迴圈.

七 視窗建立及視窗處理函式

1 視窗建立

1.1 視窗的引數初始化,包括視窗類.風格

視窗處理函式等資訊. 

注意:將defwindowproc註冊成視窗處理函式.

1.2 設定 建立hook (鉤子) 

當視窗建立的時候,呼叫這個hook函式.

wnd -> hook -> wndproc

1.3 建立視窗

createwindowex

1.4 解除安裝建立hook

將hook程式從當前程式中移除

2 hook(鉤子)程式

2.1 使用afxgetafxwndproc函式獲取了

乙個wndproc函式指標, 也就是

afxwndproc(afxwndprocbase)函式

位址.2.2 將這個wndproc函式設定成當前視窗的

處理函式

2.3 將視窗控制代碼和視窗類的指標儲存到

mfc的對映資料中.(afxmaphwnd函式)

3 afxwndproc(base)視窗處理函式

3.1 根據視窗控制代碼獲取了相對應的視窗

的cwnd *型別的指標,從對映資料中

根據視窗控制代碼查詢cwnd *指標.

(afxmaphwnd函式)

3.2 呼叫afxcallwndproc函式

3.3 在afxcallwndproc函式中,呼叫cwnd

的windowproc函式

注意: 在mfc程式當中,所有視窗處理都是

使用乙個函式.

4 視窗的建立及處理過程

4.1 將defwindowproc函式註冊成當前

視窗的處理函式

4.2 設定鉤子函式

4.3 建立視窗,並執行鉤子函式

4.4 將視窗類指標和視窗控制代碼的對應關係

儲存.  

4.5 在鉤子函式將afxwndproc(base)函式

設定當前視窗的視窗處理函式

4.6 在afxwndproc(base)收到視窗訊息,

從視窗對應關係中,查詢相應的窗

口類指標.

4.7 呼叫視窗類windowproc函式處理訊息

八 訊息對映

1 訊息對映新增

1.1 在framewnd新增訊息巨集定義

declare_message_map

1.2 新增訊息巨集實現

1.3 新增訊息處理函式

1.4 新增訊息和處理函式的對應

2 訊息巨集的實現

2.1 資料型別

2.1.1 afx_msgmap_entry 是用於儲存

訊息id與對應函式指標,及相關的資訊

struct afx_msgmap_entry

;2.1.2 afx_msgmap 用於儲存getbasemap

的函式位址及afx_msgmap_entry陣列的

位址.struct afx_msgmap

;2.2 **

class cmsgframe : public cframewnd  

const afx_msgmap* pascal cmsgframe::_getbasemessagemap() 

const afx_msgmap* cmsgframe::getmessagemap() const 

afx_comdat afx_datadef const afx_msgmap cmsgframe::messagemap = 

; afx_comdat const afx_msgmap_entry cmsgframe::_messageentries = , 

}; 

C備忘筆記

main 函式是乙個特殊的函式,並不需要引數。符號常量大寫,語句結尾無需分號。define number 10 const cant modified always 其值將不能被修改。eof end of file 定義在stdio.h中,是個constant,乙個整型數。在沒有輸入時,getcha...

awk筆記備忘

awk pattern 0變數是指整條記錄,1表示當前行的第乙個域,2表示當前行的第二個域,n當前記錄的第n個域,欄位間由fs分隔,每行按 fs 字段分隔符 預設是空格或tab cat 1.txt beth 4.00 0 dan 3.75 0 kathy 4.00 10 mark 5.00 20 m...

MFC編寫技巧及備忘錄

1 如果 量不大,可以直接檢視每次malloc或new的地方是否出現記憶體洩漏。2 在程式的入口處加上 crtsetbreakalloc 1654 然後點除錯執行,通過shift f11按鍵定位開闢記憶體空間 的 1 在 vs2008 下編譯c 程式 發現找不到 std int.h 原因stdint...