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 只是关闭窗口,并不释放资源,可以在后台运行。**

运行结果如下:
这里写图片描述
这里写图片描述
这里写图片描述

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