牧者

大风起兮云飞扬

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

Delphi中SendMessage使用说明(1)

  1. SendMessage基础知识 

  函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。 
  函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam); 
  参数: 
  hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
  Msg:指定被发送的消息。 
  wParam:指定附加的消息指定信息。 
  IParam:指定附加的消息指定信息。 
  返回值:返回值指定消息处理的结果,依赖于所发送的消息。 
  备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。
  如果指定的窗口是由调用线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。 
Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要检查发送的消息是否被支持。

附:Delphi中SendMessage使用技巧

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

    2.用SendMessage向控件发送消息 

  在编程中,有时需要控件以特殊的风格显示,而这种要求又无法通过设置控件属性实现。例如,读取客户列表并显示在下拉框供用户选择,如果下拉框宽度太窄,则不能全部显示;如果将宽度定得太宽,界面又有不紧凑之感。因此希望能在运行期动态地确定下拉框显示区域的宽度,这种要求如果不用SendMessage函数就很难实现。 
解决办法是,在读数据库时计算字符串的显示宽度,用显示宽度的最大值确定下拉框显示区域的宽度。再用SendMessage函数向下拉框发送CB_SETDROPPEDWIDTH消息和宽度值,下拉框根据消息中传来的信息,就可以进行正确显示。 
  部分源程序代码如下: 

   i:=0; //计数 
  MaxWidth:=0; 
  Query1.SQL.Clear; 
   Query1.SQL.Add(‘select Company from Customer’); 
  Query1.Open; 
  //读客户列表到下拉框 
  while not Query1.Eof do
   begin 
    ComboBox1.Items.add(Query1.FieldByName(‘Company’).AsString); 
   Width:=ComboBox1.Font.Size * Length(ComboBox1.Items); 
   if Width>MaxWidth then 
       MaxWidth:=Width; //找出最大值 
   Query1.Next; 
   i:=i+1; 
  end; 
  Query1.Close; 
  ComboBox1.Text:=ComboBox1.Items[0]; 
  //发送消息以确定显示区域的宽度 
  SendMessage(ComboBox1.Handle, CB_SETDROPPEDWIDTH,MaxWidth,0); 

   利用SendMessage函数还可以实现一些有趣的效果,例如在按钮的Click事件中加入如下语句: 

      SendMessage(Button.Handle,BM_SETSTYLE, BS_RADIOBUTTON,1); 
运行后点击按钮,就可以把按钮变成一个收音机按钮。

 

posted on 2016-10-20 09:58  牧者.D  阅读(170)  评论(0)    收藏  举报