Announcement

Collapse
No announcement yet.

Hintergrund der Menuzeile mit Bitmap pinseln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hintergrund der Menuzeile mit Bitmap pinseln

    Hi,

    Wie kann ich den Hintergrund der Menuezeile bemalen?

    Über die Diversen Verfügbaren Handles komme ich nicht an einen passenden DC. Die Menubar ist ja "nur" von der VCL gekapselt und bietet nichts passendes.

    Gruss Frank

  • #2
    Hallo Frank,<p>
    jemand hatte mal im Forum hier gesagt, dass das wohl extrem kompliziert war, ich weiß leider nicht mehr wer und warum, aber das ist eigentlich auch egal...<br>
    Sollte es Dir weniger um den eigenen Erfolg als mehr um das Ergebnis gehen solltest Du die vielleicht mal kommerzielle Komp. dazu anschauen:<br>
    http://www.cooldev.com/coolmenus.html<br>
    http://www.opaquesoftware.com/<br>
    Beide haben sehr umfangreich konfigurierbare Menüs. Bei Torry.net ist evtl. so was auch als Freeware drin, weiß ich aber nicht.<p>
    Schöne Grüße, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      Jo, ich war's. Um es nochmal kurz darzustellen. Die Menuzeile IST kein eigenes fenster, im Gegensatz zu den Popups. Die Menuzeile ist ein Bereich im "Non-Client" Bereich des Menubesitzenden Fensters. Das Windows-System zeichnet also die Menuzeile immer auch dann wenn die Titelzeile oder der Rahmen des Fensters gezeichnet wird. Das sollte passieren in wm_NCPaint. Die Größenverhältnisse werden in wm_NCCalcSize berechnet. ABER, nun das eigentliche Problem:
      <li>1. Windows hat keinerlei API Funktionen die dies für uns erledigen könnten<br>
      <li>2. Windows zeichnet das Menu wann immer es will neu<br>
      <li>3. Windows verwaltet diese Zeichnen innerhalb von eigenen Loops, ist Windows einmal in diesen Menuloops hat man keine Chance das zeichnen zu ändern<br>
      <li>4. Windows hat keine öffentlich dokumentierten Berechnungsvorschriften wie die NC-Bereiche berechnet werden. D.h. es gibt keinen einheitlichen Weg wie,wo,wann ein bestimmter Bereich im NC Bereich gezeichnet werden muß<br>
      <li>5. Windows nutzt verschiedene Methoden zur Menuverwaltung, ein SDI Menu unterscheidet sich extrem von einem MDI-Menu. Das MDI System verändert aus einem MDI-Child Fenster heraus das die einzelnen MDI ChildForms enthält das übergeordnete Menu des MDI-MainForms direkt !!<br>
      <li>6. Windows nutzt für jede Windowsversion ständig geänderten Code. Man kann also nicht per Hooking, Zeichenunterdrückungen usw. diese "Probleme" umgehen, da dies nur zugeschnitten auf eine Windowsversion funktionieren würde. Schau dir XP an, und bedenke das dort das gleiche Menusystem wie in Win2000 existiert aber diese intern wiedermal angepasst wurde.(ohne API Schnittstellen wohlgemerkt)<br>

      Um also eine eigene Hintergrundbitmap in eine Menuzeile zu bringen muß man von diesem fenster die kompletten Behandlungsroutinen für den Rahmen/Buttons/Caption/Menus selber abhandeln. Das behinhaltet ALLES, also zeichenroutinen, Menuloop, MDI-Verwaltung inklusive MDI Childforms, Rahmenloops für Größenänderungen/Verschiebungen usw. usw. In all diesen Ereignissen zeichnet nämlich Windows direkt das Menu neu.<br>
      Das bedeutet Du hast ein fenster OHNE Rahmen und sonstwas, nur der Clientbereich existiert. Dann überschreibst Du wm_NCCalcSize um um diesem Bereich herum einen Non-Client bereich zu erzeugen. Dieser enthält dann Rahmen, Titelzeile, Icons, Buttons und eben das Menu. Nun überschreibst Du die Messages wm_SetCursor, wm_NCActibate, wm_NCCreate, wm_NCDestroy, wm_NCHitTest, wm_NCLButtonDown, wm_NCLButtonUp, wm_NCLButtonDblClk, wm_NCMButtonDown, wm_NCMButtonUp, wm_NCMButtonDblClk, wm_NCRButtonDown, wm_NCRButtonUp, wm_NCRButtonDblClk, wm_NCPaint, wm_NCMouseMove, wm_SysKeyDown, wm_WindowPosChanging, wm_MDIActivate, wm_MDICreate, wm_MDIDestroy, wm_MDISetMenu, wm_MDITitle, wm_ChildActivate, wm_CaptureChanged, wm_SysCommand, wm_ContextMenu, wm_WindowPosChanged, wm_EnterIdle, wm_EnterMenuLoop, wm_ExitMenuloop, wm_StyleChanging, wm_StyleChanged, wm_SetText.<br>

      So das dürften die wichtigsten Messages sein. In all diesen Messages kann es vorkommen das Windows direkt in den Non-Client zeichnet.<br>

      Bedenkt man welche Probleme im Windows beim MDI System existieren zeigt sich das selbst MS dieses "Konstrukt OHNE gute Schnittstellen" nicht im griff hat. Die GUI Fensterlogiken stammen an diesen Stellen noch aus Win311 Zeiten.<br>

      Schaut man sich solche Kompos, wie CoolMenus an dann stellt man fest das diese gar keine Windows-Menus mehr sind sondern nur Client-Controls die ein Menu simulieren. (Die Frage ob besser oder schlechter als das Windowmenu stelle ich hier mal in den Raum)<br>
      Ähnliches wie das "Menu" in der Delphi IDE usw. usw. All diese Lösungen ändern also nicht das Standard-Windows-Menu Verhalten sondern bilden es durch eigen Kompos wie Toolbars usw. nach.<br>
      Ich kenne keine einzigste Komponente die die Standard Menubar ändert. Aus gutem Grunde, es geht nicht ohne die MS Source.<br>

      Zu Testzwecken kannste per GetWindowDC(Form1.Handle) selber im NC Bereich painten.

      Gruß

      Comment


      • #4
        Hallo zusammen,

        ich dachte mir schon das es kompliziert ist. Aber sooo..

        Ich hatte schon alles ausprobiert, mit Subclassing, Handle, NC_, Botschaften tracen etc.

        Nun ja, dann bleibt die Optik halt ein wenig anders ;-). Übrigens die Komponenten als Menuersatz, die ich testen durfte (musste?) können alle keine gescheite MDI-Verwaltung mit mergen/Systemmenu CaptionButtons etc.

        Danke für die Hinweise. Ach, Hagen. Arbeitest Du nebenbei noch oder wirst du Masoud bezahlt ;-)

        Comment


        • #5
          Dies war meine Kernaussage. Die "Ersatzmenu" bieten nicht die nötigen Basisfeatures der Menus, sie sehen nur schön aus, und die Menus selber sind in diesem Punkt schwer zu ändern.<br>

          Ne ich arbeite wie jeder andere regulär, meine Posting hier sind reines unbezahltes Hobby <br>

          Gruß Hage

          Comment

          Working...
          X