Win32程序設計基礎

/************************************************************************/
/*                       Win32程序設計基礎                              */
/************************************************************************/
/************************************************************************/
/* Win32程序的註釋,雖然很簡單,但是這是Win32程序設計的起步,所以詳細些 */
/************************************************************************/
/************************************************************************/
/* 導入包含文件WINDOWS.H,此文件包含了其它的Windows頭文件                */
/* WINDEF.H   基本類型定義                                              */
/* WINNT.H    支持Unicode的類型定義                                     */
/* WINBASE.H  內核函數                                                  */
/* WINUSER.H  用戶接口函數                                              */
/* WINGDI.H   圖形設備接口函數                                          */
/************************************************************************/
#include <windows.h>

/************************************************************************/
/* 窗口對象的過程處理函數                                               */
/* LRESULT: 簡單定義爲LONG(long)                                       */
/* CALLBACK:__stdcall,指在Windows本身和用戶的應用程序之間發生的函數調 */
/*           用的特殊調用序列。                                         */
/* HWND:    窗口句柄,32位數字,該參數爲接受消息的窗口的句柄,          */
/*           CreateWindow函數的返回值。                                 */
/* UINT:    unsigned int 無符號整型32位,                              */
/*           該參數爲MSG結構中的message域相同,表示該消息的數字         */
/* WPARAM:  UINT,32位消息參數                                         */
/* LPARAM:  LONG,32位消息參數                                         */
/************************************************************************/
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

/************************************************************************/
/* Windows應用程序的主函數,有四個參數,名稱固定爲WinMain,返回值爲int  */
/* WINAPI 在WINDEF.H中定義,#define WINAPI __stdcall                    */
/* HINSTANCE:實例句柄,數字                                             */
/* 在32位系統中WinMain的第二個參數總爲NULL(定義爲0)                     */
/* 第三個參數用於運行程序的命令行,                                     */
/* 某些Windows應用程序使用這個參數在程序啓動時將文件加載到內存          */
/* LPSTR/PSTR:指向字符串的指針,相當於 char *                          */
/* 第四個參數指出程序最初顯示的方式,正常,最大化,最小化等。           */
/************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR lpszCmdLine, int iCmdShow)
{

 /************************************************************************/
 /* 定義窗口類                                                           */
 /* TCHAR:char                                                          */
 /* _T和TEXT宏,功能一致,通常沒用,在Unicode系統中,                    */
 /* 自動把後面的字符串轉換爲寬字符串                                     */
 /************************************************************************/
 TCHAR tcClassName[] = TEXT("My Window");  //窗口類名字符串

 /************************************************************************/
 /* WNDCLASS:窗口類結構,定義了窗口的一般特性,可以創建不同的窗口       */
 /* typedef struct                                                       */
 /* {                                                                    */
 /*      UINT        style ;                                             */
 /*      WNDPROC     lpfnWndProc ;                                       */
 /*      int         cbClsExtra ;                                        */
 /*      int         cbWndExtra ;                                        */
 /*      HINSTANCE   hInstance ;                                         */
 /*      HICON       hIcon ;                                             */
 /*      HCURSOR     hCursor ;                                           */
 /*      HBRUSH      hbrBackground ;                                     */
 /*      LPCTSTR     lpszMenuName ;                                      */
 /*      LPCTSTR     lpszClassName ;                                     */
 /* }                                                                    */
 /* WNDCLASS, * PWNDCLASS ;                                              */
 /************************************************************************/
 WNDCLASS wc;                      //窗口類屬性描述結構

 wc.lpszClassName = tcClassName;   //窗口類名
 wc.lpszMenuName  = NULL;          //窗口類菜單資源名
 wc.lpfnWndProc   = WndProc;       //窗口對象的過程處理函數,指向函數的指針
 wc.hInstance     = hInstance;     //當前進程對象句柄,接收於WinMain參數
 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //窗口背景刷子對象
 wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);     //圖標對象
 wc.hCursor       = LoadCursor(NULL, IDC_ARROW);         //光標對象
 wc.cbClsExtra    = 0;             //同類窗口對象公共數據區大小
 wc.cbWndExtra    = 0;             //當前窗口對象私有數據區大小
 wc.style         = CS_HREDRAW | CS_VREDRAW; //窗口類風格,水平或垂直尺寸改變後刷新

 if (!RegisterClass(&wc))          //註冊窗口類,參數爲指向WNDCLASS結構的指針
 {

  /************************************************************************/
  /* 窗口類註冊不成功的錯誤信息                                           */
  /* MessageBox 消息框                                                    */
  /* 參數一:窗口句柄,如果沒有則爲NULL                                   */
  /* 參數二:消息框主體顯示的字符串                                       */
  /* 參數三:消息框標題欄上的字符串                                       */
  /* 參數四:winuser.h中定義的MB_開始的常數組合,消息框風格:按鈕,圖標    */
  /*      爲0,則只有ok按鈕                                            */
  /* 返回值:返回IDOK(1)。                                                */
  /* 還可以返回IDYES、IDNO、IDCANCEL、IDABORT、IDRETRY、IDIGNORE等        */
  /************************************************************************/
  MessageBox(NULL, TEXT("RegisterClassError!"), TEXT("Error"), MB_ICONERROR);

  return 0;                        //如果註冊失敗,返回並終止程序
 }

 /************************************************************************/
 /* 定義窗口對象屬性,指定有關窗口的更詳細信息                           */
 /************************************************************************/
 TCHAR tcWindowCaptionName[] = TEXT("Win32 API"); //窗口對象標題名稱
 CREATESTRUCT cs;                  //窗口對象屬性描述結構,定義在WINUSER.H

 cs.lpszClass      = tcClassName;  //窗口類名
 cs.lpszName       = tcWindowCaptionName; //窗口對象標題名稱,顯示在標題欄
 cs.style          = WS_OVERLAPPEDWINDOW; //窗口對象風格
 cs.x              = 100;          //窗口對象在屏幕上的x座標
 cs.y              = 100;          //窗口對象在屏幕上的y座標
 cs.cx             = 400;          //窗口對象的寬度
 cs.cy             = 300;          //窗口對象的高度
 cs.hwndParent     = NULL;         //窗口對象的父窗口句柄
 cs.hMenu          = NULL;         //窗口對象的菜單句柄或子窗口編號
 cs.hInstance      = hInstance;    //當前進程的實例句柄,WinMain參數
 cs.lpCreateParams = NULL;         //創建參數指針,可以訪問以後想要引用的程序中的數據

 /************************************************************************/
 /* 創建窗口對象                                                         */
 /* 定義窗口句柄hWnd,值爲CreateWindows函數的返回值。                    */
 /* 即創建成功返回窗口的句柄,否則返回NULL                               */
 /************************************************************************/
 HWND hWnd = CreateWindow( cs.lpszClass,
      cs.lpszName,
      cs.style,
      cs.x,
      cs.y,
      cs.cx,
      cs.cy,
      cs.hwndParent,
      cs.hMenu,
      cs.hInstance,
      cs.lpCreateParams);

 if (hWnd == NULL)    //判斷創建是否成功
 {

  /************************************************************************/
  /* 窗口對象創建不成功的錯誤提示                                         */
  /************************************************************************/
  MessageBox(NULL, TEXT("CreateWindowError!"), TEXT("Error!"),MB_ICONERROR);

  return 0;
 }

 /************************************************************************/
 /* 顯示窗口對象                                                         */
 /* 此時Windows內部已經創建了這個窗口。已經分配內存。                    */
 /* 但是要顯示在顯示器上還需要調用兩個函數。                             */
 /* ShowWindows(hwnd,iCmdShow)                                           */
 /* 第一個參數是剛剛用CreateWindow創建的窗口的句柄。                     */
 /* 第二個參數是傳給WinMain的iCmdShow。用來確定最初如何在屏幕上顯示窗口。*/
 /* 也可以自定義選擇以選項:                                             */
 /* SW_SHOWNORMAL      //常規                                            */
 /* SW_SHOWMAXIMIZED   //最大化                                          */
 /* SW_SHOWMINNOACTIVE //只顯示在任務欄                                  */
 /* UpdateWindow(hWnd)                                                   */
 /* 導致客戶區域被繪製。通過給窗口過程(Wndproc)發送一個WM_PAINT消息實現  */
 /************************************************************************/
 ShowWindow(hWnd, iCmdShow);
 UpdateWindow(hWnd);//立即刷新窗口對象

 /************************************************************************/
 /* 消息檢索,消息循環                                                   */
 /* MSG:消息結構,被定義在WINUSER.H                                     */
 /* 消息循環以GetMessage調用開始,它從消息隊列中取出一個消息             */
 /* 這一調用傳遞給Windows一個指向msg的MSG結構指針。                      */
 /* 第二、三、四個參數爲NULL或者0表示程序接收自己創建的所有窗口的所有消息*/
 /* Windows用從消息隊列中取出的下一個消息填充msg結構的各個域             */
 /* MSG:消息結構:                                                      */
 /* typedef struct tagMSG                                                */
 /* {                                                                    */
 /*   HWND   hwnd ;    //消息發向的窗口的句柄。                          */
 /*   UINT   message ; //消息標識符,一個數值,定義在Window頭文件中      */
 /*   WPARAM wParam ;  //一個32位的消息參數,含義根據消息不同而不同      */
 /*   LPARAM lParam ;  //同上                                            */
 /*   DWORD  time ;    //消息放入消息隊列時的時間                        */
 /*   POINT  pt ;      //消息放入消息隊列時的鼠標座標                    */
 /* }                                                                    */
 /* MSG, * PMSG ;      //結構名                                          */
 /************************************************************************/
 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0))
 {

  /************************************************************************/
  /* 檢索消息;當檢索到WM_QUIT(其值爲0x0012)消息時,從消息循環中退出      */
  /************************************************************************/
  TranslateMessage(&msg);//將msg結構傳遞給Windows,進行虛擬鍵盤消息的轉換
  DispatchMessage(&msg); //發送消息,由此操作系統調用相應的窗口過程處理消息
 }

 /************************************************************************/
 /* 主窗口返回                                                           */
 /************************************************************************/
 return msg.wParam;
}

/************************************************************************/
/* 窗口對象的過程處理函數                                               */
/* 四個參數與MSG結構中的前四個參數相同。                                */
/* 程序通常不直接調用窗口過程,由Windows本身調用。                      */
/* 程序可以通過SendMessage函數調用自己的窗口過程                        */
/************************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

 /************************************************************************/
 /* 對消息進行分類處理                                                   */
 /* WINUSER.H爲每個消息定義以WM爲前綴的標識符                            */
 /*一般Windows程序元用switch和case結構來處理,此時必須返回0。            */
 /*窗口過程不處理的其它消息必須傳遞給DefWindowProc函數,                 */
 /*窗口過程返回該函數返回值                                              */
 /************************************************************************/
 switch (iMsg)
 {

  /************************************************************************/
  /* 客戶區的繪製消息,窗口客戶區域無效時刷新                             */
  /************************************************************************/
  case WM_PAINT:
  {

   /************************************************************************/
   /* PAINTSTRUCT:繪圖結構,定義在WINUSER.H中                             */
   /* RECT:矩形結構                                                       */
   /* HDC:設備描述表句柄                                                  */
   /************************************************************************/
   PAINTSTRUCT ps;
   HDC hDC;
   RECT rect;

   /************************************************************************/
   /* 對於WM_PAINT的處理幾乎總是從一個BeginPaint函數開始的:               */
   /* hDC = BeginPaint(hWnd, &ps)                                          */
   /* 而已一個EndPaint函數結束                                             */
   /* EndPaint(hWnd, &ps)                                                  */
   /* 兩個調用中第一個參數是程序的窗口句柄,                               */
   /* 第二個參數是指向類型爲PAINTSTRUCT的結構指針                          */
   /************************************************************************/
   hDC = BeginPaint(hWnd, &ps);       //獲取顯示設備對象及繪製描述屬性
   GetClientRect(hWnd, &rect);        //獲取當前窗口對象客戶區矩形
   SetBkMode(hDC,TRANSPARENT);        //設置背景方式
   SetTextColor(hDC, RGB(255, 0, 0)); //設置文本顏色

   /************************************************************************/
   /* 繪製文本                                                             */
   /* DrawText函數,第一個參數是從BeginPaint返回的設備描述表句柄           */
   /* 第二個參數是要輸出的文本                                             */
   /* 第三個參數是-1,表示文本串是以字節0終結的。                          */
   /* 第四個參數要繪製的矩形區域                                           */
   /* 最後一個參數是系列標誌位,定義在WINDUSER.H中,水平、垂直中央,單行   */
   /************************************************************************/
   DrawText(hDC, TEXT("Hello, Win32!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
   EndPaint(hWnd, &ps);               //客戶區繪製結束,歸還顯示設備對象
   return 0;
  }

  case WM_DESTROY:                    //接收到WM_DEFTROY消息
  {

   /************************************************************************/
   /* 發送WM_QUIT消息,通知線程消息檢索循環,清除窗口主程序可以退出        */
   /* PostQuitMessage(0)函數在消息隊列裏插入一個WM_QUIT消息                */
   /************************************************************************/
   PostQuitMessage(0);

   return 0;
  }
 }

 /************************************************************************/
 /* 程序末處理的消息交給window系統的缺省窗口對象的過程處理函數處理       */
 /************************************************************************/
 return DefWindowProc(hWnd, iMsg, wParam,lParam);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章