Ir para conteúdo
Fórum Script Brasil
  • 0

Menu Da Mesma Cor Do Form


Paulo Nobre

Pergunta

Alguém poderia me passar um código para que o menu ficasse da mesma cor do form.

O componente menu acompanha a cor padrão do windows.

Gostaria, caso meu form usasse clBlue, o menu também ficasse com a mesma cor.

Obrigado.

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Paulo Nobre, caso não apareça nada mais...

Se utilizar o D7, talvez você considere fazer um teste com os componentes da paleta Additional: TActionMainMenuBar, TActionManager e TXPColorMap

Com eles é possível manipular a cor de menus (TXPColorMap - propriedade Color). Tem um exemplo neste link (precisa se cadastrar para ter acesso)

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus,

Obrigado pela dica, vou tentar estudá-la.

Algum tempo atrás (2 anos) alguém me deu uma dica, aqui mesmo no fórum de como mudar a fonte e a cor da fonte. E disse que usando canvas eu conseguiria mudar a cor. Mas, não tenho muito experiência com canvas e deixei de lado. Acho que vou ter que estudar este objeto.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus,

Fui no site que você sugeriu e baixei o projeto.

Não pude abri-lo pois aqui no trabalho não tenho o DElphi.

Mas, a cópia da unit é a seguinte:

unit U_MENUCOLORIDO;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XPStyleActnCtrls, ActnList, ActnMan, ToolWin, ActnCtrls,
  ActnMenus, ActnColorMaps;

type
  TForm1 = class(TForm)
    ActionMainMenuBar1: TActionMainMenuBar;
    ActionManager1: TActionManager;
    XPColorMap1: TXPColorMap;
    TwilightColorMap1: TTwilightColorMap;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

Numa primeira olhada parece que usa os componentes que você falou.

No local onde o código foi postado tem dois email de usuários que dizem não conseguir ativar o exemplo click dos menus.

Veja um comentário:

"Muito bom, só não consegui capturar o evento Click dos ítens de menu. Se alguém puder me ajudar, email-me por favor".

Espero não ter este problema.

Vou olhar no final de semana.

Link para o comentário
Compartilhar em outros sites

  • 0
Algum tempo atrás (2 anos) alguém me deu uma dica, aqui mesmo no fórum de como mudar a fonte e a cor da fonte. E disse que usando canvas eu conseguiria mudar a cor. Mas, não tenho muito experiência com canvas e deixei de lado. Acho que vou ter que estudar este objeto.
Paulo Nobre, deve ser possível, já que existe a propriedade OwnerDraw no compoente TMainMenu e os eventos OnDrawItem e OnAdvancedDrawItem no TMenuItem. É uma questão de explorar as opções.

No local onde o código foi postado tem dois email de usuários que dizem não conseguir ativar o exemplo click dos menus.

Veja um comentário:

"Muito bom, só não consegui capturar o evento Click dos ítens de menu. Se alguém puder me ajudar, email-me por favor".

Espero não ter este problema.

isto é porque não há qualquer evento para o item do menu, utilizando estes componentes. Eles talvez desconheçam o uso do TActionList. É associando à propriedade ActionClientItem (itens do menu no TActionMainMenuBar) à um Action (item no TActionList) que as coisas acontecem. Este último tem o evento OnExecute, que é onde as coisas acontecem - equivale ao OnClick.

Mas, não saia alterando seu projeto. Sugiro que utilize o exemplo explorando estes itens, principalmente se forem novos para você.

No exemplo, tem dois componentes para "customização" das cores(ColorMap no ActionMainMenuBar) do menu. Elimine um deles (TwilightColorMap1) para não lhe atrapalhar.

você terá que adicionar o tal TActionList (paleta Standard). Dois clicks nele e terá acesso ao editor. Clicando em New Action (teclar INS na lista), você adiciona um item, seleciona ele e altera suas propriedades. Basicamente Caption e Name. Essa propriedade categoria equivale a opção no menu principal.

obs: Este componente pode ser utilizado com os items de "menu normais".

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Caso você não tenha resolvido ainda, é só você colocar o OwnerDraw do TMainMenu para true e colocar o seguinte evento OnDrawItem nos MenuItem's ->

procedure TForm1.Arquivo1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
begin
  acanvas.brush.Color:=color;
  acanvas.FillRect(arect);
  acanvas.TextOut(arect.Left,arect.Top,(sender as tmenuitem).Caption);
end;
E no último MenuItem, para que seja pintado até o final do menu, o seguinte evento OnDrawItem ->
procedure TForm1.hgjnbvm1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
begin
  acanvas.brush.Color:=color;
  arect.Right:=width-4;
  acanvas.FillRect(arect);
  acanvas.TextOut(arect.Left,arect.Top,(sender as tmenuitem).Caption);
end;
Graças ao Micheus que mencionou essas propriedades e eventos. E lembrando que é possível utilizar outra cor caso o parametro selected seja true. E lembrando que é possível utilizar o evento OnAdvancedDrawItem onde existe o parametro State, aí você pode escolher a cor do menu de acordo com cada um dos seus possíveis estados ->
  TOwnerDrawState = set of (odSelected, odGrayed, odDisabled, odChecked,
    odFocused, odDefault, odHotLight, odInactive, odNoAccel, odNoFocusRect,
    odReserved1, odReserved2, odComboBoxEdit);

E lembrando que o caption dos TMenuItems algumas vezes tem o '&' antes do texto.

Link para o comentário
Compartilhar em outros sites

  • 0

Somando mais um pouquinho ao que o Thales postou...

E lembrando que o caption dos TMenuItems algumas vezes tem o '&' antes do texto.
para retornar o string correto na hora de passá-lo ao canvas, utilize a função:

function StripHotKey (const Text: string): string; // unit Menu

é só você colocar o OwnerDraw do TMainMenu para true e colocar o seguinte evento OnDrawItem nos MenuItem's ->
só para não ficar dúvida para os iniciantes que por ventura leiam este tópico, basta que apenas o evento de um item seja escrito. Depois é só selecionar este evento para o OnDrawItem dos demais itens - não é repetido o código para cada item.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus e Thales

Testei as duas dicas e funcionaram bem.

É claro que usando os componentes do Delphi 7, sugeridos pelo Micheus, você fica com uma gama enorme

de possibilidades.

Fico imaginado porque não criar algo ligado ao menu, diretamente. Tudo bem que o actionList serve para todos os componetes que tem a propriedade action, mas são muitas conexões que você deve fazer para colocar cores no menu.

Valeu pessoal.

Link para o comentário
Compartilhar em outros sites

  • 0
Fico imaginado porque não criar algo ligado ao menu, diretamente. Tudo bem que o actionList serve para todos os componetes que tem a propriedade action, mas são muitas conexões que você deve fazer para colocar cores no menu.
Paulo Nobre, a sugestão do uso do TActionMainMenuBar foi apenas uma sugestão imediatista, mas também para mostrar que existem outras opções e com mais recursos (sempre tem alguém que lê o post e ainda não usou outra coisa que não o TMainMenu).

Se desenhar o menu já atende as necessides(e acho que é o seu caso), então, com certeza esta é a melhor e talvez mais simples opção.

Mas, a título de não desmerecer o componente TActionList, como você disse: o actionList serve para todos os componetes. Podemos realmente tirar proveito dos Actions quando se tem menus e botões acessando as mesmas opções. Por ex. um grid com botões para Inclusão, Alteração e Exclusão e um menu PopUp que tambem acessam estas opções. Quando você associa um Action (Incluir) para o botão e para a respectiva opção do menu, você tem a possibilidade de executar uma operação onde antes executaria duas. Vamos supor que você queira desabilitar ou ocultar uma das opções, com o action, basta que você manipule propriedades como Caption, Enable ou Visible deste para que as respectivas propriedades do item de Menu e Botão assumam o mesmo valor.

Neste cenário, quando você trabalha com "controle de acesso", haverá basicamente uma classe a ser manipulada no que diz respeito a opções de menus e botões, o que pode ser vantajoso.

É sempre uma questão de avaliar a situação. Quanto mais conhecemos as ferramentas que temos, mas facilmente empregaremos eslas nas situações apropriadas.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus ,

Concordo plenamente com sua observação.

Quando disse: Porque não criar algo diretamente ligado ao menu...

Estava me referindo ao próprio Delphi, que poderia ter a opção de cor para o menu.

Ok?

Obrigado por todas as dicas neste tópico.

[]s

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...