MFC/QT 學習筆記(一)——認識windows基礎庫


MFC (微軟基礎類庫),Windows系統平台做GUI尚且OK,但不支持跨平台。

 

//Windows消息機制:

//1.SDK與API

Software Development Kit,為特定軟件框架,硬件平台,操作系統等建立應用軟件的開發工具的集合;

Application Programming Interface,操作系統提供給應用程序編程的接口;

 

//2.窗口和句柄

窗口,一個Windows程序至少有一個主窗口;

句柄,在Windows應用程序中,窗口是通過窗口句柄(HWND)來標識的。我們要對某個窗口進行操作,首先要得到這個窗口的句柄;

//ps:系統在創建各種資源(窗口,圖標...)會為他們分配內存,並返回標識這些資源的標識號,即句柄。eg:圖標句柄(HICON),光標句柄(HCURSOR),畫刷句柄(HBRUSH)

 

//3.消息與消息隊列

Windows是一種事件驅動方式的程序設計模式,主要是基於消息。

 

//4.WinMain 函數——Windows程序的入口函數,相當於DOS程序的main 

一個完整的Win32程序實現步驟:

  ·WinMain函數的定義

  ·創建一個窗口

  ·進行消息循環

  ·編寫窗口過程

 

//環境:VS2013,實測:VS2017,TranslateMessage函數未找到。

#include <windows.h>//底層實現窗口的頭文件

//回調函數
//CALLBACK 代表參數_stdcall參數的傳遞順序:從右到左入棧,函數返回前清空棧
LRESULT CALLBACK WindowProc(
    HWND hwnd,//消息所屬窗口句柄
    UINT uNsg,//具體消息名稱 WM_XXX格式
    WPARAM wParam,//鍵盤附加消息
    LPARAM lParam) {//鼠標附加消息

    switch (uNsg) {

        //所有以xxxWindow結尾的方法,不進入消息隊列,直接執行
    case WM_CLOSE:
        DestroyWindow(hwnd);//DestroyWindow 發送另一個消息WM_DESTROY
        break;
    case WM_DESTROY:
        PostQuitMessage(0);//調用while循環中的break
        break;

    case WM_LBUTTONDOWN://鼠標左鍵按下
    {
        int xPos = LOWORD(lParam);
        int yPos = HIWORD(lParam);

        char 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("HELLO"), strlen("HELLO"));
        EndPaint(hwnd, &ps);//結束
        break;
    }
    }

    return DefWindowProc(hwnd, uNsg, wParam, lParam);
}


//程序入口函數
//WINAPI 代表參數_stdcall參數的傳遞順序:從右到左入棧,函數返回前清空棧
int WINAPI WinMain(
    _In_ HINSTANCE hInstance,        //應用程序實例句柄
    _In_opt_ HINSTANCE hPrevInstance,//上一個應用程序句柄,一般為NULL
    _In_ LPSTR lpCmdLine,            //char* argv[]
    _In_ int nShowCmd) {            //顯示命令,最大/小化

    //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_ERROR);//設置圖標,null同上
    wc.hInstance = hInstance;//傳入WinMain中的形參
    wc.lpfnWndProc = WindowProc;//回調函數,窗口過程
    wc.lpszClassName = TEXT("WIN");//指定窗口類名稱
    wc.lpszMenuName = NULL;//菜單名稱
    wc.style = 0;//默認風格

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

    //3.創建窗口
    HWND hwnd = CreateWindow(
        wc.lpszClassName,//lpClassName 類名
        TEXT("Windows"),//lpWindowName 標題名
        WS_OVERLAPPEDWINDOW,//dwStyle 默認風格 混合模式
        CW_USEDEFAULT,// x坐標
        CW_USEDEFAULT,// y
        CW_USEDEFAULT,//nWidth寬高
        CW_USEDEFAULT,//nHeight
        NULL,// hWndParent 父窗口
        NULL,//hMenu 菜單
        hInstance,// hInstance 實例句柄
        NULL);//lpParam 附加值 鼠標左右鍵

    //4.顯示和更新
    ShowWindow(hwnd, SW_SHOWNORMAL);//正常大小

    UpdateWindow(hwnd);

    //5.通過循環取消息
    /*
     *typedef struct tagMSG {
     *    HWND        hwnd;        //主窗口句柄
     *    UINT        message;    //具體消息名稱
     *    WPARAM      wParam;        //鍵盤消息 附加消息
     *    LPARAM      lParam;        //鼠標消息 附加消息
     *    DWORD       time;        //消息產生時間,系統自算
     *    POINT       pt;            //鼠標位置
     *}
    **/
    MSG msg;

    while (1) {
        /*
        GetMessageW(
            _Out_ LPMSG lpMsg, 消息
            _In_opt_ HWND hWnd, 捕獲窗口,NULL代表捕獲所有窗口
            _In_ UINT wMsgFilterMin,
            _In_ UINT wMsgFilterMax);(0,0)代表捕獲所有消息
        */
        if (GetMessage(&msg, NULL, 0, 0) == FALSE) {
            break;
        }

        //翻譯消息 eg:鍵入Ctrl+C不可直接打印,需譯后再次進入消息隊列
        TranslateMessage(&msg);

        DispatchMessage(&msg);//分發消息

    }

    //6.處理窗口過程  up

    return 0;

}

 

我參考的視頻鏈接:

https://www.bilibili.com/video/av20005978/?p=8&t=328


免責聲明!

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



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