我从CComboBox继承出一个类, 写一个自绘的CComboBox. 我重写了OnDrawItem() 和 OnPaint(), 但发现在测试程序中创建这个控件时不成功. 主要原因是加入了CBS_OWNERDRAWFIXED风格, 如果不加这个风格创建是可以成功的. 但自绘CComboBox必须要有这个风格, 请有经验的大侠帮忙看一下.这是我创建的代码, 去掉CBS_OWNERDRAWFIXED风格就可以成功创建: m_pMyCombo->Create(
      WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL| CBS_SORT|CBS_OWNERDRAWFIXED,
      CRect(10,10,200,200), this, 10001);

解决方案 »

  1.   

    Create创建后
    ModifyStyle(0, CBS_OWNERDRAWFIXED|CBS_DROPDOWNLIST); 
      

  2.   

    感谢oyljerry! 你是指在自绘类中吗? 我试了在重载PreSubclassWindow()来更改风格, 但也是不行. void AFComboBoxCtrl::PreSubclassWindow()
    {
    // TODO: Add your specialized code here and/or call the base class
    ModifyStyle(0,   CBS_OWNERDRAWFIXED|CBS_DROPDOWNLIST);  CComboBox::PreSubclassWindow();
    }
      

  3.   

    还要重载MeasureItem函数,填写MEASUREITEMSTRUCT结构。
      

  4.   

    感谢cnzdgs, 能具体一点吗? 多谢!
      

  5.   

    设置了CBS_OWNERDRAWFIXED风格后,控件会向父窗口发WM_MEASUREITEM消息来获取Item的尺寸,如果父窗口没有响应这个消息,MFC会自动把消息反射会控件,所以你需要重载MeasureItem函数,填写MEASUREITEMSTRUCT结构中的高度和宽度。
      

  6.   

    是要重载MeasureItem函数来获取尺寸 
      

  7.   

    感谢cnzdgs: 我这样设置了一下值, 但是还是没成功. 能多指点一下吗: lpMeasureItemStruct->itemHeight = 30;
    lpMeasureItemStruct->itemWidth = 100;
    lpMeasureItemStruct->CtlType = ODT_COMBOBOX;
      

  8.   

    你指定了CBS_SORT风格,还要重载CompareItem函数。
    另外,CtlType不要自己设置。
      

  9.   

    自绘combobox,难度不小哈 codeproject上有能改变各种颜色的(肯定有),前些天还找到过 你去看看吧 我网速慢 不帮你查了  ;d
      

  10.   

    感谢大家, 我试了
    lpMeasureItemStruct->itemHeight = 16; 
    lpMeasureItemStruct->itemWidth = 100; 但是没有作用, 因为没有经验, 网上也找不到类似的例子, 能不能帮我贴一份类似的代码让我参考一下呢?///////////////////////////////////////////////////////////////to cnzdgs: 我把CBS_SORT风格去掉了, 但仍没有作用啊.//////////////////////////////////////////////////////////////还有我debug了一下, 发现异常是出在这个断言上:_AFXWIN_INLINE int CComboBox::GetItemHeight(int nIndex) const
    { ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, CB_GETITEMHEIGHT, nIndex, 0L); }Output出来的信息是这样的:"
    First-chance exception at 0x7e4291bf in ComboTest.exe: 0xC0000005: Access violation reading location 0x00000000.
    Unhandled exception at 0x7e4291bf in ComboTest.exe: 0xC0000005: Access violation reading location 0x00000000.
    "我不清楚为什么m_hWnd这个指针不对, 能给我点提示吗?