#0 

30-01-2012 01:09:08

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

Hello,
Je voulais savoir si il était possible, à la création de la fenêtre de rendu, de pouvoir la positionner ou l'on veut. Car par défaut, elle se créer toujours au centre de l'écran, mais est-il possible de modifier ça ? (par exemple, toujours en haut à gauche)


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#1 

30-01-2012 09:47:11

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

si bien sur on peut, code perso

Code c++ :


        void moveDevice(irr::IrrlichtDevice *device, irr::core::dimension2du pos)
        {
            irr::video::SExposedVideoData evd = device->getVideoDriver()->getExposedVideoData();
            #if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
                if(device->getType() != EIDT_WIN32) return;
                HWND handle;
                switch(device->getVideoDriver()->getdevice->getVideoDriver()Type())
                {
                    EDT_DIRECT3D8: handle = (HWND)evd.D3D8.HWnd; break;
                    EDT_DIRECT3D9: handle = (HWND)evd.D3D9.HWnd; break;
                    default: handle = (HWND)evd.OpenGLWin32.HWnd; break;
                }
                ShowWindow(handle, SW_SHOW);
                UpdateWindow(handle);
                MoveWindow(handle, pos.Width, pos.Height, device->getVideoDriver()->getScreenSize().Width, device->getVideoDriver()->getScreenSize().Height, FALSE);
            #elif defined __linux
                if(device->getType() != irr::EIDT_X11) return;
                if(evd.OpenGLLinux.X11Display && evd.OpenGLLinux.X11Window)
                    XMoveWindow((Display*)evd.OpenGLLinux.X11Display, (Window)evd.OpenGLLinux.X11Window, pos.Width, pos.Height);
            #endif
        }


j'est egalement pour changer la résolution et switcher en fullscreen wink
je n'est pas tester la partie windows encore mais ce devrait fonctionner théoriquement

Hors ligne


#2 

30-01-2012 10:43:48

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

Merci Magun, c'est nickel smile
Sinon, quand tu parle de fullscreen, est ce que tu veux dire "en gardant la barre en haut de la fenêtre  avec les boutons "fermer" "agrandir"..."
ou carrément fullscreen ?
Parce que ça m'intéresserais bien , mais en gardant les boutons en haut si tu vois ce que je veux dire.
Merci.

edit:
et j'aimerais même, changer de résolution en cours de route, a priori, ce n'est possible direct avec Irrlicht mais possible en utilisant le handle Windows (ou un truc comme ça mais que je ne maitrise absolument pas).
Car mon problème enfaite est que: je créer un fenêtre avec IrrDevice, puis je la déplace avec le bout de code que tu ma filé, ça marche impec wink sauf que, la fenêtre s'affiche d'abord au milieu, puis se déplace, mais sa premier position reste imprimer à l'ecran en arriere plan !
la solution (la bricole plutôt) que j'ai trouvé pour solutionner ça, c'est de créer un fenêtre de taille (0,0) puis de la déplacer. Ca marche, mais je suis obliger de la redimensionner avec ma souris par la suite sad donc l'idée était plutôt de ensuite la redimensionner en (1024, 100) par exemple.
(ho là là là, je ne sais pas si c'est bien compréhensible tout ça).

edit2:
En plus de ça, j'aimerais récupérer la position de la fenêtre (dans Windows) , parce que du coup, le but pour moi était donc de la placer où je voulais, mais que si on la déplace, au moment ou on la ferme, ça enregistre sa position afin de la faire réapparaitre au même endroit à la prochaine ouverture du logiciel.

Dernière modification par nabouill (30-01-2012 14:32:21)


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#3 

30-01-2012 21:10:31

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

pour un fullscreen windowed il faut juste changer la grandeur de la fenetre à la taille de l'écran moins la taille des decorations (minus, close, ...)
    BorderX = GetSystemMetrics(SM_CXDLGFRAME);

    BorderY = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYDLGFRAME);

par contre j'est le code pour changer la taille de la fentre a la voler pour irrlicht, tout comme pouvoire changer en fullscreen également a la voler, a ce que je sache je suis le seul utilisant irrlicht qui les pondues smile
maintenant y a rien de compliquer ...
bref, le fait que le device ne change pas de place directement (sous windows), c'est surment qu'il faut faire un update du Handle après le code que je t'est passer

pour récupéré la position de la fenêtre la malheureusement je ne c'est pas, je suis pro linux, et chercher dans les doc c'est reloue, tu me préviens si tu trouve a la rigeur ? wink

le code est similaire pour changer la résolution

Code c++ :

        void resizeDevice(irr::IrrlichtDevice *device, irr::core::dimension2du size)
        {
            irr::video::SExposedVideoData evd = device->getVideoDriver()->getExposedVideoData();

            #if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
                if(device->getType() != EIDT_WIN32) return;
                irr::core::dimension2du pos = device->getVideoModeList()->getDesktopResolution();
                    pos -= size;
                    pos /= 2;
                HWND handle;
                switch(device->getVideoDriver()->getdevice->getVideoDriver()Type())
                {
                    EDT_DIRECT3D8: handle = (HWND)evd.D3D8.HWnd; break;
                    EDT_DIRECT3D9: handle = (HWND)evd.D3D9.HWnd; break;
                    default: handle = (HWND)evd.OpenGLWin32.HWnd; break;
                }
                ShowWindow(handle, SW_SHOW);
                UpdateWindow(handle);
                MoveWindow(handle, pos.Width, pos.Height, size.Width, size.Height, FALSE);
            #elif defined __linux
                if(device->getType() != irr::EIDT_X11) return;
                if(evd.OpenGLLinux.X11Display && evd.OpenGLLinux.X11Window)
                {
                    XResizeWindow((Display*)evd.OpenGLLinux.X11Display, (Window)evd.OpenGLLinux.X11Window, size.Width, size.Height);
                    XRaiseWindow((Display*)evd.OpenGLLinux.X11Display, (Window)evd.OpenGLLinux.X11Window);
                    XFlush((Display*)evd.OpenGLLinux.X11Display);
                }
            #endif
            device->getVideoDriver()->OnResize(irr::core::dimension2du(size.Width, size.Height));
            device->getVideoDriver()->setViewPort(irr::core::recti(0,0,size.Width, size.Height));
            printf("resize device to %dx%d\n", size.Width, size.Height);
        }


pour passer en fullscreen je te laisse la joie de trouver smile

edit:
    c'est:
        rect r;

    GetClientRect(HWnd, &r);
    pour récupéré la boundingbox de la fenetre

Hors ligne


#4 

31-01-2012 20:37:02

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Heu sinon il existe aussi tout simplement le device->setResizable(true); smile


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#5 

01-02-2012 23:50:03

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

oui mais le "device->setResizable(true)" te sert juste à autoriser le redimensionnement de la fenêtre, mais ensuite tu dois la redimensionner à la taille que tu veux à la mano avec ta souris.

Sinon merci encore Magun pour ton bout de code pour passer en fullscreen, ça marche impec smile pour ce qui est du "GetClientRect(HWnd, &r)" ça me renvois en gros la taille de la fenêtre un peu comme un "device->getVideoDriver()->getViewPort()". Et non la position de la fenêtre.
Mais je suis en pleine recherche dans la doc, je vais finir par trouver.

En fait pour être plus clair, je travaille sur un petit projet "IrrEditWorld" un peu dans le genre IrrEdit, sauf que plutôt que de créer une fenêtre principal avec divers fenêtre de paramètre, view, menu... dedans. Je créer plusieurs "IrrlichtDevice" qui ont chacune leurs rôles, une pour la gestion de l’Edition avec barre de menu et barre d'outil, une de propriété, une de tree model, de une à quatre pour les vue (3d, top, left...) ...
Le but étant de pouvoir placer chacune d'elle ou l'on veut dans son environnement et à la taille désiré (ce qui en plus à l'avantage d'être particulièrement utile pour ceux qui aime bosser en double écran) . Au moment où l'utilisateur quitte le logiciel j'enregistre les positions et tailles de chaque fenêtre afin qu'elle puisse être remise en place à l'identique à la prochaine ouverture du logiciel.

Mais avant les bout de code de Magun, je n'avais jamais pensé à aller taper direct dans la lib Windows roll

Edit: je vous redis dès que je trouve, en attendant si quelqu'un trouve avant, je suis preneur aussi smile

Dernière modification par nabouill (01-02-2012 23:52:27)


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#6 

02-02-2012 22:18:16

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Si tu veux taper dans la mfc,  regarde du côté de GetWindowRect plustôt wink


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#7 

06-07-2012 12:42:52

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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)

Code:

position2di getWindowPos()
{
    #ifdef _DEBUG
    printf("Preparation pour la recuperation de la position de la fenetre\n");
    #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\n");
    #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\n", handle?"valide":"invalide");
    printf("Recuperation de la position de la fenetre\n");
    #endif
    WINDOWPLACEMENT lpwndpl;
    lpwndpl.length = sizeof(WINDOWPLACEMENT);
    if( GetWindowPlacement(handle, &lpwndpl) )
    {
        #ifdef _DEBUG
        printf("Position de la fenetre : %ld; %ld\n", lpwndpl.rcNormalPosition.left, lpwndpl.rcNormalPosition.top);
        #endif
        return position2di( lpwndpl.rcNormalPosition.left, lpwndpl.rcNormalPosition.top );
    }
    else
    {
        #ifdef _DEBUG
        printf("La recuperation a echouee\n");
        #endif
        return position2di(0,0);
    }
}

Pour la positionner :

Code:

void setWindowPos(position2di pos)
{
    #ifdef _DEBUG
    printf("Preparation pour la modification de la position de la fenetre\n");
    #endif
    SExposedVideoData evd = mDriver->getExposedVideoData();
    if(mDevice->getType() != EIDT_WIN32) return;
    HWND handle=NULL;
    #ifdef _DEBUG
    printf("Recuperation du handle de la fenetre\n");
    #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\n", handle?"valide":"invalide");
    printf("Recuperation de la taille de la fenetre\n");
    #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\n", lpwndpl.rcNormalPosition.left, lpwndpl.rcNormalPosition.top);
    printf("Taille de la fenetre : %ix%i\n", windowsize.Width, windowsize.Height);
    printf("Changement de la position de la fenetre a la position : %ix%i\n", 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?


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#8 

12-07-2012 10:41:26

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
81 invités en ligne
Aucun membre connecté
RSS Feed