OnSize verdoppelt die Controls?



  • Hallo

    Ich wollte eigentlich erreichen, dass sich einige Steuerelemente der Dialoggrösse anpassen. Als erstes halt ein PCITURE-CONTROL (Member Variable CControl m_ctlImgBack). In der Resourcenansicht hab ich das Bild schon drin.

    So wollte ich es bewerkstelligen:

    void CHauptDlg::OnSize(UINT nType, int cx, int cy)
    {
    	CDialog::OnSize(nType, cx, cy);
    
    	// TODO: Add your message handler code here
    	if (::IsWindow(m_ctlImgBack.m_hWnd)) ::MoveWindow(m_ctlImgBack.m_hWnd,0, 0, cx, cy, TRUE);
            if (::IsWindow(m_ctlEdit.m_hWnd)) ::MoveWindow(m_ctlEdit.m_hWnd,0, 0, cx/2, cy/2, TRUE);
    
    }
    

    Das Ergebnis lässt zu wünschen übrig. Zwar wird die Anwendung normal gestartet (SW_NORMAL) und das Bild auch im gesamten Dialog angezeigt (ich hab es so in der DLG_Resource auch angepasst).

    Klicke ich nun auf den "Maximieren-Button" wird das Dialogfeld ja auf die gesamte Bildschirmfläche vergrössert. Soweit so gut. Auch das Picture-Control und somit das Bild wird korrekt vergrössert und angepasst. Nur etwas stört mich: Die Originalgrösse des Bildes (Pic-Control) ist trotzdem immer noch zu sehen, so als wäre dieses Control nun doppelt.

    Zudem festgestellt:
    Wenn ich z.B. ein EditControll habe, möcht ich diesen auch vergrössern, aber nur zur Hälfte. Also geb ich cx/2 und cy/2 an. Das funktioniert soweit ebenfalls. Was mir aber aufgefallen ist: Wieso bleiben die Controls nicht an der eigentlichen Stelle und wieso werden Sie nicht in die Originalgrösse zurückgrwandelt, wenn ich den Dialog wieder in den "Normalzustand" bringe?? (Verkleinern Button) ??

    Das gleiche Phänomem passiert, wenn ich den Dialog minimiere und danach wieder von der Taskleiste öffne!

    Hier 4 Bilder um es zu verdeutlichen:
    Dialog in der Originalgrösse SW_SHOWNORMAL

    Dialog maximiert <-- Hab hier das EditControl noch nicht dabei. (Allerdings wird es auf die gewünschte Grösse vergrössert, aber bleibt nicht an der Position wo es vorher war!)

    Dialog, nachdem minimieren wiederhergestellt (Von Taskleiste wieder angewählt)

    Dialog nach dem maximieren wiederhergestellt (Verkleinert)

    lg
    Wolf


  • Mod

    1. MoveWindow verändert auch die Position!
    Du kannst SetWindowPos verwenden, wenn es Dir nur um die Größe geht.
    2. Evtl. ist es ratsam, ein Invalidate zu machen.
    3. Überlagerte Kindfenster sind etwas ziemlich extremes, hier kann es je nach Reihefolge der Fenster zu aktualisierungsproblemen kommen, wenn nicht WS_CLIPCHILDREN oder WS_CLIPSIBLINGS verwendet wird.



  • Hallo Martin

    MoveWindow hab ich schon drin, das mit dem Invalidate wars. 🙂

    3. Überlagerte Kindfenster sind etwas ziemlich extremes, hier kann es je nach Reihefolge der Fenster zu aktualisierungsproblemen kommen, wenn nicht WS_CLIPCHILDREN oder WS_CLIPSIBLINGS verwendet wird.

    Bei jedem einzelnen Control?

    lg
    Wolf


  • Mod

    MSDN lesen macht klug;)



  • Martin Richter schrieb:

    MSDN lesen macht klug;)

    Ich bin dran.. 🙂 Allerdings hab ich grad Probs mit MINMAXINFO ... aber irgendwie klappt das denn schon.. 🙂

    Habe mal etwas von der GUILib gehört, mir das gezogen und installieren wollen, klappt nicht. Vor allem fehlt in diesem ZIP-Archiv die entsprechende lib-Datei. 🙂


  • Mod

    Wolf1985 schrieb:

    Martin Richter schrieb:

    MSDN lesen macht klug;)

    Ich bin dran.. 🙂 Allerdings hab ich grad Probs mit MINMAXINFO ... aber irgendwie klappt das denn schon.. 🙂

    Habe mal etwas von der GUILib gehört, mir das gezogen und installieren wollen, klappt nicht. Vor allem fehlt in diesem ZIP-Archiv die entsprechende lib-Datei. 🙂

    Und was haben die Sachen, die Du hier aufzählst mit WS_CLIPCHILDREN oder WS_CLIPSIBLINGS zu tun? Zu diesen Stichwörtern (WS_CLIPCHILDREN und WS_CLIPSIBLINGS) liefert die MSDN alle wichtigen Infos.



  • Ich habe das Problem gelöst.
    Habe etwas Interessantes gefunden, was auch sicher für Andere nützlich sein könnte: CtrlsResize.h und CtrlsResize.cpp:

    Hier der Link: http://visualcpp.net/index.php?qID=29


Anmelden zum Antworten