Winodws消息

procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
{说明:
可以拦截处理方向键,但是有更灵活的方法,介绍如下:
想要你的组件能够处理方向键,你必须要拦截 CM_WANTSPECIALKEY 组件讯息。 CM_WANTSP
ECIALKEY 组件讯息提供你比拦截 WM_GETDLGCODE 窗口讯息更容易且灵活的判断方法来决定
是否需要某些特殊键的讯息。当控件收到任何一个特殊键时就会送出CM_WANTSPECIALKEY 组
件讯息给控件。

CM_WANTSPECIALKEY 组件讯息比 WM_GETDLGCODE 讯息更具有弹性的地方在这儿。我们甚至
可以根据是按下的是哪个特殊键才决定是否处理这个键。例如,你的控件有三张影像,你可
以让使用者利用左右方向键来回检视它们,如果翻到最后一张影像再按向右键时,焦点就让
它离开组件,剩下的全部都让 Delphi 来处理。

举例:
procedure TCustomGrid.WMGetDlgCode(var Msg: TWMGetDlgCode);
begin
Msg.Result := DLGC_WANTARROWS; //在这说明要处理方向键
if goRowSelect in Options then Exit;
if goTabs in Options then Msg.Result := Msg.Result or DLGC_WANTTAB; //这里同样可以处理Tab键
if goEditing in Options then Msg.Result := Msg.Result or DLGC_WANTCHARS;
end;

相关:
VCL内部消息 CM_WANTSPECIALKEY
}
procedure WMMeasureItem(var Message: TWMMeasureItem); message WM_MEASUREITEM;
procedure WMDrawItem(var Message: TWMDrawItem); message WM_DRAWITEM;
{说明:
procedure WMMeasureItem(var Message: TWMMeasureItem); message WM_MEASUREITEM;
procedure WMDrawItem(var Message: TWMDrawItem); message WM_DRAWITEM;
这两个消息息息相关,一起做说明--

系统会在控件需要绘制的时候先发送一个WM_MEASUREITEM消息给当此控件的父窗体(注意这里要
注意,这是由于标准Win32开发方式决定的,由于原来大多数的控件都是在接收到主窗体的W
M_CREATE消息时候创建的,一个窗口过程是当时程序员可以编写代码唯一的机会,所有的消
息都发送到主线程的消息循环中,所以控件的消息自然发到这里来了!可没有这么频繁使用
子类化或者超类化的方式)来确定控件的绘制范围,然后接着发送WM_DRAWITEM给此控件的父
窗体,而我们要做一个独立的组件,它怎么知道什么时候该绘制呢?代码本来应该写在窗体
中才对啊!好在delphi在库中意见考虑到这个需求,只要你的控件是在delphi中使用的,那
么TForm窗体会将所有接收的消息发送给相应的窗口过程处理,TWinControl.WMDrawItem相关
代码如下(经过处理):

举例:
procedure TWinControl.WMDrawItem(var Message: TWMDrawItem);
begin
if not DoControlMsg(Message.DrawItemStruct^.CtlID, Message) then iherited;
end;
而DoControlMsg的实现很简单:
function DoControlMsg(ControlHandle: HWnd; var Message): Boolean;
var Control: TWinControl;
begin
DoControlMsg := False;
Control := FindControl(ControlHandle);
if Control <> nil then
with TMessage(Message) do
begin
Result := Control.Perform(Msg + CN_BASE, WParam, LParam);
DoControlMsg := True;
end;
end;

相关:
上述消息在主窗体中被处理,Delphi中主窗体接受到此消息后,就查找要接受该消息的子窗体。
找到控件后将该消息的标识加上CN_BASE发送给相应窗口就是了(CN_DRAWITEM=CN_BASE+WM_
DRAWITEM),所以这里是第二个注意点:在组件中截获WM_DRAWITEM消息是没有效果的,事实
上根本没有这个消息传送到组件的窗口过程,而应该截获的是CN_DRAWITEM,WM_MEASUREITE
M的消息处理过程是一样的,组件中应该截取CN_MEASUREITEM消息。两个Delphi自定义消息
声明如下:

procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
}

时间: 2024-12-23 13:29:23

Winodws消息的相关文章

抓包过程中遇到的几种异常报文

概述: 在平时的运维过程中,我们经常会遇到一些数据传输的问题,在我们平时遇到的数据传输问题中定位难度从难到易基本为:数据传输慢不符合预期.数据传输过程有丢包.数据传输被终止或网络断开连接. 如果要对数据流分析抓包是最直接的办法,它可以帮助你更快的定位问题.最常用的抓包工具:wireshark(windows系统).tcpdump(linux系统) (工具使用略) 接下来分享下我总结的几个常见数传异常报文: *TCP Dup Ack(TCP Dup Ack 22#1此报文为22号报文的重发报文)

Java - 微信公众号 - 消息回复

1.开发接入 (1)更改入门教程中的Controller:  注(验证是属于GET,然而交互是属于POST) @RequestMapping(value = "/getMsg", method = {RequestMethod.GET, RequestMethod.POST}) public void getMsg(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException

Modbus库开发笔记之二:Modbus消息帧的生成

前面我们已经对Modbus的基本事务作了说明,也据此设计了我们将要实现的主从站的操作流程.这其中与Modbus直接相关的就是Modbus消息帧的生成.Modbus消息帧也是实现Modbus通讯协议的根本. 1.Modbus消息帧分析 MODBUS协议在不同的物理链路上的消息帧有一些差异,但我们分析一下就会发现,在这些不同的消息帧中具有一下相同的部分,这对我们实现统一的数据操作非常重要,具体描述如下: (1).简单协议数据单元 MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)

QCustomPlot 鼠标消息获取,以及对应坐标转换

1 首先在 MainWindow.h 中加入 消息处理程序(槽) private slots: void my_mouseMove(QMouseEvent* event); 2 在 MainWindow.cpp 中实现 (槽) void MainWindow::my_mouseMove(QMouseEvent* event) { //获取鼠标坐标点 int x_pos = event->pos().x(); int y_pos = event->pos().y(); // 把鼠标坐标点 转换为

分布式开放消息系统(RocketMQ)的原理与实践

分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一款高性能.高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的? 关键特性以及其实现原理 一.顺序消息 消息有序指的是可以按照消息的发送顺序来消费.例如:一笔订单产生了 3 条消息,分别是订单创建.订单付款.订单完成.消费时,要按照顺序依次消费才有意

替代alert的消息框和提示框

alert提示框由于外观不太友好,所以一般都不用alert了. 我在这里使用bootstrap的样式,写了一个可以单独显示消息,也可以确认取消的提示框. 使用的外观如下: 一:单独显示消息: 二:确认和取消: 单独显示消息的方法传递类型,信息,显示时间以及回掉函数.其中通过重载可以只传递信息. 确认和取消的方法传递类型,信息以及回掉函数.其中可以通过重载可以只传递信息和确认后执行的回掉函数.如果点击取消就去隐藏该提示框. 下面是代码: 1 //success 成功 2 //info 信息 3 /

Azure Messaging-ServiceBus Messaging消息队列技术系列6-消息回执

上篇博文中我们介绍了Azure Messaging的重复消息机制.At most once 和At least once. Azure Messaging-ServiceBus Messaging消息队列技术系列5-重复消息:at-least-once at-most-once 本文中我们主要研究并介绍Azure Messaging的消息回执机制:实际应用场景: 同步收发场景下,消息生产者和消费者双向应答模式,例如:张三写封信送到邮局中转站,然后李四从中转站获得信,然后在写一份回执信,放到中转站

java soap api操作和发送soap消息

Java代码   package gov.hn12396.appintegration.mule.client; import gov.hn12396.appintegration.mule.util.EncoderUtil; import java.net.URL; import java.util.Calendar; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.s

JMS开发步骤和持久化/非持久化Topic消息

------------------------------------------------ 开发一个JMS的基本步骤如下: 1.创建一个JMS connection factory 2.通过connection factory来创建JMS connection 3.启动JMS connection 4.通过connection创建JMS session 5.创建JMS destination 6.创建JMS producer 或者创建JMS message,并设置destination 7