Форум по 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,094
Версия 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
MessagesSysUtilsClassesGraphicsControlsFormsDialogs
  
StdCtrlsButtonsExtCtrls

type 
  TDrawButtonEvent 
procedure(ControlTWinControl
  
RectTRectStateTOwnerDrawStateof object;

  
TColorButton = class(TButton)
  private 
    
FCanvasTCanvas
    
IsFocusedBoolean
    
FOnDrawButtonTDrawButtonEvent
  protected 
    
procedure CreateParams(var ParamsTCreateParams); override
    
procedure SetButtonStyle(ADefaultBoolean); override
    
procedure CMEnabledChanged(var MessageTMessage); message CM_ENABLEDCHANGED
    
procedure CMFontChanged(var MessageTMessage); message CM_FONTCHANGED
    
procedure CNMeasureItem(var MessageTWMMeasureItem); message CN_MEASUREITEM
    
procedure CNDrawItem(var MessageTWMDrawItem); message CN_DRAWITEM
    
procedure WMLButtonDblClk(var MessageTWMLButtonDblClk); message WM_LBUTTONDBLCLK
    
procedure DrawButton(RectTRectStateUINT); 
  public 
    
constructor Create(AOwnerTComponent); override
    
destructor Destroyoverride
    
property CanvasTCanvas 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(AOwnerTComponent); 
begin 
  inherited Create
(AOwner); 
  
FCanvas := TCanvas.Create
end

destructor TColorButton.Destroy
begin 
  inherited Destroy

  
FCanvas.Free
end

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

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

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

procedure TColorButton.CNDrawItem(var MessageTWMDrawItem); 
var 
  
SaveIndexInteger
begin 
  with Message
.DrawItemStruct^ do 
  
begin 
    SaveIndex 
:= SaveDC(hDC); 
    
FCanvas.Lock
    try 
      
FCanvas.Handle := hDC
      
FCanvas.Font := Font
      
FCanvas.Brush := Brush
      
DrawButton(rcItemitemState); 
    
finally 
      FCanvas
.Handle := 0
      
FCanvas.Unlock
      
RestoreDC(hDCSaveIndex); 
    
end
  
end
  
Message.Result := 1
end

procedure TColorButton.CMEnabledChanged(var MessageTMessage); 
begin 
  inherited

  
Invalidate
end

procedure TColorButton.CMFontChanged(var MessageTMessage); 
begin 
  inherited

  
Invalidate
end

procedure TColorButton.WMLButtonDblClk(var MessageTWMLButtonDblClk); 
begin 
  Perform
(WM_LBUTTONDOWNMessage.KeysLongint(Message.Pos)); 
end

procedure TColorButton.DrawButton(RectTRectStateUINT); 
var 
  
FlagsOldModeLongint
  
IsDownIsDefaultIsDisabledBoolean
  
OldColorTColor
  
OrgRectTRect
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.LeftRect.TopRect.RightRect.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.LeftRect.TopRect.RightRect.Bottom); 
    
InflateRect(Rect, - 1, - 1); 
  
end 
  
else 
    
DrawFrameControl(FCanvas.HandleRectDFC_BUTTONFlags); 

  if 
IsDown then OffsetRect(Rect11); 

  
OldColor := FCanvas.Brush.Color
  
FCanvas.Brush.Color := Color
  
FCanvas.FillRect(Rect); 
  
FCanvas.Brush.Color := OldColor
  
OldMode := SetBkMode(FCanvas.HandleTRANSPARENT); 
  
FCanvas.Font.Color := clBtnText
  if 
IsDisabled then 
    DrawState
(FCanvas.HandleFCanvas.Brush.HandlenilInteger(Caption), 0
    ((
Rect.Right Rect.Left) - FCanvas.TextWidth(Caption)) div 2
    ((
Rect.Bottom Rect.Top) - FCanvas.TextHeight(Caption)) div 2
      
00DST_TEXT or DSS_DISABLED
  else 
    
DrawText(FCanvas.HandlePChar(Caption), - 1Rect
      
DT_SINGLELINE or DT_CENTER or DT_VCENTER); 
  
SetBkMode(FCanvas.HandleOldMode); 

  if 
Assigned(FOnDrawButtonthen 
    FOnDrawButton
(SelfRectTOwnerDrawState(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.HandleRect); 
  
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, время: 05:34.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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