AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi MenuItem Bitmap ändern geht nicht

MenuItem Bitmap ändern geht nicht

Ein Thema von berens · begonnen am 26. Jan 2021 · letzter Beitrag vom 26. Jan 2021
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
421 Beiträge
 
Delphi 2010 Professional
 
#1

MenuItem Bitmap ändern geht nicht

  Alt 26. Jan 2021, 12:40
Hallo community,
ich verwende dxgettext zum Übersetzen meines Programms. Nachdem ich mich mehrere Tage mit den Versuchen zur Lösung dieses Bugs beschäftigt habe, muss ich die Icons in meinem MainMenu explizit über die TMenuItem.Bitmap lösen; TImageList scheidet aus.

TL;DR: MainMenu-Items sind *viel* breiter als sonst, alles sieht komisch aus. Es liegt definitiv an der TImageList des MainMenus. Auch die u.g. Lösung brachte keine Besserung. Auch TP_GlobalIgnoreClass von TMainMenu, TImageList etc bringen keine Besserung. (Bitte diesen Bug jetzt nicht hier diskutieren, danke!) Ich kann also keine ImageList in TMainMenu verwenden ohne das Problem! Anderes Thema, nur zum Hintergrund warum/DASS ich keine TImageList verwenden kann!
Zitat:
Netzschleicher 25. März 2012, 12:29

Hallo alle zusammen,

bevor ich mich nun mit dem Fahrrad in die Sonne stürze wollte ich noch eine Frage loswerden.

In meinem Programm das ich schreibe verwende ich gnugettext um das ganze mehrsprachig zu machen. Das funktioniert auch soweit sehr gut. Nur habe ich jetzt ein Problem mit dem TMainMenu. Dieses MainMenu wird beim Programmstart dynamisch aufgebaut. Dafür habe ich zur Designzeit einfach eine TMainMenu-Komponente auf die Form gezogen und erstelle nur noch die nötigen Einträge.
Das Problem ist nun folgendes, wenn ich nun erst das Menü erzeuge und dann mit der gnugettext-Funktion 'TranslateComponent' die Form übersetze erscheint das Menü im alten WinXP-Design. Wenn ich 'TranslateComponent' vor dem erzeugen des Menü ausführe und die Menüeinträge mit z.B. ' MainItem->Caption = _(ACaption)' erzeuge, habe ich das Menü im schönen Design von Windows7. Wenn ich allerdings zur Laufzeit die Sprache ändere und dann mit 'RetranslateComponent' die Form wieder übersetze habe ich wieder nur das alte WinXP-Design meines MainMenüs.

Auch das versuchweise verwenden des Jvgnugettext der Jedi-Komponenten brachte keine Besserung.
Kann mir da jemand einen Tipp geben wie dieses Problem umgangen werden kann? Ich dachte schon an die Möglichkeit, bei jeder Änderung der Sprache das Menü zu löschen und wieder neu aufzubauen.

Vielen Dank in Voraus,

Grüße Netzschleicher

Netzschleicher 27. März 2012, 19:30

So, ich habe mir das ganze nochmal in einer Testanwendung zusammengesteckt und dabei herausgefunden, das es an der TImageList zu liegen scheint. Wenn dem TMainMenu keine ImageList zugewiesen ist funktioniert alles prima. Wenn ich aber eine TImageList dem TMainMenu zuweise, gibt es beim Überstetzen die geschilderten Probleme.

Ich habe mir jetzt folgendermaßen geholfen:

MainMenu->Images = NULL;
UseLanguage(ConfigReadString("Environment", "Language", ""));
TranslateComponent(this);
MainMenu->Images = MenuImageList;
Ich möchte einfach nur ein bestehendes TBitmap in einem MenuItem anzeigen lassen. Alles Tips aus dem Internet laufen mit meinem Delphi 10.4 leider nicht; das Problem beschreiben aber auch andere User mit älteren Versionen von Delphi.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Bmp1 := TPicture.Create;
  Bmp1.LoadFromFile('c:\test.bmp');
  Bmp1.Bitmap.Width := GetSystemMetrics(SM_CXMENUCHECK);
  Bmp1.Bitmap.Height := GetSystemMetrics(SM_CYMENUCHECK);
  SetMenuItemBitmaps(MainMenu1.Handle, 0, MF_BYPOSITION,
                     Bmp1.Bitmap.Handle, Bmp1.Bitmap.Handle);
Die erneute Zuweisung Breite/Höhe nur, dass es nicht daran scheitert, dass das Bild in einer falschen Größe wäre... Bitte einfach ignorieren, ist nur zum testen...

Hier ist es auch egal, ob ich MainMenu1.Handle verwende oder MeinMenuItem1.Handle. Es wird nichts sichtbar.
Wenn ich im Objektinspektor zur Designzeit das Bitmap zuweise, geht es direkt. Woran liegt's, was kann man tun.

Wie gesagt, ImageList scheidet aus.

Danke!

Edit:
Delphi-Quellcode:
procedure TGraphicResourceProvider.SetIconOnMenuItem(_ResourceName: string; _MenuItem: TMenuItem);
var
  bmp: Graphics.TBitmap;
  pic: TPicture;
  tmpParent: TMenuItem;
  tmpPos: integer;
begin
  if not assigned(_MenuItem) then Exit;
  _ResourceName := trim(_ResourceName);

  pic := GetResourcePNGImageFromRCDATA(_ResourceName);
  if (not assigned(pic)) or (_ResourceName = '') then begin
    Exit;
  end;

  bmp := graphics.TBitmap.create;
  bmp.SetSize(GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK));
  bmp.Canvas.Draw(0, 0, pic.Graphic);
  _MenuItem.Bitmap.Assign(bmp);
  FreeAndNil(bmp);

  tmpParent := _MenuItem.Parent;
  if assigned(tmpParent) then begin
    tmpPos := tmpParent.IndexOf(_MenuItem);
    tmpParent.Remove(_MenuItem);
    tmpParent.Insert(tmpPos, _MenuItem);
  end;
So würde es gehen, da das Bild wohl nur mit dem Parent.Remove/Insertgeladen wird? Geht das nicht auch "richtig", ohne WorkArounds oder OwnerDraw?
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens (26. Jan 2021 um 13:41 Uhr)
  Mit Zitat antworten Zitat
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
863 Beiträge
 
Delphi 2007 Professional
 
#2

AW: MenuItem Bitmap ändern geht nicht

  Alt 26. Jan 2021, 14:38
TL;DR: MainMenu-Items sind *viel* breiter als sonst, alles sieht komisch aus. Es liegt definitiv an der TImageList des MainMenus.
Das hört sich für mich nach einem Problem mit dem Handling von HighDef-Monitoren an. In diesem Zusammenhang habe ich das auch schon gesehen und mich tagelang unter Delphi 10.2 damit rumgeschlagen.

Irgenwer hatte dazu gepatchte VCL-Units zur Verfügung gestellt.
@UweRaabe warst Du das?

Edit: Ja es war Uwe:
https://www.uweraabe.de/Blog/2018/06...es-for-delphi/
Die sind allerdings nur für Delphi 10.2.

Ich erinnere mich allerdings nicht mehr, was ich genau gemacht habe, um das Problem zu lösen, die gepatchten Units alleine funktionierten bei mir nicht.
Thomas Mueller

Geändert von dummzeuch (26. Jan 2021 um 14:44 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 03:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf