-
суть вопроса очень проста, есть базовый класс TCustomCheckBox, есть класс TButton (или подобные ему), как соединить эти два класса в один, т.е. получить компонент TToggleBox (так он называется в Lazarus), который по сути является кнопкой с двумя состояниями итак сам вопрос, как надо правильно расширить класс TCustomCheckBox, чтобы придать визуальным состояниям вид кнопки??? PS D2010
-
Перехватите сообщение WM_PAINT и рисуйте что угодно
-
Дык, это то понятно, суть в чем, как мне прорисовать изображение кнопки, или если поставить вопрос по другому, как это изображение извлечь из компонента Tbutton???
-
В TButton нет никакого изображения, TButton - оболочка вокруг стандартного Win-контрола. Его рисует сама Windows. Вы же будете использовать Canvas (которую нужно будет создать, загляните в TCustomControl) и скорее всего DrawFrameControl
-
type
TMyCheckBox = class(StdCtrls.TCheckBox)
private
procedure CreateParams(var Params: TCreateParams); override;
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
procedure BMSetCheck(var Message: TMessage); message BM_SETCHECK;
public
procedure Draw(DC: HDC);
end;
implementation
procedure TMyCheckBox.BMSetCheck(var Message: TMessage);
begin
inherited;
Invalidate;
end;
procedure TMyCheckBox.CNDrawItem(var Message: TWMDrawItem);
begin
Draw(Message.DrawItemStruct^.hDC);
end;
procedure TMyCheckBox.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
Style := Style and not BS_RADIOBUTTON or BS_OWNERDRAW;
end;
procedure TMyCheckBox.Draw(DC: HDC);
var r: TRect;
Flag: integer;
begin
R := ClientRect;
Flag := DFCS_BUTTONPUSH;
if Checked then Flag := Flag or DFCS_PUSHED;
DrawFrameControl(DC,R,DFC_BUTTON,Flag);
DrawText(DC,PChar(Caption),Length(Caption),R,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
end;
|