لماذا لا يمكن استدعاء طريقة DrawItem الخاصة بمالك Draw Listbox

StackOverflow https://stackoverflow.com/questions/3404178

سؤال

أحاول أن أكتب مالكًا رسم قائمة باستخدام WTL. رمز بلدي يبدو مثل هذا

template<class T, class TBase = CListBox, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CMyListBoxImpl : 
   public CWindowImpl< T, TBase, TWinTraits >,
   public COwnerDraw< T >
{
...
BEGIN_MSG_MAP(CMyListBoxImpl)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
    MESSAGE_HANDLER(WM_SIZE, OnSize) 
    MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
    CHAIN_MSG_MAP(COwnerDraw< T >)
    DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

...

void Init()
{
    ...
    ModifyStyle(0, BS_OWNERDRAW | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS);
    ...
}
void DrawItem(LPDRAWITEMSTRUCT lpdis)
{
  ...

أضفت أيضا REFLECT_NOTIFICATIONS في حلقة رسالة الوالدين ، وقم بتعيين المالك إلى ثابت في ورقة الممتلكات. لكن ما زلت لا أستطيع تلقي الرسالة. ثم استخدمت spy ++ لفحص الرسالة التي يتلقاها قائمة القائمة ، لقد وجدت بعض الرسائل الغريبة للغاية (WM_USER+7211).
نظام التشغيل الخاص بي هو WinXP واستخدام VS2008.

هل كانت مفيدة؟

المحلول

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

موضوع المنتدى هذا قد تكون أيضًا مفيدة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top