Menüs verändern

Shaijan

Mitglied
Hi ...

Ich arbeite derzeit an einem Programm, bei dem ich das Fenster mit Skins erstelle.
Für verschiedene Optionen benutze ich ein PopupMenü ...
Nun wollte ich gerne das Menü an das restliche Aussehen des Fensters/Skins anpassen. D.h. z.B. die Farbe verändern oder ähnliches.

Ich weiß wie man die Farbe eines Menüs verändert, aber das sieht ziemlich mies aus, da der Rand des Menüs nicht miteingefärbt wird.
Bei anderen Programmen (weiß allerdings nicht mit welcher Sprache da gearbeitet wurde) habe ich auch schon flache Menüs, ohne einen solchen 3D-Rand gesehen. Gibt es da eine Möglichkeit, den Rand zu entfernen?
Zusätzlich suche ich eine Möglichkeit einzelne Menü-Einträge zu färben, d.h. unterschiedliche Farben für die einzelnen Menü-Einträge zu benutzen.

Und gibt es eine Möglichkeit ein Bild, oder eine andere Farbe auf z.B. der rechten Seite des Menüs anzuzeigen? (wie z.B. beim Start-Menü von Windows)

Habe diesbezüglich noch nichts gefunden, weder im Forum, noch in der MSDN.
Würde mich aber über alles freuen, Codeschnipsel, Referenzen etc ...

Arbeite unter Win2000 mit MSVC++

Gruß
Shai
 
1. Falsches Forum (richtig wäre "VisualStudio & MFC")

2. Ich wüsste keine Möglichkeit die Farbe des MFC Menüs zu ändern, das einzige was ich da empfehlen könnte wäre das designen von eigenen Menüs, dazu findest du aber dort im Forum was...

Gruss

MFC OpenGL
 
Hi ...

Habs nun hinbekommen mein Menü so zu verändern, wie ichs gern hätte (mit nem OWNERDRAW-Menü)

Allerdings tritt da ein ganz komischer Fehler auf.
Und zwar zeichne ich an der linken seite eine etwa 5 pixel breite Linie mit einem Pattern-Brush...
Diese Linie wird auch gezeichnet, allerdings nicht so wie ichs gerne hätte.

Wenn ich das Menü aufrufe (d.h. mein Owner-Window die WM_DRAWITEM bekommt), ist die Grafik um 3 Pixel versetzt. Also zwar zwischen dem Linken Rand (0) und dem rechten Rand (5) gezeichnet, aber der Brush fängt beim Pixel 0 etwa in der Mitte an (wenn ihr versteht was ich meine ;) )
Wenn ich dann mit der Maus über die einzelnen Menüeinträge wandere, ändert sich der Brush so, wie ich es eigentlich geplant habe.

Hoffe da kann mir evtl. jemand helfen?
Denke nicht, dass es ein Fehler in meinem Code ist, da ja bei jeder WM_DRAWITEM msg (aufrufen des Menüs und mit der Maus rüberwandern) der gleiche Code aufgerufen wird, aber trotzdem unterschiedlich gezeichnet wird ...

Ich habe die Vermutung, dass sich irgendwie die Koordinaten, des DCs ändern (da der Rand des Menüs genau 3 Pixel breit ist, habe ich die Vermutung aufgestellt, beim Aufrufen des Menüs ist die Koordinate 0 links auf dem Rand und danach neben dem Rand)
Aber wenn ich die Koordinaten veränder, bekomme ich auch kein richtiges Ergebnis.

Gruß
Shai
 
Das könnte das Brush-Offset sein. Setz mal mit SetBrushOrg oder SetBrushOrgEx die beiden Koordinaten auf 0,0. Irgendjemand hat da den DC nicht richtig aufgeräumt.
 
Moin Moin ...

Hab da wieder ein Problem mit meinem Menü ...

Und zwar versuche ich das Menu nun dynamisch aus einem im Editor erstellten Menü zu erstellen ...
Beim Laden des Menüs gehe ich jeden Eintrag durch, speichere seinen String und lege ihn in dwItemData des MENUITEMSTRUCTs ab. fMask des MENUITEMSTRUCTs ist u.a. auf MIIM_DATA gesetzt, so dass der Wert für dwItemData gesetzt wird, wenn ich SetMenuItemInfo() aufrufe ...

Der Code sieht vereinfacht etwa so aus:
Code:
void Create(HMENU hMenu)
{
  static int itemID = 4000;

  MENUITEMINFOSTRUCT mii;
  mii.cbSize = sizeof(MENUITEMINFOSTRUCT);
  mii.fType = MFT_OWNERDRAW;
  mii.fMask = MIIM_FTYPE | MIIM_DATA | MIIM_ID;

  int count = GetMenuItemCount(hMenu);
  for(int i=0;i<count;i++)
  {
    mii.wID = itemID++;

    char str[16];
    GetMenuString(hMenu,i,str,16,MF_BYPOSITION);

    mii.dwItemData = (ULONG)str;
    ::SetMenuItemInfo(hMenu,i,TRUE,&mii);
  }
}

Wenn ich nun nachdem ich dwItemData setze den String abfrage mit (char *)dwItemData, wird er mir richtig angezeigt ...
Allerdings wird er nicht an das MenuItem übergeben ...
Wenn ich nämlich in meiner Draw-Methode den String mit (char *)dis->itemData (dis = LPDRAWITEMSTRUCT) abfrage und schreiben möchte, wird nichts, bzw. manchmal eine geschweifte Klammer oder was anderes angezeigt...

Wenn ich das Menu manuell (zur Laufzeit) erstelle und die Daten auf die gleiche Art und Weise speicher (mii.dwItemData = (ULONG)"text des items" - SetMenuItemInfo(....&mii)) funktioniert das einwandfrei ... d.h. es wird der richtige Text angezeigt, aber hier nicht ...
Mach ich irgendwas falsch?

würd mich über Hilfe freuen

Gruß
Shai
 
Äh, ja.

Dein char-Array str ist da nur lokal, und du speicherst dir einen Pointer drauf. Sobald du den Kontext verlässt (nächste schliessende Klammer), ist das char-Array futsch und dein ItemData zeigt in die Pampa.
Das klappt bei dem direkten zuweisen deswegen, weil da der Compiler diesen String als konstante Variable in deine .exe einbaut und der Pointer immer gültig ist. Du müsstest da einen string new[]-en, dann kannst du den Text reinkopieren, und am Ende latürnich delete[]en.

Blöde Frage, warum rufst du das GetMenuString nicht direkt auf, statt dir umständlich den String ins ItemData reinzupacken?
 
Hi ...
Erstmal danke für die Antwort, liegt ja eigentlich nahe. Hab auch schon den Speicherplatz dynamisch erstellt, aber aus Gewohnheit irgendwie sofort wieder delete-ed *g* ... naja, ich werds mal versuchen ...

Zu deiner Frage:
Das hab ich versucht, aber hat auch nicht funktioniert, war aber in einem früheren Entwicklungsstadium ... ich kann das ja nochmal versuchen, allerdings hats damals nicht geklappt ...
Ich dachte der String würde gelöscht beim OWNERDRAW-Menü ...

Gruß
Shai
 
Zurück