CB非可视组件的消息处理技巧

2016-02-19 16:36 4 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的CB非可视组件的消息处理技巧,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  一个非可视的组件必须对Windows操作系统或用户定义的消息作出响应。然而,由于一个非可视组件没有窗口,因此它也没有窗口句柄,自然它也不能接收到消息,为了解决这一问题,我们的思路是创建一个隐藏的窗口,使非可视组件能够接收到消息。

  为了给你的非可视组件创建一个隐藏的窗口,需要有以下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  1.一个私有变量型(Private Variable)的HWnd来取得窗口句柄。

  2.一个用来捕捉窗口发送给组件的函数(a WndProc)。

  3.对AllcolateHwnd的调用使之创建窗口句柄并设置WndProc。

  为了清楚的解释上述思路和展示创建过程,下面我们将以一个具体的实例来说明。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  首先我们先创建一个新的组件,在C++ Builder中,选择FILE|NEW双击组件图标显示一个新的组件对话框改变Ancestor Type为Tcomponent和Class name为Ttest并设置完毕。

  然后,切换到新组件的头文件,在类的私有部分(private section)加入以下声明:

  HWnd Fhandle;

  void __fastcall WndProc(Tmessage &Msg);

  第一行声明了一个调用Fhandle的HWnd变量,这个变量将用于窗口创建后捕获窗口句柄。

  第二行声明了一个用于接收消息的WndProc函数。这个函数的声明必须加以标识,以便限定它是一个WndProc,然后在类声明Public(公有)部分构造以下声明:

  

Viod DoIt( );
  这个公有函数将被我们用来测试组件,类声明应如下:
  class PACKAGE Ttest:public Tcomponent
   {
   private:
     HWnd Fhandle;
    void __fastcall WndProc(Tmessage &Msg);
   protected:
   public:
     __fastcall Ttest(Tcomponent *Owner);
     void DoIt( );
   __published:
   };

  现在切换到组件的代码单元,将下面一行加入到单元的顶部(在函数上也许是不错的地方)

  #define MY__Message WM_USER+1

  这一行声明了一个在DoIt函数被调用时,组件将发送给它自己的用户自定义消息。此时我们必须为组件分配一个窗口句柄。这个句柄将提供一个隐藏的窗口使我们可以捕捉组件中的消息。找到组件构造代码,加入下面代码:

  

__fastcall Test::Test(Tcomponent *Owner): Tcomponent(Owner)
  {
  Fhandle=AllocateHWnd(WndProc);
  }

  好,重要的一步已完成,AllocateHWnd函数创建了一个隐藏窗口并且返回它的句柄,注意这里我们为了使Windows知道哪里发来了消息,传递WndProc的地址;

  现在我们来创建WndProc的函数部分。在源文件中加入:

  

void __fastcall Ttest::WndProc(Tmessage &Msg)
  {
   if (Msg.Msg == MY__MESSAGE)
    MessageBox(0,"Got here!","Message",0);
   try 
{
    Dispatch(&Msg);
    }
   catch ()
{
    Application-HandleException(this);
    }
  }

  无论何时Windows发送消息给组件,Windows都会调用这个函数。这部分代码完成了两件事。首先,它检查被接收的消息是否是我们用户自定义的消息。如果是,一个消息框将被显示,你可以看到实际上我们接收到的消息。其次,这段代码传送了系统(或VCL)处理过程中的消息,try/catch块用来保证,如果异常出现,它将成为缺省风格下的句柄。

  概括地说,WndProc函数在为缺省句柄传递所有其他消息,监控了所有客户消息。现在我们创建DoIt函数,完成我们的组件,加入我们创建DoIt函数,完成我们的组件,加入代码:

  

void Ttest::DoIt()
   {
   PostMessage(Fhandle, MY__MESSAGE, 0, 0);
   }

  这个函数发送一个消息组件的窗口句柄(记住,这个窗口句柄是以前存入到Fhandle数据成品中的)。现在我们已经完成了创建组件选择,用SelectFile|ColseAll来保存我们的工作测试组件。

  下一步将测试组件。如果你使用BCB3,那么你必须把组件加入到包(Packege)中,然后用Componet|install(可以使用DCLSTD35 Packege来快速测试)。再选择你刚存的TestBCB.Cpp,一旦你安装完成组件后,它将出现在组件板上。双击按钮,为按钮的OnClick事件创建以下代码:

  Test1- DoIt( );

  现在运行程序,当你点击按钮时,将看到一个消息框显示Got here".

  总结:一个可以响应Windows消息的非可视组件有许多用途。最显而易见的就是用来封装某些方面的WindowsAPI。例如:TAPI和WinSock发送消息给事件的指定用户。如果你写的组件封装了一个这样的API。你将需要捕捉Windows发送的消息。而在你的组件中加入隐藏窗口将很好的帮你做到这一点。

  以上程序在C++ BUILDER 3.0中调试通过。

来源:http://www.tulaoshi.com/n/20160219/1612516.html

延伸阅读
无痛人流的种类分为: 普通无痛人流: 安全无痛,恢复快,无后遗症,终止妊娠提早在6周之前。适用于早早孕,未生育年轻女性或早早孕反应强烈急需中止妊娠的女性。 超导可视无痛人流 :结合先进的b超,将无痛人流技术发挥到极致,在千层洁净手术室完成。定位精确,无不适感,彻底避免了术后感染。 超导可视(微创)无痛人流 :利用...
C++ Builder Environment Options对话框可以全局水平上改变C++ Builder IDE(而Project Options在对话框则是在项目水平上控制)。为了打开Environment Options对话框,选择主菜单中的Tools|Environment Options,这是个标签式对话框,共有八个页面。第10课介绍代码编辑器时已经介绍Editor.Display和Color页面,第11课介绍查错器选项时介绍...
虽然如今好的配色方案已经唾手可得,但想为数据可视化找到合适的配色方案,难度仍然不小。因信息图的独特属性,在保证色彩具有清晰辨识度的同时,还必须满足丰富而不凌乱的配色要求。不过即使你对色彩不敏感,用了今天这篇干货提到的3个技巧,也能轻松制作出好看的信息图。 在信息图方面,事情甚至更加棘手,因为我们要通过上千种各不相同的数...
标签: ASP
  在ASP中用EasyMailObject组件处理Exchange邮件源代码---读取邮件主题和大小(maillist1.asp) <%@ LANGUAGE="VBSCRIPT" % <% '************************************************ '这个文件列出所有邮件,并把邮件内容显示窗口置为空白窗口 '作者:awayeah '邮箱:awayeah@163.net '************...
标签: ASP
  在ASP中用EasyMailObject组件处理Exchange邮件源代码---删除邮件时调用的文件(mail_prc.asp) <%@ Language=VBScript % <% '************************************* '这个文件是删除邮件时调用的 '作者:awayeah '邮箱:awayeah@163.net '************************************* dim cc,cc1,sep,dd '取得邮件总数 msgcount = s...

经验教程

169

收藏

82
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部