1.ModifyStyle(0,LVS_OWNERDRAWFIXED);如果我定义了这个类型之后是不是下面这个消息就响应不了?
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
如果没有定义重绘的类型是不是DrawItem响应不了2.我想重载一个自己的CListCtrl类,里面有按扭、进度条、图片、文字……之类一些控件,
请问要怎么做会比较好,
如果有做过这个前辈们,请不吝赐教
我的QQ:366789252
E_Mail:[email protected]

解决方案 »

  1.   

    如果没有定义重绘的类型是不是DrawItem响应不了是的
    2.我想重载一个自己的CListCtrl类,里面有按扭、进度条、图片、文字……之类一些控件, 请问要怎么做会比较好a, 首先自绘制CLISTCTRL
    b, 根据你的需要, 动态创建其他的控件
      

  2.   

    1.那定义了重载类型以后
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) 这个消息是不是就不能用了?
    2.能不能留个联系方式,碰到问题可以请教一下!谢谢!!!
      

  3.   

    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)在不同的消息响应下
    是需要的,比如想CListCtrl的Report风格下希望对于每一个子项都可以编辑
    一般谁也不会有这么全的功能不是,
    至于对于编辑每一个子项,以及在子项中添加CCombobox控件的还是有的http://www.vckbase.com/document/viewdoc/?id=1853
    http://www.codeproject.com/KB/list/#ListView controls这两个上面都找的到,就不发给你了,都是开源的。看下吧
      

  4.   

    可以参考一下codeproject上面有很多的列子。
      

  5.   


    可以用吗?我在我工程里面加入定义了自己定义的消息可是通过断点调试,这个消息就没有响这个消息了,只能响应DrawItem 这个消息了!!
      

  6.   

    呵呵,有点不大理解,我也看了很多的例子了,现在主要针对的也就Report风格的!谢谢咯
      

  7.   

    貌似www.codeproject.com上面有例子
      

  8.   

    BEGIN_MESSAGE_MAP(CWListCtrl, CListCtrl)
    ON_WM_MEASUREITEM()
    ON_WM_CREATE()
    ON_WM_MEASUREITEM_REFLECT()
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
    //NM_CUSTOMDRAW 
    END_MESSAGE_MAP()
      

  9.   

    这个消息加进去我明白,我是说如果我们把CListCtrl通过ModifyStyle(0,LVS_OWNERDRAWFIXED);设置为重绘类型的话,NM_CUSTOMDRAW消息就响应不了了!?不是吗?
      

  10.   

    我自绘的listctrl里面没有添加ModifyStyle(0,LVS_OWNERDRAWFIXED)
      

  11.   


    void CWListCtrl::PreSubclassWindow()
    {
    }
    int CWListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CListCtrl::OnCreate(lpCreateStruct) == -1)
    return -1;
    //ModifyStyle(0,LVS_OWNERDRAWFIXED);
    CListCtrl::PreSubclassWindow();
    CHeaderCtrl *pHeader = GetHeaderCtrl();
    m_Header.SubclassWindow(pHeader->GetSafeHwnd());
    }
    void CWListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
    {
    LPNMTVCUSTOMDRAW pCustomDraw = (LPNMTVCUSTOMDRAW)pNMHDR; static int nItemState;
    static CRect rcItem;
    switch (pCustomDraw->nmcd.dwDrawStage)
    {
    case CDDS_PREPAINT:
    *pResult = CDRF_NOTIFYITEMDRAW;
    break;
    case CDDS_ITEMPREPAINT:
            //奇数行    
    if(pCustomDraw->nmcd.dwItemSpec % 2)    
    pCustomDraw->clrTextBk = RGB(239, 244, 248);    
            //偶数行    
    else   
    pCustomDraw->clrTextBk = RGB(244, 248,251);    
    *pResult = CDRF_NOTIFYSUBITEMDRAW|CDRF_NOTIFYPOSTPAINT;
    break;
    case CDDS_ITEMPOSTPAINT:
    break;
    default:
    *pResult = CDRF_DODEFAULT;
    }
    }void CWListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
    }
    void CWListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
    {
    if (m_nRowHeight>0)
    {
    lpMeasureItemStruct->itemHeight = m_nRowHeight;
    }
    }
    int CWListCtrl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat /* = LVCFMT_LEFT */, int nWidth /* = -1 */, int nSubItem /* = -1 */)
    {
    m_Header.m_HChar.Add(lpszColumnHeading);
    return CListCtrl::InsertColumn(nCol,lpszColumnHeading,nFormat,nWidth,nSubItem);
    }
    void CWListCtrl::DeleteAllColumn()
    {
    int ch =m_Header.GetItemCount();
    for(int d= 0;d<ch;d++)
    DeleteColumn(0);
    m_Header.m_HChar.RemoveAll();
    }
    // Gradient - 渐变系数,立体背景用,不用渐变设为0
    void CWListCtrl::SetHeaderBKColor(int R, int G, int B, int Gradient) //设置表头背景色
    {
    m_Header.m_R = R;
    m_Header.m_G = G;
    m_Header.m_B = B;
    m_Header.m_Gradient = Gradient;
    }// 设置表头高度
    void CWListCtrl::SetHeaderHeight(float Height) //设置表头高度
    {
    m_Header.m_Height = Height;
    }
    bool CWListCtrl::FindColColor(int col,COLORREF &color) //查找列颜色
    {
    int flag = 0;
    for (POSITION pos = m_ptrListCol.GetHeadPosition();pos!=NULL;)
    {
    stColor *pColor = (stColor*)m_ptrListCol.GetNext(pos);
    if (pColor->nCol==col)
    {
    flag = 1;
    color = pColor->rgb;
    break;
    }
    }
    if (1==flag)
    {
    return true;
    }
    return false;
    }
    bool CWListCtrl::FindItemColor(int col,int row,COLORREF &color) //查找颜色
    {
    int flag = 0;
    for (POSITION pos = m_ptrListItem.GetHeadPosition();pos!=NULL;)
    {
    stColor *pColor = (stColor*)m_ptrListItem.GetNext(pos);
    if (pColor->nCol==col&&pColor->nRow==row)
    {
    flag = 1;
    color = pColor->rgb;
    break;
    }
    }
    if (1==flag)
    {
    return true;
    }
    return false;
    }
    void CWListCtrl::SetColColor(int col,COLORREF color) //设置列颜色
    {
    stColor *pColor  = new stColor;
    pColor->nCol = col;
    pColor->rgb = color;
    m_ptrListCol.AddTail(pColor);
    }
    void CWListCtrl::SetItemColor(int col,int row,COLORREF color) //设置格子颜色
    {
    stColor *pColor  = new stColor;
    pColor->nCol = col;
    pColor->nRow = row;
    pColor->rgb = color;
    m_ptrListItem.AddTail(pColor);
    }
    void CWListCtrl::SetRowHeigt(int nHeight) //高置行高
    {
    m_nRowHeight = nHeight; CRect rcWin;
    GetWindowRect(&rcWin);
    WINDOWPOS wp;
    wp.hwnd = m_hWnd;
    wp.cx = rcWin.Width();
    wp.cy = rcWin.Height();
    wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
    SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
    }
    void CWListCtrl::SetHeaderFontHW(int nHeight,int nWith) //设置头部字体宽和高
    {
    m_Header.m_fontHeight = nHeight;
    m_Header.m_fontWith = nWith;
    }
    void CWListCtrl::SetHeaderTextColor(COLORREF color) //设置头部字体颜色
    {
    m_Header.m_color = color;
    }
    BOOL CWListCtrl::SetTextColor(COLORREF cr)  //设置字体颜色
    {
    m_color = cr;
    return TRUE;
    }
    void CWListCtrl::SetFontHW(int nHeight,int nWith) //设置字体高和宽
    {
    m_fontHeight = nHeight;
    m_fontWith = nWith;
    }
    void CWListCtrl::SetColTextColor(int col,COLORREF color)
    {
    stColor *pColor = new stColor;
    pColor->nCol = col;
    pColor->rgb = color;
    m_colTextColor.AddTail(pColor);
    }
    bool CWListCtrl::FindColTextColor(int col,COLORREF &color)
    {
    int flag = 0;
    for (POSITION pos = m_colTextColor.GetHeadPosition();pos!=NULL;)
    {
    stColor *pColor = (stColor*)m_colTextColor.GetNext(pos);
    if (pColor->nCol==col)
    {
    flag = 1;
    color = pColor->rgb;
    break;
    }
    }
    if (1==flag)
    {
    return true;
    }
    return false;
    }
    bool CWListCtrl::FindItemTextColor(int col,int row,COLORREF &color)
    {
    int flag = 0;
    for (POSITION pos = m_ItemTextColor.GetHeadPosition();pos!=NULL;)
    {
    stColor *pColor = (stColor*)m_ItemTextColor.GetNext(pos);
    if (pColor->nCol==col&&pColor->nRow==row)
    {
    flag = 1;
    color = pColor->rgb;
    break;
    }
    }
    if (1==flag)
    {
    return true;
    }
    return false;
    }
    void CWListCtrl::SetItemTextColor(int col,int row,COLORREF color)
    {
    stColor *pColor = new stColor;
    pColor->nCol = col;
    pColor->nRow = row;
    pColor->rgb = color;
    m_ItemTextColor.AddTail(pColor);
    }
      

  12.   


    恩。这样就对了。没有加这个他就会响应那个消息,如果加了就不行了。那按你的方法的能不能做到说把ListCtrl的每一行的高度加高,(不用图片撑高的方法)