用習慣了c的人要看乙個程式時首先會想到找到那個main函式在哪,然後再順著往下看.因為main函式作為程式的入口點,整個程式都是從那開始執行的.當在c++中sdk
(win32 api project)開發時也繼承沿用c的思維,是有個main函式,不過現在的main函式改名字了,叫winmain,當然有時還有變體,比如叫_twinmain,反正名字中總會帶個main,讓我們一看就知道.而在qt中就跟c一樣,就老實的來個標準的main函式.
我們會發現c++中可以有乙個單獨的main函式,不用包含在哪個類中,另外還有不屬於任何類的全域性變數或全域性函式這自然就不是純粹的物件導向語言了.所以說c++支援多種程式設計正規化嘛,可以是跟c完全一樣的面向過程正規化,或者再加些普通的類就是基於物件的正規化了,如果再用到繼承和多型就是物件導向了,而要是用到模板就是泛型正規化了.而且這些正規化可以互相混合用.而c#就是純的物件導向,所以它裡面雖然也有main函式,但也是要放在乙個類裡面去,至於具體放哪個類無所謂,你隨便放.一般預設是放program這個類裡.當然並不是說純的物件導向就比混合的正規化好,應該各有優缺點.
哎扯得有點遠了,言歸正傳.
開發乙個帶介面的sdk程式大致流程是這樣的.首先自然是要有個main函式做入口點.然後按下面的步驟來(為了討論方便,只說大概流程,**也是不完整的)
int _twinain( hinstance hinstance, hinstance hprevinstance, lptstr lpcmdline, int ncmdshow)
msg msg;
initinstance(hinstance hinstance, int ncmdshow) //第2步,建立窗體
while (getmessage(&msg, null, 0, 0)) //第3步訊息迴圈,分派訊息
translatemessage(&msg);
dispatchmessage(&msg);
return (int) msg.wparam; //第4步,退出程式
return registerclass(...);
bool initinstance(hinstance hinstance, int ncmdshow)
createwindow(...); //建立窗體
showwindow(...); //顯示窗體
updatewindow(...); //送出wm_paint
return true;
lresult callback wndproc(...)
在mfc中生成乙個有介面的程式大體過程也一樣,只不過封裝起來了.那我們感興趣的就是兩個問題.
1.mfc中有沒有main函式了,如果有它跑哪去了?
2.如果有main函式,它裡面的那4步涉及到的具體操作是否也跟win32 api一樣?
下面我們就來一一解答下
實際上候捷那本深入淺出mfc裡面有講的很清楚了.不過由於講的太詳細了,有幾十頁,看的容易暈,而且他舉的例都是老版本的mfc類,在新版本中一些類的函式會有一點點變化.
1.針對第乙個問題,mfc裡是有用到main函式的
// export winmain to force linkage to this module
extern int afxapi afxwinmain(hinstance hinstance, hinstance hprevinstance,
_in_ lptstr lpcmdline, int ncmdshow);
呼叫main的順序
2.針對第2個問題,main函式裡具體的操作.
知道了有main函式,你心裡可能有一絲安慰了.但還是有些覺得不安的是這main函式裡的具體操作是否跟sdk中的一樣,是不是也來那麼幾步,先註冊視窗再建立視窗之類的.
答案是mfc呼叫的main函式大概流程差不多是那樣,但實現細節很不一樣.我們看下上面說的afxwinmain裡面的內容是啥吧.你可以在winmain.cpp中看到詳細**.
把這個main函式簡化一下,做的操作大概是這樣,
afxwinmain(...)
cwinthread* pthread = afxgetthread();
//這下面幾個函式就差不多是完成前面講的sdk中的所有步驟
pthread->initinstance();
pthread->run();
afxwinterm(); //結束程式
反正結束程式我們就不用管了,重點關心前面的三步,註冊視窗,建立視窗,還有訊息分派.
m_pmainwnd = new cmyframewnd; //這張操作會註冊並建立視窗,m_pmainwnd就是返回的視窗控制代碼
m_pmainwnd->showwindow(m_ncmdshow); //顯示視窗
m_pmainwnd->updatewindow();
pthread->run();是分派訊息,你可以在thrdcore.cpp中檢視cwinthreed的run函式的原始碼,下面摘了一點點.
// acquire and dispatch messages until a wm_quit message is received.
for (;;)
不過關於訊息的處理mfc用到了訊息對映機制,比如複雜.這裡不討論了,反正大概就把cmyframewnd當成是視窗過程就行了.
而指標嘛由於呼叫了虛函式,所以用到了物件導向中的多型,於是轉來轉去的.然後最難的地方可能就是訊息機制在這裡更複雜一點了.不能簡單的與sdk中做一對一的對比.
原 計算乘積的聚合函式跑哪去了呢?
非常鬱悶,笨笨的excel有個product函式可以用於計算某一列的乘積,但是oracle,sql server都沒有,貌似mysql也沒有。看了一下asktom,貌似要自己寫乙個product的function,鬱悶鬱悶。突然,同事提出嘗試變換一下,可是乘法已經是最基本的四則,莫非要變換成加法?還...
我的學習狀態哪去了
最近不知道為什麼總靜不下心學習,對著電腦發呆,對電腦遊戲也失去了興趣,網路 雖然還有那麼一點點 力,可總歸是因無聊而生,我自己也鬱悶了,到底我 出問題了?怎麼一點也提不起學習的熱情來?是沒帶電腦來的緣故?用著別人的電腦不自在?還是?想不明白.思來想去最有可能的還是情緒的波動吧,加上自己不太注重毅力的...
我的輸入法上哪去了
再一次遇到這樣的問題,剛裝的電腦,右下角的輸入法不見了,以前遇到這個問題的時候不知道怎麼解決。只好忍著,直一忍到實在是受不了的時候就重灌系統。這次是剛裝的系統,輸入法不見了又重灌?下定決心這次要把你搞定。原來解決辦法很簡單 begin 開始 執行 ctfmon.exe 啟動輸入法 禍不單行 ctrl...