Ein bisschen in anderen DC zeichnen



  • Hallo!

    Ist es möglich in der OnPaint Methode eines Fenster (Kindfenster) ein bisschen ins Elternfenster (Dialog) zu zeichnen?

    Beispiel

    = -> Stellt das Dialogfenster/Elternfenster dar
    - -> stellt das Kindfenster dar
    x -> stellt den sich überschneidenden Zeichenbereich dar, x ist eine Grafik
    ==================================
    =   xxx                          =
    = --xxx-------------             =
    = - xxx            -             =
    = -                -             =
    = -                -             =
    = ------------------             =
    =                                =
    =                                =
    ==================================
    

    Wie auf dieser sauberen Skizze zu sehen, möchte ich eine Grafik zeichnen, die sowohl ins Elternfenster ragt als auch ins Kindfenster ragt. Geht so etwas, wenn ja wie?


  • Mod

    Erzeuge ein eigenes Fenster und lege es über die anderen fenster.
    In die DCs Zeichnen ist sinnlos, oder Du müsstest im fremden Prozess die Fenster subclassen und WM_PAINT abfangen.



  • was ist sin und zweck deines Vorhabens?



  • Martin Richter schrieb:

    Erzeuge ein eigenes Fenster und lege es über die anderen fenster.
    In die DCs Zeichnen ist sinnlos, oder Du müsstest im fremden Prozess die Fenster subclassen und WM_PAINT abfangen.

    Ja, das hatte ich auch schon überlegt. Erscheint mir nur recht unprofessionell. 🙂

    BorisDieKlinge schrieb:

    was ist sin und zweck deines Vorhabens?

    Ich möchte einen Button zwischen Control und Dialog setzen. Ähnlich wie bei Office 2007.


  • Mod

    HaJo. schrieb:

    Martin Richter schrieb:

    Erzeuge ein eigenes Fenster und lege es über die anderen fenster.
    In die DCs Zeichnen ist sinnlos, oder Du müsstest im fremden Prozess die Fenster subclassen und WM_PAINT abfangen.

    Ja, das hatte ich auch schon überlegt. Erscheint mir nur recht unprofessionell. 🙂

    BorisDieKlinge schrieb:

    was ist sin und zweck deines Vorhabens?

    Ich möchte einen Button zwischen Control und Dialog setzen. Ähnlich wie bei Office 2007.

    Unprofessionell? Ähhhhh... 😕 Warum?

    Ich finde eher Dein Vorhaben unporfessionell. Wie willst Du denn bitte darin nun die Klicks abfangen? Nein Wenn Du übergreifende Controls hast mit eigenen DCs musst Du ein eingenes Fenster verwenden. Alles andere ist Bit-Schieberei der üblen Sorte.
    Versuch ertsmal klar zu kommen wie Fenster überhaupt funktionieren und wer über welchen DC regiert!



  • Martin Richter schrieb:

    Unprofessionell? Ähhhhh... 😕 Warum?

    Naja, dieser "Button" sollte eigentlich KEIN eigenes Control sein, sondern gehört zum Ribbon Control.

    Martin Richter schrieb:

    Ich finde eher Dein Vorhaben unporfessionell. Wie willst Du denn bitte darin nun die Klicks abfangen?

    Wie bei ToolBar oder ähnlichen Controls auch. Mit PtInRect.

    Martin Richter schrieb:

    Nein Wenn Du übergreifende Controls hast mit eigenen DCs musst Du ein eingenes Fenster verwenden. Alles andere ist Bit-Schieberei der üblen Sorte.
    Versuch ertsmal klar zu kommen wie Fenster überhaupt funktionieren und wer über welchen DC regiert!

    Das klingt jetzt aber echt hart. Bis XP konnte man ja noch ohne weiteres zwischen Titelleiste und Dialog ein Logo etc. zeichnen. In Vista ist das nicht mehr möglich, da der Non Client Bereich über einen anderen Prozess gezeichnet wird (Aero). Deswegen müsste versuchte ich die Glasleiste - wie es zb. auch der Explorer unter Windows tut - etwas auszuweiten und auf den Dialog UND das Ribbon Control etwas zu zeichnen.


  • Mod

    In der reinen Theorie kannst Du immer Dir einen DC besorgen und da rein malen.
    Sprich bei Dir in den Elternfenster Dialog.
    Außer WS_CLIPCHILDREN wurde gesetzt. Kontrolliere mal ob das bei Dir der Fall ist.

    Die Frage ist nur wann wird gezeichnet. Und das bekommst Du evtl. een nicht unter Kontrolle wenn mehere Fenster und DCs im Spiel sind.

    Das hat nichts mit Vista zu tun und schon gar nicht mit einem anderen Prozess oder Thread!
    Das Zeichnen eines Fensters erfolgt immer (auch unter Vista) in dem Kontext des Prozesses und des selben Threads, ob da nun Aero im Spiel ist oder nicht.
    Einzig alleine die Reihenfolge ist und war nie garantiert!



  • Martin Richter schrieb:

    In der reinen Theorie kannst Du immer Dir einen DC besorgen und da rein malen.
    Sprich bei Dir in den Elternfenster Dialog.
    Außer WS_CLIPCHILDREN wurde gesetzt. Kontrolliere mal ob das bei Dir der Fall ist.

    Ist nicht gesetzt. Aber über zwei Fenster malen, geht wohl wirklich nur mit einem neuen Fenster. Ich habe noch einmal darüber nachgedacht. 😕
    Die einzige Möglichkeit die mir einfällt ohne ein neues Fenster zu nutzen wäre, den oberen Teil des Buttons im W_PAINT Event des Dialogs zu zeichen und den unteren im WM_PAINT Event des Ribbon Fenster. Allerdings ist mir *das* dann doch zu unelegant. 🙂

    Martin Richter schrieb:

    Das hat nichts mit Vista zu tun und schon gar nicht mit einem anderen Prozess oder Thread!
    Das Zeichnen eines Fensters erfolgt immer (auch unter Vista) in dem Kontext des Prozesses und des selben Threads, ob da nun Aero im Spiel ist oder nicht.
    Einzig alleine die Reihenfolge ist und war nie garantiert!

    Man kann unter Vista nicht mehr so ohne weiteres bei aktiviertem Aero Theme über das WM_NCPAINT Event in den NC Bereich des Fensters zeichnen. Das übernimmt der Desktop Window Manager (anderer Prozess).


  • Mod

    HaJo schrieb:

    Man kann unter Vista nicht mehr so ohne weiteres bei aktiviertem Aero Theme über das WM_NCPAINT Event in den NC Bereich des Fensters zeichnen. Das übernimmt der Desktop Window Manager (anderer Prozess).

    Ähhh. Wo steht das! Link bitte...

    Du meinst also WM_NCPAINT wird in enem anderen Thread-Context versendet, als das Fenster angelegt wurde? Wo steht das?



  • Martin Richter schrieb:

    Ähhh. Wo steht das! Link bitte...

    Du meinst also WM_NCPAINT wird in enem anderen Thread-Context versendet, als das Fenster angelegt wurde? Wo steht das?

    Ja, unter Windows Vista wurde doch der DWM samt API eingeführt.
    Hier ist ein interessanter Beitrag dazu: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=926128&SiteID=1
    Ich meine aber schon etwas in einem Microsoft Blog im Zusammenhang mit DWM darüber gehört zu haben.

    Edit: U.a. 5 Posting

    Edit 2: http://shellrevealed.com/blogs/shellblog/archive/2006/10/12/Frequently-asked-questions-about-the-Aero-Basic-window-frame.aspx

    The DWM doesn't have any legacy worries because applications cannot draw inside the glass frame, since it's rendered and managed by a totally different process.


  • Mod

    Sehr interessant...
    Absolutes Neuland für mich!

    Sorry dann müsste ich mich erstmal eingehend damit beschäftigen, aber wie ich ds sehe kommt man dann hier um eine Vista/Aero-Speziallösung nicht drum herum.



  • Martin Richter schrieb:

    Sehr interessant...
    Absolutes Neuland für mich!

    Sorry dann müsste ich mich erstmal eingehend damit beschäftigen, aber wie ich ds sehe kommt man dann hier um eine Vista/Aero-Speziallösung nicht drum herum.

    Ja und das geht mir im Moment mit meinen einfachen GUI Kenntnissen dann doch etwas zu weit. Das gesamte MS Ribbon Control ist ein einziges Fenster und setzt auf der Titelleiste an. Vorerst muss ich wohl auf den Button verzeichten. Hätte ich das komplette Ribbon Control implementiert müsste ich es ja registrieren lassen.


Anmelden zum Antworten