2013-05-30 4 views
3

Это продолжение по сравнению с this question о том, как сделать кнопки панели инструментов плоскими, когда включены стили VCL. Используя решение в этом вопросе, теперь большинство моих кнопок TActionToolbar являются плоскими. Тем не менее, есть одна кнопка на панели инструментов с раскрывающимся меню с дополнительными действиями:Плоские кнопки панели инструментов с Delphi VCL Styles - элементы панели инструментов с выпадающими списками?

enter image description here

И это еще рисунок кнопки края вокруг него. Как я могу удалить границы кнопок для кнопок панели инструментов с помощью выпадающих списков, чтобы они соответствовали другим простым кнопкам и выглядели больше, когда стили VCL были отключены?

ответ

7

Этот тип кнопки является ничьей по классу TThemedDropDownButton, поэтому вы должны переопределить этот класс и метод TThemedDropDownButton.DrawBackground.

Использование same unit of the previous answer добавить новый класс TThemedDropDownButtonEx

TThemedDropDownButtonEx= class(TThemedDropDownButton) 
    protected 
    procedure DrawBackground(var PaintRect: TRect); override; 
    end; 

Затем реализовать метод DrawBackground как так

procedure TThemedDropDownButtonEx.DrawBackground(var PaintRect: TRect); 
const 
    CheckedState: array[Boolean] of TThemedToolBar = (ttbButtonHot, ttbButtonCheckedHot); 
var 
    LIndex : Integer; 
begin 
    LIndex := SaveDC(Canvas.Handle); 
    try 
    if Enabled and not (ActionBar.DesignMode) then 
    begin 
     if (MouseInControl or IsChecked or DroppedDown) and 
     (Assigned(ActionClient) and not ActionClient.Separator) then 
     begin 
     StyleServices.DrawElement(Canvas.Handle, StyleServices.GetElementDetails(CheckedState[IsChecked or (FState = bsDown)]), PaintRect); 

     if IsChecked and not MouseInControl then 
      StyleServices.DrawElement(Canvas.Handle, StyleServices.GetElementDetails(ttbButtonPressed), PaintRect); 
     end 
     else 
     ; 
    end 
    else 
     ; 
    finally 
    RestoreDC(Canvas.Handle, LIndex); 
    end; 
end; 

и наконец изменить метод TPlatformVclStylesStyle.GetControlClass на этом пути

Изменить этот код

if AnItem.HasItems then 
    case GetActionControlStyle of 
    csStandard: Result := TStandardDropDownButton; 
    csXPStyle: Result := TXPStyleDropDownBtn; 
    else 
    Result := TThemedDropDownButton; 
    end 
else 

от этого

if AnItem.HasItems then 
    case GetActionControlStyle of 
    csStandard: Result := TStandardDropDownButton; 
    csXPStyle: Result := TXPStyleDropDownBtn; 
    else 
    Result := TThemedDropDownButtonEx; 
    end 
else 

enter image description here

+0

прекрасно работает, спасибо за помощь! –

+2

Ничего себе, король VCL Themes снова наносит удар! –

Смежные вопросы