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...