【解決方法】グラフィック クラスの描画イメージがダイアログ ボックスにイメージを描画しないのはなぜですか?

[ad_1]

アプリケーションの 2 つのダイアログ ボックスにそれぞれ画像を描画する必要があります。 私はメモリ DC を使用することにしました。 残念ながら、画像を描画する代わりに、ブラック ボックスが描画されました。 何が間違っているのでしょうか? 関連するコードを以下に示します。

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.

解決策 1

1. を呼び出して、GDI+ ライブラリを初期化していることを確認します。 GdiplusStartup API。
2. 次を使用して、イメージが正常に読み込まれたことを確認します。 GetLastStatus ファイルをロードした後の Image クラスのメソッド。
3. 次のコマンドを使用して、グラフィックス操作の最後のステータスを確認します。 GetLastStatus 画像を描画した後のGraphicsクラスのメソッド。
4. 正しい呼び出しシーケンスで描画を実行していることを確認してください。たとえば、描画を呼び出し、呼び出し後にコントロールの背景を無効化すると、背景が消去されます。 まず、GDI+ ビットマップ オブジェクトから作成されたグラフィックス オブジェクトで描画をテストし、結果のビットマップをファイルに保存できます。

よろしく、
マキシム。

解決策 2

見る ダイアログ ボックスのプログラミングに関する考慮事項 – Win32 アプリ | Microsoft Learn[^]、特に次の見出しのセクション: WM_INITDIALOG メッセージ

[ad_2]

コメント

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