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

Delphi(CM)中的组件消息和自定义图形设计时组件,delphi,graphics,components,messages,design-time,Delphi,Graphics,Components,Messages,Design Time,我想在Delphi中创建一个在某种程度上可编辑的图形组件 在designtime编辑器中 我想知道 我应该从哪个组件继承(例如TWinControl或其他) 如何处理组件消息(CM_xxx),以便能够在编辑器中移动我的组件 如果可以在designtime编辑器中使用本机windows组件,但在运行时切换到其他组件 我想在运行时切换到其他类型的组件(如果有必要)的原因是,我打算使用的组件是Graphics32库中的TBitmap32,它比标准windows图形快很多倍,但TBitmap32并不

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

我想知道

  • 我应该从哪个组件继承(例如TWinControl或其他)
  • 如何处理组件消息(CM_xxx),以便能够在编辑器中移动我的组件
  • 如果可以在designtime编辑器中使用本机windows组件,但在运行时切换到其他组件
我想在运行时切换到其他类型的组件(如果有必要)的原因是,我打算使用的组件是Graphics32库中的TBitmap32,它比标准windows图形快很多倍,但TBitmap32并不是从TWinControl继承来的

如果可能的话,我可以在designtime中使用标准VCL,然后将其属性应用于TBitmap32

例如: 在designtime中,我使用一个可以移动的TImage,当我运行应用程序时,它会从TImage中获取X和Y值以及位图,并将它们应用到TBitmap32组件,然后将TBitmap32组件绘制到需要绘制的任何位置

代码可以如下所示: TMyBMP=类别(TImage) 私有的 fResultBMP:TBitmap32;


我希望你能理解,谢谢

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

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

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

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


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

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

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


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

不符合“组件消息(CM)”仅由VCL生成,不反映Windows消息(WM_2;),这是非常不正确的引用。在
X消息中
X表示目的地,而不是原点。不符合“组件消息(CM_u)仅由VCL生成,不反映Windows消息(WM_u)”,这是非常不正确的参考。在
X消息中
X表示目的地,而不是起点。我将结合djsoft给我的答案来尝试这个方法。非常感谢。我会结合djsoft给我的答案来尝试这个。非常感谢。谢谢,我会结合雷米·勒博给我的答案来尝试。谢谢,我会结合雷米·勒博给我的答案来尝试。