引:
這篇部落格是根據昨天的我們團隊技術研討會,我所講的部分的內容(這句話讀起來好糾結啊),由幻燈片改變而成的。因為我們團隊在介面設計上缺陷很大,而我想對強一些(當然是我們團隊之中了,我們都是大學生,所以我也強不到哪兒去)。為什麼不直接講mfc技術,而要簡單講框架。原因如下:個人認為mfc難學難用在於你不了解mfc的架構,如果你稍微有一些了解的話,用起來也就沒那麼複雜了。框架型別的東西往往如此,為程式設計師隱藏了太多的細節,通常都是知其然而不知其所以然。我準備了好長時間,但是講解效果不好。意料之外,情理之中。一來看框架就要看原始碼,乙個框架原始碼的複雜程度可想而知;二來大家都關心一些實用的技術,表面性東西,比如怎麼實現視窗透明之類的技術,而不願意花費時間在框架性東西上。這是一件很悲劇的事情……,我們園子裡有大牛,當然我相信有很多學生,我想告訴大家的是學技術要專一要往深里學,不要浮躁,踏踏實實的。廢話都多了……
我要寫一點宣告,上面廢話可以不看,宣告一定要看。
(1)部落格參考了侯俊傑老師的《深入淺出mfc》,我用的是visual studio 2008,在原始碼上有一些不同。我學習了他分析問題的方法,在一些我自己搞不定的問題上,我摘了他書的原話。
(2)除本文之外,其他鏈結跳轉文章是我直接從wps doc中直接複製過去,難免有一些失真。我本想一點一點校正格式,但是由於文章比較長,所以格式上會有一些混亂。這一點請大家見諒。
(3)小弟才疏學淺。如果看到本文的您是高手的話,您一定會發現文章的很多錯誤,希望您給我指出來。言辭表達不正,也歡迎您斧正。
(4)文章由幻燈片改編,銜接可能不流暢。
(4)本文為獨酌逸醉
正文:例項**:
#include<
windows.h
>
atom registerwndclass( hinstance hinstance , lpcwstr classname);
lresult callback windowproc(hwnd ,uint, wparam, lparam);
/**/
intcallback winmain(
__in hinstance hinstance,
__in hinstance hprevinstance,
__in lpstr lpcmdline,
__in
intncmdshow )
//(2)建立視窗
hwnd hwnd;
//視窗控制代碼
hwnd
=createwindow(
classname,
//視窗類名稱
text(""
), //
視窗標題
//視窗風格
100,
//視窗位置的 x 座標 , cw_usedefault
100,
//視窗位置的 y 座標 , cw_usedefault
400,
//視窗的寬度 , cw_usedefault
300,
//視窗的高度 , cw_usedefault
null,
//父視窗控制代碼
null,
//選單控制代碼
hinstance,
//應用程式控制代碼
null);
//視窗建立資料指標, wm_create lparamif(
!hwnd)
//(3)顯示並更新視窗
showwindow(hwnd, ncmdshow);
updatewindow(hwnd);
//(4)進入訊息迴圈
msg msg;
//如果 msg 訊息為 wm_quit , getmessage 返回為 0 ,退出迴圈
while
(getmessage(
&msg, null, 0,
0))
//程式結束
return
msg.wparam;}//
註冊視窗
atom registerwndclass( hinstance hinstance , lpcwstr classname)
//視窗過程
lresult callback windowproc(
__in hwnd hwnd,
//a handle to the window.
__in uint umsg,
//the message.
__in wparam wparam,
//additional message information
__in lparam lparam
//additional message information)
return
defwindowproc(hwnd, umsg, wparam, lparam);
}
思考:2.1 mfc 程式的初始化過程
2.2 rtti(執行時型別識別)
2.3 dynamic creation(動態建立)
c++動態建立物件的困難在於,無法在程式執行期間,根據動態獲得的乙個類名稱,要求程式產生乙個物件。
在 rtti 中,cruntimeclass 物件記錄了類的 createobject 函式,在程式執行期間獲得類名稱,遍歷鍊錶找到名稱匹配項,呼叫 createobject ,產生新物件。
c++ 動態型別相關
(1) typeid 運運算元
(2)巨集 [ rtti ]
(3)模板實參演繹 [stl iterator_traits]
c++在動態物件建立上一直是乙個缺陷,據我說知,c# 有一項技術支援(反射)。
2.4 persistence(永久儲存)機制
persistence:將物件永久保留下來(寫入檔案),persistence 機制,也就是serialize(資料讀寫)。
persistence 簡介
mfc 訊息分類
命令訊息(wm_command):「使用者命令程式做些操作」。凡是 ui 物件產生的訊息都是這種命令訊息,可能來自選單或者加速鍵或工具欄按鈕,並且都以 wm_command 呈現。sdk 程式主要靠 wparam 識別之,mfc 程式則主要靠選單項的識別碼( menu id)識別——其實兩者是一樣的。
凡是派生自 ccmdtarget 的類,都由資格接受命令訊息。
標準訊息:除 wm_command 之外,任何以 wm_ 開頭的都算這一類,均可接受此訊息。
control notification:由控制項產生,為的是向父類視窗通知某種情況。例如當你在 listbox 上選擇其中乙個專案,listbox 就會產生 lbn_selchange 傳送給父視窗。這類訊息是以 wm_command 形式呈現。
mfc 執行緒分類:work thread,ui thread
區別:work thread 沒有訊息迴圈
ui thread 有自己的訊息和佇列迴圈
work thread:通常用來執行後台計算和維護任務,如冗長的計算過程,印表機的後台列印等
ui thread:一般用於處理獨立於其他執行緒執行之外的使用者輸入,響應使用者及系統所產生的事件和訊息等。
4.1 work thread的建立
cwinthread*
afxbeginthread(afx_threadproc pfnthreadproc,
lpvoid pparam,
npriority=thread_priority_normal,
uint nstacksize=0,
dword dwcreateflags=0,
lpsecurity_attributes lpsecurityattrs=null);
執行緒函式型別:
uint executingfunction(lpvoid pparam);
4.2 ui thread的建立
cwinthread* afxbeginthread(cruntimeclass* pthreadclass,
int npriority=thread_priority_normal,
uint nstacksize=0,
dword dwcreateflags=0,
lpsecurity_attributes lpsecurityattrs=null);
具體請看:多執行緒程式設計之二——mfc中的多執行緒開發
略(幻燈片中講了一些,但是比較雜碎,就不在這裡列出來了……)
《本文完》
2011-09-20
MFC基本框架
mfc基本框架 by 小戴 發表於 2006 12 21 15 59 00 mfc 應用程式框架 1 mfc 簡介 mfc microsoft foundation class 是由微軟公司編寫的一套專門用於 windows 程式設計的 c 基礎類庫,vc 程式設計基本上都是圍繞著 mfc 類庫來進...
MFC 框架學習
1.最簡單的框架程式 使用mfc基礎類庫,編寫乙個最簡單的框架程式 include public bool initinstance cframewnd pmainwnd new cframewnd pmainwnd showwindow m ncmdshow pmainwnd updatewind...
MFC執行框架
2 winmain登場 extern c int winapi twinmain hinstance hinstance,hinstance hprevinstance,lptstr lpcmdline,int ncmdshow twinmain函式的 t 是為了支援unicode而準備的乙個巨集。...