進入MFC講壇的前言 一

2021-04-16 19:36:53 字數 2822 閱讀 3779

在這裡,我想談談自己學習mfc的一些體會。我是從2023年才開始在window下編寫程式的。在這之前,我編寫過一些dos程式,包括乙個簡單的全螢幕編輯器和乙個帶函式的表示式直譯器,都是一些小的程式。window 3.1流行後,我開始在它下面編寫程式。

從編寫dos程式到編寫window程式,需要從程式設計思想上作乙個比較大的調整。在dos下編寫程式,程式的總體流程完全由應用程式自己控制;但在 window下,程式的總體流程是由作業系統控制的,這一點對在dos下「胡作非為」的dos程式設計師而然,特別不習慣,思想上一時很難轉過彎來,總覺得操 作系統所控制的應用程式流程能夠滿足我們所提出的任意要求嗎?萬一某個應用程式所需要的流程同它相牴觸,那該怎麼樣?

但後來隨著學習的深入,我覺得這種擔心是完全多餘的,就我個人而然在還沒有碰到上面的問題。

另外乙個轉變就是,在window下,程式是由事件(或訊息)驅動的,程式設計師在程式中主要是提供事件處理程式的**,然後由作業系統來呼叫這些**,從 程式設計師的角度看,就是作業系統在「**」他或她所寫的**。這一點也很不習慣,因為在dos下,都是應用程式呼叫作業系統的**(api),現在一下反過 來了,角色變化了,受不了!不過,隨作程式設計量的增加,這一點也慢慢淡化了。

剛開始,我是用sdk程式設計的,使用了半年後,我受不了了, 太麻煩了,編寫乙個簡單的顯示」hello, world!」的程式就得上百行**,再加上討厭的make檔案和.def檔案(那時我使用的是borland c++ 3.1,而且也不知道有owl這個東西)。後來聽人說,現在在window下編寫c或c++程式用的都是mfc,mfc的功能很強大!於是,我到圖書館去 借了兩本講vc的書,照著書上的內容,折騰了乙個禮拜。

說實在話,那乙個禮拜是把我搞得最迷糊的乙個禮拜,mfc把我給嚇壞了。是 的,用mfc編寫乙個「hello, world!」程式只需自己編寫一行**,但我不知道我所編寫的那一行**是什麼時候執行的,我不知道mfc在背後幹了什麼。這些倒不是最主要的,更讓我 難以接受的是,我覺的我所有的程式設計行動都在mfc的控制之下,而且控制得更「死」了,我的思想鑽進上面所提到的「死胡同」中去了。後來我想,如果那時候我 看了一些有關構件(framework)的文章或書,我想,這個「死胡同」對我而然,應該是不存在的。

其實,所有這些都是由於對 mfc不熟悉所造成的,mfc是乙個框架(framework)式類庫,框架式類庫同一般的類庫的不同之處在於,庫中的各個類之間是有聯絡的,它們是按照 框架所定義的模式去協作完成任務的。所以,要學習mfc,首先就要了解各個類之間是如何協作的以及它們的介面。

另外,我覺得,如果熟悉sdk的話,對理解mfc和使用mfc編寫程式是有很大幫助的,因此在後面的講解中,我會根據需要穿插一些sdk方面的知識,以助理解。

最後,必須具有一定的c++知識,完全不知道c++為何物而去使用mfc,我實在難以想象其最後的結果,最好掌握c++的基本知識。

mfc應用程式的控制流程

一般的window應用程式基本流程

winmain()函式

任何乙個應用程式都有乙個入口函式,在window下,程式的入口函式根據應用程式的型別,有兩種選擇:控制台程式的入口函式是main(),一般的 window介面程式的入口函式是winmain()。這裡只**同我們下面的討論有關的winmain()函式。下面是該函式的原型:(visuall c++中)

int apientry winmain(

hinstance hinstance,

hinstance hprevinstance,

lpstr lpcmdline,

int ncmdshow)

其中:hinstance是標識當前程序的例項,它實際上是程序所佔據的位址空間的首位址,在很多window api中,都要將它作為乙個引數傳進去,所以,應用程式一般都會將它儲存在乙個全域性量中。

hpreinstance是應用程式前乙個例項的例項控制代碼。這是16位window的殘留物,在win32應用程式中,這個引數始終為null。所以,某些從16為移植到32位的應用程式,如果使用了hpreinstance,就應該對**作相應的修改。

lpcmdline是命令列引數,這同main()中的argv類似。

ncmdshow用來指明應用程式的主視窗的顯示方式(最大化顯示,最小化顯示,一般化顯示)。

乙個例項

下面是乙個顯示」hello, world」的程式的**,它體現了一般的window應用程式的基本流程。

int apientry winmain(hinstance hinstance,

hinstance hprevinstance,

lpstr lpcmdline,

int ncmdshow)

return msg.wparam;

}file://視窗函式

lresult callback wndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)

return 0;

}上面程式的執行過程如下:

1、註冊乙個視窗類

這是為後面的建立視窗作準備,在使用createwindwo()和createwindowex()建立視窗時,都必須提供乙個標識視窗類的字串。建立視窗類的主要意圖是向作業系統提供視窗處理函式。

2、建立視窗

啟動訊息迴圈,分發並處理訊息。

其中的關鍵部分是訊息迴圈:

while (getmessage(&msg, null, 0, 0))

呼叫getmessage()從執行緒的訊息佇列中取出一條訊息,將訊息翻譯後,再呼叫

dispatchmessage()將該訊息分發至相應的視窗過程。(實際上dispatchmessage()是將該訊息作為引數呼叫對應的視窗的視窗函式,這就是分發的實質),在後面我們會詳細討論mfc的訊息環同上面的訊息環的區別。

進入MFC講壇的前言 一

在這裡,我想談談自己學習mfc的一些體會。我是從1997年才開始在window下編寫程式的。在這之前,我編寫過一些dos程式,包括乙個簡單的全螢幕編輯器和乙個帶函式的表示式直譯器,都是一些小的程式。window 3.1流行後,我開始在它下面編寫程式。從編寫dos程式到編寫window程式,需要從程式...

一ant學習的前言

然後需要設定環境變數 在網上看了很多種設定方法,都是大同小異 1 設定乙個ant home ant檔案所放的根目錄 d program files ant1.8.4 2在path裡面新增 ant home bin 有些人說這種方法不行,要直接設定為d program files ant1.8.4 b...

再談C語言的學習(一) 前言

去年寫過 如何學習c語言 可惜 痕跡 的 學術交流 版面太小,結果一萬多字的文章 了幾期後原稿也丟失了。當 痕跡 的編輯聯絡我說要過載全篇文章時,我既興奮又覺得對不住 原稿丟了啊。於是我決定重寫一篇,一來我可以重溫當時寫 學c 的樂趣,二來可以把我一年多來的新認識奉獻給大家。這次,我的讀者群不再只是...