Set Parent()-childwindow bleibt unsichtbar!? [gelöst]



  • Hallo,
    ich habe folgende Frage:
    ich habe mit SetParent meinem programm ein anderes fenster (zu übungszwecken editor) als childwindow zugewiesen. die Funktion SetParnt funktioniert auch wunderbar- nur leider macht sie auch das child-windiw unsichtbar. ich habe es schon mit ShowWindow/SetForegroundWindow/UpdateWindow etc. + dem vorher bestimmten Handle von Editor versucht. erfolglos 😞 .

    Wie kann ich denn ein so "erstelltes" Child-window sichtbar machen?

    übrigens: nein, das fenster wird nicht irgendwei egschollse oder abgeschossen, denn wenn ich es hinterher wieder als cjild-window vom desktop definiere ist es wieder da 🙂 ; es ist also nur unsichtbar.

    danke schonmal,
    andi01.



  • Also, ich hab diesen Code von dir übersetzt (nur nodepad selber geöffnet):

    #include<iostream>
    #include<windows.h>
    #include<conio.h>
    #include<winuser.h>
    #include <TCHAR.h>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        HWND hwnd=FindWindow(0, TEXT("Unbenannt - Editor"));
        cout<<"Handle Editor: "<<hwnd<<endl;
        Sleep(1000);
        if(hwnd==NULL)
        {
            cout<<"Bitte starten Sie editor!\n";
        }
        SetParent(hwnd, GetConsoleWindow());
        Sleep(1000);
    /*
        HWND child=FindWindowEx(GetConsoleWindow(), NULL, 0, TEXT("Unbenannt - Editor"));
        cout<<"child-handle: "<<child<<endl;
        ShowWindow(child, SW_NORMAL);
        UpdateWindow(child); */ tut nix nur Sache, da es nicht unsichtbar ist
        getch();
    }
    

    und bei mir sieht es dann so aus:
    http://img40.imageshack.us/img40/7025/unbenanntsm.png
    es ist nicht unsichtbar, sondern eben ein child window der Konsole und auch nur in dem Arbeitsbereich der Konsole sichtbar.
    Vielleicht siehst du den Editor nicht, weil deine Konsole zu klein ist (mal größer ziehen?)



  • also ich habe genau deinen code einfach kopiert. bei mir wird editor einfach unsichtbar, selbst wenn ich den kommentierten code verwende 😕 😕

    ich benutze WinXP und MS Visual C++ 2008 Express Edition(mit UniCode); sollte ich vielleicht einmal einen anderen compiler verwenden???

    ich kapiers einfach nicht woran das luiegt, bei dir gehts doch auch?!

    danke schonmal,
    andi01.



  • 2. edit: lol, jetzt gehts ´bei xP^^

    hatte vergessen das fenster nach untern größer zu machen, da war die ganze zit editor XDD 😃

    danke, etz gehts 🙂 .

    nur kann man das fenster auch rausschieben auf den desktop wie es normal ist? es kann ja trotzdem als child-window dekleriert bleiben. Was ich meien ist: mit CreateWindow() erstelle ich ja auch ein child-window. das ist aber doch auch außerhalb der ersten fensters! geht das hier auch irgendwie?

    danke schonmal,
    andi01.



  • ich kann dir leider nicht sagen warum es bei dir nicht geht, ich hab XP SP3 und es klappt bei mir...



  • sry unsere posts haben sich wahrscheinlich überschnitten 😃 . siehe edit oben^^

    thx, andi01.


  • Mod

    Es gibt einen Untereschied zwischen Child-Windows und Owned Windows.

    Childwindows liegen immer Client Bereicht des Parents.
    Lies diesen Artikel von Kyle Marsh.

    http://msdn.microsoft.com/en-us/library/ms997562.aspx



  • ok. kann man dann ein bereits offenes fenster auch einfach als owned window deklerieren? Bsp editor: kann man den auch einfach als owned-window der konsolenanwendung dklerieren? gibts da auch so einen einfachen befehl wie setparent()?

    danke schonmal,
    andi01.


  • Mod

    Du hast den Artikle nicht gelesen.

    Man spricht von Owner wenn WS_CHILD nicht gesetzt ist.
    Man spricht von Parent wenn WS-CHILD gesetzt ist.

    Beides bezieht sich auf die selbe Info im Fenster und auf diese Info wird mit GetParent/SetParent zugegriffen.

    Ansonsten verstehe ich Deine Frage in keiner Weise. Am Besten Du liest den Artikel nochmal schon langsam. 🕶



  • der artikel ist einfach ein wenig kompliziert^^
    ich werde ihn nochmal in ruhe durchlesen.

    also ein child-window ist automatisch auch ein owned-window, oder?

    immerhin kann man doch mit dem Befehl SetParent kein WS_CHILD setzen oder nicht setzen, dort kann man doch nur die beiden handles angeben und ein window als childwindow deklerieren.

    naja ich werde den artikel wircklich nochmal in Ruhe durchlesen.

    mfg,
    andi01.



  • Bitte schön langsam lesen:

    andi01 schrieb:

    also ein child-window ist automatisch auch ein owned-window, oder?

    Das ist genau falschrum!
    Martin Richter hat richtig geschrieben:

    Martin Richter schrieb:

    Man spricht von Owner wenn WS_CHILD nicht gesetzt ist.
    Man spricht von Parent wenn WS-CHILD gesetzt ist.

    Martin



  • achso, owner window, nicht owned window^^ achsoo, etz versteh ich das 😃

    somit müsste also das owner das parentwindow sein(bzw. child-window vom desktop).

    noch eine kleine frage: wenn ich das parent-window schließe geht ja das child-window mit zu. ist das umgekehrt auch so?

    danke, andi01.



  • andi01 schrieb:

    noch eine kleine frage: wenn ich das parent-window schließe geht ja das child-window mit zu. ist das umgekehrt auch so?

    Nein, das musst du selbst ausprogrammieren, wenn es so sein soll (vergleiche das mit einem Klick auf den OK/Schliessen-Button eines Dialogs, der Button ist ein Child des Dialogs, und der Programmierer legt fest, dass sich der gesamte Dialog schliessen soll, wenn der Benutzer die Eingaben bestätigt hat. Eventuell muss aber das Schliessen verhindert werden, wenn z.B. fehlerhafte Eingaben getätigt wurden).

    MfG,

    Probe-Nutzer



  • ok, danke.

    nur wie kriegt man das hin dass sich das parent mitschließt? ein Möglichkeit wäre in einem 2. thread vom parent ständig zu überwachen ob das child noch aktiv ist und wenn nicht das parent zu schließen. gut, das funktioniert, aber geht das nicht auch einfacher und eleganter dass sich das parent mitschließt? kann man die beiden fenster nicht irgendwie koppeln dass das andere mit zugeht wenn man eines schließt?

    denn die Lösung mit der dauernden überwchung hat einige Nachteile: schlechte performance(viel unnötige cpu-auslastung bei dauernder überpfrüfung), relativ aufwändig zum schreiben,macht das programm nur unnötig kompliziert und den code schwerer zu verstehen,...

    danke schonmal,
    andi01.


  • Mod

    Schick doch einfach WM_CLOSE and das Parent, wenn das Child schließt.



  • stimmt, diese Lösung gefällt mir schon viel besser und auch die performance ist sehr viel besser weil dadurch nicht unnötig cpu-auslastung hervorruft 🙂 .

    ich nehme mal an das war die einfachste Lösung, oder? oder kann man das irgendwie so hinkriegen dass das parent einfach von selbst zugeht wenn man das child zumacht?

    danke,
    andi01.


  • Mod

    Nein!



  • ok, damit ist das Thema gelöst.

    danke an alle,
    andi01.


Anmelden zum Antworten