begin process at 2010 02 10 10:02:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

Chargement d'un bitmap avec la fonction BitBlt().


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Chargement d'un bitmap avec la fonction BitBlt().

samedi 26 avril 2008 à 00:16:29 | Chargement d'un bitmap avec la fonction BitBlt().

mohdaef

Bonjour.

Pour les besoins de la partie graphique d'un petit jeu, je souhaite afficher une grille, chaque cases formée d'un image différentes, après quelque recherches j'ai trouvé la fonction BitBlt() qui permet d'afficher une image dans un contexte de dessin. Dans une version antérieure j'utilisé la fonction LoadImage() pour charger les bitmap en mémoire à l'ouverture du programme.
Je n'arrive pas à faire le lien entre ces deux fonctions, j'ai trouvé plusieurs codes sur internet mais assez complexe.

    Serait-il possible d'avoir un code minimaliste pour réaliser ceci ?

Merci d'avance.
samedi 26 avril 2008 à 15:47:38 | Re : Chargement d'un bitmap avec la fonction BitBlt().

jfrancois

Bonjour,

Voici un programme Windows minimaliste qui affiche une grille qui est un damier de 2 images (disponibles dans les ressources) :

#include <stdio.h>
#include <windows.h>
#include <commctrl.h>

// --- Bibliothèque pour "InitCommonControls()"
#pragma comment(lib,"comctl32.lib")

// --- Instance de l'application
static HINSTANCE g_hInstance = NULL;

// --- Prototypes des fonctions locales
int WINAPI       WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
LRESULT CALLBACK WinProc(HWND,UINT,WPARAM,LPARAM);

 

// ===================
// Fonction principale
// ===================
int WINAPI WinMain
(
    HINSTANCE hInstance      // E:instance courante
   ,HINSTANCE hInstancePrev  // E:instance précédente
   ,LPSTR     pszCommandLine // E:ligne de commande
   ,int       iDisplay       // E:mode d'affichage
)                            // S:code retour
{
   // --- Initialiser
   g_hInstance = hInstance;
   InitCommonControls();
   static const char* szClassName = "GrilleImageClasse";

  
   // --- Enregistrer la classe de la fenêtre
   WNDCLASSEX WndClass;
   WndClass.cbSize        = sizeof(WNDCLASSEX);
   WndClass.style         = 0;
   WndClass.lpfnWndProc   = WinProc;
   WndClass.cbClsExtra    = 0;
   WndClass.cbWndExtra    = 0;
   WndClass.hInstance     = g_hInstance;
   WndClass.hIcon         = LoadIcon(g_hInstance,"ICONE_APP");
   WndClass.hCursor       = LoadCursor(NULL,IDC_ARROW);
   WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
   WndClass.lpszMenuName  = NULL;
   WndClass.lpszClassName = szClassName;
   WndClass.hIconSm       = NULL;
   if (! RegisterClassEx(&WndClass)) return 0;


   // --- Créer la fenêtre
   HWND hWnd = CreateWindowEx
   (
       0
      ,szClassName
      ,"Grille d'images"
      ,WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX
      ,CW_USEDEFAULT,CW_USEDEFAULT // x,y
      ,CW_USEDEFAULT,CW_USEDEFAULT // largeur,hauteur
      ,(HWND)NULL
      ,(HMENU)NULL
      ,g_hInstance
      ,(LPVOID)NULL
   );
   if (hWnd == NULL) return 0;
   ShowWindow(hWnd,iDisplay);
   UpdateWindow(hWnd);


   // --- Traiter les messages de la fenêtre
   MSG Msg;
   while (GetMessage(&Msg,NULL,0,0))
   {
      TranslateMessage(&Msg);
      DispatchMessage(&Msg);
   }
   return Msg.wParam;
}

 

// ==================================
// Traiter les messages de la fenêtre
// ==================================
LRESULT CALLBACK WinProc
(
    HWND   hWnd   // E:handle de la fenêtre
   ,UINT   uiMsg  // E:message à traiter
   ,WPARAM wParam // E:paramètre WPARAM
   ,LPARAM lParam // E:paramètre LPARAM
)                 // S:code retour
{
   static HWND    hGrille = NULL;
   static int     iGrilleLargeur;
   static int     iGrilleHauteur;

   static HBITMAP hImage1   = NULL;
   static HBITMAP hImage2   = NULL;
   static HDC     hdcImage1 = NULL;
   static HDC     hdcImage2 = NULL;
   static int     iImageLargeur;
   static int     iImageHauteur;

   switch (uiMsg)
   {
      // ----------------
      // Créer la fenêtre
      // ----------------
      case WM_CREATE:
      {
         // --- Charger les 2 images
         HDC hDC = GetDC(hWnd);

         hdcImage1 = CreateCompatibleDC(hDC);
         hImage1   = LoadBitmap(g_hInstance,(LPCTSTR)"IMAGE_1");
         SelectObject(hdcImage1,hImage1);

         hdcImage2 = CreateCompatibleDC(hDC);
         hImage2   = LoadBitmap(g_hInstance,(LPCTSTR)"IMAGE_2");
         SelectObject(hdcImage2,hImage2);

         ReleaseDC(hWnd,hDC);

        
         // --- Obtenir la taille des images
         // --- (elles ont toutes la même taille !)
         BITMAP Bitmap;
         GetObject(hImage1,sizeof(BITMAP),&Bitmap);
         iImageLargeur = Bitmap.bmWidth;
         iImageHauteur = Bitmap.bmHeight;

        
         // --- Obtenir la taille de la grille
         // --- (nombre d'images entières en largeur et hauteur)
         iGrilleLargeur = iImageLargeur * 5;
         iGrilleHauteur = iImageHauteur * 4;


         // --- Redimensionner la fenêtre
         RECT Rect;
         GetWindowRect(hWnd,&Rect);
         int iBordX = GetSystemMetrics(SM_CXFIXEDFRAME);
         int iBordY = GetSystemMetrics(SM_CYFIXEDFRAME);
         int iTitre = GetSystemMetrics(SM_CYCAPTION);
         int iMarge = 20; // marge autour de la grille
         MoveWindow
         (
             hWnd
            ,Rect.left,Rect.top // même position sur l'écran
            ,iGrilleLargeur + (iMarge * 2) + (iBordX * 2) // largeur
            ,iGrilleHauteur + (iMarge * 2) + (iBordY * 2) + iTitre // hauteur
            ,TRUE
         );

        
         // --- Créer le contrôle statique de la grille
         hGrille = CreateWindowEx
         (
             0
            ,"STATIC"
            ,""
            ,WS_VISIBLE | WS_CHILD | WS_BORDER
            ,iMarge,iMarge                 // x,y
            ,iGrilleLargeur,iGrilleHauteur // largeur,hauteur
            ,hWnd
            ,(HMENU)NULL
            ,g_hInstance
            ,NULL
         );
      }
      return 0;

 

      // -----------------
      // Peindre la grille
      // -----------------
      case WM_PAINT :
      {
         // --- Début du remplissage
         PAINTSTRUCT Paint;
         HDC hDC = BeginPaint(hGrille,&Paint);
         if (hDC == NULL) return 0;

         // --- Remplir la grille avec une alternance des 2 images
         int iLigne = 0;
         for (int iY=0 ; iY<iGrilleHauteur ; iY+=iImageHauteur)
         {
            int iColonne = iLigne++ % 2;
            for (int iX=0 ; iX<iGrilleLargeur ; iX+=iImageLargeur)
            {
               BitBlt(hDC,iX,iY,iImageLargeur,iImageHauteur
                     ,iColonne++ % 2 ? hdcImage2 : hdcImage1,0,0
                     ,SRCCOPY);
            }
         }
  
         // --- Fin du remplissage
         EndPaint(hWnd,&Paint);
      }
      return 0;

 

      // ---------------------
      // Quitter l'application
      // ---------------------
      case WM_DESTROY:
      if (hImage1)   DeleteObject((HGDIOBJ)hImage1);
      if (hImage2)   DeleteObject((HGDIOBJ)hImage2);
      if (hdcImage1) DeleteDC(hdcImage1);
      if (hdcImage2) DeleteDC(hdcImage2);
      PostQuitMessage(0);
      return 0;
   }


  
   // --- Retour du traitement par défaut
   return DefWindowProc(hWnd,uiMsg,wParam,lParam);
}

Le fichier des ressources contient :

ICONE_APP  ICON    "icone.ico"
IMAGE_1    BITMAP  "image 1.bmp"
IMAGE_2    BITMAP  "image 2.bmp"

Jean-François

samedi 26 avril 2008 à 19:25:52 | Re : Chargement d'un bitmap avec la fonction BitBlt().

mohdaef

Bonjour,

Merci beaucoup pour ce code, ça va beaucoup m'aider.



Cette discussion est classée dans : fonction, afficher, chargement, bitmap, bitblt


Répondre à ce message

Sujets en rapport avec ce message

Découper puis affichier un bitmap [ par Vortex99011 ] Bonjour,depuis quelques jours de recherches désespérées, je viens vous demander ici un grand secours. Je recherche une manière quelconque pour affiche Affichage d'une image [ par stockley81 ] Bonjour,j'afficher une image dans ma fenetre avec la fonction glDrawPixels mais je voudrais pouvoir l'afficher a des coordonnes precises sur la fenetr Problème avec un Bitmap [ par nauss ] Je veux afficher un bitmap en niveau de gris sous visual C++ en MFC.Pour l'instant j'arrive à l'afficher mais en niveau de rouge!!Y doit y avoir une h la fonction "afficher le source" de internet explorer [ par zip8000 ] Bonjour,je cherche a reproduire le resultat de la fonction "afficher la source" qui ouvre le code html d'une page internet. Mon but est de recuperer c allegro+probleme de creation de buffer dans une fonction [ par xboxut ] salut je suis en train de monter mon moteur 2D avec allegro et j ai un bleme au niveau d une fonction.void buffscroll(BITMAP *bmp) //la c la fonction comment afficher un bitmap avec cette librairie... [ par Milli ] http://www.via.ecp.fr/~laurent/ bonjour, j ai trouver ce site ma fois fort simpathique , mais le problrme est que je n arrive pas a executer leprogram Comment afficher un texte sur une SDI via l'appel d'un menu [ par marcel6566 ] BonjourVC++6 et MFCJ'ai créé une appli avec une SDIJ'ai créé un menu 'Bonjour' avec son ID_BonjourAvec ClassWizard, je crée la fonction OnBonjour() da Sprites sous OpenGL [ par tintin72 ] Salut,Je programme un jeu 2D en OpenGL et je me sert des textures pour afficher mes sprites, mais c'est au niveau des dimensions que ça va pas. Comme Afficher une DialogBox [ par Gabi ] Donc, j,essai d'afficher une DialogBox juste après que ma fenêtre soit affichée. Mais ça ne marche pas. Aucune erreur de compilation, ni aucune erreur Redimensionner BITMAP des le chargement [ par AlexMAN ] Bonjour,J'ai vu kil existait une API StretchBlt ki permet, si jne me trompe pas, de redimensionner une image mais a partir d'une source existante, don


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,312 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales