程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> VC++ >> 明明白白看MFC之程序框架(1)

明明白白看MFC之程序框架(1)

編輯:VC++

  對於程序員來說,如果要提高編程效率,一個好用的,功能強大的並且可以得心應手使用的編程工具往往會給我們程序員帶來莫大的方便。其實對於現在的編程工具來說,使用哪

一種工具都不是問題的關鍵,重要的是你能夠使用到什麼程度,畢竟現在的工具都是非常的強大,對於一般的編程任務來說還沒有不能夠勝任的工具,否則的話恐怕他就不可能在這個世界上存在哪怕是只有一個月的生命。但是根據個人所好以及周圍的人的影響,我們都會去使用某一種或者幾種工具。比較Visual Basic 、C++ Builder和Delphi等編程工具,用VC++編寫Windows應用程序可以說是最富於挑戰性和艱巨性。在本文中我無意去比較各種工具的好壞,僅就我自己學習Visual C++的MFC的體會和心得拿出來與大家一起分享和交流,也希望可以結識更多的志同道合的朋友。

  就我個人的偏見,學習VC++就應該要學習他的類庫MFC(Microsoft Foundation Classes)。也許有的人一聽說MFC就有點望而生畏,這是可以理解的,畢竟Microsoft雖然給了我們一個強大而且非常復雜的類庫,但是沒有給我們帶來學習他的好的方便之處。回想自己學習MFC時的無助和迷茫,以及所走過的彎路,現在想起來還心有余悸,雖然我現在也還是處於非常初級的初級入門階段,但是還是很樂意把自己的心得和體會拿出來一起與大家分享。也希望得到大家的指點。

一、SDK應用程序結構
  
  我學習MFC之路可是從windows編程開始的(可能這一開始就是彎路了^_^)。首先也請大家跟著我一起看一個SDK應用程序結構的Windows應用程序。當然也是經典的“Hello world!”了,編寫的過程就不必羅嗦了,下面給出他的主要源代碼(我使用向導生成的,但是為了閱讀的方便經過了一點點的編輯):

   LRESULT CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);

   int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

 {

   // TODO: Place code here.

  MSG msg;

  ………………………………

  MyRegisterClass(hInstance);

   if (!InitInstance (hInstance, nCmdShow))

  {

        return FALSE;

  } 

  // Main message loop:

  while (GetMessage(&msg, NULL, 0, 0))

  {

        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

        {

               TranslateMessage(&msg);

               DispatchMessage(&msg);

        }

     }

  return msg.wParam;

  }

   BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

  {

     …………………… 

    return TRUE;

  }

  //窗口函數WndProc(),回調函數

  LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

  {

  int wmId, wmEvent; 

  ……………………

  switch (message)

  {

        case WM_COMMAND:

               ………………

               break;

  case WM_PAINT:

               hdc = BeginPaint(hWnd, &ps);

               // TODO: Add any drawing code here...

               RECT rt;

               GetClientRect(hWnd, &rt);

               DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);

               EndPaint(hWnd, &ps);

               break;

        case WM_DESTROY:

               ……

        default:

               return DefWindowProc(hWnd, message, wParam, lParam);

     }

     return 0;

  }

SDK之"Hello World"源程序 

     首先讓我們看一下這個程序的結構,WinMain()是函數的入口點,該函數的主要任務是完成一些初始化的工作和維護了一個消息循環。他們的工作流程如下:入口(WinMain())---à       MyRegisterClass()---->InitInstance ()-àwhile消息循環。函數由入口開始執行,之後調用 MyRegisterClass()注冊窗口類,之後InitInstance ()生成並顯示窗口,這樣之後,就完成了一個窗口的初始化工作了(當然,在 MyRegisterClass(),InitInstance ()中都需要調用相應的API函數來具體的實現,不過我這裡重點分析的是他的結構,所以不考慮他的具體實現細節),然後就是維護消息循環,至此,這個程序的基本結構就差不多建立了。以後程序的運作就靠個消息循環來推動了。

     現在,再讓我們看看那個消息循環的結構,在例子程序中,我們是要程序在窗口中輸出一句"Hello World"。在主程序中我們似乎已經把應用程序的框架全部分析的滴水不漏了,但是沒有看到要求程序輸出"Hello World" 呀?這就是Windows消息的作用了,我們當然還記得剛剛我們說過主程序還維持了一個消息循環,不錯,就是在這個循環裡面大有文章。Window應用程序的特點就是消息驅動,當系統或者用戶要求應用程序完成某一個任務的時候,所依靠的就是消息,系統會把用戶的要求或者系統的要求放到一個消息結構中,然後發送給應用程序,再去處理。我們現在來看看應用程序是怎麼來完成我們的任務的。在應用程序初始化完成之後,調用了一個顯示窗口的API函數,所以系統知道了程序要顯示窗口了,此時(注意,這裡就是產生消息的時機),此時就會在消息隊列中產生一個WM_PAINT消息,這樣,應用程序的消息循環就可以捕捉到這個消息並且將它發送給窗口函數(注意,這個函數是由系統調用的),然後窗口函數就處理這個消息,我們就是在他處理這個消息的時候讓他完成我們的任務的。從這個過程中我們可以看到,如果我們要與程序交互的話,需要做得僅僅就是選擇適當的時機讓系統產生消息了。現在,我們終於可以完全明白SDK的程序的運作過程了。

     OK,一個SDK的應用程序的框架就這樣被建立了,下面我們再來看看如何建立一個MFC的應用程序的框架,以及這兩者之間的對應關系。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved