1. 程式人生 > 實用技巧 >Windows核心程式設計第01天 建立視窗

Windows核心程式設計第01天 建立視窗

1.入口函式WinMain,該函式的功能是被系統呼叫,作為一個32位應用程式的入口點。

int WINAPI WinMain( HINSTANCE hInstance,  //應用程式當前例項的控制代碼。
            HINSTANCE hPrevInstance, //應用程式的先前例項的控制代碼。對於同一個程式開啟兩次,出現兩個視窗第一次開啟的視窗就是先前例項的視窗。對於一個32位程式,該引數總為NULL。
            LPSTR lpCmdLine,  //指向應用程式命令列的字串的指標,不包括執行檔名。pCmdLine是一個以空終止的字串,指定傳遞給應用程式的命令列引數。
            int
nCmdShow)  //指明視窗如何顯示。

2.WNDCLASS,該結構包含一個視窗類的全部資訊,也是Windows程式設計中使用的基本資料結構之一,應用程式通過定義一個視窗類確定視窗的屬性

typedef struct _WNDCLASS {
  UINT style;  // 視窗型別
  WNDPROC lpfnWndProc;  //視窗處理函式
  int cbClsExtra;  //視窗擴充套件
  int cbWndExtra;  //視窗例項擴充套件
  HINSTANCE hInstance;  //例項控制代碼
  HICON hIcon;  //視窗的最小化圖示
  HCURSOR hCursor;  //
視窗滑鼠游標   HBRUSH hbrBackground;  //視窗背景色   LPCTSTR lpszMenuName;  //視窗選單   LPCTSTR lpszClassName;// 視窗類名 } WNDCLASS, *LPWNDCLASS;

初始化程式碼如下:

   WNDCLASS wndclass;

   wndclass.style = CS_HREDRAW | CS_VREDRAW;  //設定當水平長度或垂直長度改變或移動視窗時,重畫整個視窗 wndclass.lpfnWndProc = (WNDPROC)WinSunProc;  //設定WinSunProc為視窗處理函式 wndclass.cbClsExtra
= 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance;  // wndclass.hIcon = LoadIcon(NULL, IDI_ERROR);  //設定圖示為系統的錯誤圖示 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);  //設定滑鼠游標為系統箭頭游標 wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);  //設定背景畫刷為深灰色 wndclass.lpszMenuName = NULL;  //無視窗選單 wndclass.lpszClassName = L"WeiXin";  //設定視窗類名

3.註冊視窗

   RegisterClass(&wndclass);

4.建立視窗

    HWND hwnd;
    hwnd = CreateWindow(L"WeiXin",   //指定視窗類名,這可以是任何用函式RegisterClass註冊的類名,或是任何預定義的控制類名。
              L"測試",   //設定視窗名字
              WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,  //設定無最大化(~WS_MAXIMIZEBOX表示取反最大化視窗)視窗風格
               100, 100, 640, 480,   //視窗初始位置設定為(100,100),大小為640x480
              NULL,   //無父視窗設為NULL
              NULL,   //無選單設為NULL
              hInstance,   //視窗例項控制代碼
              NULL);  //視窗建立資料

5.顯示並更新視窗

    ShowWindow(hwnd, SW_SHOWNORMAL);  //設定正常顯示
    UpdateWindow(hwnd);

6.訊息迴圈(保證視窗一直顯示)

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))  //設定NULL表示接收所有視窗訊息
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

完整程式碼如下:

#include <Windows.h>
#include <stdio.h>

LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = (WNDPROC)WinSunProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_ERROR);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = L"WeiXin";

    RegisterClass(&wndclass);

    HWND hwnd;
    hwnd = CreateWindow(L"WeiXin", L"測試", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 100, 100, 640, 480, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}