1. 程式人生 > >Windows程式設計入門——從一個簡單的視窗說起

Windows程式設計入門——從一個簡單的視窗說起

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL,"苟利國家生死以,豈因禍福避趨之","唸詩",MB_OK);
    return 0;
}

這就是最簡單的一個Win32程式,裡面有很多宣告都是以前在C/C++學習中沒有見到過的。

WinMain():是和以往程式設計中的main()等價的東西.這是程式開始執行的入口;

HINSTANCE hInstance:程式可執行模組的控制代碼;

HINSTANCE hPrevInstance:總是為NULL;

LPSTR lpCmdLine:命令列引數組成的一個單字串,不包括程式名;

int nCmdShow:要傳遞給ShowWindow()的一個整數。

主程式中出現的MessageBox()原型為:int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)

其實是根據Unicode的定義來的:

WINUSERAPI int WINAPI MessageBoxA(
 
HWND hWnd,
 
LPCSTR lpText,
 
LPCSTR lpCaption,
 
UINT uType);
 
 
WINUSERAPI int WINAPI MessageBoxW(
 
HWND hWnd,
 
LPCWSTR lpText,
 
LPCWSTR lpCaption,
 
UINT uType);
 
 
#ifdef UNICODE
 
#define MessageBox MessageBoxW//如果啟用Unicode庫,就用MessageBoxW
 
#else
 
#define MessageBox MessageBoxA//否則,就用MessageBoxA
 
#endif

單單隻有一個視窗未免也太low了,我們可以增加一些互動元素,比如對於滑鼠點選的處理。

這時我們可以嘗試著把WM_LBUTTONDOWN新增到WndProc()中,看看能夠發生什麼

WndProc()部分的完整程式碼如下:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_LBUTTONDOWN:
    {
        char szFileName[MAX_PATH];
        HINSTANCE hInstance=GetModuleHandle(NULL);

        GetModuleFileName(hInstance, szFileName, MAX_PATH);
        MessageBox(hwnd, "視窗彈出成功", "新訊息", MB_OK|MB_ICONINFORMATION);
    }
    break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}


在程式中加入這樣一段程式碼之後,在程式視窗中點選一下,便會彈出一個新的視窗。具體效果如下圖所示:

深入研究WndProc函式:

WinProc是視窗回撥過程。Windows通過它將事件傳遞給程式。回撥函式是被呼叫回來的函式。這個函式處理所有傳送給主程式視窗的訊息。所以,通常WinProc是主程式原始碼檔案中最長的函式。

需要了解這個函式,因為它是通向初始化Direct3D的鑰匙。它的引數既簡單又直白,它們代表Windows程式的真實“引擎”。據前述,這一資訊是早先在WinMain中由GetMessage函式獲取的。不要將InitInstance和WinProc混淆在一起。InitInstance只執行一次,對選項進行設定。而後就由WinProc接管,接收並處理訊息。

有關於WinProc的引數:

HWND hWnd:在遊戲中,通常要使用hWnd作為引數建立一個新的裝置環境控制代碼,也就是一個hDC。在DirectX到來之前,必須要保留好視窗控制代碼,因為只要引用一個視窗或控制元件就必須使用到它。在DirectX程式中,視窗控制代碼僅在開始時用於建立視窗。

UINT messgae:傳送給視窗回撥過程的訊息。訊息可以是任何東西,甚至是無需使用的訊息。由於這個原因,有一個將訊息傳遞給預設訊息處理器的方法。

WPARAM wParam和LPARAM lParam:與特定命令訊息一起傳遞過來的引數值的高位和低位。

關於按鍵訊息捕捉的引數:

MK_CONTROL:鍵盤上Ctrl鍵被按下;

MK_LBUTTON:滑鼠左鍵被按下;

MK_MBUTTON:滑鼠中鍵被按下;

MK_RBUTTON:滑鼠右鍵被按下;

MK_SHIFT:鍵盤Shift鍵被按下;

...其他跟此類似