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

Posted

技术标签:

【中文标题】Delphi (CM_) 中的组件消息和自定义图形设计时组件【英文标题】:Component Messages in Delphi (CM_) and Custom Graphical DesignTime Component 【发布时间】:2012-03-16 07:37:55 【问题描述】:

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

我想知道

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

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

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

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

代码可能如下所示: TMyBMP=类(TImage) 私人的 fResultBMP:TBitmap32; .....

希望你能理解,谢谢!

【问题讨论】:

不符合delphi.about.com/od/vclusing/a/customvcldev_2.htm“组件消息(CM_)仅由VCL生成,不反映Windows消息(WM_)” 那是完全不正确的参考。在X message X 表示目的地,而不是起点。 【参考方案1】:

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

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

要将位图保存到 DFM,您可以将 TBitmap32 公开为已发布的属性(这提供了在设计时操作位图的另一种方法),或者覆盖组件的 DefineProperties() 方法以流式传输手动位图。

【讨论】:

我会试试这个,结合 djsoft 给我的答案。谢谢!【参考方案2】:

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

【讨论】:

谢谢,我会结合 Remy Lebeau 给我的答案试试这个。

以上是关于Delphi (CM_) 中的组件消息和自定义图形设计时组件的主要内容,如果未能解决你的问题,请参考以下文章

打字稿中的样式组件“as”道具和自定义道具

delphi OnMouseLeave 事件不灵敏及解决之道(使用TrackMouseEvent函数进行加强)

Delphi 自定义 TImage 组件 - 组件中的 MouseEnter、MouseLeave

Delphi - 如何正确注册自 XE8 以来的图形类?

Django中的tags,母版和继承,组件,静态文件相关,自定义simpletag和自定义inclusion_tag

vue之props和自定义事件的驼峰命名