用C++建立一個窗口


      如何用C++建立一個窗口,對於一個新手來說還是比較復雜的,今天就簡單給大家介紹如何在空項目下建立一個窗口:

#include "windows.h"


//6、處理消息(窗口過程)
    //CALLBACK代表__stdcall參數傳遞順序  從右往左依次入棧,並且在函數返回前自動清空堆棧內容
LRESULT CALLBACK WindowProc(
    HWND hwnd,              //消息所屬窗口句柄
    UINT uMsg,               //具體消息名稱,WM_XXX
    WPARAM wparam,           //鍵盤附加消息
    LPARAM lparam                //鼠標附加消息
)
{

    switch (uMsg)
    {
    case WM_CLOSE:
        DestroyWindow(hwnd);                //觸發WM_DESTROY
        break;
    case WM_DESTROY:
        PostQuitMessage(0);                  //發送退出消息
        break;
    case WM_LBUTTONDOWN:                      //鼠標左鍵按下消息
    {
        int xPos;
        int yPos;
        xPos = LOWORD(lparam);
        yPos = HIWORD(lparam);
        //打印操作,通常同MessageBox
        TCHAR buf[1024];
        wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);
        //所屬窗口、顯示內容、標題內容、關聯按鍵類型
        MessageBox(hwnd, buf, TEXT("鼠標按下"), MB_OK);
        break;
    }
    case WM_KEYDOWN:       //鍵盤消息
        MessageBox(hwnd, TEXT("鍵盤按下"), TEXT("鍵盤消息"), MB_OK);
        break;
    case WM_PAINT:     //繪圖
    {
        PAINTSTRUCT ps;             //繪圖結構體
        HDC hdc = BeginPaint(hwnd, &ps);
        //繪制文字
        TextOut(hdc, 100, 100, TEXT("helloworld"), strlen("helloworld"));
        EndPaint(hwnd, &ps);
        break;
    }
    default:
        break;
    }
    //默認方式處理
    return DefWindowProc(hwnd, uMsg, wparam, lparam);
}


int WINAPI WinMain(
    HINSTANCE hInstance,           //應用程序實例句柄
    HINSTANCE hPrevInstance,       //前一個應用程序實例句柄,在win32環境下基本值NULL,不起作用
    LPSTR lpCmdLine,             //char *argv[]  命令行參數數組
    int nShowCmd)                //窗口顯示命令,最大化最小化
{
    //實現底層窗口  6步驟
    //1、設計窗口類
    //2、注冊窗口類
    //3、創建窗口類
    //4、顯示和更新窗口
    //5、通過循環取消息
    //6、處理消息(窗口過程)
    

    



    //1、設計窗口
    WNDCLASS wc;
    wc.cbClsExtra = 0;//類額外的內存,通常為零
    wc.cbWndExtra = 0;//窗口額外的內存,通常為零
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//設置背景
    wc.hCursor = LoadCursor(NULL, IDC_HAND);//設置光標,如果第一個參數為NULL,代表使用系統提供的默認光標
    wc.hIcon = LoadIcon(NULL, IDI_WARNING);
    wc.hInstance = hInstance;//當前實例句柄,WinMain函數中形參即可
    wc.lpfnWndProc = WindowProc;//窗口過程函數,回調函數,名稱可以隨便起
    wc.lpszClassName = TEXT("WINDOW");//指定窗口類名
    wc.lpszMenuName = NULL;//菜單名,沒有填NULL
    wc.style = 0;//0代表默認風格

    //2、注冊窗口類
    RegisterClass(&wc);

    //3、創建窗口
    /*
    lpClassName,    //類名
    lpWindowName,    //窗口名
    dwStyle,        //顯示風格  WS_OVERLAPPEDWINDOW
    x, y,\    //創建窗口的起始坐標  CW_USEDEFAULT
    nWidth,nHeight,    //創建窗口默認寬高
    hWndParent,        //父窗口,NULL
    hMenu,       菜單  NULL
    hInstance,    實例句柄,hInstance
    lpParam       其他參數   NULL
    */
    HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("TEXT WINDOW"), WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT ,
        NULL, NULL, hInstance, NULL);
    //4、顯示和更新
    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);
    //5、通過循環取消息

    /*
    HWND        hwnd;                  //主窗口
    UINT        message;               //消息名稱   WM_XXXXX(WINDOW MESSAGE)
    WPARAM      wParam;                //附加消息    鍵盤
    LPARAM      lParam;                //附加消息    鼠標左右鍵
    DWORD       time;                  //消息產生時間,
    POINT       pt;                    //附加消息   鼠標   x,y坐標
    */
    MSG msg;
    while(1)
    {
        /*
        參數
        _Out_ LPMSG lpMsg,               消息結構體
        _In_opt_ HWND hWnd,            NULL  捕獲所有窗口消息
        _In_ UINT wMsgFilterMin,            過濾最小消息數量
        _In_ UINT wMsgFilterMax             過濾最大消息數量       都寫0代表捕獲所有消息
        */
        if (GetMessage(&msg, NULL,0,0) == FALSE)
        {
            break;
        }
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

由上面的代碼及注釋可以清楚的看到,創建一個窗口共有6步:

       1、設計窗口類
       2、注冊窗口類
       3、創建窗口類
       4、顯示和更新窗口
       5、通過循環取消息
       6、處理消息(窗口過程)

同時還介紹了窗口處理的事件,包括關閉窗口WM_CLOSE,鼠標左鍵按下消息WM_LBUTTONDOWN,鍵盤消息WM_KEYDOWN,繪圖消息WM_PAINT,以及這些消息實現的一些細節!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM