[ad_1]
मुझे अपने एप्लिकेशन के दो संवाद बक्सों पर एक-एक छवि बनाने की आवश्यकता है। मैंने मेमोरी डीसी का उपयोग करना चुना। दुर्भाग्य से, छवि बनाने के बजाय, इसने एक ब्लैक बॉक्स बनाया। क्या ग़लत हो सकता है? प्रासंगिक कोड नीचे दिखाए गए हैं.
//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.
समाधान 1
1. सुनिश्चित करें कि आपने कॉल करके GDI+ लाइब्रेरी प्रारंभ कर ली है GdiplusStartup
एपीआई.
2. जो भी छवि सफलतापूर्वक लोड की गई है उसका उपयोग करके जांचें GetLastStatus
फ़ाइल लोड करने के बाद छवि वर्ग की विधि।
3. का उपयोग करके ग्राफ़िक्स ऑपरेशन की अंतिम स्थिति की जाँच करें GetLastStatus
छवि खींचने के बाद ग्राफ़िक्स वर्ग की विधि।
4. सुनिश्चित करें कि आप सही कॉल अनुक्रम में ड्राइंग कर रहे हैं उदाहरण के लिए आप ड्राइंग को कॉल कर सकते हैं और कॉल के बाद नियंत्रण की पृष्ठभूमि को अमान्य कर सकते हैं जो पृष्ठभूमि को मिटाने का कारण बनता है। आप पहले GDI+ बिटमैप ऑब्जेक्ट से बनाए गए ग्राफ़िक्स ऑब्जेक्ट पर ड्राइंग का परीक्षण कर सकते हैं और परिणामी बिटमैप को फ़ाइल में सहेज सकते हैं।
सम्मान,
मैक्सिम।
समाधान 2
देखना डायलॉग बॉक्स प्रोग्रामिंग विचार – Win32 ऐप्स | माइक्रोसॉफ्ट लर्न[^]विशेष रूप से शीर्षक वाला अनुभाग: WM_INITDIALOG संदेश.
[ad_2]
コメント