Сообщения компонентов в Delphi (CM_) и пользовательском графическом компоненте DesignTime - PullRequest
1 голос
/ 26 февраля 2012

Я хочу создать графический компонент в Delphi, который до некоторой степени редактируется внутри редактора времени разработки.

Я хотел бы знать

  • От какого компонента я должен унаследовать (например, TWinControl или что-либо еще)
  • Как обрабатывать сообщения компонентов (CM_xxx), чтобы иметь возможность перемещаться по моему компоненту в редакторе
  • Если возможно использовать собственные компоненты Windows в редакторе Designtime,но затем переключиться на другой компонент во время выполнения.

Причина, по которой я хочу иметь возможность (если даже необходимо) переключиться на компонент другого типа во время выполнения, заключается в том, что компонент, который я собираюсь использовать, это TBitmap32 избиблиотека Graphics32, которая во много раз быстрее стандартной графики для Windows, но TBitmap32 не наследуется от TWinControl для начала.

Возможно, если возможно, я мог бы сделать что-то вроде использования стандартного VCL во время разработки, а затем просто взять егосвойства и применить их к TBitmap32.

Пример: во время разработкиЯ использую TImage, который я могу перемещать, и когда я запускаю приложение, оно берет значения X и Y, а также растровое изображение из TImage и применяет их к компоненту TBitmap32 и рисует компонент TBitmap32 туда, куда его нужно рисовать.

Код может выглядеть примерно так: TMyBMP = class (TImage) private fResultBMP: TBitmap32;.....

Надеюсь, вы понимаете, спасибо!

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Я бы не использовал разные компоненты во время разработки и выполнения.Это только усложнит дизайн вашего компонента.То, что вы используете во время выполнения, должно быть тем же, что и во время разработки.

Что бы я сделал, если бы ваш компонент содержал элемент TBitmap32, переопределил метод Paint() для рисования растрового изображениякак во время выполнения, так и во время разработки, а затем ответьте на сообщение CM_DESIGNHITTEST, чтобы ваш компонент мог реагировать на действия мыши во время разработки, когда мышь находится над растровым изображением.Затем вы можете переопределить стандартные методы MouseDown/Move/Up(), чтобы при необходимости манипулировать позиционированием / изменением размера растрового изображения (внутри этих методов вы можете различать время выполнения и время разработки, проверяя свойство ComponentState вашего компонента для флага csDesigning).

Чтобы сохранить растровое изображение в DFM, вы можете либо выставить TBitmap32 как опубликованное свойство (которое предлагает альтернативный способ управления растровым изображением во время разработки), либо переопределить DefineProperties() вашего компонента.способ потоковой передачи растрового изображения вручную.

1 голос
/ 27 февраля 2012

Вы можете создать компонент, унаследованный от TGraphicControl или TWinControl. Последнее необходимо, если вы хотите, чтобы ваш контроль мог получать фокус и сообщения Windows. Ваш компонент должен использовать TBitmap32 в качестве буфера - вы все рисуете там, в памяти. В методе Paint (который вы переопределяете) вы копируете содержимое из буфера на экран, используя BitBlt или аналогичную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...