Windows应用程序的消息处理机制

Windows应用程序的消息处理机制:

这里写图片描述

1)操作系统接收应用程序窗口信息,将消息传递到应用程序的消息队列中;
2)应用程序在消息循环中,调用GetMessage函数,将消息从队列中一条一条取出来,并进行预处理;
3)应用程序调用DispatchMessage, 将消息传递会给操作系统;
4)操作系统调用窗口过程函数,对消息进行处理(即“系统给应用程序发送了消息”);

实例:

#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc
(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);
int WINAPI WinMain
(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
{
    //设计一个窗口
    WNDCLASS wndcls;
    wndcls.cbClsExtra = 0;
    wndcls.cbWndExtra = 0;
    wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wndcls.hCursor = LoadCursor(NULL,IDC_CROSS);
    wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);
    wndcls.hInstance = hInstance;
    wndcls.lpfnWndProc = WinSunProc;
    wndcls.lpszClassName = "sunxin2006";
    wndcls.lpszMenuName = NULL;
    wndcls.style = CS_HREDRAW | CS_VREDRAW;
    //注册
    RegisterClass(&wndcls);
    //创建一个窗口
    HWND hwnd;
    hwnd = CreateWindow("sunxin2006","http://www.sunxin.org",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
    //显示及刷新窗口
    ShowWindow(hwnd,SW_SHOWNORMAL);
    UpdateWindow(hwnd);
    //定义消息结构体,开始消息循环
    MSG msg;
    while(GetMessage(&msg,hwnd,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
//编写窗口过程函数
LRESULT CALLBACK WinSunProc
(
  HWND hwnd,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
 )
{
    switch(uMsg)
    {
    case WM_CHAR:
        char szChar[20];
        sprintf(szChar,"char code is %d",wParam);
        MessageBox(hwnd,szChar,"char",0);
        break;
    case WM_LBUTTONDOWN:
        MessageBox(hwnd,"mouse clicked","message",0);
        HDC hdc;
        hdc = GetDC(hwnd);
        TextOut(hdc,0,50,"程序员之家",strlen("程序员之家"));
        break;
    case WM_PAINT:
        HDC hDc;
        PAINTSTRUCT ps;
        hDc = BeginPaint(hwnd,&ps);
        TextOut(hDc,0,0,"http://www.sunxin.org",strlen("http://www.sunxin.org"));
        EndPaint(hwnd,&ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值