windows 窗口消息

純乾貨,代碼如下:

#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WinFirstProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

int WINAPI WinMain(
  HINSTANCE hInstance,      //應用程序實例的句柄  當前實例
  HINSTANCE hPrevInstance,  // 應用程序實例的句柄 先前實例 一般爲NULL
  LPSTR lpCmdLine,          // 長指針 字符串類型 命令行參數
  int nCmdShow              // 顯示窗口的狀態 (最大化等)
)
{
    WNDCLASS wndcls;
    wndcls.cbClsExtra=0;
    wndcls.cbWndExtra=0;
    wndcls.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);  //背景顏色
    wndcls.hCursor = LoadCursor(NULL, IDC_SIZENS);   //鼠標的形狀
    wndcls.hIcon = LoadIcon(NULL, IDI_INFORMATION);  //窗口的圖標 icon
    wndcls.hInstance=hInstance;
    wndcls.lpfnWndProc = WinFirstProc;
    wndcls.lpszClassName="first";
    wndcls.lpszMenuName=NULL;
    wndcls.style=CS_HREDRAW | CS_VREDRAW;  //水平重畫或者垂直重畫
    RegisterClass(&wndcls);   //註冊窗口類

    HWND hwnd;
    //創建窗口類
    hwnd=CreateWindow("first","第一個程序",WS_OVERLAPPEDWINDOW,
        0,0,600,400,NULL,NULL,hInstance,NULL);
    //顯示窗口
    ShowWindow(hwnd,SW_SHOWNORMAL);
    //更新窗口
    UpdateWindow(hwnd);

    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg); //轉換消息
        DispatchMessage(&msg);   //將收到的消息傳到回調函數 進行處理
    }
    return 0;
}

LRESULT CALLBACK WinFirstProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
    switch(uMsg)
    {
        //鍵盤輸入
    case WM_CHAR:
        char szChar[20];
        //格式化文本到內存區中
        sprintf(szChar,"char is %d",wParam);
        //彈出消息框
        MessageBox(hwnd,szChar,"提示",0);
        break;
        //鼠標按下
    case WM_LBUTTONDOWN:
        MessageBox(hwnd,"mouse clicked","提示",0);
        HDC hdc;
        hdc=GetDC(hwnd);
        TextOut(hdc,0,100,"helloworld",strlen("helloworld"));
        ReleaseDC(hwnd, hdc); /* 注意釋放資源*/
        break;
        //繪寫窗口
    case WM_PAINT:
        HDC hDC;
        PAINTSTRUCT ps;
        hDC=BeginPaint(hwnd,&ps);
        TextOut(hDC,0,0,"hello",strlen("hello"));
        EndPaint(hwnd,&ps);
        break;
        //退出
    case WM_CLOSE:
        if (IDYES == MessageBox(hwnd, "是否真的結束?", "windows", MB_YESNOCANCEL))
        {
            DestroyWindow(hwnd);  //銷燬窗口
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);   
        break;
    default:
        return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
}

創建一個完整的窗口需要經過下面四個操作步驟:
1、設計一個窗口類;
2、註冊窗口類;
3、創建窗口;
4、顯示及更新窗口
隊列消息會被送到系統消息隊列,然後到線程消息隊列。Windows維護一個系統消息
隊列,每個GUI線程也有一個線程消息隊列。其中包括鍵盤鼠標消息,WM_PAINT、
WM_TIMER、WM_CLOSE、WM_QUIT、WM_LBUTTONDOWN 等。Windows應用程序的輸入由Windows
系統以消息的形式發送給應用程序的窗口,這些窗口通過窗口過程來接收和處理消息,然後
把控制返還給Windows.
消息循環從消息隊列中得到消息,如果不是快捷鍵消息或對話框消息,就進行消息轉換和派發,
讓目的窗口的窗口過程來處理。當得到消息WM_QUIT,退出消息循環。
**WM_DESTROY 銷燬窗口,並釋放資源。
WM_CLOSE 只是關閉窗口,並不釋放資源,可以在後臺運行。**

運行結果如下:
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章