深入C++ Builder之编写自己的元件(1)

2016-02-19 15:18 7 1 收藏

下面这个深入C++ Builder之编写自己的元件(1)教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

  深入C++ Builder之编写自己的元件-深入分析VCL继承、消息机制(1)

  这篇文章提及内容可能大家已经在很多地方看到过了,作者也是如此,只不过还看了很多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的

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

  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相对简单就不作深入讨论了。

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

  画出自己

  元件要显示在窗体上,必须以一定的样子出现,那么可定要画出自己,大家都知道处理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();
 }
}

来源:https://www.tulaoshi.com/n/20160219/1609337.html

延伸阅读
38)问:事件OnChange和OnScorll都可以描述滚动条的滚动事件,他们有什么区别吗? 答:事件OnChange和OnScorll是有区别的。只要属性Position的值发生改变,那么无论这个值是用户操作滚动条引起的还是通过程序修改的,都会产生OnChange事件。而OnScorll事件只有在用户操作滚动条时才发生。当用户操作滚动条时,首先发生OnScorll事件,然...
(7)在C++Builder集成开发环境中,还有Component菜单。在组件菜单下的菜单命令是有关建立、安装、重建组件的菜单项。其中: “New Component”菜单项打开组件向导建立新组件。 “Install Component”菜单项安装新的组件。 “Import ActiveX Control”菜单项将ActiveX控制的类型库加入到C++Builder的工程中。 “Create Component ...
13.对话框组件 96)问:怎样编写文件打开、保存等对话框? !-- frame contents -- !-- /frame contents -- 答:C++Builder为我们提供了许多常用的对话框组件,这些对话框组件都放在组件模板的Dialogs选项卡中,例如Font,Color,Open和Print对话框。其中OpenDialog对话框组件最具有代表性,只要把握了它的用法,那么你也就会...
(4)利用C++Builder集成开发环境中的视图“View”菜单,可以显示或隐藏C++Builder集成开发环境中的不同的部分,也可以用于打开属于集成调试器的窗口。 “Project Manager”菜单项用于显示工程治理器。 “Object Inspector”菜单项用于显示对象监视器窗口。 “Alignment Palette”菜单项用于显示排版窗口。 “Component List”菜单...
13.对话框组件 96)问:怎样编写文件打开、保存等对话框? 答:C++Builder为我们提供了许多常用的对话框组件,这些对话框组件都放在组件模板的Dialogs选项卡中,例如Font,Color,Open和Print对话框。其中OpenDialog对话框组件最具有代表性,只要掌握了它的用法,那么你也就会使用其他的对话框组件了。 97)问:对话框组件...

经验教程

797

收藏

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