Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как кнопку Button, BitBtn перекрасить? Поменять цвет кнопки? 
:(
    Опции темы
Sarge big father
Дата 17.5.2003, 14:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











У меня есть кнопка Button1 или BitBtn1, можно ли помянить её цвет например на синий во время выполнения программы? дело в том что присвоить кнопке BitBtn рисунок можно только перед запуском, и baaa.gif не удобно менять цвет из файла!
  Вверх
Song
Дата 17.5.2003, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



>>что присвоить кнопке BitBtn рисунок можно только перед запуском
Сам придумал?


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Sarge
Дата 17.5.2003, 15:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вернее я могу!
  Вверх
<Spawn>
Дата 17.5.2003, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Класс TButton не имеет возможности смены цвета. Ето можно сделать только самому. Тобишь тебе нада создать производный класс от TButton и реализовать смену цвета ))


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Sarge
Дата 17.5.2003, 19:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А как?
  Вверх
&-ray
Дата 17.5.2003, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 406
Регистрация: 15.4.2003
Где: Казахстан, г Аста на

Репутация: нет
Всего: нет



Можно сделать другое:
вместо button использовать image и при клике менять картинку, чтобы был эффект нажатия. Там уж можно нарисовать что угодно


--------------------
"Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б.

--------------------
И снова мышь беру я в руки
Куда иду? - Конечно в сруки!
PM MAIL WWW   Вверх
Sarge
  Дата 17.5.2003, 20:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Srawn, напиши пожалуйста, а КАК создать производный класс от TButton и реализовать смену цвета.
  Вверх
<Spawn>
Дата 17.5.2003, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Я компонентов практически еще не делал, но могу показать на небольшом примерчике. Например, можно обрабатывать самому WM_PAINT (Хотя возможно существуют внутренние события компонента о которых я не знаю). Я не стал возиться, но у меня ни как не получилось заставить работать, если создать Канвас на стадии Create или CreateWnd - вылетала Access Vialetion, так что я только ради примера привожу в таком виде:

Код
type
 TMyButton=class(TButton)
  private
   FCanvas:TCanvas;
   FColor:TColor;
   procedure DrawButton(Offset:integer);
   procedure OnPaint(var Msg:TMessage);message WM_PAINT;
   procedure OnLDown(var Msg:TMessage);message WM_LBUTTONDOWN;
   procedure OnLUp(var Msg:TMessage);message WM_LBUTTONUP;
   procedure Double(var Msg:TMessage);message WM_LBUTTONDBLCLK;
  published
   property Color:TColor read FColor write FColor default clBlue;
  end;

procedure TMyButton.DrawButton(Offset:integer);
var
Rect:TRect;
begin
with Rect do begin
Left:=0;
Top:=0;
Bottom:=Self.Height;
Right:=Self.Width;
end;
InflateRect(Rect,Offset,Offset);
FColor:=clBlue;
//Поидее этот подход не правильный, поскольку рациональнее было бы создавать Канвас на стадии создания компонента, чего как я уже сказал у меня не получилось

with TCanvas.Create do begin
try
Brush.Color:=FColor;
Handle:=GetDc(Self.Handle);
FillRect(Rect);
TextOut((Self.Width div 2)-(TextWidth(Self.Caption)div 2 )+Offset,
        (Self.Height div 2)-(TextHeight(Self.Caption) div 2)+Offset,Self.Caption);
finally
ReleaseDC(Self.Handle,Handle);
Free;
end;
end;
end;

procedure TMyButton.OnPaint(var Msg:TMessage);
begin
inherited;
DrawButton(-2);
end;

procedure TMyButton.OnLDown(var Msg:TMessage);
begin
inherited;
DrawButton(-1);
end;

procedure TMyButton.OnLUp(var Msg:TMessage);
begin
inherited;
DrawButton(-2);
end;

procedure TMyButton.Double(var Msg:TMessage);
begin
inherited;
DrawButton(-1);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
btn:TMyButton;
begin
with TMyButton.Create(Form1) do begin
Parent:=Form1;
Left:=10;
Top:=10;
Caption:='MyButton';
end;
end;


Надеюсь это тебе как то поможет smile.gif

Это сообщение отредактировал(а) <Spawn> - 17.5.2003, 23:08


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 18.5.2003, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Если хочется, чтоб кнопка отображала фокус то можно добавить это:
Код
if Self.Focused then
begin
 InflateRect(Rect,-1,-1);
 DrawFocusRect(Rect);//Метод TCanvas для отрисовки фокуса
end;


Это сообщение отредактировал(а) <Spawn> - 18.5.2003, 09:26


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Song
Дата 18.5.2003, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Sarge, чтобы это сделать, тут весьма объёмный исходник будет. Стоит ли оно того?


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
78125
Дата 19.5.2003, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 20.1.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата
Можно сделать другое:
вместо button использовать image и при клике менять картинку, чтобы был эффект нажатия. Там уж можно нарисовать что угодно

Вот я тоже так думаю - хоть цветочки нарисуй! biggrin.gif
--------------------
купим подпись
PM MAIL   Вверх
Unregistered
Дата 19.5.2003, 10:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А почему экземпляр TCanvas создать не получилось? я специяльно попробовал, вроде нормально...
  Вверх
<Spawn>
Дата 19.5.2003, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(Unregistered @ 19.5.2003, 02:55)
А почему экземпляр TCanvas создать не получилось? я специяльно попробовал, вроде нормально...

не знаю, но у меня вылетала ошибка (пробовал на Create и на CreateWnd)


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Unregistered
Дата 19.5.2003, 14:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Можешь даже свою BitBTn панелькой заменить у неё цвет меняеться
  Вверх
Guest_df_3
Дата 19.5.2003, 14:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Можешь даже свою BitBTn панелькой заменить у неё цвет меняеться
  Вверх
Sarge
Дата 24.5.2003, 23:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо!
  Вверх
Sarge
Дата 24.5.2003, 23:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Извини, Spawn за вопрос, а как сделать обработчик события ONCLICK?
  Вверх
<Spawn>
Дата 25.5.2003, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(Sarge @ 24.5.2003, 15:48)
Извини, Spawn за вопрос, а как сделать обработчик события ONCLICK?

Напиши прототип обработчика OnClick и присвой его обработчику етой кнопки. А можно новые компоненты устанавливать - Component>InstallComponent. Тогда он будет добавлен к компонентам и ты сможешь использовать его обработчики стандартным образом.

Для прототипа обработчика делаешь, например так:

Код
procedure TForm1.OnMyButtonClick(Sender:TObject);
begin
ShowMessage('lalala');
end;
//Не забуть добавить  в private или public формы
//procedure OnMyButtonClick(Sender:TObject);

//Присваиваешь обработчик
MyButton.OnClick:=OnMyButtonClick;


но если ты будешь пользоваться моим примером, то там надо еще добавить обработку перерисовки компонента на паре событий, а именно CM_MOUSEENTER(или как то по другому) и CM_MOUSELEAVE.

Это сообщение отредактировал(а) <Spawn> - 25.5.2003, 08:32


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Medved
Дата 27.5.2003, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Вот, взято из Кулибы:

Цветная кнопка

В книгах Калверта, Свана и других авторов можно найти похожий текст. Смысл текста – "Изменить цвет кнопок Button, BitBtn нельзя, т.к. их рисует WINDOWS". Если нельзя, но ОЧЕНЬ НУЖНО, то можно.

Небольшой компонент ColorBtn, дает возможность использовать в кнопках цвет. Кроме того, представлено новое свойство - Frame3D, позволяющее получить более реалистичный вид нажатой кнопки. В отличие от API, при изменении значения свойства Frame3D, не требуется переоткрытие компонента.

Код
   
unit colorbtn;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;

type

TColorBtn = class(TButton)
private
FCanvas: TCanvas;
IsFocused: Boolean;
F3DFrame: boolean;
FButtonColor: TColor;
procedure Set3DFrame(Value: boolean);
procedure SetButtonColor(Value: TColor);
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
procedure DrawButtonText(const Caption: string; TRC: TRect; State: TButtonState; BiDiFlags: Longint);
procedure CalcuateTextPosition(const Caption: string; var TRC: TRect; BiDiFlags: Longint);
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure SetButtonStyle(ADefault: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property ButtonColor: TColor read FButtonColor write SetButtonColor default clBtnFace;
property Frame3D: boolean read F3DFrame write Set3DFrame default False;
end;


procedure Register;

implementation

{ TColorBtn }

constructor TColorBtn.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
Height:= 21;
FCanvas:= TCanvas.Create;
FButtonColor:= clBtnFace;
F3DFrame:= False;
end;


destructor TColorBtn.Destroy;
begin
FCanvas.Free;
Inherited Destroy;
end;


procedure TColorBtn.CreateParams(var Params: TCreateParams);
begin
Inherited CreateParams(Params);
with Params do Style:= Style or BS_OWNERDRAW;
end;


procedure TColorBtn.Set3DFrame(Value: boolean);
begin
if F3DFrame <> Value then F3DFrame:= Value;
end;


procedure TColorBtn.SetButtonColor(Value: TColor);
begin
if FButtonColor <> Value then begin
FButtonColor:= Value;
Invalidate;
end;
end;


procedure TColorBtn.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));
end;


procedure TColorBtn.SetButtonStyle(ADefault: Boolean);
begin
if IsFocused <> ADefault then IsFocused:= ADefault;
end;


procedure TColorBtn.CNDrawItem(var Message: TWMDrawItem);
var
RC: TRect;
Flags: Longint;
State: TButtonState;
IsDown, IsDefault: Boolean;
DrawItemStruct: TDrawItemStruct;
begin
DrawItemStruct:= Message.DrawItemStruct^;
FCanvas.Handle:= DrawItemStruct.HDC;
RC:= ClientRect;
with DrawItemStruct do begin
IsDown:= ItemState and ODS_SELECTED <> 0;
IsDefault:= ItemState and ODS_FOCUS <> 0;
if not Enabled then State:= bsDisabled
else if IsDown then State:= bsDown
else State:= bsUp;
end;
Flags:= DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
if IsDown then Flags:= Flags or DFCS_PUSHED;
if DrawItemStruct.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;
FCanvas.Rectangle(RC.Left, RC.Top, RC.Right, RC.Bottom);
InflateRect(RC, -1, -1);
end;
if IsDown then begin
FCanvas.Pen.Color:= clBtnShadow;
FCanvas.Pen.Width:= 1;
FCanvas.Rectangle(RC.Left, RC.Top, RC.Right, RC.Bottom);
InflateRect(RC, -1, -1);
if F3DFrame then begin
FCanvas.Pen.Color:= FButtonColor;
FCanvas.Pen.Width:= 1;
DrawFrameControl(DrawItemStruct.HDC, RC, DFC_BUTTON, Flags);
end;
end else
DrawFrameControl(DrawItemStruct.HDC, RC, DFC_BUTTON, Flags);
FCanvas.Brush.Color:= FButtonColor;
FCanvas.FillRect(RC);
InflateRect(RC, 1, 1);
if IsFocused then begin
RC:= ClientRect;
InflateRect(RC, -1, -1);
end;
FCanvas.Font:= Self.Font;
if IsDown then OffsetRect(RC, 1, 1);
DrawButtonText(Caption, RC, State, 0);
if IsFocused and IsDefault then begin
RC:= ClientRect;
InflateRect(RC, -4, -4);
FCanvas.Pen.Color:= clWindowFrame;
Windows.DrawFocusRect(FCanvas.Handle, RC);
end;
FCanvas.Handle:= 0;
end;


procedure TColorBtn.CalcuateTextPosition(const Caption: string; var TRC: TRect; BiDiFlags: Integer);
var
TB: TRect;
TS, TP: TPoint;
begin
with FCanvas do begin
TB:= Rect(0, 0, TRC.Right + TRC.Left, TRC.Top + TRC.Bottom);
DrawText(Handle, PChar(Caption), Length(Caption), TB, DT_CALCRECT or BiDiFlags);
TS:= Point(TB.Right - TB.Left, TB.Bottom - TB.Top);
TP.X:= ((TRC.Right - TRC.Left) - TS.X + 1) div 2;
TP.Y:= ((TRC.Bottom - TRC.Top) - TS.Y + 1) div 2;
OffsetRect(TB, TP.X + TRC.Left, TP.Y + TRC.Top);
TRC:= TB;
end;
end;


procedure TColorBtn.DrawButtonText(const Caption: string; TRC: TRect; State: TButtonState; BiDiFlags: Integer);
begin
with FCanvas do begin
CalcuateTextPosition(Caption, TRC, BiDiFlags);
Brush.Style:= bsClear;
if State = bsDisabled then begin
OffsetRect(TRC, 1, 1);
Font.Color:= clBtnHighlight;
DrawText(Handle, PChar(Caption), Length(Caption), TRC,
DT_CENTER or DT_VCENTER or BiDiFlags);
OffsetRect(TRC, -1, -1);
Font.Color:= clBtnShadow;
DrawText(Handle, PChar(Caption), Length(Caption), TRC,
DT_CENTER or DT_VCENTER or BiDiFlags);
end else
DrawText(Handle, PChar(Caption), Length(Caption), TRC,
DT_CENTER or DT_VCENTER or BiDiFlags);
end;
end;


procedure Register;
begin
RegisterComponents('Controls', [TColorBtn]);
end;

end.  


Небольшое дополнение. Кнопку по прежнему рисует WINDOWS, а раскрашивает ее ColorBtn. Код компонента на 90% повторяет код BitBtn, ничего необычного здесь нет. Хочется повторить слова Калверта – "Пользуйтесь исходным кодом". Чаще заглядывайте в VCL - можно найти много интересного.



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
dm9
Дата 27.5.2003, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Здесь есть о цветной кнопке, а также ещё много интересго

http://www.symbol.ru/library/delphi_secrets/
PM MAIL ICQ   Вверх
Dapo
Дата 28.5.2003, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Чтобы перекрасить кнопку достаточно знать ее хендл. Код приведенный Pegas-ом, конечно полезен. Но чтобы был понятен смысл всего вышеизложенного можно вкратце написать, следующее:
Чтобы закрасить контрол другим цветом нужно через его хендл получить контекст устройства - HDC (f.e. ButtonDC:=GetWindowDC(Button.Handle)). Затем создать экземпляр класса TCanvas (f.e. ButtonCanvas:=TCanvas.Create) и назначить ему полученный контекст устройства (ButtonCanvas.Handle:=ButtonDC). Теперь используем этот "настроеный" канвас для отрисовки изображения на контроле. Можно использовать и сам HDC для отрисовки API-функциями. У меня была похожая задача, только рисовать надо было на TListBox.
PM MAIL   Вверх
Sarge
  Дата 2.6.2003, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 24.5.2003
Где: Москва, флотская улица, дом 13

Репутация: нет
Всего: нет



А я решил всё подругому, в лоб!
По ходу программы создаю TBitmap и присваиваю кнопке.
Причем кнопка получается как у SPAWN без его километрового кода, и не глючит...
Я очень долго мучался с краями, поэтому получился такой странный код.
Смотрите код, пропишите функцию:
Код

Function Fill(clr:Tcolor; brd:Integer; rec:TRect):TBitmap;
begin
if brd>0 then brd:=brd+1 else brd:=-1;
with result do begin
result:=TBitmap.Create;
Height:=rec.Bottom-2*brd;
Width:=rec.Right-2*brd;
canvas.Brush.Color:=clr;
Canvas.FillRect(Rect(0, 0,Width-1, Height-1));
end;
end;

И её вызов, например:
Код

BitBtn1.Glyph:=Fill(clred,2,bitbtn1.ClientRect);

параметр brd означает отступление от краёв кнопки, если поставить 0 то она просто закрасится сплошняком, я использую 2.
И заметьте, что ведь у меня (пока) самый простой и эффективный способ!!!
PM MAIL   Вверх
Unregistered
Дата 2.6.2003, 14:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Sarge, я не понял как у тебя будут обрабатываться клики на кнопке (в предидущик примерах это есть).
  Вверх
Sarge
  Дата 2.6.2003, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 24.5.2003
Где: Москва, флотская улица, дом 13

Репутация: нет
Всего: нет



Это был код общего применения.
А этот заточен под кнопку TBitBtn:
Код
procedure KickBitBtn(frag:TBitBtn; clr:TColor; board:integer);overload;
var bmp:Tbitmap;
begin
if board>0 then board:=board+1 else board:=-1;
with bmp do begin
bmp:=TBitmap.Create;
Height:=frag.Height-2*board;
Width:=frag.Width-2*board;
canvas.Brush.Color:=clr;
Canvas.FillRect(Rect(0, 0,Width-1, Height-1));
frag.Glyph:=bmp;
end;
end;

И используется так:
Код
KickBitBtn(BitBtn1, clblue, 2);

exclamation.gif Работает пока без caption, поставьте Caption:='' и получится голая кнопка, а иначе пока не хочет, буду думать...

Это сообщение отредактировал(а) Sarge - 2.6.2003, 15:15
PM MAIL   Вверх
Sarge
  Дата 2.6.2003, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 24.5.2003
Где: Москва, флотская улица, дом 13

Репутация: нет
Всего: нет



Unregistered, клики обрабатываются стандартным образом, потому что кнопка создаётся сатически.
Просто кидаешь на форму BitBtn Создаёшь обработчик события OnClick...
Понял?

PM MAIL   Вверх
Sarge
  Дата 2.6.2003, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 24.5.2003
Где: Москва, флотская улица, дом 13

Репутация: нет
Всего: нет



А хотя нет...
Моя кнопка работает только без Caption...
Может быть кто-нибудь знает как сделать Caption?
Просто я рачитывал, что текст можно поместить поверх рисунка, а насамом деле только слева, справа, сверху, или снизу...
Обломчик, хотя... может быть кому то нужна пустая кнопка...confused.gif
PM MAIL   Вверх
Song
Дата 2.6.2003, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



А что за проблема текст вывести?


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
<Spawn>
Дата 2.6.2003, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(Sarge @ 2.6.2003, 07:11)
А хотя нет...
Моя кнопка работает только без Caption...
Может быть кто-нибудь знает как сделать Caption?
Просто я рачитывал, что текст можно поместить поверх рисунка, а насамом деле только слева, справа, сверху, или снизу...
Обломчик, хотя... может быть кому то нужна пустая кнопка...confused.gif

TextOut()?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Dapo
Дата 3.6.2003, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Sarge извини конечно, но твой код по моему не имеет смысла...т.е. он может и работает (не смотрел), но для чего так делать? Ставить на форму TBitButton только для для того чтобы получить его рект и наложить на него битмап? Тебе же сказали, если тебе нужен такой подход - целесообразней использовать TImage. И в зависимости от состояния подгружай в него картинки (например из TImageList), а еще лучше наследника от него (TImage) сделать и добавить св-ва на разные состояния. Хотя тут вариантов много.
PS Я хочу сказать, что твой код - не ответ на поставленный тобой вопрос.
PM MAIL   Вверх
Dapo
Дата 3.6.2003, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Да, а как на счет TButton?
Чтобы не быть голословным -
вот что-то приблизительное, то о чем я писал уже:

procedure ChgClr(Sender:TButtonControl;clr,capclr:TColor;Caption:string);
var DC:HDC;//контекст устройства
Cnvs:TCanvas;
begin
Cnvs:=TCanvas.Create;
DC:=GetWindowDC(Sender.Handle);
Cnvs.Handle:=DC;
Cnvs.Brush.Color:=clr;
Cnvs.Font.Color:=capclr;
Cnvs.FillRect(Sender.ClientRect);
Cnvs.TextRect(Sender.ClientRect,0,0,Caption);
ReleaseDC(Sender.Handle,dc);
Cnvs.Free;
end;

PM MAIL   Вверх
Unregistered
Дата 3.6.2003, 08:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Dapo Совершенно справедливо! Но на практике наверное не очень удобно каждый раз на WM_PAINT создавать и убивать Cnvs... лучше сделать его пропертью.
Но не ужели нет варианта каким-нибудь образом попытаться заставить windows отрисовывать кнопку др. цветом? Возможно ли на время отрисовки TButton изменить значение BtnFaсe например?...
Мне кажется что вопрос был задан именно в этом направление.
  Вверх
Sarge
  Дата 3.6.2003, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 24.5.2003
Где: Москва, флотская улица, дом 13

Репутация: нет
Всего: нет



biggrin.gif Не...
Я не сдамся!!!
Отвечаю, кнопка как живая, потому что я отступаю от краёв, если не отступать, то получится просто не живой цветной прямоугольник, а тут именно кнопка, зацените.
Вот готовый код.
Caption работает!!! Всё готово!!!
Код
var capt:string;
procedure KickBitBtn(frag:TBitBtn; clr:TColor; board:integer);overload;
var bmp:Tbitmap;
begin
if (frag.Caption<>'') then capt:=frag.Caption;
frag.Caption:='';
if board>0 then board:=board+1 else board:=-1;
with bmp do begin
bmp:=TBitmap.Create;
Height:=frag.Height-2*board;
Width:=frag.Width-2*board;
with Canvas do begin
Brush.Color:=clr;
FillRect(Rect(0, 0,Width-1, Height-1));
TextOut((Width div 2)-(TextWidth(Capt)div 2 ),(Height div 2)-(TextHeight(Capt) div 2),Capt);
end;
frag.Glyph:=bmp;
end;
end;

Всё теперь всё работает, кнопка просто кидается на форму,
после Implementation прописываем этот код (сверху),
И теперь когда надо перекрасить просто вызываем эту процедеру:
Код
KickBitBtn(BitBtn1, clblue, 2);

и кнопка перекрашиваеися в указаный цвет.
Если надо создать уже "накрашенную" пихаем запуск процедуры в
OnCreate;
Просто сделайте как я говорю, и все будет чики-пуки!
rolleyes.gif

Это сообщение отредактировал(а) Sarge - 3.6.2003, 13:57
PM MAIL   Вверх
Dapo
Дата 4.6.2003, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



>>frag.Glyph:=bmp;//используешь св-во Glyph

Так что на счет TButton?wink.gif
PM MAIL   Вверх
Dapo
Дата 4.6.2003, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Цитата(Unregistered @ 3.6.2003, 05:35)
Dapo ... лучше сделать его пропертью...

Конечно лучше! :-) Возвращаемся к коду Pegas-a (создание собственного компонента). Расширяем? wink.gif
PM MAIL   Вверх
Pasha
Дата 4.6.2003, 06:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Button- никак не перекрасишь она использует цвета Windows, а другую BitBtn.Color если не ошибаюсь.
  Вверх
Unregistered
Дата 4.6.2003, 08:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Dapo так я же говорю, что если во время WM_PAINT изменить системную константу BtnFace, кажеться так она называется, интересно что получиться... ща просто занят немного, освобожусь попробую...
  Вверх
Medved
Дата 4.6.2003, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Цитата(Pasha @ 4.6.2003, 09:46)
Button- никак не перекрасишь она использует цвета Windows, а другую BitBtn.Color если не ошибаюсь.

Прежде чем ввязываться в дисскуссию, читайте пожалуйста темы с самого начала,


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Sarge
  Дата 11.6.2003, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 24.5.2003
Где: Москва, флотская улица, дом 13

Репутация: нет
Всего: нет



Странно, кажется идеи закончились, и каждый остался при своём мнении...
PM MAIL   Вверх
Чoо
Дата 6.8.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



Цитата(Sarge @ 3.6.2003,  13:53)
Вот готовый код.
Caption работает!!! Всё готово!!!
Код
var capt:string;
procedure KickBitBtn(frag:TBitBtn; clr:TColor; board:integer);overload;
var bmp:Tbitmap;
begin
if (frag.Caption<>'') then capt:=frag.Caption;
frag.Caption:='';
if board>0 then board:=board+1 else board:=-1;
with bmp do begin
bmp:=TBitmap.Create;
Height:=frag.Height-2*board;
Width:=frag.Width-2*board;
with Canvas do begin
Brush.Color:=clr;
FillRect(Rect(0, 0,Width-1, Height-1));
TextOut((Width div 2)-(TextWidth(Capt)div 2 ),(Height div 2)-(TextHeight(Capt) div 2),Capt);
end;
frag.Glyph:=bmp;
end;
end;

Закрасил так же кнопочку. Единственное, хотел бы обратить внимание на 
Код

bmp:=TBitmap.Create;

Лучше bmp объявить сразу после implementation

Код

implementation
var
  bmp:TBitMap;


Само создание сделать так:
Код

if not assigned(bmp) then bmp:=TBitmap.Create; 

так как необязательно его создавать каждый раз заново

ну и не забывать его освобождать, например по событию формы дестрой:
Код

procedure ChildFm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(bmp);  //если просто bmp.free, то указатель остается и при следующей закраске получим ошибку доступа к памяти
end;  


а то утечки будут. Если я заблуждаюсь, подправьте меня, пожалуйста.

Добавлено @ 18:07
пы сы: темка старая, но до сих пор актуальная smile

Это сообщение отредактировал(а) Чoо - 7.8.2010, 14:50


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
bems
Дата 7.8.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Чoо, нет, за 7 лет ему ужн точно не надо. Не делай так больше.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Чoо
Дата 7.8.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



bems, я тему апнул не просто что бы апнуть или посоветовать что-то автору. Просто решил, что, поскольку я так же закрашиваю кнопки, кто-то и еще может воспользоваться примером, написанным выше. Поэтому написал пару замечаний на счет утечек. И у самого же возник вопрос: так ли опасны эти утечки, что стоит им уделять внимание, и освобождаются ли ресурсы, если уничтожается дочерняя форма, которая заняла эти ресурсы (создала bmp.create)?

вобщем тему поднял только из добрых побуждений.

Это сообщение отредактировал(а) Чoо - 7.8.2010, 11:51


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1555 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.