1. 程式人生 > >建立一個基本的win32視窗

建立一個基本的win32視窗

#include<Windows.h>
#include<windowsx.h>
#include <mmSystem.h> 

//  建立一個基本的win32視窗

BOOL InitWindow(HINSTANCE hInstance, int nCmdshow);
LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,              // 當前例項控制代碼
    HINSTANCE hPrevInstance,          // 前一個例項控制代碼
    PSTR szCmdLine,                   // 命令字元行
    int iCmdShow) {                   // 視窗顯示方式
    MSG msg;

    //建立主視窗
    if (!InitWindow(hInstance, iCmdShow))
        return FALSE;

    //進入訊息迴圈:從該應用的訊息佇列中撿取訊息
    //送到訊息處理過程,當撿取到WM_QUIT訊息時,退出訊息迴圈。
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}
static BOOL InitWindow                                    //建立視窗
(HINSTANCE hInstance, int iCmdShow) {
    static TCHAR szAppName[] = TEXT("My First Win");    // 應用程式名
    HWND hwnd;                                            // 視窗控制代碼
    WNDCLASS wc;                                        //視窗類結構


                                                        //填充視窗類結構
    wc.style = CS_VREDRAW | CS_HREDRAW;
    wc.lpfnWndProc = WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = GetStockBrush(WHITE_BRUSH);
    wc.lpszClassName = szAppName;
    wc.lpszMenuName = NULL;

    //註冊視窗類
    if (!RegisterClass(&wc)) {
        MessageBox(NULL, TEXT("註冊視窗類失敗!"), szAppName, MB_ICONERROR);
        return 0;
    }

    //建立主視窗
    hwnd = CreateWindow(szAppName,                                        //  視窗類名稱
        TEXT("一個基本的Win32程式"),                    //  視窗標題
        WS_OVERLAPPEDWINDOW,                            //    視窗風格
        100,                                            //    視窗位置座標x
        100,                                            //    視窗位置座標y
        400,                                            //    視窗寬度
        300,                                            //    視窗高度
        NULL,                                            //    父視窗控制代碼
        NULL,                                            //    選單控制代碼
        hInstance,                                        //    應用程式例項控制代碼
        NULL);                                            //    視窗建立例項指標

    if (!hwnd) return FALSE;

    //    顯示並更新視窗
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    return    TRUE;
}


LRESULT CALLBACK WinProc         //處理主視窗資訊
(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

    HDC            hdc;
    PAINTSTRUCT ps;
    RECT        rect;

    switch (message) {
    case WM_CREATE:                    //建立資訊
        PlaySound(TEXT("My First Win.wav"), NULL, SND_ASYNC | SND_FILENAME);
        return 0;

    case WM_KEYDOWN:                //擊鍵訊息
        switch (wParam)
        {
        case VK_ESCAPE:
            MessageBox(hWnd, TEXT("ESC鍵按下了!"), TEXT("鍵盤"), MB_OK);
            break;
        }
        return 0;

    case WM_RBUTTONDOWN:            //滑鼠訊息
        MessageBox(hWnd, TEXT("滑鼠右鍵按下了!"), TEXT("滑鼠"),
            MB_OK);
        return 0;

    case WM_PAINT:                                                    //視窗重畫訊息
        hdc = BeginPaint(hWnd, &ps);                                //取得裝置環境控制代碼
        GetClientRect(hWnd, &rect);                                    //視窗客戶區矩形
        SetTextColor(hdc, RGB(50, 50, 255));                            //設定文字顏色
        DrawText(hdc, TEXT("歡迎使用《Windows 環境與程式設計基礎》"),
            -1, &rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);                //輸出文字
        EndPaint(hWnd, &ps);                                        //釋放資源
        return 0;

    case WM_DESTROY:                //退出訊息
        PostQuitMessage(0);            //呼叫退出函式
        return 0;

    }
    //呼叫預設訊息處理過程
    return DefWindowProc(hWnd, message, wParam, lParam);
}//函式WinProc結束