2013-02-16 12 views
5

TActionMainMenuBar ha un bug con gli elemetnts di radice di pittura senza elementi figlio.funzionano per TActionMainMenuBar bug di disegno in cui l'elemento non deseleziona

Utilizzando Delphi XE2/w7-32bit **

come riprodurre:
menù costruire con TActionMainMenuBar, aggiungere alcune azioni ad esso:

file | options | help 
- New 
- Open 
- Save 
    -Exit 

assegnare a tutte le azioni di un metodo vuoto

procedure TfrmMain.ActionExecute(Sender: TObject); 
begin 
// 
end; 

ora eseguire l'applicazione e provare a fare clic su opzioni o elemento di guida.
ora fai clic sul modulo, ma l'elemento del menu è ancora premuto!

esistono soluzioni alternative?

upd: guarda lo screenshot, l'elemento del menu è inattivo, ma il cursore del mouse non è sul menu, e il controllo automatico è falso, e anche il controllo è falso.
enter image description here
qui non è un qualsiasi mappa di colori sulla forma, e direttore di stile è la piattaforma predefinita

+0

Non vedo alcun problema/Impossibile riprodurre in Delphi 2009. –

+0

@AndreasRejbrand viene assegnato il metodo vuoto? per favore mandami un exe compilato, forse abbiamo qualche regressione in XE2 – utmost

+0

Posso riprodurre questo è XE2 – davea

risposta

1

ecco la mia soluzione:
creare classe personalizzata in questo modo:


type 
    TFastThemedButton = class(TThemedMenuButton) 
    protected 
    procedure DrawBackground(var PaintRect: TRect); override; 
end; 

...


procedure TFastThemedButton.DrawBackground(var PaintRect: TRect); 
const 
    MenuStates: array[Boolean {MouseInControl}, Boolean {Selected}] of TThemedMenu = 
    ((tmMenuBarItemNormal, tmMenuBarItemPushed), (tmMenuBarItemHot, tmMenuBarItemPushed)); 
var 
    BannerRect: TRect; 
    StartCol, EndCol: TColor; 
begin 
    Canvas.Brush.Color := ActionBar.ColorMap.Color; 
    Canvas.Font := ActionBar.Font; 
    StyleServices.DrawElement(Canvas.Handle, StyleServices.GetElementDetails(MenuStates[MouseInControl, (State=bsDown)]), PaintRect); 
end;

ora in te TActionMainMenuBar.OnGetControlClass aggiungi questo semplice codice e imposta a buggy actionclients tag = -100


procedure TfrmActions.ActionMainMenuBar1GetControlClass(Sender: TCustomActionBar; AnItem: TActionClient; var ControlClass: TCustomActionControlClass); 
begin 
    if ControlClass.InheritsFrom(TCustomMenuButton) and then 
    begin 
    if (AnItem.Tag =-100) and (ControlClass = TThemedMenuButton) then 
     ControlClass := TFastThemedButton; 
    end; 
end;

bene, ora tutti gli elementi di root con -100 tag, funziona come vorremmo

0

Sto usando l'evento MainMenuExitMenuLoop con MainMenu.RecreateControls su tutte le forme con un menu. Finora questo rimuove la selezione bloccata dalle voci del menu.