2012-02-24 3 views
2

Мне нравится использовать XPStyle найденный в TActionManager, чтобы создать свой интерфейс меню.Расширение TActionManager - Градиент краски?

Одна вещь, которую я действительно хотел бы обойтись без использования компонентов третьей партии является вынести градиент вдоль стороны меню:

enter image description here

XPColorMap, кажется, не имеют свойства, необходимые, чтобы изменить это, если Я пропускаю что-то действительно очевидное.

Как я могу это сделать, если это вообще возможно?

Спасибо.

UPDATE

Благодаря отличной информации и образец кода, предоставленной wp_1233996, вот результат:

enter image description here

Я не вижу, как это противный XP стиль меню на Windows 7, хотя? Я думаю, что это выглядит очень хорошо лично :)

+2

Выглядит смешно поставить XP меню на Windows 7. Насти гибрид Vibe. –

+0

@David - и там вы идете губите мой паз ... Я продолжал смотреть на этом меню мышлении ... выглядит круто, что он делает, что по-другому ??? – GDF

+0

Не совсем, если я поместил цвет в голубой и имел красивый градиент слева, было бы хорошо. Его личный выбор действительно, если что-нибудь, это для личного использования в любом случае - хе-хе вы не должны смотреть на него :) В сочетании с TToolBar набором для dsGradient это выглядит нормально. Скриншот был быстрым примером. –

ответ

4

http://edn.embarcadero.com/article/33461 ссылки на отличную статью Джереми Севера, которая объясняет некоторые из магии компонентов компонентов. Мое решение основано на этой статье.

В первом классе отвечает за покраску пунктов меню является TXPStyleMenuItem (в единичных Vcl.XPActnCtrls). Создайте новый класс, который наследуется от TXPStyleMenuItem и переопределяет метод DrawBackground. Новый метод должен быть чем-то вроде этого:

uses 
    ..., Vcl.XPActnCtrls, Vcl.GraphUtil, ...; 

type 
    TMyStyleMenuItem = class(TXPStyleMenuItem) 
    protected 
    procedure DrawBackground(var PaintRect: TRect); override; 
end; 

procedure TMyStyleMenuItem.DrawBackground(var PaintRect: TRect); 
// Some lines are copied from Delphi's TXPStyleMenuItem.DrawBackground. 
var 
    BannerRect: TRect; 
    StartCol, EndCol: TColor; 
begin 
    inherited; 

    BannerRect := PaintRect; 
    BannerRect.Right := 25; 
    StartCol := clGray; //or: Actionbar.ColorMap.UnusedColor; 
    EndCol := clSilver; //or: Actionbar.ColorMap.Color; 
    GradientFillCanvas(Canvas, StartCol, EndCol, BannerRect, gdHorizontal); 

    if (Selected and Enabled) or (Selected and not MouseSelected) then 
    begin 
    if Enabled and not ActionBar.DesignMode then 
     if not Separator or (Separator and ActionBar.DesignMode) then 
     Canvas.Brush.Color := Menu.ColorMap.SelectedColor; 
    Dec(PaintRect.Right, 1); 
    end; 
    if (not ActionBar.DesignMode and Separator) then exit; 
    if not Mouse.IsDragging and ((Selected and Enabled) or 
    (Selected and not MouseSelected)) then 
    begin 
    Canvas.FillRect(PaintRect); 
    Canvas.Brush.Color := ActionBar.ColorMap.BtnFrameColor; 
    Inc(PaintRect.Right); 
    Canvas.FrameRect(PaintRect); 
    end; 
end; 

В этом коде, начать градиент и конечные цвета жёстко. Для большей гибкости лучше было бы взять цвета из цветовой карты, как указано в комментариях.

Для того, чтобы использовать этот новый класс вместо старого XPStyleMenuItem, реализовать обработчик событий для события в ActionMainMenubar в OnGetControlClass:

procedure TForm1.ActionMainMenuBar1GetControlClass(Sender: TCustomActionBar; 
    AnItem: TActionClient; var ControlClass: TCustomActionControlClass); 
begin 
    if ControlClass.InheritsFrom(TXPStyleMenuItem) then 
    ControlClass := TMyStyleMenuItem; 
end; 
Смежные вопросы