Delphi(CM)中的组件消息和自定义图形设计时组件
我想在Delphi中创建一个在某种程度上可编辑的图形组件 在designtime编辑器中 我想知道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并不
- 我应该从哪个组件继承(例如TWinControl或其他)
- 如何处理组件消息(CM_xxx),以便能够在编辑器中移动我的组件
- 如果可以在designtime编辑器中使用本机windows组件,但在运行时切换到其他组件
我希望你能理解,谢谢 您可以创建从
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给我的答案来尝试这个。非常感谢。谢谢,我会结合雷米·勒博给我的答案来尝试。谢谢,我会结合雷米·勒博给我的答案来尝试。