Dialog -> "Always on Top"



  • Moin.

    Ich habe in meiner WinCE Anwendung einen Dialog, welcher auch dann noch angezeigt werden soll, wenn ein Dialog im Hintergrund angeklickt wird.

    Denke das ist ja auch die Definition von "Always on Top".

    So habe ich es versucht, aber es funktioniert nicht. Was mache ich falsch?

    BOOL CDialogMessage::OnInitDialog()
    {
    	int		Ret;
    
    	CDialog::OnInitDialog();
    
    	//--- Always on Top
    	Ret = SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    	//Ret = ::SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST ,0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
    }
    


  • Hi

    Du musst auch dafuer sorgen, dass in deiner Dialog-Ressource der EXSTYLE das WS_EX_TOPMOST Flag enthaelt.

    Wenn du die Dialog-Ressource im Ressource Editor erstellst, findest du das bei den Eigenschaften das Dialogs unter "Darstellung/Topmost", das musst du auf True setzen.

    Zur Laufzeit kann man das so aendern.

    LONG exstyle	= ::GetWindowLong( m_hWnd, GWL_EXSTYLE); 
    exstyle |= WS_EX_TOPMOST;
    ::SetWindowLong( m_hWnd, GWL_EXSTYLE, exstyle);
    

    PantaRhei



  • Hi, erstmal vielen Dank für Deine Antwort.

    PantaRhei schrieb:

    Hi

    Du musst auch dafuer sorgen, dass in deiner Dialog-Ressource der EXSTYLE das WS_EX_TOPMOST Flag enthaelt.

    Wenn du die Dialog-Ressource im Ressource Editor erstellst, findest du das bei den Eigenschaften das Dialogs unter "Darstellung/Topmost", das musst du auf True setzen.

    Ich habe die Dialog Ressource in der Ressourcen Ansicht erstellt. Nur sehe ich bei mir unter Eigenschaften des Dialogs "Darstellung/Topmost" nicht.

    Hier ein Screenshot:
    http://img291.imageshack.us/img291/3117/eigenschaften.png

    PantaRhei schrieb:

    Zur Laufzeit kann man das so aendern.

    LONG exstyle	= ::GetWindowLong( m_hWnd, GWL_EXSTYLE); 
    exstyle |= WS_EX_TOPMOST;
    ::SetWindowLong( m_hWnd, GWL_EXSTYLE, exstyle);
    

    PantaRhei

    Den Code habe ich bei mir auch mal unter OnInitDialog hinzugefügt. Leider scheint das auch keine Wirkung zu haben 😞



  • Versuch mal die Ressourcedatei (*.rc) direkt zu editieren, muesste dann z.B. so aussehen:

    IDD_DIALOG1 DIALOGEX 0, 0, 316, 184
    STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
    EXSTYLE WS_EX_TOPMOST
    CAPTION "Dialog"
    FONT 8, "MS Shell Dlg", 400, 0, 0x1
    BEGIN
        DEFPUSHBUTTON   "OK",IDOK,205,163,50,14
        PUSHBUTTON      "Abbrechen",IDCANCEL,259,163,50,14
    END
    

    Wie gesagt, die Zeile "...EXSTYLE WS_EX_TOPMOST..." ist wichtig.



  • Also es sieht jetzt so aus:

    IDD_DIALOG_BURN_MESSAGE DIALOG  0, 243, 182, 54
    STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_SYSMENU
    EXSTYLE WS_EX_TOPMOST 
    FONT 8, "MS Shell Dlg"
    BEGIN
    END
    

    Ist das richtig?

    So funktioniert es bei mir leider auch nicht.

    Muss man bei WinCE vielleicht etwas beachten?



  • Tja, es koennte an CE selbst liegen. Hab mal ein Testprojekt fuer CE erstellt und konnte im Ressourcen-Editor auch nur das einstellen, was bei dir sichtbar war. Aber ursprueglich stand in den About-Dialogen dies:

    IDD_ABOUTBOX DIALOG  0, 0, 156, 129
    STYLE DS_SETFONT | DS_SETFOREGROUND | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMODAL
    EXSTYLE 0x80000000L
    ...
    

    Ich habe WS_EX_TOPMOST dazu addiert, also so:

    ...
    EXSTYLE WS_EX_TOPMOST | 0x80000000L
    ...
    

    Und schon bin ich mit meiner Weisheit am Ende.


Anmelden zum Antworten