Entwickler-Ecke

Windows API - Menü färben bzw. ein Bitmap setzen


LonghornUser - Do 15.01.04 20:31
Titel: Menü färben bzw. ein Bitmap setzen
Hallo,

Ich möchte ein Mainmenü machen, wo die Kopfzeile (wo &Datei, &Bearbeiten, etc. steht) blau ist oder, was noch besser wäre ein blaues Bitmap annehmen kann. Genauso müsste das für das aufgeklappte menü gehen.

Geht sowas ? Wenn ja wie ? Gibt es dafür Komponenten oder geht das delphi-intern ?


Keldorn - Fr 16.01.04 09:39

Hallo

du könntest die Einträge im ondrawitem eines Menuitems selber zeichnen.
Komponente gibts sicher auch, gugg bei torry vorbei.

Mfg Frank


LonghornUser - Fr 16.01.04 21:18

Danke erstma. Gibts irgendwo ein Toturial zum Ownerdraw-ereignis ?

Komponenten habe ich schon geguckt, aber funzt alles net so wie ichs brauche.


Keldorn - Fr 16.01.04 21:37

Tut brauchst du keines. Such einfach nach den drawitem (Listbox, Combobox) oder zur not auch Drawcell-ereignissen im Forum. Läuft alles mehr oder weniger nach dem gleichen Muster ab. Measureitem wäre noch was fürs festlegen der Höhe, wenn das gewünscht ist.

Ein simples Beipiel wäre:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.test21DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
begin
  //owner draw des menus auf true stellen
  if selected then
   //selektiert
    begin
      //hintergrund
      ACanvas.Brush.Color := clred;
      ACanvas.FillRect(ARect);
      //Text
      Acanvas.TextRect(ARect,ARect.Left+2,ARect.top+2,(Sender as TMenuItem).Caption);
    end
   else
    begin
      //hintergrund
      ACanvas.Brush.Color := clblue;
      ACanvas.FillRect(ARect);
      //Text
      Acanvas.TextRect(ARect,ARect.Left+2,ARect.top+2,(Sender as TMenuItem).Caption);
    end;
end;

Einfach allen/deinen gewünschten Items dieses Ereignis zuordnen, oder du tust das per code zur laufzeit
statt dem Hintergrund kannst du auch ein Bildmalen und den Text transparent drüberlegen (brush:=bsclear);

Allerdings habe ich es immer vermieden, im menu rumzupinseln. Erstens sieht es meist nicht schick aus, wenn die Systemvorgaben ignoriert werden und zweitens mußt du dich dann auch ums Zeichnen der Unterstriche, der Shortcuts und der images kümmern. und wenn du da an alles denken willst, hast du was vor.

Mfg Frank


LonghornUser - So 18.01.04 19:58

Danke vielmals. Das habe ich gesucht. Ich wusste immer nicht, wie man in diesem event sieht, wenn etwas selektiert ist.

Aber da stellt sich noch ne Frage: Kann ich den Schatten und den Rahmen des Menüs irgendwie wegbekommen bzw. überzeichnen ? Ich möchte statt dem rahmen und dem schatten einfach ein 1-pixel breites rechteck. Ist sowas möglich ? Wenn ja, wie ??


Delete - So 18.01.04 21:18

LonghornUser hat folgendes geschrieben:
Aber da stellt sich noch ne Frage: Kann ich den Schatten und den Rahmen des Menüs irgendwie wegbekommen bzw. überzeichnen ? Ich möchte statt dem rahmen und dem schatten einfach ein 1-pixel breites rechteck. Ist sowas möglich ? Wenn ja, wie ??

Der Schatten ist OS-abhängig, IMHO erst ab ME (?), 2000 und XP. Und der Rahmen gehört, glaube ich, zum Non-Client-Bereich. An den kommst du so nicht ran. Dazu musst du direkt in die Nachrichtenbearbeitung des Menüs eingreifen.

Notfalls schau doch mal in die XPMenu-Komponente. Da wird das ja auch alles gemacht.


Keldorn - So 18.01.04 22:05

MathiasSimmack hat folgendes geschrieben:

... zum Non-Client-Bereich. An den kommst du so nicht ran. Dazu musst du direkt in die Nachrichtenbearbeitung des Menüs eingreifen.

na da hätsch auch ne Frage ;)
welche Nachricht wäre denn das prinzipiell?

Mfg Frank