Dialog per CreateWindowEx erzeugen... kleines Problem...



  • Hi all,
    ich habe in meinem Programm ein "eingeklinktes" Dialog... In den Dialog eigenschaften ist "Untergeordnet" eingestellt. Jetzt wollte ich dem Benutzer die Möglichkeit geben, den Player "auszuklinken", so dass er nichtmehr fest integriert links im Hauptfenster sitzt, sondern man ihn per Titelleiste herumschieben kann und das Hauptfenster schließen kann, ohne dass der Player gleich mitminimiert wird.

    Im Hauptfenster erstelle ich das (noch eingeklinkte) Player-Dialog:

    hMP3Player = CreateDialog(hInst, (LPSTR)IDD_MP3PLAYER, hChild1, (DLGPROC)MP3Player);
    

    Ich habe nach einer Möglichkeit gesucht, den Style des Fensters zu ändern. Per SetWindowLongPtr konnte ich kein Ergebnis erziehen, da ich dort das "ParentWnd" des Player-Dialoges nicht einstellen kann! Ich muss nähmlich "ParentWnd" auf NULL setzten, da es dann nicht mehr vom Hauptfenster abhängig ist und ich es frei verschieben kann. Mit SetWindowLongPtr kann man das eben nicht auf NULL setzen. Darum habe ich geacht, ich beende das Dialog, erstelle es dann wieder per CreateWindowEx (es steht in der MSDN, dass man mit CreateWindowEx() auch dialog erstellen kann). Ich habe Folgendes probiert:

    hMP3Player = CreateWindowEx(NULL, "#32770", "DIALOG", WS_OVERLAPPED | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, hInst, NULL);
                SetWindowLongPtr(hMP3Player, DWLP_DLGPROC, (long)MP3Player);
                SetWindowLongPtr(hMP3Player, GWLP_ID, IDD_MP3PLAYER);
                SetWindowPos(hMP3Player, NULL, 0, 0, 200, 200, SWP_SHOWWINDOW);
    

    Leider ohne Erfolg.

    Was ich erreichen will ist, dass ich das Dialog eben "ausklinken" kann. Es ist am Anfang "untergeordnet", ohne Titelleiste, in mein Programm integriert. Ich möchte es dan nso ausklinken, dass es eine Titelleiste hat, dass es von keinem Fenster mehr abhängig ist, und extra nochmal in der Taskleiste als Dialog angezeigt wird ...

    Könnt Ihr mir helfen?
    Tschüss



  • P.S.:
    Das Dialog öffnet sich sogar mit CreateWindowEx, die Prozedur wird auch zugewiesen, aber es erscheinen keine Elemente (Buttons etc. von IDD_MP3PLAYER)... Wahrscheinlich geht die IDD_MP3PLAYER DLG-PROC Zuweisung nicht!



  • Das Dialog öffnet sich sogar mit CreateWindowEx, die Prozedur wird auch zugewiesen, aber es erscheinen keine Elemente (Buttons etc. von IDD_MP3PLAYER)
    ... Wahrscheinlich geht die IDD_MP3PLAYER DLG-PROC Zuweisung nicht!

    Was Du da machst, ist mir völlig rätselhaft. Warum setzt Du die ID nicht gleich im CreateWindow-Aufruf? Und warum verwendest Du nicht CreateDialog?

    Ich habe nach einer Möglichkeit gesucht, den Style des Fensters zu ändern. Per SetWindowLongPtr konnte ich kein Ergebnis erziehen,

    Nach dem Aufruf von SetWindowLongPtr muß noch SetWindowPos aufgerufen werden. Zitat MSDN: "If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED"

    da ich dort das "ParentWnd" des Player-Dialoges nicht einstellen kann!

    Das ist auch kein Style. Dafür gibt es aber die Funktion SetParent().

    Ich würde, davon mal abgesehen, so vorgehen: Erstelle ein Fenster ohne Parent mit dem ExStyle WS_EX_TOOLWINDOW und ohne Titelleiste. Dieses Fenster kannst Du jetzt in Deine Anwendung 'einpflanzen'. Wes es ausgedockt wird, fügst Du (per SetWindowLongPtr) die Titelleiste hinzu, löscht das ExStyle WS_EX_TOOLWINDOW und setzt anstelle dessen WS_EX_APPWINDOW.

    [ Dieser Beitrag wurde am 03.11.2002 um 16:47 Uhr von -King- editiert. ]



  • Ich habe das ja so probiert, wie es mir auch lieber wäre:

    hMP3Player = CreateDialog(hInst, (LPSTR)IDD_MP3PLAYER, NULL, (DLGPROC)MP3Player);
    

    Aber wenn ich hParentWindow auf "NULL" setze (wie in diesem Beispiel) dann erscheint das Dialog nicht! Es erscheint mit CreateDialog nur, wenn ich das WndHandle von meinem MainWnd übergebe, oder eines der Childwindows...



  • Der Dialog darf dann natürlich auch nicht das Style WS_CHILD gesetzt haben, nicht 'untergeordnet'.



  • , löscht das ExStyle WS_EX_TOOLWINDOW und

    Wie kann man denn ein Style "löschen"?



  • Wie kann man denn ein Style "löschen"?

    LONG_PTR lExStyle;
    
      lExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
      lExStyle &= ~WS_EX_TOOLWINDOW;
      SetWindowLongPtr(hWnd, GWL_EXSTYLE, lExStyle);
    


  • Huch, sowas habe ich ja noch nie gesehen. Ich werde dann einmal ausprobieren...

    Bis gleich



  • DANKE. Es funktioniert!



  • Ein Problem gibts da noch.
    Es klappt zwar alles super, nur wenn ich ihn einklinke und wieder ausklinke, dann bleibt da so ein Fleck, wo der Player eingeklinkt war. Ich hab schon die Fenster mit UpdateWindow geupdatet, aber es bleibt dort. Wie könnte ich alles neu zeichnen lassen, um den Fleck wegzubekommen?



  • Hmmm, ist das Thema jetzt untergegangen?



  • InvalidateRect()



  • THX! Es Funzt jetzt alles! Genial!!!


Anmelden zum Antworten