Déplacer une fenetre

Résolu
cs_Vinsininounet Messages postés 25 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 6 avril 2008 - 14 juil. 2007 à 00:07
cs_Vinsininounet Messages postés 25 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 6 avril 2008 - 18 juil. 2007 à 12:16
Bonjour à tous,

Je suis un petit débutant en C mais j'ai une question qui me trotte dans la tete depuis pas mal de temps :

Je voudrais savoir si il existait un moyen de déplacer une fenetre ouverte avec la SDL sur l'ecran ,
du genre, la centrer ,ou la placer dans un coin ,enfin j'espere que vous m'avez compris ... 

Pour ceux qui m'ont compris et qui penvent m'aider je les remercient d'avance.

Sinon bonne continuation a tout le monde.

// dsl pour les fautes d'orthographe si il y en a , je suis crevé ... j'vais m'coucher . a +

8 réponses

ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
14 juil. 2007 à 10:28
Salut !

Il faut récupérer le HANDLE créé par SDL. De mémoire : HWND hWindow = GetWindow(0,0);
Si je me souvient bien, en méttant (0, 0) ca récupère la fenètre principale de l'application appelant la fonction. Sinon il y à aussi les fonctions FindWindow et EnumWindows.

Une fois que tu à le Handle, tu peux faire tout ce que tu veux avec ta fenêre.
BOOL SetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl);
3
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
14 juil. 2007 à 11:14
Alors pour la première question, je peux pas te certifier à 100% que ca va marcher, j'ai pas mon IDE sous la maain ni mon code où j'avais fait ca. Mais l'idée est la. Enfin, il faut que tu corrige une erreur quand même :
HWND fenetre ;
WINDOWPLACEMENT pos; //Pas un pointeur, sinon tu n'a pas la zone mémoire associée
pos.x = 100; //Du coup c'est des points et non des flèches
pos.y = 200;
fenetre = GetWindow(0,0);
SetWindowPlacement(fenetre, &pos); //Et ici tu passe l'adresse de ta variable (retour à un pointeur)

Pour la deuxième question, tu peux récupérer les positions de n'importe quelle fenêtre, il te faut juste trouver le handle de ces fenêtre. Regarde du coté de EnumWindows pour trouver les fenêtre.

La position d'un objet, quel qu'il soit, c'est toujours son coin supérieur gauche. Attention cependant à la parentée de l'objet. Il est frequent que la position obtenue est relative à son parent.

Au fait, je n'ai même pas pensé à te demander avant de répondre mais, les fonctions pré-citée sont présente uniquement sous Windows, donc si tu est sous Mac ou Lunix, ca fonctionnera pas.
3
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
14 juil. 2007 à 21:55
En fait, ce n'est pas la même notion de parentée. Je ne parle pas de l'heritage des classes du C++. Mais de l'objet parent d'un controle. Par exemple, un bouton est un enfant de la fenêtre qui le contient.

Ses coordonées sont relative à celles de cette fenetre.

La fonction EnumWindow est un callback. C'est à dire que tu dois écrire une fonction qui possède le prototype cité dans la documentation. Cette fonction sera appellée par EnumWindow pour chaque fenêtre. Ta fonction dois déterminer si la fenêtre que lui donne EnumWindow, est celle que tu recherche ou non.
3
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
14 juil. 2007 à 22:09
Je rajoute un tit post pour une explication plus précise (j'avais pas ce qu'il me fallait sous la main)

BOOL CALLBACK MonEnumEnumWindowsProc(HWND hwnd, LPARAM lParam)
{
//Tu reçois en paramètre le handle de la fenêtre
//A toi de t'en servir pour savoir si c'est la fenetre que tu cherche.
//Par exemple en comparant le titre de la fenetre.

return TRUE; //Ce n'est pas la bonne fenêtre, on passe à la suivant.
//OU
return FALSE; //C'est la fenêtre que tu cherchais, on s'arrete la.
}

Pour utiliser apres :
int main(int argc, char* argv[])
{
EnumWindow(MonEnumEnumWindowsProc, 0); // Tu peux remplacer le 0 par n'importe quelle valeur numérique y comprit une adresse. Ce nombre sera contenu dans le lParam recu par la fonction décrite plus haut. Ce qui fait que tu peux passe l'adresse d'une structure, objet ou autre. Tu devra juste la caster pour t'en servir.
}
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Vinsininounet Messages postés 25 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 6 avril 2008
14 juil. 2007 à 11:05
Merci ctx,

Sa répond a ma question, mais je voudrai etre sur d'avoir bien compris ton explication :

si je fais :

HWND fenetre ;
WINDOWPLACEMENT *pos ;
pos->x = 100;
pos->y = 200;
fenetre = GetWindow(0,0);
SetWindowPlacement(fenetre,pos);

Sa vas marcher ?

Et une deuxieme question me vien :

Comment peut on récuperer les position d'autres fenetres non minimisées sur le bureau ?
Si on peut , quel valeur récupere t'on , le haut a gouche , le bas a droite , etc ...

Merci d'avance a vous,
Et bonne continuation a tout les monde,
0
cs_Vinsininounet Messages postés 25 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 6 avril 2008
14 juil. 2007 à 11:46
Dabord merci pour ta réponse,

Non, je suis sous Windows.

Pour la parenté des objet je comprend pas trop parceque je fais du C pas du C++,
Mais j'ai compris que un parent en gros c'était la fenetre qui avait ordonné l'ouverture de l'autre.
donc pour calculer la position de la fenetre "fille" ( pas fils puisque fenetre c au féminin  ) je fais :
posparent + posfille = position fenetre. ( dis moi si je me trompe )

D'accord je vais utiliser la fonction EnumWindows pour trouver les fenetres mais je voudrait juste savoir , Elle prend quoi comme paremetre et elle renvoie quoi ?

Sinon pour l'erreur du pointeur, ouai je sais je pensait a sa dans ma tete mais comme j'était trés fatigué j'ai écrit le contraire a ce que je pensait , enfin bon .

encore merci a toi pour tes réponses.

 
0
cs_Vinsininounet Messages postés 25 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 6 avril 2008
14 juil. 2007 à 11:54
ehh pour la fonction EnumWindows enfait je voudrait juste savoir comment l'utiliser et comment distinguer une fenetre parente d'une fenetre normale ...

sinon bonne continuation a tous ...  ( C'est les vacances !!! )
0
cs_Vinsininounet Messages postés 25 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 6 avril 2008
18 juil. 2007 à 12:16
d'abord merci pour ta réponse .

Grace a toi j'ai compris !!
( c pas une mince a faire )

J'avais déja utilisé des fonctions de callback en SDL mais c'était quand meme asser flou dans ma tete ...

Bon sinon bonne contiuation a tous 
0
Rejoignez-nous