Problem mit SetWindowPos()



  • Moin,

    Ich habe wie im Header schon geschrieben ein Problem mit SetWindowPos im Zusammenhang mit CTabCtrl.

    Ich habe ein TabCtrl mit 5 Reitern erstellt und auch die Klassen dazu erstellt.
    Ich hab es nach einem Beispielmix von Hier und anderen Seiten gemacht und an sich funktioniert es auch. Nur schmeist mir der Kompiler im Debug-Mode für jedes SetWindowPos eine Asseration um die Ohren, die sich auf SetWindowPos bezieht. Aber auch nur, wenn ich Elemente in die PropPages setze. Die Ganze Applikation statet als Tray und SW_HIDE. Nach den Asserts läuft das Programm ohne murren.

    Das ist meine Vorgehensweise zum Positionieren der PropPages

    CRect rcItem;
    cTabMenu.GetWindowRect(&rcItem); //cTabMenu ist Controll von Tab
    //in den Bsp. ist von GetItemRect() die Rede, aber die Werte sind immer 0 !?
    
    cPropPage1.SetWindowPos(NULL, rcItem.left, rcItem.bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); //cPropPage1 ist link auf die PropertyPage gibt 1 bis 5
    

    Das rufe ich in der "OnTcnSelchange" auf um die Position der PropPage zu setzen.

    Das geliche Problem habe ich, mit "OnWindowPosChanged", wobei hier diese Vorgehensweise garnicht geht (Auch die gelichen Asserts aber dann noch einen Ausnahmefehler). Weiß einer warum? Ich hab jetzt die "lpwndpos" genommen, aber lieber wäre mir eine automatische Positionierung.

    Danke


  • Mod

    1. Warum machst Du das überhaupt mit CTabCtrl und nicht direkt mit CPropertySheet/CPropertyPage?
    2. Vermutlich machst Du das auch schon bevor die Pages angelegt wurden. Das heißt das Fenster handle ist noch NULL! WM_SIZE kommt auch schon bevor WM_CREATE ausgeführt wurde und dort legst Du vermutlich die Controls erst an...



  • Ist ein erstes Mal mit Tabs und PropPages...

    1. Weil ich mich an den Beispielen orientiert habe und es funktioniert. Wenns ne andere Methode gibt schau ich mir die Gerne an (wenn du nen Link hast immer her damit 😉 )

    2. Stimmt ich erstelle meine Pages in WM_CREATE. Sollte / Muss ich die jetzt in WM_SIZE verlegen?



  • So neue Erkenntnis:

    Ich hab mal OnWindowsPosChanged() auskommentiert und nun sind die Asserts weg.
    Alerdings ist das doch die Funktion die dafür sorgt, dass man mitbekommt ob die Position des Fensters verändert wurde. Und somit brauch ich die doch um meinen PropPages zu sagen wo sie gefälligst "mitwandern" sollen.


  • Mod

    Uruk-h4j schrieb:

    So neue Erkenntnis:

    Ich hab mal OnWindowsPosChanged() auskommentiert und nun sind die Asserts weg.
    Alerdings ist das doch die Funktion die dafür sorgt, dass man mitbekommt ob die Position des Fensters verändert wurde. Und somit brauch ich die doch um meinen PropPages zu sagen wo sie gefälligst "mitwandern" sollen.

    Verstehe ich nicht.
    Wenn Du es richtig gemacht hast, sind die PropertyPages Child Windows und die wandern immer mit dem Parent mit...

    Bliebt immer noch meine Frage: Warum arbeitest Du nicht mit den systemeigenen CProprtySheet/CPropertyPage?



  • Wenn Du es richtig gemacht hast, sind die PropertyPages Child Windows und die wandern immer mit dem Parent mit...

    Woher weiß ich ob cihs wirklich "Richtig" gemacht hab? Wie gesagt ich hab das CTabCtrl angelegt und dann jeweils die Klasse CPorpertyPage hinzugefügt. Den Dialog hab ich dann mit cPropPage angelegt und verwende den jetzt. Ich hab nirgends angeben müssen ob Child oder nicht. in davon ausgegangen, dass sie als Child automatisch erstellt werden. Wenn ich ohne "SetWindowPos" arbeite liegen die Dialoge in der oberen linken Ecke.

    Bliebt immer noch meine Frage: Warum arbeitest Du nicht mit den systemeigenen CProprtySheet/CPropertyPage?
    

    Leider steh ich gerade auf der Leitung und komm nicht mit. Wie binde ich systemeigene CPropertyPages ein? Oder reden wir aneinander vorbei?

    Ich hab vorerst ein Workaround gemacht was mir die Asserts vom Leib hält. Besser wäre aber es richtig zu haben.


  • Mod

    Dann hast Du es IMHO falsch gemacht. CPropertyPage wird von CPropertySheet behandelt. CPropertyShett managed alles mit dem TabCtrl...



  • Aha. Also soll das jetzt im Klartext heißen, dass ich einfach nur die Klasse PropertySheet einfügen muss oder muss (für alle oder nur einmal?)? oder muss ich alle PorpertyPages ersetzen?


  • Mod

    CPropertySheet ist das Parent für alle CPropertyPage's.



  • So habs geschaft das in ein PropertySheet einzuarbeiten. Zwar nur dass er angezeigt wird, aber das ist ja jetzt nen adneres Thema.

    Danke martin. Ich werd dann wohl erstmal ein wenig lesen müssen und erstell bei bedarf nen neuen Thread.

    -CLOSED-


Log in to reply