Historique des modifications - Message

Message #10598

Sujet: Position de la fenêtre


Type Date Auteur Contenu
Création du message 06-07-2012 10:42:52 johnplayer
J'ai le même problème problème donc je me permet de déterrer le topic^^.
En fait, j'ai réussi à récupérer la position de la fenetre et j'ai aussi réussi à la positionner.

Seulement sous windows, désolé pour les autres, je n'ai pas linux.

Pour récupérer la position : (il est possible de récupérer le cadre de la fenetre avec quelques modifs)
position2di getWindowPos()
{
    #ifdef _DEBUG
    printf("Preparation pour la recuperation de la position de la fenetre\
");
    #endif
    SExposedVideoData evd = mDriver->getExposedVideoData();
    if(mDevice->getType() != EIDT_WIN32) return position2di(0,0);
    HWND handle=NULL;
    #ifdef _DEBUG
    printf("Recuperation du handle de la fenetre\
");
    #endif
    switch(mDriver->getDriverType())
    {
        case EDT_DIRECT3D8: handle = (HWND)evd.D3D8.HWnd; break;
        case EDT_DIRECT3D9: handle = (HWND)evd.D3D9.HWnd; break;
        default: handle = (HWND)evd.OpenGLWin32.HWnd; break;
    }
    #ifdef _DEBUG
    printf("Handle %s\
", handle?"valide":"invalide");
    printf("Recuperation de la position de la fenetre\
");
    #endif
    WINDOWPLACEMENT lpwndpl;
    lpwndpl.length = sizeof(WINDOWPLACEMENT);
    if( GetWindowPlacement(handle, &lpwndpl) )
    {
        #ifdef _DEBUG
        printf("Position de la fenetre : %ld; %ld\
", lpwndpl.rcNormalPosition.left, lpwndpl.rcNormalPosition.top);
        #endif
        return position2di( lpwndpl.rcNormalPosition.left, lpwndpl.rcNormalPosition.top );
    }
    else
    {
        #ifdef _DEBUG
        printf("La recuperation a echouee\
");
        #endif
        return position2di(0,0);
    }
}

Pour la positionner :

void setWindowPos(position2di pos)
{
    #ifdef _DEBUG
    printf("Preparation pour la modification de la position de la fenetre\
");
    #endif
    SExposedVideoData evd = mDriver->getExposedVideoData();
    if(mDevice->getType() != EIDT_WIN32) return;
    HWND handle=NULL;
    #ifdef _DEBUG
    printf("Recuperation du handle de la fenetre\
");
    #endif
    switch(mDriver->getDriverType())
    {
        case EDT_DIRECT3D8: handle = (HWND)evd.D3D8.HWnd; break;
        case EDT_DIRECT3D9: handle = (HWND)evd.D3D9.HWnd; break;
        default: handle = (HWND)evd.OpenGLWin32.HWnd; break;
    }
    #ifdef _DEBUG
    printf("Handle %s\
", handle?"valide":"invalide");
    printf("Recuperation de la taille de la fenetre\
");
    #endif
    dimension2di windowsize(-1,-1);
    WINDOWPLACEMENT lpwndpl;
    lpwndpl.length = sizeof(WINDOWPLACEMENT);
    if( GetWindowPlacement(handle, &lpwndpl) )
        windowsize = dimension2di( (lpwndpl.rcNormalPosition.right - lpwndpl.rcNormalPosition.left), (lpwndpl.rcNormalPosition.bottom - lpwndpl.rcNormalPosition.top) );
    #ifdef _DEBUG
    printf("Position actuelle de la fenetre : %ld; %ld\
", lpwndpl.rcNormalPosition.left, lpwndpl.rcNormalPosition.top);
    printf("Taille de la fenetre : %ix%i\
", windowsize.Width, windowsize.Height);
    printf("Changement de la position de la fenetre a la position : %ix%i\
", pos.X, pos.Y);
    #endif
    POINT min; min.x = min.y = 0;
    POINT max; max.x = max.y = 10000;
    RECT rect; rect.left = pos.X; rect.top = pos.Y; rect.right = pos.X+windowsize.Width; rect.bottom = pos.Y+windowsize.Height;
    lpwndpl.length = sizeof(WINDOWPLACEMENT);
    lpwndpl.flags = WPF_SETMINPOSITION;
    lpwndpl.showCmd = SW_SHOW;
    lpwndpl.ptMinPosition = min;
    lpwndpl.ptMaxPosition = max;
    lpwndpl.rcNormalPosition = rect;
    SetWindowPlacement(handle, &lpwndpl);
}

Maintenant, le problème, c'est que je dois récupérer la position de la fenetre à la fermeture du logiciel. Mais GetWindowPosition() foire si closedevice() a déjà été appelée.

Donc la question est : comment récupérer la position de la fenêtre lorsque l'utilisateur clique sur le bouton fermer de la barre de titre? Car dans ce cas, closeDevice() est appelée en interne.
Peut-on intercepter le message de ce bouton?

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
144 invités en ligne
membre en ligne: -
RSS Feed