Pourquoi l’image de dessin de la classe graphique ne dessine-t-elle pas d’image sur ma boîte de dialogue ?

la programmation


Je dois dessiner une image chacune sur deux boîtes de dialogue de mon application. J’ai choisi d’utiliser une mémoire DC. Malheureusement, au lieu de dessiner l’image, il a dessiné une boîte noire. Qu’est-ce qui ne va pas ? Les codes correspondants sont indiqués ci-dessous.

C++
//Top of dialogue box procedure

static HDC hmemDC = nullptr;
    static HBITMAP hbitmap = nullptr;
    static HBITMAP hOldbitmap = nullptr;

C++
case WM_INITDIALOG:

  HDC hdc = GetDC(hDlg);
        
        hmemDC = CreateCompatibleDC(hdc);
        hbitmap = CreateCompatibleBitmap(hmemDC,iPicWidth,iPicHeight);
        hOldbitmap = (HBITMAP)SelectObject(hmemDC, hbitmap);

        ReleaseDC(hDlg, hdc);
C++
//The drawing code

 std::string stPicPath;
            if (UpdateStudentInfoControls(hDlg, llSessionID, llArmID, eUseMode, stPicPath))
            {
               DrawAppImage(hmemDC, iPicLeft,iPicTop,iPicWidth, iPicHeight, stPicPath);
            }
            else
            {
                HPEN hPen = (HPEN)GetStockObject(BLACK_PEN);
                HPEN hOldPen = (HPEN)SelectObject(hmemDC, hPen);

                MoveToEx(hmemDC, 0, 0, NULL);
                LineTo(hmemDC,iPicWidth, 0);
                LineTo(hmemDC, iPicWidth,iPicHeight);
                LineTo(hmemDC,0,iPicHeight);
                LineTo(hmemDC,0,0);

                SelectObject(hmemDC, hOldPen);
            }
C++
case WM_PAINT:
   {
       PAINTSTRUCT ps;
       HDC hdc = BeginPaint(hDlg, &ps);

       BitBlt(hdc, iPicLeft, iPicTop, iPicWidth, iPicHeight, hmemDC, 0, 0, SRCCOPY);

       EndPaint(hDlg, &ps);

   }
   return (INT_PTR)TRUE;
C++
<


void DrawAppImage(HDC hdc, int iLeft, int iTop, int iWidth, int iHeight, string stImagePath)
{
	string stImageFullPath = stDBImageDirectory;
	stImageFullPath += '\\';
	stImageFullPath += stImagePath;

	wstring wstImagePath = utf8_decode(stImageFullPath);

	// Create an Image object.
	Gdiplus::Image image(wstImagePath.c_str());


	Gdiplus::Graphics graphics(hdc);

	// Draw the original source image.
	graphics.DrawImage(&image, iLeft, iTop, iWidth, iHeight);
}



/pre>

What I have tried:

I have spent sustantial time debugging the code.

Solution 1

1. Assurez-vous d’avoir initialisé la bibliothèque GDI+ en appelant GdiplusStartup API.
2. Vérifiez quelle image chargée avec succès en utilisant GetLastStatus méthode de la classe Image après le chargement du fichier.
3. Vérifiez le dernier état de l’opération graphique en utilisant GetLastStatus méthode de la classe Graphics après avoir dessiné l’image.
4. assurez-vous que vous effectuez le dessin dans la séquence d’appel correcte, par exemple, vous pouvez appeler le dessin et après l’appel invalider l’arrière-plan du contrôle, ce qui entraîne l’effacement de l’arrière-plan. Vous pouvez d’abord tester le dessin sur l’objet graphique créé à partir de l’objet bitmap GDI+ et enregistrer le bitmap obtenu dans le fichier.

Salutations,
Maxime.

Solution 2

Voir Considérations sur la programmation des boîtes de dialogue – Applications Win32 | Microsoft Apprendre[^]en particulier la section intitulée : Le message WM_INITDIALOG.

コメント

タイトルとURLをコピーしました