IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Déplacer une BITMAP


Sujet :

Visual C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut Déplacer une BITMAP
    Bonjour à tous,

    J'essaye de déplacer un BITMAP que j'affiche dans une fenêtre lors du resize de celle-ci.
    Pour faire ça, j'intercepte le message 'WM_SIZE' puis comme j'ai lu dans le forum, je tente d'effacer l'image puis de la ré-afficher à sa nouvelle position.
    J'utilise le code suivant pour le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    case WM_CREATE:
    		hDC = GetDC(hwnd);
    		g_hBitmap = (HBITMAP)LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_INTERACTIVE_ICON));
    		GetObject(g_hBitmap,sizeof(BITMAP),(LPVOID)(&infoBmp));
    		width_Image = infoBmp.bmWidth; 
    		height_Image = infoBmp.bmHeight; 
    		break;
    	case WM_PAINT:
    		BeginPaint(hwnd,&ps);
    		result = DrawState(hDC,NULL,NULL,(LPARAM)g_hBitmap,0,DEFAULT_SCREEN_WIDTH-40,DEFAULT_SCREEN_HEIGHT-40,0,0,DST_BITMAP);
    		EndPaint(hwnd,&ps);
    		break;
    	case WM_SIZE:
    		 //position control after window re-sizing
             dx=LOWORD(lParam); //LOWORD = WIDTH
             dy=HIWORD(lParam); //HIWORD = WEIGHT
             InvalidateRect(hwnd,NULL,false); // J'efface toute la zone cliente
    		 result = DrawState(hDC,NULL,NULL,(LPARAM)g_hBitmap,0,dx-width_Image,dy-height_Image,0,0,DST_BITMAP); //Je ré-affiche le bitmap à sa nouvelle position
    		 break;
    Lorsque je fait ça, j'ai bien la nouvelle BITMAP qui s'affiche et qui se déplace lors du resize de la fenêtre. Le seul problème est que la bitmap affichée par le premier appel à DrawState dans 'case WM_PAINT:' n'est pas effacée. En gros, je me retrouve avec deux BITMAP affichée :
    - une qui se déplace bien
    - celle d'origine qui reste à sa place initiale.

    Sauriez-vous pourquoi? Ai-je oublié de faire quelque chose? Comment dois-je supprimer la première BITMAP?

    Une autre indication : si je passe la champ ' bErase' de la fonction InvalidateRect à TRUE, même problème sauf qu'en plus la nouvelle BITMAP (celle qui se déplace bien) scintille mais je sais pourquoi (il faut intercepter le message 'EraseBackgrd').

    Merci d'avance!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Tu ne dois pas dessiner à un autre moment que le WM_PAINT.

    Il te faut donc mémoriser quelque part (pour un débutant, on peut commencer par des variables globales avant de passer aux choses sérieuses), les coordonnées où tu veux afficher le bitmap, et les modifier dans WM_SIZE.
    Puis rafraichir la fenêtre (InvalidateRect() fait ça très bien).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Ok : on ne dessine que dans le WM_PAINT.

    J'ai donc modifié le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    static long dx,dy;
     
    case WM_CREATE:
    		hDC = GetDC(hwnd);
    		g_hBitmap = (HBITMAP)LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_INTERACTIVE_ICON));
    		GetObject(g_hBitmap,sizeof(BITMAP),(LPVOID)(&infoBmp));
    		width_Image = infoBmp.bmWidth; 
    		height_Image = infoBmp.bmHeight; 
    		break;
    	case WM_PAINT:
    		BeginPaint(hwnd,&ps);
    		result = DrawState(hDC,NULL,NULL,(LPARAM)g_hBitmap,0,dx-width_Image-10,dy-height_Image-10,0,0,DST_BITMAP);
    		EndPaint(hwnd,&ps);
    		break;
    	case WM_SIZE:
    		 //position control after window re-sizing
             dx=LOWORD(lParam); //LOWORD = WIDTH
             dy=HIWORD(lParam); //HIWORD = WEIGHT
    		 InvalidateRect(hwnd,NULL,true);
    		 UpdateWindow(hwnd);
    		 break;
    Et ça marche .

    Cela dit, comment connait-il mes variables dx,dy avant le premier passage dans WM_PAINT? Passe-t-il dans WM_SIZE avant (vu que WM_SIZE poste un message WM_PAINT)?

    Et est-ce bien ça qu'il faut faire ? Je vais jeter un coup d'oeil aux choses sérieuses justement.

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Tu dois initialiser dx et dy à une "bonne" valeur avant le premier passage (par exemple, dans le traitement de WM_CREATE.

    De plus, je te déconseille le UpdateWindow() dans le traitement de WM_SIZE. Une fois que InvalidateRect() a demandé un rafraichissement, tu n'as plus qu'à l'attendre: Inutile de précipiter les choses...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Ok merci j'ai fais les modifications.

    Quand à l'initialisation de dx et dy, je faisais cette remarque justement parce que ça marche même sans initialisation (et il met la BITMAP dès le premier passage à la bonne place).
    Il doit donc passer dans WM_SIZE au moins une fois avant WM_PAINT non?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    C'est possible, mais j'éviterais de compter là-dessus quand même, à moins que ce soit explicitement documenté sur MSDN. Mieux vaut faire les choses "bien".

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Oui c'est sûr.
    Je te remercie

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/11/2007, 13h33
  2. Déplacer une TImage avec la souris
    Par Ingelishome dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/03/2005, 14h16
  3. Affichage d'une bitmap et de l'heure
    Par nanarr dans le forum Assembleur
    Réponses: 14
    Dernier message: 16/04/2004, 22h39
  4. Analyser une bitmap
    Par Vathal dans le forum OpenGL
    Réponses: 6
    Dernier message: 14/02/2004, 16h12
  5. Réponses: 2
    Dernier message: 20/01/2004, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo