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,,);
return ;
}
- FindWindow函数:查找窗口类名称和窗口标题与指定字符串相匹配的窗口。
- SendMessage函数: 向窗口发送消息,直到目标窗口处理完这个消息才返回。参数与WindowProc函数相同。
以下是Windows程序的基本框架,win32程序都是在这个框架的基础上扩充而来:
#include <windows.h> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char szClassName[] = "MainWClass";
WNDCLASSEX wndclass;
//用描述主窗口的参数来填充WNDCLASSEX结构
wndclass.cbSize=sizeof(wndclass); //结构大小
wndclass.style=CS_HREDRAW | CS_VREDRAW; //指定如果大小改变就重画
wndclass.lpfnWndProc=MainWndProc; //窗口指针函数
wndclass.cbClsExtra=; //没有额外的类内存
wndclass.cbWndExtra=; //没有额外窗口内存
wndclass.hInstance = hInstance; //实例句柄
wndclass.hIcon=::LoadIcon(NULL, IDI_APPLICATION); //使用预定义图标
wndclass.hCursor=::LoadCursor(NULL, IDC_ARROW); //使用预定义光标
wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH); //使用白色背景画刷
wndclass.lpszMenuName=NULL; //不指定菜单
wndclass.lpszClassName=szClassName; //窗口类名称
wndclass.hIconSm=NULL; //没有类的小图标 //注册这个窗口类
::RegisterClassEx(&wndclass);
//创建主窗口
HWND hWnd=::CreateWindowEx(
, //dwExStyle,扩展样式
szClassName, //lpClassName,类名
"My First Window!", //lpWindowName,窗口标题
WS_OVERLAPPEDWINDOW, //swStyle,窗口风格
CW_USEDEFAULT, //X,初始x坐标
CW_USEDEFAULT, //Y,初始y坐标
CW_USEDEFAULT, //nWidth,宽度
CW_USEDEFAULT, //nHeight,高度
NULL, //hWndParent,父窗口句柄
NULL, //hMenu,菜单句柄
hInstance, //hInstance,程序实例句柄
NULL); //lpParam,用户数据 if(hWnd == NULL)
{
::MessageBox(NULL,"创建窗口出错!","error",MB_OK);
return -;
}
//显示窗口,刷新窗口客户区
::ShowWindow(hWnd,nCmdShow);
::UpdateWindow(hWnd);
//从消息队列中取出消息,交给窗口函数处理,直到GetMessage返回FALSE,结束消息循环
MSG msg;
while(::GetMessage(&msg,NULL,,))
{
//转化键盘消息
::TranslateMessage(&msg);
//将消息发送到相应的窗口函数
::DispatchMessage(&msg);
}
return msg.wParam;
} LRESULT CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
char szText[]="Hello World!";
switch(message)
{
case WM_PAINT: //窗口客户区重绘
{
HDC hdc;
PAINTSTRUCT ps;
//使无效的客户区变得有效,并取得设备环境句柄
hdc=::BeginPaint(hWnd,&ps);
//显示文字
::TextOut(hdc,,,szText,strlen(szText));
::EndPaint(hWnd,&ps);
return ;
}
case WM_DESTROY: //销毁窗口
::PostQuitMessage();
return ;
}
//将不处理的消息交给系统默认处理
return ::DefWindowProc(hWnd,message,wParam,lParam);
}
简单Win窗口
Windos消息驱动的更多相关文章
- Intellij IDEA 创建消息驱动Bean - 接收JMS消息
除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...
- JMS和消息驱动Bean(MDB)
一.说明 本示例使用的ActiveMQ作为消息中间件,服务器为Glassfish,使用JMS发送消息,在MDB接收到消息之后做打印输出. 二.ActiveMQ安装配置 1.安装console war包 ...
- EJB_消息驱动发展bean
消息驱动发展bean Java信息服务(Java MessageService) Java 信息服务(Java Message Service,简称 JMS)是用于訪问企业消息系统的开发商中立的API ...
- Akka(1):Actor - 靠消息驱动的运算器
Akka是由各种角色和功能的Actor组成的,工作的主要原理是把一项大的计算任务分割成小环节,再按各环节的要求构建相应功能的Actor,然后把各环节的运算托付给相应的Actor去独立完成.Akka是个 ...
- EJB_开发消息驱动bean
开发消息驱动bean Java消息服务(Java MessageService) Java 消息服务(Java Message Service,简称 JMS)是用于访问企业消息系统的开发商中立的API ...
- SpringCloud实战9-Stream消息驱动
官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架. 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互 ...
- 「Android」消息驱动Looper和Handler类分析
Android系统中的消息驱动工作原理: 1.有一个消息队列,可以往这个消息队列中投递消息; 2.有一个消息循环,不断的从消息队列中取得消息,然后处理. 工作流程: 1.事件源将待处理的消息加入到消息 ...
- 使用 Spring Cloud Stream 构建消息驱动微服务
相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring Cloud Stream 的几个概念 Spring Cloud Stream is a ...
- 基于Kafka消息驱动最终一致事务(二)
实现用例分析 上篇基于Kafka消息驱动最终一致事务(一)介绍BASE的理论,接着我们引入一个实例看如何实现BASE,我们会用图7显示的算法实现BASE.
随机推荐
- 【数据结构】算法 LinkList (Merge Two Sorted Lists)
合并2个有序链表 list A, list B, Solution: 对A,B 表按序读取数据,比较大小后插入新链表C. 由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接 ...
- Windows中的原语与原子
目前对原语与原子的理解为: 原语: 由内核提供的核外调用的一段具有特定功能的方法或者函数称之为---原语 原语操作不允许发生中断. 原子: 在多进程多线程的操作系统中不允许其他进程或者 ...
- 单片机C语言基础编程源码六则
1.某单片机系统的P2口接一数模转换器DAC0832输出模拟量,现在要求从DAC0832输出连续的三角波,实现的方法是从P2口连续输出按照三角波变化的数值,从0开始逐渐增大,到某一最大值后逐渐减小,直 ...
- python学习之爬虫初体验
作业来源: "https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2851" ** 1.简述爬虫原理 通用爬虫 即(搜索 ...
- liunx驱动----系统滴答时钟的使用
2019-3-12系统滴答定时器中断使用 定义一个timer 其实就是使用系统的滴答定时器产生一个中断. 初始化timer init_timer函数 实现如下 void fastcall ini ...
- MyBatis笔记(一) 最简单的select
小白学习MyBatis的第一天,学习资料包括MyBatis3的官方文档,以及孤傲苍狼大佬的博客.这里先致敬大佬. · 首先,什么是MyBatis? 引用官网的一段话,“MyBatis 是一款优秀的持久 ...
- 51行代码实现简单的PHP区块链
本文原始地址:php区块链demo 今年区块链特别火,我也很火啊.我火什么呢.前几年,公众平台出现,还得花时间去学去看,后来小程序出现,又得花时间精力去学去看.现在比特币.以太坊等去中心化货币带起了区 ...
- 施密特正交化 GramSchmidt
施密特正交化 GramSchmidt 施密特正交化的原名是 Gram–Schmidt process,是由Gram和schmidt两个人一起发明的,但是后来因为施密特名气更大,所以该方法被简记为施密特 ...
- ORACLE 12c RAC的常用管理命令
ORACLE 12c RAC的常用管理命令 一.查询 1.RAC查询 1.1.查询节点 [grid@swnode1 ~]$ su - grid [grid@swnode1 ~]$ /u01/app/1 ...
- 不校验csrf
from django.views.decorators.csrf import csrf_exempt@csrf_exemptdef a(request): pass