MFC 框架技術簡單研討

2022-02-16 13:35:39 字數 4564 閱讀 2863

引:

這篇部落格是根據昨天的我們團隊技術研討會,我所講的部分的內容(這句話讀起來好糾結啊),由幻燈片改變而成的。因為我們團隊在介面設計上缺陷很大,而我想對強一些(當然是我們團隊之中了,我們都是大學生,所以我也強不到哪兒去)。為什麼不直接講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而準備的乙個巨集。...