知识大全 Delphi中SendMessage使用技巧

Posted 消息

篇首语:努力吧,只有站在足够的高度才有资格被仰望。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi中SendMessage使用技巧相关的知识,希望对你有一定的参考价值。

Delphi中SendMessage使用技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Windows系统是由消息机制驱动的 每个线程如果建立了一个窗口 则由系统分配一个消息队列用于窗口消息的处理 另外 消息也可以不经过消息队列而利用SendMessage函数直接发送给窗口 窗口过程将处理这个消息 但只有当消息被处理之后 SendMessage才能返回到调用程序 下面结合两个Delphi程序 讨论如何利用SendMessage向控件发送消息和控件对这种消息的响应

  用SendMessage向控件发送消息

  在编程中 有时需要控件以特殊的风格显示 而这种要求又无法通过设置控件属性实现 例如 读取客户列表并显示在下拉框供用户选择 如果下拉框宽度太窄 则不能全部显示 如果将宽度定得太宽 界面又有不紧凑之感 因此希望能在运行期动态地确定下拉框显示区域的宽度 这种要求如果不用SendMessage函数就很难实现

  解决办法是 在读数据库时计算字符串的显示宽度 用显示宽度的最大值确定下拉框显示区域的宽度 再用SendMessage函数向下拉框发送CB_SETDROPPEDWIDTH消息和宽度值 下拉框根据消息中传来的信息 就可以进行正确显示

  部分源程序代码如下  i:= ; //计数  MaxWidth:= ;  Query SQL Clear;  Query SQL Add( select Company from Customer );  Query Open;//读客户列表到下拉框  while not Query Eof do begin   ComboBox Items add(Query FieldByName( Company ) AsString);   Width:=ComboBox Font Size * Length(ComboBox Items[i]);   if Width>MaxWidth then   MaxWidth:=Width; //找出最大值   Query Next;   i:=i+ ;  end;  Query Close;  ComboBox Text:=ComboBox Items[ ];  //发送消息以确定显示区域的宽度  SendMessage(ComboBox Handle CB_SETDROPPEDWIDTH MaxWidth );    利用SendMessage函数还可以实现一些有趣的效果 例如在按钮的Click事件中加入如下语句

  SendMessage(Button Handle BM_SETSTYLE

  BS_RADIOBUTTON )

  运行后点击按钮 就可以把按钮变成一个收音机按钮

  控件接收SendMessage消息

  上面讨论了用SendMessage向控件发送消息的过程 但凡事有利就有弊 用SendMessage发送的消息在处理上存在着一定困难 因为该消息不经过消息队列 所以无法用OnMessage方式来指定对消息的响应 甚至用HookMainWindow也不行 因为消息直接发送到控件 绕过了主窗体 要对这种类型的消息作出响应 需要重载控件的WndProc方法

  例如 对于一个列表框 滚动条的滚动消息就是用SendMessage方式发送的 因此该消息不在TlistBox的事件列表中 下面是处理控件响应该滚动消息的具体步骤

   首先从TlistBox继承一个TmyListBox类 并重载WndProc方法 在程序中加入下列定义 typeTMyListBox=class(TListBox)privateprocedure WndProc(var Msg: TMessage); override;//重载WndProc 处理发送到控件的消息publicend;    其中WndProc方法指定控件对消息的响应 输入参数是TMessage类型 该数据类型是一个记录 包含了消息代码和消息的参数 消息参数可以用Longint或Word方式获得

   对滚动事件做出响应 在WndProc方法中加入如下处理代码  if (Msg Msg=WM_VSCROLL) and (Msg WParamLo=SB_ENDSCROLL) then   begin//获得鼠标位置对应的列    ItemIndex:=ItemAtPos(Point true);   Form Edit Text:=inttostr(ItemIndex);  inherited;   end  else   inherited;    当程序接收到WM_VSCROLL消息 且WParamLo参数为SB_ENDSCROLL时 表示竖直滚动条停止滚动 就可以用ItemAtPos方法确定与鼠标位置对应的ItemIndex ItemAtPos方法的Point参数是一个TPoint类型的变量 用来保存鼠标的位置

cha138/Article/program/Delphi/201311/24698

相关参考

知识大全 SendMessage API函数在PowerBuilder中应用[2]

SendMessageAPI函数在PowerBuilder中应用[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶

知识大全 SendMessage API函数在PowerBuilder中应用[1]

SendMessageAPI函数在PowerBuilder中应用[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶

知识大全 Delphi学堂之在Delphi中自己建立交叉表

Delphi学堂之在Delphi中自己建立交叉表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!fu

知识大全 Delphi中对象解除技巧

Delphi中对象解除技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Delphi程序设计

知识大全 DELPHI中使用API函数的方法

DELPHI中使用API函数的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  DELPHI的

知识大全 Delphi中制作特效菜单

特效处理:Delphi中制作特效菜单  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!菜单是应用程序中

知识大全 Delphi中使用纯正的面向对象方法

Delphi中使用纯正的面向对象方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Delphi的V

知识大全 Delphi中保存图像列表

Delphi中保存图像列表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近在做项目时遇到将图

知识大全 Delphi中动画设计[2]

Delphi中动画设计[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  imagepictu

知识大全 Delphi中数据的自动录入

Delphi中数据的自动录入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!