Überlagerung von Dialogelementen



  • Hallo, ich habe folgendes Problem:
    In meiner CFormView Klasse blende ich meine Controls(Buttons, Edits etc) dynamisch ein und aus. Nun habe ich ein TextCtrl eingebaut, das sich automatisch vergrößert bei OnSetFocus und wieder verkleinert bei OnKillFocus. Jedoch kommt es vor, dass sich (durch die Vergrößerung) das TextCtrl und paar restliche Controls überlagern. D.h. Edits werden über dem TextCtrl gezeichnet, jedoch werden die Ereignisse an das TextCtrl gesendet(d.h. ich klicke auf das editctrl und das TextCtrl reagiert). Ich habe alles probiert: über SetWindowPos den z-level des TextCtrl auf wndTop gesetzt, sowie die restlichen auf wndBottom gesetzt. Hat alles nichts gebracht. Wo könnte mein Problem liegen?

    Gruß



  • Hallo zusammen,

    ich habe momentan das selbe Problem und würde mich über eine Lösung echt freuen. Hat jemand eine Idee?

    Grüße



  • Hallo,

    nochmal zu dem (wie ich finde :)) sehr allgemeinen Problem:

    Es gibt zwei Dialogelemente (ob nun Static, Edit, List, Button... ganz allgemein: Fenster), die sich überlagern. Wie holt man nun eines davon in den Vordergrund und zwar so, dass es auch da bleibt...

    Ich könnte mir gut vorstellen, dass dieses Problem andere auch haben... vor allem dann, wenn die Dialogelemente dynamisch erzeugt werden.

    Viele Grüße



  • Das geht mit SetWindowPos(); schau mal in die MSDN

    Gruß
    :: NoName ::



  • Hi,

    leider funktioniert das nicht mit SetWindowPos(). Das so in den Vordergrund gestellt Fenster gerät sofort wieder in den Hintergrund, was dann wie ein "Grafikfehler" aussieht. Beim Threadersteller bzagh funktionierte das auch nicht.

    Viele Grüße



  • Hast du es denn auch so geschrieben ?

    SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    

    Ansonsten mal mit SetForegroundWindow(); versuchen...

    Gruß
    :: NoName ::



  • Hi,

    leider klappt es damit auch nicht. Ich poste mal den relevanten Code-Abschnitt, da gibt's nämlich noch eine PeekMessage-Schleife. Vielleicht hat es irgendetwas damit zu tun:

    HANDLE hThread = m_pObserverThread->m_hThread;
    CStatic *pWaitBox = new CStatic();
    CRect size;
    GetClientRect(&size);
    size.DeflateRect(int(0.2*size.right), int(0.4*size.bottom));
    pWaitBox->Create("Bitte warten, bis die aktuelle Aktion beendet ist...", WS_CHILD | WS_VISIBLE | SS_CENTER, size, this);
    pWaitBox->ShowWindow(SW_NORMAL);
    pWaitBox->SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    while (::WaitForSingleObject(hThread, 100) == WAIT_TIMEOUT)
    {
        MSG msg; 
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
        {
            if (!IsDialogMessage(&msg)) 
            { 
                ::TranslateMessage(&msg); 
                ::DispatchMessage(&msg); 
            } 
        }
    }
    m_pObserverThread = NULL;
    delete pWaitBox;
    

    Es wird also in der Dialog-Klasse (GUI) darauf gewartet, dass ein Thread beendet wird. Währenddessen soll dieses "Bitte warten"-Fenster eingeblendet werden.

    Viele Grüße


Anmelden zum Antworten