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?