Delphi(CM_)和自定义图形设计时组件中的组件消息

时间:2012-02-26 16:16:38

标签: delphi graphics components messages design-time

我想在Delphi中创建一个可以在某种程度上编辑的图形组件 在设计时编辑器中。

我想知道

  • 我应该从哪个组件继承(例如TWinControl或其他)
  • 如何处理组件消息(CM_xxx)以便能够在编辑器中移动我的组件
  • 如果可以在设计时编辑器中使用本机Windows组件,但在运行时切换到其他组件。

我希望能够(如果有必要)在运行时切换到其他类型的组件的原因是因为我打算使用的组件是来自Graphics32库的TBitmap32,它比标准的Windows图形要快许多倍,但是TBitmap32不是从TWinControl开始继承的。

也许如果可能的话,我可以做一些事情,比如在设计时使用标准的VCL,然后只需将其属性应用到TBitmap32。

实施例: 在设计时我使用TImage,我可以移动,当我运行应用程序时,它采用X和Y值,以及来自TImage的位图,并将它们应用于TBitmap32组件并将TBitmap32组件绘制到需要绘制的任何位置

代码看起来像这样: TMyBMP = class(TImage)   私人的     fResultBMP:TBitmap32; .....

我希望你理解,谢谢!

2 个答案:

答案 0 :(得分:3)

我不会在设计时和运行时使用不同的组件。这只会使组件设计过于复杂。在运行时使用的内容应该与您在设计时使用的内容相同。

我要做的是让你的组件包含TBitmap32成员,覆盖Paint()方法在运行时和设计时绘制位图,然后响应{{1消息,以便当鼠标位于位图上时,组件可以在设计时对鼠标活动做出反应。然后,您可以根据需要覆盖标准CM_DESIGNHITTEST方法来操作位图定位/大小调整(在这些方法中,您可以通过检查组件的MouseDown/Move/Up()属性来区分运行时和设计时。 {1}}标志)。

要将位图保存到DFM,您可以将ComponentState公开为已发布属性(提供在设计时操作位图的替代方法),或覆盖组件的csDesigning手动流式传输位图的方法。

答案 1 :(得分:1)

您可以创建从TGraphicControlTWinControl继承的组件。如果您希望控件能够接收焦点和Windows消息,则需要后者。 您的组件应该使用TBitmap32作为缓冲区 - 您可以在内存中进行绘制。在Paint方法(您覆盖)中,使用BitBlt或类似函数将内容从缓冲区复制到屏幕。