[ad_1]
Tôi cần vẽ từng hình ảnh trên hai hộp thoại của ứng dụng của mình. Tôi đã chọn sử dụng bộ nhớ dc. Thật không may, thay vì vẽ hình ảnh, nó lại vẽ một hộp đen. Điều gì có thể sai? Các mã có liên quan được hiển thị dưới đây.
//Top of dialogue box procedure static HDC hmemDC = nullptr; static HBITMAP hbitmap = nullptr; static HBITMAP hOldbitmap = nullptr;
case WM_INITDIALOG:
HDC hdc = GetDC(hDlg);
hmemDC = CreateCompatibleDC(hdc);
hbitmap = CreateCompatibleBitmap(hmemDC,iPicWidth,iPicHeight);
hOldbitmap = (HBITMAP)SelectObject(hmemDC, hbitmap);
ReleaseDC(hDlg, hdc);
//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); }
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;
< 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.
Giải pháp 1
1. Hãy chắc chắn rằng bạn đã khởi tạo thư viện GDI+ bằng cách gọi GdiplusStartup
API.
2. Kiểm tra bất kỳ hình ảnh nào được tải thành công bằng cách sử dụng GetLastStatus
phương thức của lớp Image sau khi tải tệp.
3. Kiểm tra trạng thái cuối cùng của thao tác Đồ họa bằng cách sử dụng GetLastStatus
phương thức của lớp Graphics sau khi vẽ hình ảnh.
4. đảm bảo rằng bạn đang thực hiện vẽ theo đúng trình tự cuộc gọi, ví dụ: bạn có thể gọi bản vẽ và sau khi gọi, nền của điều khiển sẽ vô hiệu hóa khiến nền bị xóa. Trước tiên, bạn có thể thử vẽ trên đối tượng đồ họa được tạo từ đối tượng bitmap GDI+ và lưu bitmap kết quả vào tệp.
Trân trọng,
Châm ngôn.
Giải pháp 2
Nhìn thấy Những cân nhắc khi lập trình hộp thoại – Ứng dụng Win32 | Microsoft Tìm hiểu[^]đặc biệt là phần có tiêu đề: Thông báo WM_INITDIALOG.
[ad_2]
コメント