CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

■建控件中的几点疑问■

楼主xxiao07()2003-05-03 20:37:13 在 C++ Builder / 基础类 提问

class   PACKAGE   TVecCanvas   :   public   TCustomControl  
  {  
  private:  
      TList*   ShapeList;  
      CShape*   CurrentShape;  
      bool   Down;  
      TPoint   LastPos;  
      TPoint   NewPos;  
      THoverShapeEvent   FOnHoverShape;  
      ToolType   FTool;  
      TShapeSelectedEvent   FOnShapeSelected;  
      DYNAMIC   void   __fastcall   MouseDown(TMouseButton   Button,   Classes::TShiftState   Shift,   int   X,   int   Y);  
      DYNAMIC   void   __fastcall   MouseUp(TMouseButton   Button,   Classes::TShiftState   Shift,   int   X,   int   Y);  
      DYNAMIC   void   __fastcall   MouseMove(Classes::TShiftState   Shift,   int   X,   int   Y);  
      void   __fastcall   DoHoverShape(int   index);  
      void   __fastcall   SetTool(ToolType   value);  
      void   __fastcall   DoShapeSelected(int   index);  
  protected:  
      void   __fastcall   Paint();  
  public:  
      __fastcall   TVecCanvas(TComponent*   Owner);  
      __fastcall   ~TVecCanvas();  
      int   __fastcall   ShapeAtPos(int   x,   int   y);  
  __published:  
      __property   Color;  
      __property   OnClick;  
      __property   THoverShapeEvent   OnHoverShape     =   {   read=FOnHoverShape,   write=FOnHoverShape   };  
      __property   Align;  
      __property   OnMouseMove;  
      __property   OnMouseDown;  
      __property   OnMouseUp;  
      __property   ToolType   Tool     =   {   read=FTool,   write=SetTool   };  
      __property   TShapeSelectedEvent   OnShapeSelected     =   {   read=FOnShapeSelected,   write=FOnShapeSelected   };  
   
  };  
   
  1。THoverShapeEvent、TShapeSelectedEvent是“事件”类?到哪里找此类资料?  
  2。以下的属性和事件,是否是BCB默认的名称,只要你定义了规定的名称BCB就知道要做什么?  
  __published:  
      __property   Color;//系统自认为是设置颜色?  
      __property   OnClick;;//系统自认为是单击鼠标事件?  
      __property   OnMouseMove;;;//系统自认为是鼠标移动事件?  
  ................................  
  问题点数:100、回复次数:7Top

1 楼gk0205(沉默是金)回复于 2003-05-03 20:54:05 得分 10

相应的属性和事件你要自己去写代码的呀!  
   
  “__property   Color;//系统自认为是设置颜色?”  
  这些只是你定义了一个属性并给它一个名字而已唉!  
  Top

2 楼xxiao07()回复于 2003-05-03 21:04:27 得分 0

我问的是定义属性“Color”系统就知道这是设置颜色的?  
                  定义事件“OnClick”系统就知道这是单击鼠标事件了?  
  如果我写成“xColor”、“xOnClick”肯定不行!  
  我想知道:系统是否认“属性和事件名称”的!  
  Top

3 楼Aweay(别问我问题,2年不用忘光了)回复于 2003-05-03 22:38:28 得分 0

我的代码被贴到这里来了,^_^!  
   
  今天我特地写了一篇关于如何写控件的文章  
  http://www.csdn.net/develop/read_article.asp?id=18239  
  可能还没有被审批通过,过几天再看吧  
   
  Color  
  OnClick是从父类继承的,我只是表露而已  
   
  THoverShapeEvent、TShapeSelectedEvent  
  是我自己定义的事件,看源代码啊  
   
  过几天我还会写一些文章的,你可以密切关注我的文章  
  Top

4 楼Aweay(别问我问题,2年不用忘光了)回复于 2003-05-03 22:39:58 得分 90

先贴到这里好了:  
   
  这篇文章提及内容可能大家已经在很多地方看到过了,作者也是如此,只不过还看了很多VCL源代码,加上自己实际编写元件的经验,拼凑了这么一篇文章。所以所有言论都是个人观点、经验的描述,仅供参考。  
   
  你可转载,拷贝,但必须加入作者署名Aweay,如果用于商业目的,必须经过作者同意。  
   
  系统要求  
   
  如果你想一起跟着做的话,那么你应该看看这里,否则你可以直接跳过。  
  C++   Builder6   +   updata4     (上帝造人的工具,以下简称BCB)  
  Windows2k   or   higher   (必要)  
  作者强烈建议你使用WinNT,BCB在Win9x下有非常多的问题,而且非常不稳定,就算你不在乎这个,还有一个非常致命的问题,BCB的帮助文件在Win9x下显示不完全(因为BCB的帮助索引关键字数量超过Win9x的限制),这样非常难于参考帮助。  
  Delphi6   :(   (必要)  
  什么?是不是写错了,完全没有写错,如果你要深入VCL查看源代码的话,在没有比用Delphi6更合适的了,在全部安装Delphi6后,把VCL   Source的目录加入Search   Path中,这样你可以在编辑器中按住Ctrl键,点击鼠标直接跳转到源代码处非常方便,比什么grep好用多了。  
   
  起步  
   
  对于VCL的消息机制,大家可以参考CKER的  
  http://www.csdn.net/develop/read_article.asp?id=8131  
   
  重复的内容我就不介绍了,但是对于编写元件来说上面的消息机制还是很模糊,而且很多时候并不是用那些方法来处理消息的,还有就是元件特有的CM_XXXXXXXX消息如何处理呢?如何加入自己的事件呢?这些问题我会在后面的讨论中做详细介绍。  
   
  站在巨人的肩膀  
   
  编写元件的第一件事情就是确定我们从那里继承的问题,选取一个好的祖先类是编写一个好的元件的第一步,那么到底如何选取他山之石呢?一般性的规则是这样的:  
  1.对于有界面的显示的,需要处理键盘事件的,又不是容器的组件从TCustomControl继承  
  2.对于有界面的显示的,需要不处理键盘事件的,需要处理鼠标事件的从TGraphicsControl继承  
  3.对于没有界面显示的,类似与TOpenDialog/TXpMenu这样的控件从TComponent继承  
  4.如果你想扩展某个指定的控件,比如TPanel,你最好从TCustomPanel继承,而不要从TPanel直接继承。  
   
  注意上面第4条规则,基本上所有组件都有TCustomXXX的父类,这也是VCL鼓励的继承对象,原因在于你可以定制元件属性的可见性,最重要的是他们的构造函数和析构函数是虚拟的。  
   
  这篇文章主要针对1,2规则的元件进行介绍,3,4相对简单就不作深入讨论了。  
   
  画出自己  
   
  元件要显示在窗体上,必须以一定的样子出现,那么可定要画出自己,大家都知道处理WM_PAINT消息就可以了,从CKER的文章里,我们可以得出很多方法来处理这个消息,比如:  
  __fastcall   WndProc(TMessage   msg)  
  {  
      switch(msg->msg)  
      {  
          case   WM_PAINT:  
              //我们的处理代码  
      ...  
  }  
   
  或者干脆用消息映射的宏,但这些都不是最好的方法。  
   
  从TControl以后的组件都有Paint这个虚拟方法,我们只要重载这个方法就可以自动绘制,相当于处理了WM_PAINT,这是因为:  
  procedure   TGraphicControl.WMPaint(var   Message:   TWMPaint);  
  begin  
      if   Message.DC   <>   0   then  
      begin  
          Canvas.Lock;  
          try  
              Canvas.Handle   :=   Message.DC;  
              try  
                  Paint;  
              finally  
                  Canvas.Handle   :=   0;  
              end;  
          finally  
              Canvas.Unlock;  
          end;  
      end;  
  end;  
  以上代码片断说明了这一点,据我所研究过的专业级组件都是通过重载这个函数来绘制自己的。  
   
  注意上面的代码片断就是用我上面提到的方法(装delphi6)按了几次鼠标左键得到的,是不是很实惠,^_^。  
   
  在Paint方里我们可以自由绘制,在后面的文章里我会交大家如何高效率绘制。  
   
  在很多时候,我们需要重绘自己,比如我前几天给网友做的划线的组件,当线的宽度改变时我们必须重绘自己,否则无法反映属性的改变,我见很多朋友使用repaint()方法,这也不是最好的方法,我们应该用Invalidate(),为什么?留给大家看源代码吧,就算复习上面的知识了。  
  代码演示:  
  void   __fastcall   TLine::SetLineWidth(int   value)  
  {  
      //TODO:   Add   your   source   code   here  
      if(FLineWidth!=value)  
      {  
          FLineWidth=value;  
          Invalidate();  
      }  
  }  
   
  Top

5 楼Aweay(别问我问题,2年不用忘光了)回复于 2003-05-03 22:42:37 得分 0

以上是文章的第一部分Top

6 楼ljwwjh(向往开发)回复于 2003-05-04 00:02:49 得分 0

关注!  
  Top

7 楼qibo999(行路者)回复于 2003-05-04 09:08:59 得分 0

gzTop

相关问题

  • 关于创建CEdit控件中的疑问。
  • QUERY控件疑问!!!
  • ActiveX 控件疑问
  • Winsock控件疑问……
  • 有关动态创建控件时控件大小的疑问?请进!
  • 在C#中ListView控件的疑问??????急急急!!!!!!!
  • 关于Custom确认控件中ServerValidateFuction的一些疑问?
  • 在 Delphi 中使用OCX 控件的疑问
  • Qt中关于控件QTextEdit用法的疑问
  • 关于vs.net2005中datagridview列增加自定义控件疑问

关键词

  • .net
  • 控件
  • 属性
  • 源代码
  • 组件
  • 鼠标
  • 代码
  • bcb
  • 函数
  • vcl

得分解答快速导航

  • 帖主:xxiao07
  • gk0205
  • Aweay

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo