VC ListCtrl中嵌入进度条

VC中在listctrl中嵌入进度条,截图如下:

 

其实要实现这个非常容易,以下是自绘ListCtrl的代码,首先继承CListCtrl,然后增加函数OnCustomDraw: 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.  } }

然后为该函数增加消息映射(#add 其实是消息反射): 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);  } }

 

 

上面用到一个结构,是存放于ItemData中用来表示进度和步长的: typedef struct _ProcessLCI_Data_ {             int  nProportion;            int  nStep; } PLCIDATA, *LPPLCIDATA;

接下来就是在容器中使用继承的ListCtrl了,这里使用对话框,在一个定时器中模拟进度的变化(其它的初始化和清除就不罗嗦了):

void CListCtrlProcessDlg::OnTimer(UINT nIDEvent) {       if(nIDEvent == TIMER_PROCESS)       {                     BOOL bPaint = FALSE;          for(int i = 0; i < m_listProcess.GetItemCount(); ++i)           {                      LPPLCIDATA pIData = (LPPLCIDATA)m_listProcess.GetItemData(i);                      if(pIData->nProportion >= 100)                               continue;                      bPaint = TRUE;                      if(pIData->nProportion + pIData->nStep > 100)                      {                                pIData->nProportion = 100;                      }                      else                      {                                pIData->nProportion += pIData->nStep;                      }            }            if(bPaint)                      m_listProcess.Invalidate(FALSE);      }      CDialog::OnTimer(nIDEvent); }

   这里有个奇怪的问题,在VC6中不调上面的Invalidate(),只要TIMMER发生,进度条都会自动刷新。但在VC71上编译,如果不调Invalidate(),根本不刷新???不解!!!    从运行的结果看,效果还不错。VC6编译的就是满100%后进度条还是不停的闪烁;而VC71就不会了,因为没有调Invalidate()???

 

怎么样?很简单吧,其实使用VC开发界面也非常迅速的,虽然还是觉得MFC的封装有JAVA界面库封装得那么好该多好啊

时间: 2024-09-21 17:28:14

VC ListCtrl中嵌入进度条的相关文章

extjs-ExtJs如何用progresscolumn组件实现在grid的中列中嵌入进度条

问题描述 ExtJs如何用progresscolumn组件实现在grid的中列中嵌入进度条 请问各位大神,ExtJs如何用progresscolumn组件实现在grid的中列中嵌入进度条呢?由于是新手,我现在怎么搞都搞不出来 ,请问我帮帮忙,项目急需!!!像这样: 解决方案 配置renderer返回div设置width就好了吧,不需要第三方插件 renderer:function(value, metaData, record, rowIndex, colIndex, store){//v为计算

Asp.net中带进度条的批量静态页生成

asp.net|静态 Asp.net中带进度条的批量静态页生成 namespace WDFROG.BLL...{    public delegate void CreateHtmlHandler(string fileName,string msg,int percent );    public class News    ...{        private const string C_ERR_MSG = "You have no rights!";        priva

WEB应用程序中的进度条

web|程序 WEB应用程序中的进度条 Julien Cheyssial 写作于2003/10/01 Joise.LI翻译并修改于2004-4-2 写在前面: 原文是我在需要使用进度条时找到的一篇文章,讲解详细并附有实例.我在原文的基础上加上了自己的修改:增加了线程处理并且将进度条的使用放到了子线程中处理.这是我第一次翻译文章,敬请各位指正.原文见于http://www.myblogroll.com/Articles/progressbar/,请对照参考. 谁说在WEB应用程序中不能使用进度条?

在ASP.NET中显示进度条

asp.net|显示 对于加载时间比较长的ASP.NET页面,我们可以在客户端浏览器中显示进度条来显示页面正在装载.下面就是具体的实现过程: 新建项目,名字为WebPortal,在项目类型中选择Visual C#项目或者Visual Basic项目都可: 在模板类型中选择ASP.NET Web应用程序: 位置里输入:http://localhost/WebPortal: 添加新项:名字为ShowProgress的Web窗体. 在您的Web窗体ShowProgress.aspx上添加任何其他的We

c#中如何控制模态子窗体中的进度条

这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(Form.ShowDialog).主线程无法继续执行下面的事务:另一方面,又要在处理事务的时候来同步这个窗体里面的进度条.这两件事情都必须做,却都不能先做... 所以很多人不得不把事务处理写到模态窗体当中去,这样可以达到目的,却造成了代码结构混乱,而且子窗体无法复用,如果有多个事物,不得不为每个事务来写控制窗体. 这里我们介绍一种比较直接了当的方法,就是主线程中开启两个子线程,一个用于显示模态窗体,一个用于处理事务, 并同时更新第一个线程

C#实现在弹出窗口中显示进度条

在C#中要实现显示进度条,只要通过C#子线程控制进度条即可.至于弹出一个模式窗口来 显示进度条,则可以按照子线程的思路稍作修改. C#进度条窗体 首先是进度条窗体,需要在上面添加进度条,然后去掉ControlBox.除此外,还要增加一 个方法,用来控制进度条的增加幅度,具体如下: /// < summary> /// Increase process bar /// < /summary> /// < param name="nValue">the

Android在自定义View(SurfaceView)中实现进度条Progress

http://www.havenliu.com/java/689.html Android本身带有Progress控件.可以在布局中灵活使用,但如果是在自定义的View或者SurfaceView中使用,就需要自己实现,其实不难,只要熟悉了android的PorterDuff,就能利用PorterDuff的遮罩效果方便的实现进度条. PorterDuff.Mode的灵活使用可以实现很多强大的功能,比如以前比较流行的美女擦玻璃,在屏幕上用手指绘图或橡皮檫等功能. 下面是源码,老规矩,完整源码中文章末

Android ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

http://www.cnblogs.com/chon/archive/2011/06/28/2092317.html Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任.ListView存在的最根本的原因在于它的高效(如何实现的?).ListView通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xm

Android中自定义进度条详解_Android

Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子 很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如: ok,我们开始吧: 一)变换前背景 先来看看progressbar的属性: 复制代码 代码如下: <ProgressBar             android:id="@+id/progressBar"             style="?android:attr/progressBarStyleHor