Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Фон кнопки TButton

611
13 июля 2001 года
Viktor
9 / / 20.01.2000
Доброго Всем настроения.
Вопрос такой как изменить фон кнопки (установить свой цвет, или рисунок). У кнопки нет свойства Canvas, а свойство Brush - read only. Может через API ...?
Если кто знает просьба ответить.

C уважением Виктор.
[EMAIL]sneip@uct.kiev.ua[/EMAIL]
371
16 июля 2001 года
Non_prog
193 / / 20.03.2000
На панели компонентов закладка Additional->
SpeedButton->Glyph->Load(*.bmp)
Либо расширять класс TButton добавить TBitmap
611
16 июля 2001 года
Viktor
9 / / 20.01.2000
<TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD>Quote:<HR></TD></TR><TR><TD><FONT SIZE=-1><BLOCKQUOTE>
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 должен быть на самом фоне или рисунке, а не слева или справа.

Виктор.
371
17 июля 2001 года
Non_prog
193 / / 20.03.2000
В Paint-е можно сделать прозрачную
надпись на рисунке, и поместить рисунок
на кнопочку.
611
17 июля 2001 года
Viktor
9 / / 20.01.2000
<TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD>Quote:<HR></TD></TR><TR><TD><FONT SIZE=-1><BLOCKQUOTE>
On 2001-07-17 02:26, Non_prog wrote:
В Paint-е можно сделать прозрачную
надпись на рисунке, и поместить рисунок
на кнопочку.
</BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE>
Этого делать тоже не хочется, будет слишком много ресурсов. Хотелось бы иметь один фон а Caption проставлять самому.
611
24 июля 2001 года
Viktor
9 / / 20.01.2000
Отвечаю сам себе!
Пришлось долго повозиться, было выпито много литров пива, но...
Насколько я понял с 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]

Виктор.
371
02 августа 2001 года
Non_prog
193 / / 20.03.2000
Вообще-то о какой экономии ресурсов может идти речь - это же RAD,
лучше экономить время
1.1K
16 августа 2001 года
Danchik
4 / / 20.04.2000
Более правильным было бы отнаследоватся от TCustomControl если тебе нужен focus на контроле или TGraphicControl если focus не нужен, и перекрыть нужные тебе методы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог