No MFC,Only API (轉)

gugu99發表於2008-05-27
No MFC,Only API (轉)[@more@] 

No MFC,Only :namespace prefix = o ns = "urn:schemas--com::office" />

在DOS中,養成了喜歡把所有東西都搞清楚的習慣,轉化到程式設計仍喜歡把事情的方方面面都弄清楚,起初選擇了VC6,但由於MFC的聲勢浩大,讓我認為Windows程式設計就是MFC程式設計,學習了一段時間後,發現MFC並不是初學者的好工具,因為MFC是建立在類的基礎上的,運用類的性質隱藏了許多東西,讓初學者搞不清從何處開始,怎樣傳遞訊息,怎樣過程。但同時不可否認,如果你是C++高手,清楚瞭解OO思想,那麼使用MFC開發工程一定會使你的工作顯著提高。如果你的情況不是這樣,就不要試圖開始使用MFC,它會把你搞得糊里糊塗,工作沒有進展。

拋開MFC,一樣能寫出優秀的應用程式——使用API。

許多人不願意直接使用API,他們認為API太低階,數量龐大,不易掌握。但據我的學習所得API雖然龐大,但不是大的不可學。經過一定的練習,使用API一樣能使你的工作很出色。

以下講解從使用最基本的API建立簡單的WIN32程式開始,如果你有興趣那麼就跟緊我。

 

範例1:建立一個“HELLO WORLD”視窗程式

因為是第一次接觸使用WIN32 API程式設計,所以需要介紹一下如何開始你的程式,以及怎樣你的Visual C++環境。

首先,新建一個工程,選擇Win32 Application選項,這是開始WIN32 API的必要開端,然後,輸入工程名進入下一步,在這一步只要選擇A simple Win32 Application就好。下面到了編碼階段,需要配置你的工程,開啟Project選單,settings選項,選中Link標籤,看你在程式中include的頭的相應 .lib是否被列進來,如果沒有就把它新增進來,這樣就確保了不會出現LINK錯誤。

開始工程時,由於選擇了“A simple Win32 Application”選項,工程的基礎檔案已經建立好,可以直接向WinMain中填寫程式碼,源程式提供如下:

#define WIN32_LEAN_AND_MEAN  //說明這不是一個MFC程式

#include "stdafx.h"      //包含相應標頭檔案

//申明此為由Windows呼叫的處理視窗的過程

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

//定義應用程式名及類名

char szAppName[]="Begin";

 

int APIENTRY WinMain(HINSTANCE hInstance,  //應用程式控制程式碼

  HINSTANCE hPrevInstance, 

   LPSTR  lpCmdLine,  //命令列引數

  int  nCmdShow)  //視窗顯示方式

{

  MSG msg;    //訊息變數

  HWND hWnd;    //主視窗控制程式碼

  WNDCLASSEX wc; 

//WNDCLASSEX 結構初始化

  wc.cbClsExtra        =0;

  wc.cbSize        =sizeof(WNDCLASSEX);

  wc.cbWndExtra        =0;

  wc.hbrBackground     =(HBRUSH)GetStock(WHITE_BRUSH);

  wc.hCursor        =LoadCursor(NULL,IDC_ARROW);

  wc.hIcon        =LoadIcon(NULL,IDI_APPLICATION);

  wc.hIconSm        =0;

  wc.hInstance       =hInstance;

  wc.lpfnWndProc      =(WNDPROC)MainProc;

  wc.lpszClassName     =szAppName;

  wc.lpszMenuName      =NULL;

  wc.style        =CS_HREDRAW | CS_VREDRAW |

             CS_LCLKS | CS_OWNDC;

  //註冊視窗類

  RegisterClassEx(&wc);

  //建立主視窗

  hWnd=CreateWindowEx(0,szAppName,szAppName,WS_OVERLAPPEDWINDOW,

    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

    NULL,NULL,hInstance,NULL);

  //顯示主視窗

  ShowWindow(hWnd,nCmdShow);

  UpdateWindow(hWnd);

  //進入事件迴圈

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

  {//翻譯並分發訊息

    TranslateMessage(&msg);

    DispatchMessage(&msg);

  }

//程式結束時返回給Windows以下值

  return msg.wParam;

}

//該函式由Windows呼叫,用來處理訊息

LRESULT CALLBACK MainProc(HWND hWnd,UINT message,

        WPARAM wParam,LPARAM lParam)

{

  HDC hdc;//在視窗客戶區繪製任何,都要使用該控制程式碼(handle device context)

  PAINTSTRUCT ps;

 

  switch(message)

  {

  case WM_CREATE://視窗被建立時,傳送此訊息

    return 0;

  case WM_PAINT://視窗恢復被遮蓋區域,移動,改變大小等出現無效區時傳送此訊息

    hdc=BeginPaint(hWnd,&ps);

    TextOut(hdc,0,0,"HELLO WORLD",11);

    EndPaint(hWnd,&ps);

    return 0;

  case WM_CLOSE://選擇了關閉視窗的動作

    PostQuitMessage(0);

    return 0;

  }

//用預設函式處理訊息

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

}

基於視窗的Win32 API程式的結構就是這樣,至於選單,工具欄,狀態列,工具欄提示等等視窗,我會在後面一一道來。

 

範例2:基於對話方塊的“HELLO WORLD”程式

對話方塊及其控制元件的建立有兩種方法:一,在資源編輯器中建立;二,由程式執行時動態產生;第一種方法很簡單,所有工作在 Visual 環境下的程式設計師,都對這一點稱奇,它改變了傳統設計介面的方法,只要用滑鼠控制就能做出令人稱讚的介面。我要介紹一下第二鍾方法,源程式如下:

 

#define WIN32_LEAN_AND_MEAN

#include "stdafx.h"

#include "re.h"  //包含定義控制元件識別符號的標頭檔案

//處理對話方塊訊息的函式

BOOL WINAPI MainDlg(HWND,UINT,WPARAM,LPARAM);

 

HINSTANCE hIns;  //全域性應用程式控制程式碼,方便各程式訪問

 

int APIENTRY WinMain(HINSTANCE hInstance,

  HINSTANCE hPrevInstance,

   LPSTR  lpCmdLine,

  int  nCmdShow)

{

  MSG msg;

  hIns=hInstance;

  //建立對話方塊

  DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG),

    NULL,(DLGPROC)MainDlg);

  //進入訊息迴圈

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

  {

    TranslateMessage(&msg);

    DispatchMessage(&msg);

  }

  return msg.wParam;

}

//對話方塊訊息處理函式

BOOL WINAPI MainDlg(HWND hDlg,UINT message,

      WPARAM wParam, LPARAM lParam)

{

  switch(message)

  {

  case WM_INITDIALOG:

    //初始化對話方塊

    CreateWindow("STATIC","HELLO WORLD",WS_CHILD | WS_VISIBLE,

      160,100,200,50,hDlg,NULL,hIns,NULL);

    return TRUE;

  case WM_COMMAND:

    switch(LO(wParam))

    {

    case IDOK:

    case IDCANCEL:

      EndDialog(hDlg,0);  //結束對話方塊

      PostQuitMessage(0);

      break;

    }

    return TRUE;

  }

  return FALSE;

}

 

資原始檔中有以下內容

IDD_DIALOG DIALOG DISCARDABLE  0, 0, 188, 98

STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU

CAPTION "Dialog"

FONT 10, "System"

BEGIN

  DEFPUSHBUTTON  "OK",IDOK,25,80,40,9

  PUSHBUTTON  "Cancel",IDCANCEL,65,80,40,9

END

對話方塊中控制元件的動態建立就是用函式CreateWindow來實現的,以後還會看到其他控制元件的建立和使用。

當對話方塊函式處理了某一訊息後應返回TRUE,反之,返回FALSE。

這一講內容講述了簡單Win32程式設計框架,並無涉及太多艱難知識,如果你能接受並喜歡這種Windows程式設計方法,就請和我一起學習吧。

有任何意見,建議請 e:y_h_zhang@sohu.com.

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004664/,如需轉載,請註明出處,否則將追究法律責任。

相關文章