首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  界面/窗口  |  列表控件   


 在ListCtrl中嵌入进度条


原作者:不详    源出处:CSDN    发布者:施昌权    发布类型:转载    发布日期:2008-09-25

      

        其实要实现这个非常容易,以下是自绘ListCtrl的代码,首先继承CListCtrl,然后增加函数:
        void CProcessList::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
        {
                //draw each item.set txt color,bkcolor....
                NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
 
                // Take the default processing unless we set this to something else below.
                *pResult = CDRF_DODEFAULT;
 
                // First thing - check the draw stage. If it's the control's prepaint
                // stage, then tell Windows we want messages for every item.
 
                if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
                {
                        *pResult = CDRF_NOTIFYITEMDRAW;
                }
                else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
                {
                        // This is the notification message for an item.  We'll request
                        // notifications before each subitem's prepaint stage.
  
                        *pResult = CDRF_NOTIFYSUBITEMDRAW;
                }
                else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
                {
                        // This is the prepaint stage for a subitem. Here's where we set the
                        // item's text and background colors. Our return value will tell
                        // Windows to draw the subitem itself, but it will use the new colors
                        // we set here.
  
                        int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
                        int nSubItem = pLVCD->iSubItem;
  
                        if(nSubItem != 2)//这里我只重绘第二列
                                return;

                        COLORREF crText  = ::GetSysColor(COLOR_WINDOWFRAME);
                        COLORREF crBkgnd = ::GetSysColor(COLOR_WINDOW);
  
                        CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc);
                        CRect rect;
                        GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
                        if (GetItemState(nItem, LVIS_SELECTED))
                                DrawText(nItem, nSubItem, pDC, ::GetSysColor(COLOR_HIGHLIGHT), ::GetSysColor(COLOR_HIGHLIGHT), rect);
                        else
                                DrawText(nItem, nSubItem, pDC, crText, crBkgnd, rect);

                        *pResult = CDRF_SKIPDEFAULT; // We've painted everything.
                }
        }

        然后为该函数增加消息映射:
        ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)

        最后我们为画进度条而努力,这里程序中把进度存在ItemData中。
        void CProcessList::DrawText(int nItem,
        int nSubItem,
        CDC *pDC,
        COLORREF crText,
        COLORREF crBkgnd,
        CRect &rect)
        {
                ASSERT(pDC);
                pDC->FillSolidRect(&rect, crBkgnd);
 
                int nProcess = GetItemData(nItem);
                CRect procRect = rect;
                pDC->Rectangle(procRect);

                procRect.left += 1;
                procRect.bottom -= 1;
                procRect.top += 1;
                procRect.right = procRect.left + rect.Width() * nProcess / 100;
                CBrush brush(RGB(255,0,0));
                pDC->FillRect(&procRect, &brush);
 
                CString str;
                str.Format("%d%%", nProcess);
 
                if (!str.IsEmpty())
                {
                        UINT nFormat = DT_VCENTER | DT_SINGLELINE | DT_CENTER;
  
                        pDC->SetBkMode(TRANSPARENT);
                        pDC->SetTextColor(crText);
                        pDC->SetBkColor(crBkgnd);
                        pDC->DrawText(str, &rect, nFormat);
                }
        }

        怎么样?很简单吧,其实使用VC开发界面也非常迅速的……


关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号