Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Farben des TMainMenu ändern??? (https://www.delphipraxis.net/114148-farben-des-tmainmenu-aendern.html)

winx 20. Mai 2008 15:39


Farben des TMainMenu ändern???
 
Hi,

ich hab ein Formular mit einem TMainMenu. Von diesem kann ich
keinerlei Fraben ändern?

Brauch ich ne andere Kompo oder muß ich nur irgendwie "tricksen"?

Danke,
winx

Privateer3000 20. Mai 2008 16:50

Re: Farben des TMainMenu ändern???
 
Dieser Typ hat keine Coloreigenschaft
aber das Mainmenü von Jedi sollte es haben.
Probier das mal aus

shmia 20. Mai 2008 18:22

Re: Farben des TMainMenu ändern???
 
Man kann auch ein Standard Menü nachträglich aufpeppen.
Mit der API-Funktion SetMenuInfo kann man ein Brush-Handle für den Hintergrund zuweisen.

Delphi-Quellcode:
procedure TForm1.TestX1Click(Sender: TObject);
var
   mi: TMenuInfo;
begin
   if not Assigned(FBrush) then
      FBrush := TBrush.Create;
   FBrush.Color := clRed; // Rot!
   FBrush.Style := bsSolid;


   mi.cbSize := sizeof(mi);
   mi.fMask := MIM_BACKGROUND;
   mi.hbrBack := FBrush.Handle;
   SetMenuInfo(Test1.Handle {MenuItem-Handle}, mi);
end;

Muetze1 20. Mai 2008 18:51

Re: Farben des TMainMenu ändern???
 
Hach, meine alte Routine. Ich habe die nochmal später umgebaut, damit diese nicht immer ein ganzen TBrush "verbraucht".

Delphi-Quellcode:
Procedure TfrmXXX.SetMainMenuBGColor;
Var
  lMenuInfo: TMenuInfo;
  lMenuColor: TColor;
Begin
//    if ( Win32Platform = VER_PLATFORM_WIN32_NT ) and
//       ( $100*Win32MajorVersion + Win32MinorVersion >= $501 ) then
//      lMenuColor := clMenuBar   // erst ab XP (und D7) verfügbar
//    else
//      lMenuColor := clMenu;

  lMenuColor := clRed {gewünschte Farbe};

  DeleteObject(fMenuBrushHandle);
  fMenuBrushHandle := CreateSolidBrush(ColorToRGB(lMenuColor));

  FillChar(lMenuInfo, SizeOf(lMenuInfo), 0);

  lMenuInfo.cbSize := SizeOf(lMenuInfo);
  lMenuInfo.hbrBack := fMenuBrushHandle;
  lMenuInfo.fMask := MIM_BACKGROUND;
  SetMenuInfo(mnu_MainMenu.Handle, lMenuInfo);
End;
Vor allem lief diese Version "stabiler", da das Menu zwischenzeitlich auch mal die Farbe verloren hatte mit einem TBrush. Ich glaube da hat das GDI Handle-sparen von der VCL zugeschlagen gehabt. Mit dem diesem Code tritt der Fehler nicht mehr auf und es läuft stabil. Vllt. mal in die CodeLibrary eintragen?

winx 21. Mai 2008 06:53

Re: Farben des TMainMenu ändern???
 
Hi,

danke!!! Wollte den "stabileren" Code doch gleich mal testen:

Aber bei mir ändert sich absolut nix, Farbe bleibt grau.
fMenuBrushHandle : wo muß ich das deklarieren und muß ich sonst noch was machen???

Das Jedi MainMenü hat es übrigens auch nicht :-(

Gruß,
winx

marky522 21. Mai 2008 16:23

Re: Farben des TMainMenu ändern???
 
Hallo,

probiers mal damit! Habe es aus dem obigen zusammengebastelt.
Es mach ein Gradient-Menue.


MfG
Mark

Delphi-Quellcode:
procedure gradient(SColor,EColor:TColor;bitmap1:TBitmap);
procedure Drehen90Grad(Bitmap:TBitmap);

var
  Form1: TForm1;

implementation
var
 hand:THandle;
 bitmap1:Tbitmap;
{$R *.dfm}

procedure gradient(SColor,EColor:TColor; bitmap1:TBitmap);
var a,b,sr,sg,sb,er,eg,eb:integer;
    dr,db,dg:double;
    Row : ^TRGBQuad;
begin
 bitmap1.PixelFormat:=pf32bit;
 sr:=SColor and $000000ff;
 sg:=SColor and $0000ff00; sg := sg shr 8;
 sb:=SColor and $00ff0000; sb := sb shr 16;
 er:=EColor and $000000ff;
 eg:=EColor and $0000ff00; eg := eg shr 8;
 eb:=EColor and $00ff0000; eb := eb shr 16;

 dr:=(sr-er)/bitmap1.Height;
 dg:=(sg-eg)/bitmap1.Height;
 db:=(sb-eb)/bitmap1.Height;

 for a := Bitmap1.Height-1 downto 0 do begin
  row := Bitmap1.Scanline[a];
  for b := 0 to Bitmap1.Width-1 do begin
   row^.rgbred:=trunc(sr-dr*a);
   row^.rgbblue:=trunc(sb-db*a);
   row^.rgbgreen:=trunc(sg-dg*a);
   inc(row);
  end;
 end;
end;

type TMyhelp = array[0..0] of TRGBQuad;

procedure Drehen90Grad(Bitmap:TBitmap);
var P      : PRGBQuad; //^THelpRGB;
    x,y,b,h : Integer;
    RowOut : ^TMyhelp;
    help   : TBitmap;
BEGIN
   Bitmap.PixelFormat := pf32bit;
   help := TBitmap.Create;
   help.PixelFormat := pf32bit;
   b := bitmap.Height;
   h := bitmap.Width;
   help.Width := b;
   help.height := h;
   for y := 0 to (h-1) do begin
     rowOut := help.ScanLine[y];
     P := Bitmap.scanline[bitmap.height-1];
     inc(p,y);
     for x := 0 to (b-1) do begin
        rowout[x] := p^;
        inc(p,h);
     end;
   end;
   bitmap.Assign(help);
   help.Free;
end;


procedure TForm1.FormCreate(Sender: TObject);
var mi:TMenuInfo;
begin
 if Assigned(Bitmap1) then Bitmap1.Free;
 Bitmap1:=TBitmap.Create;
 Bitmap1.Width:=21;
 Bitmap1.Height:=Form1.Width;
 gradient(ColortoRGB(clBtnHighlight),ColortoRGB(clBtnFace),bitmap1);
 Drehen90Grad(Bitmap1);

 DeleteObject(hand);
 hand:=createPatternbrush(bitmap1.Handle);
 Fillchar(mi,Sizeof(mi),0);

 mi.cbSize:=sizeof(mi);
 mi.fMask:=MIM_BACKGROUND;
 mi.hbrBack:=hand;
 SetMenuInfo(MainMenu1.Handle,mi);
end;


procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
var mi:TMenuInfo;
begin
 if Assigned(Bitmap1) then Bitmap1.Free;
 Bitmap1:=TBitmap.Create;
 Bitmap1.Width:=21;
 Bitmap1.Height:=NewWidth;
 gradient(ColortoRGB(clBtnHighlight),ColortoRGB(clBtnFace),bitmap1);
 Drehen90Grad(Bitmap1);
     
 DeleteObject(hand);
 hand:=createPatternbrush(bitmap1.Handle);
 Fillchar(mi,Sizeof(mi),0);
                 
 mi.cbSize:=sizeof(mi);
 mi.fMask:=MIM_BACKGROUND;
 mi.hbrBack:=hand;
 SetMenuInfo(MainMenu1.Handle,mi);
end;
end.

Privateer3000 23. Mai 2008 09:22

Re: Farben des TMainMenu ändern???
 
zu den Jedi-menu gehört auch ein Painter
habs allerdings nie getestet


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz