C ++: الخطوة 1: ExtractIconEx. الخطوة 2: ؟؟؟ الخطوة 3: SetMenuItemBitmaps

أقوم بتجربة إضافة رموز إلى ملحق shell. لدي هذا الرمز (مطهر لسهولة القراءة) ، والذي يعمل:

InsertMenu(hmenu, index, MF_POPUP|MF_BYPOSITION, (UINT)hParentMenu, namestring);

الخطوة التالية هي هذا الرمز:

HICON hIconLarge, hIconSmall;
ICONINFO oIconInfo;
ExtractIconEx("c:\\progra~1\\winzip\\winzip32.exe", 0, &hIconLarge, &hIconSmall, 1);
GetIconInfo(hIconSmall, &oIconInfo);
//???????
SetMenuItemBitmaps(hParentMenu, indexMenu-1, MF_BITMAP | MF_BYPOSITION, hbmp, hbmp);

ماذا أضع لاستبدال؟ لقد وجدت محاولات Google هذه المعرفة العديد من النصائح التي فشلت في الحصول عليها. أي مشورة على الحصول على هذا العمل ، وخاصة على الأجهزة القديمة (على سبيل المثال لا. إطار الشبكة ، لا فيستا) هو موضع تقدير.

0
وأضاف تحرير
الآراء: 1

2 إجابة

هذا يعمل ، على الرغم من أن اللون الخلفي أسود بدلا من الشفافية.

GetIconInfo(hIconSmall, &oIconInfo);
SetMenuItemBitmaps(hmenu, uMenuIndex+i+popUpMenuCount-1, MF_BITMAP | MF_BYPOSITION, oIconInfo.hbmColor, oIconInfo.hbmColor);
0
وأضاف
على ما يبدو ، يقوم Windows بعمل شيء ذكي إلى الأيقونة. كان رمز أوريجنال أقل شفافية مما كنت اعتقد ، ولكن قررت ويندوز لإضافة شفافية غريبة. ومع ذلك ، ينتهي الأمر بالشفرة أعلاه إلى الحاجة إلى رسم صورة نقطية باستخدام الرسم بين الخطوتين.
وأضاف المؤلف Brian, مصدر

توفر Vista دعمًا مناسبًا للرموز الموجودة في القوائم ، وبالنسبة إلى نظام التشغيل Vista السابق ، يجب استخدام عناصر قائمة سحب المالك (MF_OWNERDRAW) إذا كنت تريد رموزًا بالألوان الكاملة بحجم 16 × 16

Vista style menus... Vista style+pre Vista callback

0
وأضاف
يتطلب هذا الحل Windows XP وإطار .net. أتمنى أن أتجنب كلاهما.
وأضاف المؤلف Brian, مصدر
هل نظرت إلى الرابط الثاني ، لديه رمز يعمل على طول الطريق مرة أخرى إلى WIN95. النقطة هي ، قبل أي شيء فيستا ، تحتاج حقا أن تفعل الرسم بنفسك ، لذلك أنت حر في اختيار ما إذا كنت ترغب في استخدام GDI ، GDI + أو. نت
وأضاف المؤلف Anders, مصدر