[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]
コメント