搜索
熱搜: 活動 交友 discuz
查看: 2044|回復: 0
打印 上一主題 下一主題

[教學] Win32 SDK 視窗程式

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-14 04:51:14 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
  1. //: 這裡我為大家加上了中文註解,比較容易讀懂程式碼。

  2. #include "stdafx.h"
  3. #include "HelloWin32SDK.h"
  4. #define MAX_LOADSTRING 100

  5. // 全域變數
  6. HINSTANCE hInst;                                // 視窗實體變數
  7. TCHAR szTitle[MAX_LOADSTRING];                    // 視窗標題列
  8. TCHAR szWindowClass[MAX_LOADSTRING];            // 主視窗類別

  9. // 向前宣告
  10. ATOM                MyRegisterClass(HINSTANCE hInstance);   //註冊視窗
  11. BOOL                InitInstance(HINSTANCE, int);           //初始化變數群
  12. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);    //視窗訊息處理函示
  13. LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);      //「關於」視窗的處理函示

  14. /*視窗程式的進入點,舊版的SDK寫法為:

  15. int WINAPI WinMain(HINSTANCE hInstance,
  16.                    HINSTANCE hPrevInstance,
  17.                    LPTSTR    lpCmdLine,
  18.                    int       nCmdShow)
  19. {...}
  20. */
  21. int APIENTRY _tWinMain(HINSTANCE hInstance,
  22.                      HINSTANCE hPrevInstance,
  23.                      LPTSTR    lpCmdLine,
  24.                      int       nCmdShow)
  25. {     
  26.     MSG msg;
  27.     HACCEL hAccelTable;

  28.     // 初始化全域變數(字串)
  29.     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  30.     LoadString(hInstance, IDC_HELLOWIN32SDK, szWindowClass, MAX_LOADSTRING);
  31.     // 註冊視窗
  32.     MyRegisterClass(hInstance);
  33.     // 處理應用程式的初始化
  34.     if (!InitInstance (hInstance, nCmdShow))
  35.     {
  36.         return FALSE;
  37.     }

  38.     hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HELLOWIN32SDK);

  39.     // 訊息迴圈
  40.     while (GetMessage(&msg, NULL, 0, 0))
  41.     {
  42.         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  43.         {
  44.             TranslateMessage(&msg);
  45.             DispatchMessage(&msg);
  46.         }
  47.     }

  48.     return (int) msg.wParam;
  49. }


  50. //
  51. //  函數: MyRegisterClass()
  52. //
  53. //  目的: 註冊視窗類別
  54. //
  55. //  COMMENTS:
  56. //
  57. //    This function and its usage are only necessary if you want this code
  58. //    to be compatible with Win32 systems prior to the 'RegisterClassEx'
  59. //    function that was added to Windows 95. It is important to call this function
  60. //    so that the application will get 'well formed' small icons associated
  61. //    with it.
  62. //
  63. //    這是新版的視窗類別結構 WNDCLASSEX ,這個結構只比舊的WNDCLASS多了兩個資料成員。
  64. //    一個為 cbSize 用來計算結構大小,另外一個 hIconSm 記錄視窗縮小化後的大小。

  65. ATOM MyRegisterClass(HINSTANCE hInstance)
  66. {
  67.     WNDCLASSEX wcex;

  68.     wcex.cbSize = sizeof(WNDCLASSEX);
  69.    
  70.     //視窗樣式
  71.     wcex.style            = CS_HREDRAW | CS_VREDRAW;      
  72.     //訊息處理函數
  73.     wcex.lpfnWndProc    = (WNDPROC)WndProc;            
  74.     //額外要求註冊視窗所需要的記憶體(byte)
  75.     wcex.cbClsExtra        = 0;                           
  76.     //額外要求生成視窗所需要的記憶體(byte)
  77.     wcex.cbWndExtra        = 0;                           
  78.     //包含處理這個視窗類別的訊息處理程式的 HANDLE。
  79.     wcex.hInstance        = hInstance;               
  80.     //視窗圖示     
  81.     wcex.hIcon            = LoadIcon(hInstance, (LPCTSTR)IDI_HELLOWIN32SDK);
  82.     //視窗中使用的游標
  83.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
  84.     //視窗的背景
  85.     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
  86. /*
  87.     背景可以是事先定義好的色彩常數。
  88.         COLOR_ACTIVEBORDER
  89.         COLOR_ACTIVECAPTION
  90.         COLOR_APPWORKSPACE
  91.         COLOR_BACKGROUND
  92.         COLOR_BTNFACE
  93.         COLOR_BTNSHADOW
  94.         COLOR_BTNTEXT
  95.         COLOR_CAPTIONTEXT
  96.         COLOR_GRAYTEXT
  97.         COLOR_HIGHLIGHT
  98.         COLOR_HIGHLIGHTTEXT
  99.         COLOR_INACTIVEBORDER
  100.         COLOR_INACTIVECAPTION
  101.         COLOR_MENU
  102.         COLOR_MENUTEXT
  103.         COLOR_SCROLLBAR
  104.         COLOR_WINDOW
  105.         COLOR_WINDOWFRAME
  106.         COLOR_WINDOWTEXT
  107. */      
  108.     //功能表
  109.     wcex.lpszMenuName    = (LPCTSTR)IDC_HELLOWIN32SDK;
  110.     //註冊視窗的字串
  111.     wcex.lpszClassName    = szWindowClass;
  112.     //視窗最小化後的ICON
  113.     wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

  114.     //舊版的 WNDCLASS 需改用 RegisterClass 函數。
  115.     return RegisterClassEx(&wcex);
  116. }

  117. //
  118. //   FUNCTION: InitInstance(HANDLE, int)
  119. //
  120. //   PURPOSE: Saves instance handle and creates main window
  121. //
  122. //   COMMENTS:
  123. //
  124. //        In this function, we save the instance handle in a global variable and
  125. //        create and display the main program window.
  126. //
  127. //   記住視窗程式的記憶位置實體
  128. //

  129. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  130. {
  131.    HWND hWnd;

  132.    // 將 Instance Handle 放置到全域變數
  133.    hInst = hInstance;

  134.    // 建立視窗
  135.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  136.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  137.    // 判斷視窗建立是否成功
  138.    if (!hWnd)
  139.    {
  140.       return FALSE;
  141.    }

  142.    // 顯示視窗
  143.    ShowWindow(hWnd, nCmdShow);
  144.    // 更新視窗
  145.    UpdateWindow(hWnd);

  146.    return TRUE;
  147. }

  148. //
  149. //  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
  150. //
  151. //  PURPOSE:  Processes messages for the main window.
  152. //
  153. //  WM_COMMAND    - 處理視窗的功能表
  154. //  WM_PAINT    - 繪製視窗的訊息代號
  155. //  WM_DESTROY    - 結束視窗
  156. //
  157. //  ☆這個函數是用來處理所有的視窗事件。(主視窗)
  158. //  
  159. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  160. {
  161.     int wmId, wmEvent;
  162.     PAINTSTRUCT ps;
  163.     HDC hdc;

  164.     switch (message)
  165.     {
  166.     case WM_COMMAND:
  167.         wmId    = LOWORD(wParam);
  168.         wmEvent = HIWORD(wParam);
  169.         // Parse the menu selections:
  170.         switch (wmId)
  171.         {
  172.         case IDM_ABOUT:
  173.             //顯示「關於」對話視窗,最後一個參數是該對話視窗的事件處理函數。
  174.             DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  175.             break;
  176.         case IDM_EXIT:
  177.             DestroyWindow(hWnd);
  178.             break;
  179.         default:
  180.             return DefWindowProc(hWnd, message, wParam, lParam);
  181.         }
  182.         break;
  183.     case WM_PAINT:
  184.         hdc = BeginPaint(hWnd, &ps);
  185.         // TODO: Add any drawing code here...
  186.         EndPaint(hWnd, &ps);
  187.         break;
  188.     case WM_DESTROY:
  189.         PostQuitMessage(0);
  190.         break;
  191.     default:
  192.         return DefWindowProc(hWnd, message, wParam, lParam);
  193.     }
  194.     return 0;
  195. }

  196. // Message handler for about box.
  197. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  198. {
  199.     switch (message)
  200.     {
  201.     case WM_INITDIALOG:
  202.         return TRUE;

  203.     case WM_COMMAND:
  204.         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  205.         {
  206.             EndDialog(hDlg, LOWORD(wParam));
  207.             return TRUE;
  208.         }
  209.         break;
  210.     }
  211.     return FALSE;
  212. }
複製代碼
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2026-6-4 11:32 , Processed in 0.033891 second(s), 17 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表