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】:您可以创建一个继承自TGraphicControl
或TWinControl
的组件。如果您希望您的控件能够接收焦点和 Windows 消息,则需要后者。
您的组件应该使用 TBitmap32 作为缓冲区 - 您在内存中进行所有绘制。在Paint
方法(您覆盖)中,您可以使用BitBlt
或类似函数将内容从缓冲区复制到屏幕。
【讨论】:
谢谢,我会结合 Remy Lebeau 给我的答案试试这个。以上是关于Delphi (CM_) 中的组件消息和自定义图形设计时组件的主要内容,如果未能解决你的问题,请参考以下文章
delphi OnMouseLeave 事件不灵敏及解决之道(使用TrackMouseEvent函数进行加强)
Delphi 自定义 TImage 组件 - 组件中的 MouseEnter、MouseLeave