我创建一个CSkinListBox(继承CListBox),通过重载CTLCOLOR改变列表控件的背景颜色,但是我想改变控件的出现的滚动条的颜色,不知道怎样才能实现???

解决方案 »

  1.   

    设置自画风格,重载自画虚函数,注意不是自画消息(WM_DRAWITEM)。
      

  2.   

    自己创建一个 SCROLLBAR ,然后隐藏 LISTBOX 自带的 SCROLLBAR ,把你自己的 scrollbar 放在合适的地方,重写 LISTBOX 的 GETSCROLLBAR 函数(好像是这个名字,记不清楚了,是CWND类的函数),以返回你自己的SCROLLBAR的指针。响应你自己的SCROLLBAR的滚动消息。最后,重载 SCROLLBAR 的 ONPAINT, 画之。
      

  3.   

    设置控件为ownredraw风格,然后设置里面一个结构DRAWITEMSTRUCT里面的参数,重载DrawItem()、MesureItem()和CompareItem()函数,设置你自己的风格,就可以了。
      

  4.   

    everandforever大哥,如果在wm_ncpaint中直接画滚动条能不能实现?
      

  5.   

    OnCtlColor(..)
    {
    if(GetFocus()==myScroll1){
    SetBkColor(..);
    }
      

  6.   

    请问OnCtlColor()加在哪里?是加在CMyDialog类中,还是加在CMyListBox类中???
      

  7.   

    TO kingcom_xu(我的刀是杀不了人的):
    不能吧。SCROLLBAR也是个独立的WND。
      

  8.   

    TO everandforever(Forever):
    我试过你的方法,但是在通过外部的滚动条来控制列表控件滚动时,列表中的内容有滚动了,但是但它只是把滚动过后的内容覆盖原来的内容,没有把滚动前的内容擦掉,这样控件中显示的内容一遍混乱!请问怎么解决??你有这方面的源代码吗?如果有能给我寄一份吗?我的代码如下:
    void CtestscrollDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    SCROLLINFO si;
    si.fMask  = SIF_ALL ;
        m_SkinBar.GetScrollInfo (&si) ;
    int height; switch(nSBCode)
    {
    case SB_LINEUP:
    si.nPos -= 10 ;
    break;
    case SB_LINEDOWN:
    si.nPos += 10;
    height = m_ListBox.GetItemHeight(1);
    m_ListBox.ScrollWindow(0, height, NULL, NULL);
    m_ListBox.UpdateWindow();
    break;
    case SB_THUMBTRACK:
            si.nPos = si.nTrackPos ;
            break ; } //si.fMask = SIF_POS ;
        m_SkinBar.SetScrollInfo (&si, TRUE) ;
    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }
      

  9.   

    没做过。这要你自己解决了。
    这种替换SCROLLBAR的方法,我是从 MSDN 中看到的。
      

  10.   

    codeproject上那个Cool Scrollbar Library挺爽的呀