当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

深化VCL理解BCB的消息机制2[VC/C++编程]

赞助商链接



  本文“深化VCL理解BCB的消息机制2[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

重载TControl的WndProc办法

还是先谈谈VCL的担当战略.VCL中的担当链的顶部是TObject基类.一切的VCL组件和对象都担当自TObject.

翻开BCB帮忙查看TControl的担当关系:

TObject->TPersistent->TComponent->TControl

呵呵,本来TControl是从TPersistent类的子类TComponent类担当而来的.TPersistent抽象基类具有利用流stream来存取类的属性的本领.

TComponent类则是全部VCL组件的父类.

这就是全部的VCL组件包含您的自定义组件可以利用dfm文件存取属性的缘由『当然如果TPersistent的子类,我想您很少需求直接从TObject类来派生您的自定义组件吧』.

TControl类的重要性并不亚于它的父类们.在BCB的担当关系中,TControl类的是全部VCL可视化组件的父类.实际上就是控件的意思吧.所谓可视化是指您可以在运行期间看到和操作的控件.这类控件所具有的一些基本属性和办法都在TControl类中举行定义.

TControl的实目前\Borland\CBuilder5\Source\Vcl\control.pas中可以找到.『大概会有朋友问你怎么知道在那边?利用BCB供应的Search -> Find in files很简单找到.大概利用第三方插件的grep功效.』

好了,进入VCL的源码吧.说到这里免不了要抱怨一下Borland.哎,为什么要用pascal实现这一切.....:-(

TControl担当但并没有重写TObject的Dispatch()办法.反而供应了一个新的办法就是xycleo提到的WndProc().一同来看看Borland的工程师们是怎么写的吧.

procedure TControl.WndProc(var Message: TMessage);
var
  Form: TCustomForm;
begin
//由拥有control的窗体来处理计划期间的消息
  if (csDesigning in ComponentState) then
  begin
   Form := GetParentForm(Self);
   if (Form <> nil) and (Form.Designer <> nil) and
    Form.Designer.IsDesignMsg(Self, Message) then Exit;
  end
//假如需求,键盘消息交由拥有control的窗体来处理
  else if (Message.Msg >= WM_KEYFIRST) and (Message.Msg <= WM_KEYLAST) then
  begin
   Form := GetParentForm(Self);
   if (Form <> nil) and Form.WantChildKey(Self, Message) then Exit;
  end
//处理鼠标消息
  else if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then
  begin
   if not (csDoubleClicks in ControlStyle) then
    case Message.Msg of
     WM_LBUTTONDBLCLK, WM_RBUTTONDBLCLK, WM_MBUTTONDBLCLK:
      Dec(Message.Msg, WM_LBUTTONDBLCLK - WM_LBUTTONDOWN);
    end;
   case Message.Msg of
    WM_MOUSEMOVE: Application.HintMouseMessage(Self, Message);
    WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
     begin
      if FDragMode = dmAutomatic then
      begin
       BeginAutoDrag;
       Exit;
      end;
      Include(FControlState, csLButtonDown);
     end;
    WM_LBUTTONUP:
     Exclude(FControlState, csLButtonDown);
   end;
  end
// 下面一行有点分外.假如您细心的话会看到这个消息是CM_VISIBLECHANGED.
// 而不是我们熟习的WM_开首的尺度Windows消息.
// 固然Borland没有在它的帮忙中提到有这一类的CM消息存在.但很明显这是BCB的
// 自定义消息.呵呵,假如您对此有爱好可以在VCL源码中查找相关的内容.一定会有不小的收获.
  else if Message.Msg = CM_VISIBLECHANGED then
   with Message do
    SendDockNotification(Msg, WParam, LParam);
// 最后调用dispatch办法.
  Dispatch(Message);
end;


  以上是“深化VCL理解BCB的消息机制2[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 深化VCL理解BCB的消息机制2
  • <b>深化VCL理解BCB的消息机制1</b>
  • 深化VCL理解BCB的消息机制3
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .