Фон кнопки TButton
Вопрос такой как изменить фон кнопки (установить свой цвет, или рисунок). У кнопки нет свойства Canvas, а свойство Brush - read only. Может через API ...?
Если кто знает просьба ответить.
C уважением Виктор.
[EMAIL]sneip@uct.kiev.ua[/EMAIL]
SpeedButton->Glyph->Load(*.bmp)
Либо расширять класс TButton добавить TBitmap
On 2001-07-16 01:33, Non_prog wrote:
На панели компонентов закладка Additional->
SpeedButton->Glyph->Load(*.bmp)
Либо расширять класс TButton добавить TBitmap
</BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE>
TSpeedButton не подходит т.к. Caption должен быть на самом фоне или рисунке, а не слева или справа.
Виктор.
надпись на рисунке, и поместить рисунок
на кнопочку.
On 2001-07-17 02:26, Non_prog wrote:
В Paint-е можно сделать прозрачную
надпись на рисунке, и поместить рисунок
на кнопочку.
</BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE>
Этого делать тоже не хочется, будет слишком много ресурсов. Хотелось бы иметь один фон а Caption проставлять самому.
Пришлось долго повозиться, было выпито много литров пива, но...
Насколько я понял с TButton ничего не получится, но с TBitBtn вроде как все Ок.
Пришлось обрабатывать сообщение CN_DRAWITEM и заново обрисовывать кнопку.
Пример
procedure TMyClass.CNDrawItem(var Message TWMDrawItem);
begin
DrawItem(Message.DrawItemStruct);
end;
procedure TMyClass.DrawItem(const pdi PDrawItemStruct);
var
IsDown, IsDefault, IsFocused Boolean;
R TRect;
Flags Longint;
FCanvasTCanvas;
begin
FCanvas=TCanvas.Create;
FCanvas.Handle = pdi^.hDC;
CopyRect(R,pdi^.rcItem);
IsDown = pdi^.itemState and ODS_SELECTED <> 0;
IsDefault = pdi^.itemState and ODS_FOCUS <> 0;
IsFocused = pdi^.itemState and ODS_FOCUS <> 0;
Flags = DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
if IsDown then Flags = Flags or DFCS_PUSHED;
if pdi^.itemState and ODS_DISABLED <> 0 then
Flags = Flags or DFCS_INACTIVE;
if IsFocused or IsDefault then
begin
FCanvas.Pen.Color = clWindowFrame;
FCanvas.Pen.Width = 1;
FCanvas.Brush.Style = bsClear;
Case FButtonForm of
RectFCanvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
EllipsFCanvas.Ellipse(R.Left, R.Top, R.Right, R.Bottom);
end;
InflateRect(R, -1, -1);
end;
if IsDown then
begin
FCanvas.Pen.Color = clBtnShadow;
FCanvas.Pen.Width = 1;
FCanvas.Brush.Color = clBtnFace;
Case FButtonForm of
RectFCanvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
EllipsFCanvas.Ellipse(R.Left, R.Top, R.Right, R.Bottom);
end;
InflateRect(R, -1, -1);
end
else
DrawFrameControl(pdi^.hDC, R, DFC_BUTTON, Flags);
CopyRect(R,pdi^.rcItem);
InflateRect(R, -4, -4);
fCanvas.Brush.Bitmap=FPicture.Bitmap;
fCanvas.FillRect(R);
SetBkMode(pdi^.hDC,TRANSPARENT);
CopyRect(R,pdi^.rcItem);
FCanvas.Font = Self.Font;
if IsDown then DrawText(pdi^.hDC,PChar(Caption),Length(Caption),R,DT_CENTER or DT_VCENTER or DT_SINGLELINE)
else
begin
OffsetRect(R, -1, -1);
DrawText(pdi^.hDC,PChar(Caption),Length(Caption),R,DT_CENTER or DT_VCENTER or DT_SINGLELINE)
end;
if IsFocused and IsDefault then
begin
CopyRect(R,pdi^.rcItem);
InflateRect(R, -4, -4);
FCanvas.Pen.Color = clWindowFrame;
FCanvas.Brush.Color = clBtnFace;
DrawFocusRect(FCanvas.Handle, R);
end;
end;
Это все конечно сырое, но работает.
Есть еще одна проблема. У TBitBtn есть свойство Glyph, но сдесь это не работает, никак не могу понять как мне этот Glyph сюда всунуть.
Если кого нибудь это заинтересовало и хотел бы доработать, свяжитесь, подумаем вместе.
[EMAIL]sneip@uct.kiev.ua[/EMAIL]
Виктор.
лучше экономить время
Более правильным было бы отнаследоватся от TCustomControl если тебе нужен focus на контроле или TGraphicControl если focus не нужен, и перекрыть нужные тебе методы.