Windos消息驱动

当Window是向程序发送消息时,它调用程序中的一个函数,这个函数用来描述Windows发送的消息,成为窗口函数消息处理函数。他是一个自定义的回调函数:

LRESULT CALLBACK WindowProc(HWND hwnd, UNIT uMsg, WPARAM wParam, LPARAM lParam); 

  • CALLBACK 宏是_stdcall的意思,说明采用WIndows标准方式传递参数。 详见:https://blog.csdn.net/lionghua/article/details/38415655
  • uMsg:是一个消息ID号,它指定了所发的消息,当窗口函数接受到消息时,它使用消息ID号来决定如何处理这个消息;后面两个参数wParam和lParam的值也取决于uMsg。

 

例:关闭一个记事本程序,即向它的主窗口发送WM_CLOSE消息:

int main(int argc,char* argv[])
{
    //查找标题为“无标题-记事本“的窗口
    HWND hWnd = ::FindWindow(NULL,"无标题-记事本");
    //也可以使用类名查找,如 FindWindow("Notepad",NULL);

    if(hWnd != NULL)
        ::SendMessage(hWnd,WM_CLOSE,0,0);
    return 0;
}
  • FindWindow函数:查找窗口类名称和窗口标题与指定字符串相匹配的窗口。
  • SendMessage函数: 向窗口发送消息,直到目标窗口处理完这个消息才返回。参数与WindowProc函数相同。

 

以下是Windows程序的基本框架,win32程序都是在这个框架的基础上扩充而来:

 1 #include <windows.h>
 2 
 3 LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
 4 int APIENTRY WinMain(HINSTANCE hInstance,
 5                             HINSTANCE hPrevInstance,
 6                             LPSTR lpCmdLine,
 7                             int nCmdShow)
 8 {
 9     char szClassName[] = "MainWClass";
10     WNDCLASSEX wndclass;
11     //用描述主窗口的参数来填充WNDCLASSEX结构
12     wndclass.cbSize=sizeof(wndclass);    //结构大小
13     wndclass.style=CS_HREDRAW | CS_VREDRAW;    //指定如果大小改变就重画
14     wndclass.lpfnWndProc=MainWndProc;    //窗口指针函数
15     wndclass.cbClsExtra=0;    //没有额外的类内存
16     wndclass.cbWndExtra=0;    //没有额外窗口内存
17     wndclass.hInstance = hInstance;    //实例句柄
18     wndclass.hIcon=::LoadIcon(NULL, IDI_APPLICATION);    //使用预定义图标
19     wndclass.hCursor=::LoadCursor(NULL, IDC_ARROW);     //使用预定义光标
20     wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);    //使用白色背景画刷
21     wndclass.lpszMenuName=NULL;    //不指定菜单
22     wndclass.lpszClassName=szClassName;    //窗口类名称
23     wndclass.hIconSm=NULL;    //没有类的小图标
24     
25     //注册这个窗口类
26     ::RegisterClassEx(&wndclass);
27     //创建主窗口
28     HWND hWnd=::CreateWindowEx(
29             0,                                      //dwExStyle,扩展样式
30             szClassName,                     //lpClassName,类名
31             "My First Window!",              //lpWindowName,窗口标题
32             WS_OVERLAPPEDWINDOW,    //swStyle,窗口风格
33             CW_USEDEFAULT,                //X,初始x坐标
34             CW_USEDEFAULT,                //Y,初始y坐标
35             CW_USEDEFAULT,                //nWidth,宽度
36             CW_USEDEFAULT,                //nHeight,高度
37             NULL,                                //hWndParent,父窗口句柄
38             NULL,                                //hMenu,菜单句柄
39             hInstance,                         //hInstance,程序实例句柄
40             NULL);                               //lpParam,用户数据
41     
42     if(hWnd == NULL)
43     {
44         ::MessageBox(NULL,"创建窗口出错!","error",MB_OK);
45         return -1;
46     }    
47     //显示窗口,刷新窗口客户区
48     ::ShowWindow(hWnd,nCmdShow);
49     ::UpdateWindow(hWnd);
50     //从消息队列中取出消息,交给窗口函数处理,直到GetMessage返回FALSE,结束消息循环
51     MSG msg;
52     while(::GetMessage(&msg,NULL,0,0))
53     {
54         //转化键盘消息
55         ::TranslateMessage(&msg);
56         //将消息发送到相应的窗口函数
57         ::DispatchMessage(&msg);
58     }
59     return msg.wParam;
60 }
61 
62 LRESULT CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
63 {
64     char szText[]="Hello World!";
65     switch(message)
66     {
67     case WM_PAINT:    //窗口客户区重绘
68             {
69                 HDC hdc;
70                 PAINTSTRUCT ps;
71                 //使无效的客户区变得有效,并取得设备环境句柄
72                 hdc=::BeginPaint(hWnd,&ps);
73                 //显示文字
74                 ::TextOut(hdc,10,10,szText,strlen(szText));
75                 ::EndPaint(hWnd,&ps);
76                 return 0;    
77             }
78     case WM_DESTROY:    //销毁窗口
79                 ::PostQuitMessage(0);
80                 return 0;
81     }
82     //将不处理的消息交给系统默认处理
83     return ::DefWindowProc(hWnd,message,wParam,lParam);
84 }
简单Win窗口

 

转载于:https://www.cnblogs.com/ShadowCharle/p/10696810.html

一、Win32编程基本概念 1、消息驱动 在介绍Windows消息驱动概念之前,我们首先来回顾面向过程的程序结构:main()程序有明显的开始、中间过程和结束点,程序是围绕这个过程编写好相关的子过程,再把这些子过程串联在一起。程序编好以后,该过程也就确定了,程序必须按照规定好的顺序执行:是否需要用户的输入、输入什么、程序取得用户输入以后做什么处理,处理完毕将结果显示给用户。该过程一旦确定,程序的执行过程也是固定的,用户不能干预。 而Windows编程所采用设计思想是:消息驱动,又叫做事件驱动。在这种程序结构中,程序没有明显的开始、结束,程序流程的控制由各种随机发生、不确定、没有预先设定顺序的事件的发生来触发。是一个不断产生消息和处理消息的过程。 也就是说程序一运行开始处于等待消息状态,取得消息以后,就对该消息做出相应的处理,完成处理以后又进入等待消息的状态。这种程序结构与Windows操作系统结合非常紧密,最明显一点就是消息的管理是由操作系统完成的。应用程序从操作系统获得消息有两种方式:一种就是应用程序调用Windows提供的消息获取函数;另外一种就是回调函数,由操作系统自己调用。 这种消息驱动机制,有点像银行的柜台业务:早上八点,银行开门(Windows应用程序开始运行),每个营业员(Windwows线程)回到自己的柜台开始办公。如果有顾客来办理相关业务(相当于Windows消息),那么对应的业务员就进行处理。顾客来办理业务的时间以及业务类型都是随机的,如果某一时刻没有顾客办理业务并且没有到下班时间(Windows应用程序退出)的话,那么相关的业务员进入等待状态。所有的业务员不断重复该过程,直到下班(Windows应用程序退出)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值