Dialogposition fixieren



  • Hallo Leute,

    ich habe in der FAQ mal gestöbert und dazu nichts gefunden. Das kleine Programm soll unter Win CE laufen und ich benutze das VS2008.

    Ich habe es erstmal wie folgt versucht:

    SetWindowPos(&CWnd::wndTop, 1, 1, 240, 295, SWP_NOSENDCHANGING );
    

    Die Option "SWP_NOSENDCHANGING" gibt es laut compiler nicht. Ich hatte auch schon versucht anstatt "wndTop" "wndTopMost" zu verwenden. Damit allerdings habe ich dann ein Problem mit Fehlermeldungen genauer gesagt mit Message-Boxen, die sind dann logischerweise hinter dem Dialog.
    Der Dialog ist so beschaffen, dass er den gesamten Bildschirm des kleinen Gerätes ausfüllt, also müsste es genügen, wenn ich ihn an seiner Position fixieren kann.
    Hat jemand eine Idee dazu?

    Viele Grüße
    Ranger



  • Bevor ich hier nochmal als dumm eingestuft werde möchte ich zwischenzeitlich mal loswerden, dass ich für einen Teil der Probleme eine Lösung gefunden habe. Auch hier hat mehr suchen geholfen. Wenn mein Dialog schon wndTopMost ist, kann ich die MessageBox durch den Style MB_TOPMOST sozusagen noch obendrauf setzen. Der Dialog ist nach dem Schließen der MessageBox wieder wndTopMost.

    Wie ich in der ursprünglichen Frage aber schrieb, möchte ich gern, dass der Dialog nicht verschoben wird. Ich habe versucht die WM_WINDOWPOSCHANGING abzufangen und zu umgehen. Die scheint es bei WinCE Geräten nicht zu geben (hängt möglicherweise mit dem Touch-Screen zusammen), Ich ahbe anschließend versucht WM_WINDOWPOSCHANGED zu überladen und den Dialog wieder auf den Ursprünglichen Platz zu setzen, aber da schmiert das Programm dann ab. Im Debugger sehe ich, dass er ständig durch diese Funktion läuft:

    void CTopDlg::OnWindowPosChanged(WINDOWPOS* lpwndpos)
    {
    	CDialog::OnWindowPosChanged(lpwndpos);
    
    	SetWindowPos(&CWnd::wndTopMost, 1, 1, 240, 295, SWP_SHOWWINDOW );
    }
    

    Die SetWindowPos() Methode ist aber auch bereits in der OnInitDialog() Methode enthalten. Ich denke er dreht sich irgendwie im Kreis. Nach mehreren Durchläufen landet er hier:

    void __cdecl AtlTraceVU(DWORD_PTR dwModule, const char *pszFileName, int nLine,
    						DWORD_PTR dwCategory, UINT nLevel, const WCHAR *pszFormat, va_list ptr)
    {
    	const CAtlTraceCategory *pCategory;
    	CAtlTraceModule::fnCrtDbgReport_t pfnCrtDbgReport = NULL;
    ...
    

    Habe ich etwas übersehen?

    VG
    Ranger

    Edit: Hab die Funktion aus der OnInitDialog() herausgenommen, gleiches Bild.


  • Mod

    Wenn Du selbst SetQWindowPos ausführst must Du die Positionierung ja zulassen. Also setze ein Flag... sonst hast Du ein Rekursionsproblem.

    Die Doku von CE kennt WM_WINDOWSPOSCHANGING nicht.



  • Hallo Martin,

    danke für die Hilfe. Die fehlende Unterstützung besagter Nachricht, habe ich beim compilieren schon bemerkt. Ich kann in der Umgebung den Meldungshandler des Dialogs für die Nachricht zwar erstellen, aber das Programm lässt sich daher nicht mehr erstellen. Aber klar, wenn sie nicht in der Doku steht gibt es sie nicht.
    Das Rekursionsproblem muss noch raus.

    Danke
    Ranger


Log in to reply