Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.01.2011, 18:29
Fenia Fenia вне форума
Прохожий
 
Регистрация: 02.01.2011
Сообщения: 12
Репутация: 10
По умолчанию TButton

При работе встретился с проблемой - не нравится стандартный дизайн Button. хочется его как-то поменять. решил начать с малого - попытался создать потомка TButton только с поддержкой цветов. какие есть предложения по поводу реализации этого ) а то я в этих классах новичок новичок
Ответить с цитированием
  #2  
Старый 02.01.2011, 20:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,116
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Fenia
При работе встретился с проблемой - не нравится стандартный дизайн Button. хочется его как-то поменять. решил начать с малого - попытался создать потомка TButton только с поддержкой цветов. какие есть предложения по поводу реализации этого ) а то я в этих классах новичок новичок

вообще, наследоваться от TButton не самая удачная идея, т.к. он полностю "сидит" на стандартном контроле Windows. Если уж очень хочется наследоваться от кнопки, то лучше наследуйся от TBitBtn - там отрисовка, если не ошибаюсь, кастомная.
Ответить с цитированием
  #3  
Старый 03.01.2011, 00:16
Аватар для ***
*** *** вне форума
Прохожий
 
Регистрация: 20.06.2010
Сообщения: 47
Репутация: 0
Хорошо

Цитата:
Сообщение от Fenia
При работе встретился с проблемой - не нравится стандартный дизайн Button. хочется его как-то поменять. решил начать с малого - попытался создать потомка TButton только с поддержкой цветов. какие есть предложения по поводу реализации этого ) а то я в этих классах новичок новичок

Можно с помощью компонента Image просто в Photoshop нарисуй 1 кнопку при наверении нажатии и в обычном положении и запрограммируй так что бы картинки менялись
__________________
Я новичок в программировании
Ответить с цитированием
  #4  
Старый 03.01.2011, 03:29
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Google: TImgBtn Delphi
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 03.01.2011, 09:02
Аватар для EvilRussian
EvilRussian EvilRussian вне форума
Начинающий
 
Регистрация: 21.12.2010
Адрес: Россия, Красноярский край
Сообщения: 177
Репутация: 22
Счастье

А я как-то вообще без кнопки, через TImage так делал
Точно не помню, но по OnMouseEnter картинка менялась на затенённую, по OnMouseLeave возвращалась в нормальное состояние, а когда ЛКМ была нажата при нахождении внутри картинки, то изображение менялось на нажатое.

Впрочем, так проще делать на GameMaker'е, который я не устану рекламировать
__________________
Если не ты, то кто?
(с) Терри Пратчетт

Не забывайте ставить плюсы и говорить спасибо!
Ответить с цитированием
  #6  
Старый 03.01.2011, 11:07
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Если вопрос о потомке TButton, которому можно задать цвет, то:
PHP код:
unit ColorButton; 

interface 

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

type 
  TDrawButtonEvent 
= procedure(Control: TWinControl; 
  
Rect: TRect; State: TOwnerDrawState) of object;

  
TColorButton = class(TButton)
  private 
    
FCanvas: TCanvas; 
    
IsFocused: Boolean; 
    
FOnDrawButton: TDrawButtonEvent; 
  protected 
    
procedure CreateParams(var Params: TCreateParams); override; 
    
procedure SetButtonStyle(ADefault: Boolean); override; 
    
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; 
    
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; 
    
procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM; 
    
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; 
    
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK; 
    
procedure DrawButton(Rect: TRect; State: UINT); 
  public 
    
constructor Create(AOwner: TComponent); override; 
    
destructor Destroy; override; 
    
property Canvas: TCanvas read FCanvas; 
  
published 
    property OnDrawButton
: TDrawButtonEvent read FOnDrawButton write FOnDrawButton; 
    
property Color; 
  
end; 

procedure Register; 

implementation 

procedure Register
; 
begin 
  RegisterComponents
('DelphiSources', [TColorButton]); 
end; 

constructor TColorButton.Create(AOwner: TComponent); 
begin 
  inherited Create
(AOwner); 
  
FCanvas := TCanvas.Create; 
end; 

destructor TColorButton.Destroy; 
begin 
  inherited Destroy
; 
  
FCanvas.Free; 
end; 

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

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

procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem); 
begin 
  with Message
.MeasureItemStruct^ do 
  
begin 
    itemWidth  
:= Width; 
    
itemHeight := Height; 
  
end; 
end; 

procedure TColorButton.CNDrawItem(var Message: TWMDrawItem); 
var 
  
SaveIndex: Integer; 
begin 
  with Message
.DrawItemStruct^ do 
  
begin 
    SaveIndex 
:= SaveDC(hDC); 
    
FCanvas.Lock; 
    try 
      
FCanvas.Handle := hDC; 
      
FCanvas.Font := Font; 
      
FCanvas.Brush := Brush; 
      
DrawButton(rcItem, itemState); 
    
finally 
      FCanvas
.Handle := 0; 
      
FCanvas.Unlock; 
      
RestoreDC(hDC, SaveIndex); 
    
end; 
  
end; 
  
Message.Result := 1; 
end; 

procedure TColorButton.CMEnabledChanged(var Message: TMessage); 
begin 
  inherited
; 
  
Invalidate; 
end; 

procedure TColorButton.CMFontChanged(var Message: TMessage); 
begin 
  inherited
; 
  
Invalidate; 
end; 

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

procedure TColorButton.DrawButton(Rect: TRect; State: UINT); 
var 
  
Flags, OldMode: Longint; 
  
IsDown, IsDefault, IsDisabled: Boolean; 
  
OldColor: TColor; 
  
OrgRect: TRect; 
begin 
  OrgRect 
:= Rect; 
  
Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT; 
  
IsDown := State and ODS_SELECTED <> 0; 
  
IsDefault := State and ODS_FOCUS <> 0; 
  
IsDisabled := State and ODS_DISABLED <> 0; 

  if 
IsDown then Flags := Flags or DFCS_PUSHED; 
  if 
IsDisabled 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(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom); 
    
InflateRect(Rect, - 1, - 1); 
  
end; 

  if 
IsDown then 
  begin 
    FCanvas
.Pen.Color := clBtnShadow; 
    
FCanvas.Pen.Width := 1; 
    
FCanvas.Brush.Color := clBtnFace; 
    
FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom); 
    
InflateRect(Rect, - 1, - 1); 
  
end 
  
else 
    
DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags); 

  if 
IsDown then OffsetRect(Rect, 1, 1); 

  
OldColor := FCanvas.Brush.Color; 
  
FCanvas.Brush.Color := Color; 
  
FCanvas.FillRect(Rect); 
  
FCanvas.Brush.Color := OldColor; 
  
OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT); 
  
FCanvas.Font.Color := clBtnText; 
  if 
IsDisabled then 
    DrawState
(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0, 
    ((
Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2, 
    ((
Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2, 
      
0, 0, DST_TEXT or DSS_DISABLED) 
  else 
    
DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect, 
      
DT_SINGLELINE or DT_CENTER or DT_VCENTER); 
  
SetBkMode(FCanvas.Handle, OldMode); 

  if 
Assigned(FOnDrawButton) then 
    FOnDrawButton
(Self, Rect, TOwnerDrawState(LongRec(State).Lo)); 

  if 
IsFocused and IsDefault then 
  begin 
    Rect 
:= OrgRect; 
    
InflateRect(Rect, - 4, - 4); 
    
FCanvas.Pen.Color := clWindowFrame; 
    
FCanvas.Brush.Color := clBtnFace; 
    
DrawFocusRect(FCanvas.Handle, Rect); 
  
end; 
end; 
end. 
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #7  
Старый 03.01.2011, 17:31
Fenia Fenia вне форума
Прохожий
 
Регистрация: 02.01.2011
Сообщения: 12
Репутация: 10
По умолчанию

все спасибо за ответы. меня одно интересует, что значит в последнем посте message_ etc
это сообщения системе? можно ссылку где можно про это почитать? ))
Ответить с цитированием
  #8  
Старый 27.11.2011, 16:49
Dormindo Dormindo вне форума
Прохожий
 
Регистрация: 27.11.2011
Сообщения: 1
Репутация: 10
По умолчанию Модуль ColorButton работает, но не вполне корректно:

Доброго времени суток!

В результате
DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);

из-за DT_SINGLELINE свойство WordWrap не отрабатывается.
При замене DT_SINGLELINE на DT_WORDBREAK отрабатывается нормально, но только в том случае, если кнопка включена. При выключении кнопки Enabled:=False - перенос по словам всё равно не работает.
Ну и плюс - слетает центрирование по вертикали.

Кто-нибудь решил эту проблему?
Ответить с цитированием
  #9  
Старый 27.11.2011, 17:24
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

все правильно:
Цитата:
DT_VCENTER
Centers text vertically. You must combine this value with DT_SINGLELINE.
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2026