Move the button

Description

Eh bien je m'efforce d'essayer de vous fairecomprendremon probleme avec le hasard
mais vous ne comprenez pas (je suis très mauvais pédagogue car j'explique mal)...
donc, voyez par vous-même et si vous trouvez la solutions, dites-le moi !!!!!
Ce programme, ne sert a rien : juste d'exemple pour ceux qui voudrait faire un prog du type "Etes-vous intelligent"
et deux boutton (l'un oui, l'autre non) et ou il est impossible de cliquer sur oui puisque le boutton
s'en va !

Source / Exemple :


#include <windows.h>
#include <commctrl.h>
#include <stdlib.h>
#include <time.h>
#include "resource.h"

POINT mousepos;
RECT ButPos;
RECT Window;
RECT MoveAire;
UINT iLongueur, iHauteur;
UINT iLongueurW, iHauteurW;
UINT iLongueurMA, iHauteurMA;

int xpos;
int ypos;
int yesypos;
int yesxpos;
int yesyposW;
int yesxposW;
int MAX;
int MAY;
int random1;
int random2;

void random(HWND handle)
{
if (ypos >= (yesypos-1) && ypos <=((yesypos+iHauteur)+1) && xpos >= (yesxpos-1) && xpos <=((yesxpos+iLongueur)-1))
{ 
/*while (random1 > MAX || random1 < (MAX+iLongueurMA) || random2 > MAY || random2 < (MAY+iLongueurMA))
{*/

/*
Pourquoi cette boucle entres commentaire ? eh bien car j'ai essayé de dire, en clair, qu'il fallait tirer
de nouveau des onombres aux hasards si 
-ce nombre était inférieur à la position de départ X de l'aire de déplacement
-ce nombre était inférieur à la position de départ Y de l'aire de déplacement
-ce nombre était supérieur à la position (X+HAUTEUR) (soit X d'arrivée) de l'aire de déplacement
-ce nombre était supérieur à la position (Y+HAUTEUR) (soit Y d'arrivée) de l'aire de déplacement

mais si vous laissez cette boucle, vous verez que le prog va tellement chercher, qu'il va planter.
à mon avis, je lui ai demandé de faireun truc mathmatiquement impossible donc il peut toujours chercher...

  mais bon, je uis fatigué donc je vous met le prog et dites moi si vous trouvez l'erreur, merci.

  • /
srand((unsigned) time(NULL)); random1=rand() %MAX; srand((unsigned ) time(NULL)); random2=rand() %MAY; //} MoveWindow(GetDlgItem(handle,ID_CLICK),random1,random2,iLongueur,iHauteur,TRUE); } } LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_MOUSEMOVE: { //coordonnées de la souris GetCursorPos(&mousepos); xpos = mousepos.x; ypos = mousepos.y; //coordonnées du bouton GetWindowRect(GetDlgItem(hDlg,ID_CLICK), &ButPos); yesxpos = ButPos.left; yesypos = ButPos.top; iLongueur = ButPos.right - ButPos.left; iHauteur = ButPos.bottom - ButPos.top; //coordonnées de l'aire de déplacement GetWindowRect(GetDlgItem(hDlg,IDC_AIRE), &MoveAire); MAX = MoveAire.left; MAY = MoveAire.top; iLongueurMA = MoveAire.right - MoveAire.left; iHauteurMA = MoveAire.bottom - MoveAire.top; //coordonnées de la fenetre GetWindowRect(hDlg, &Window); yesxposW = Window.left; yesyposW = Window.top; iLongueurW = Window.right - Window.left; iHauteurW = Window.bottom - Window.top; SetDlgItemInt(hDlg,IDC_XPOS,xpos,TRUE); SetDlgItemInt(hDlg,IDC_YPOS,ypos,TRUE); SetDlgItemInt(hDlg,IDC_YESXPOS,yesxpos,TRUE); SetDlgItemInt(hDlg,IDC_YESYPOS,yesypos,TRUE); SetDlgItemInt(hDlg,IDC_LG,iLongueurW,TRUE); SetDlgItemInt(hDlg,IDC_HG,iHauteurW,TRUE); SetDlgItemInt(hDlg,IDC_WX,yesxposW,TRUE); SetDlgItemInt(hDlg,IDC_WY,yesyposW,TRUE); //on détermine si la souris est sur le bouton ou non. //en fait, si les coordonnées de la souris - ((les coordonnées du bouton)-1) sont égales, alors... random(hDlg); /*pourquoi si les coordonnées de la souris - ((les coordonnées du bouton)-1) ? (le -1).Eh bien car lorsque l'on est sur le bouton, la position de l souris ne change plus, du moins, pour windows...
  • /
} break; case WM_CLOSE: DestroyWindow(hDlg); break;/* case WM_INITDIALOG: { } break;*/ case WM_DESTROY: PostQuitMessage(0); break; case WM_COMMAND: switch(HIWORD(wParam)) { case BN_CLICKED: switch(LOWORD(wParam)) { case ID_CLICK: { random(hDlg); } break; case IDCANCEL: DestroyWindow(hDlg); break; } } break; default: return FALSE; } return FALSE; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hdlg; MSG Msg; hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC) DlgProc); if(hdlg == NULL) { MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(hdlg, nCmdShow); UpdateWindow(hdlg); while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }

Conclusion :


1-Le bug pincipal vient du hasard !
2-Je n'ai pas réussi a limiter la surface de déplacement du bouton a la zone prevu pour..

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.