سؤال

لقد كتبت الكود التالي ، الذي يحاول أخذ صورة نقطية 32 × 32 (تم تحميلها من خلال نظام موارد MFC) وتحويله إلى صورة نقطية 16 × 16 ، بحيث يمكن استخدامها ككبار وصغار من أجل clistctrl. ومع ذلك ، عندما أفتح clistctrl ، تكون جميع الرموز سوداء (في منظر صغير وكبير). قبل أن أبدأ اللعب بتغيير حجمه ، كان كل شيء يعمل بشكل مثالي.

ما الخطأ الذي افعله؟

 // Create the CImageLists
 if (!m_imageListL.Create(32,32,ILC_COLOR24, 1, 1))
 {
  throw std::exception("Failed to create CImageList");
 }
 if (!m_imageListS.Create(16,16,ILC_COLOR24, 1, 1))
 {
  throw std::exception("Failed to create CImageList");
 }

 // Fill the CImageLists with items loaded from ResourceIDs
 int i = 0;
 for (std::vector<UINT>::iterator it = vec.begin(); it != vec.end(); it++, i++)
 {
  CBitmap* bmpBig = new CBitmap();
  bmpBig->LoadBitmap(*it);
  CDC bigDC;
  bigDC.CreateCompatibleDC(m_itemList.GetDC());
  bigDC.SelectObject(bmpBig);

  CBitmap* bmpSmall = new CBitmap();
  bmpSmall->CreateBitmap(16, 16, 1, 24, 0);
  CDC smallDC;
  smallDC.CreateCompatibleDC(&bigDC);
  smallDC.SelectObject(bmpSmall);
  smallDC.StretchBlt(0, 0, 32, 32, &bigDC, 0, 0, 16, 16, SRCCOPY);

  m_imageListL.Add(bmpBig, RGB(0,0,0));
  m_imageListS.Add(bmpSmall, RGB(0,0,0));
 }

 m_itemList.SetImageList(&m_imageListS, LVSIL_SMALL);
 m_itemList.SetImageList(&m_imageListL, LVSIL_NORMAL);
هل كانت مفيدة؟

المحلول 4

تأكد من إلغاء تحديد CBITMAPS بعد استخدامها:

// Select the objects
CBitmap* ret1 = bigDC.SelectObject(bmpBig);
CBitmap* ret2 = smallDC.SelectObject(bmpSmall);
...
// Do the painting
...
// Deselect
bigDC.SelectObject(ret1);
smallDC.SelectObject(ret2);

نصائح أخرى

تحتاج إلى إنشاء compatibledc ل bigdc. أي الحصول على التيار المستمر للنافذة الحالية أولاً وافعل شيئًا مثل

bigDC.CreateCompatibleDC(&myWindowHdc);

أنت تضيف مرجعًا إلى كائن CBITMAP المحلي في القائمة. لم يعد المرجع صالحًا بمجرد خروجك من الحلقة. حاول إنشاء الكائن على كومة.

حاول استخدام CreateCibleBitMap () بدلاً من CreateBitMap () - يجب أن تكون النقطتين هي نفسها بالنسبة لـ Bitblt/StretchBlt للعمل.

أيضًا ، يمكن أن يكون www.gdiwatch.com مفيدًا عند تصحيح مشكلات مثل هذا. يبدو مهجورًا ولكن يمكن صنع إصدار التنزيل للعمل مع VS2008 أيضًا.

تحتاج إلى تغيير:

bmpSmall->CreateBitmap(16, 16, 1, 32, 0);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top