首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

奇怪的 从绘listctrl

2013-07-04 
奇怪的 自绘listctrl需求:listctrl中插入一个进度条,每一行都有进度条 csdn上看到一个帖子,和我的需求相关

奇怪的 自绘listctrl
需求:listctrl中插入一个进度条,每一行都有进度条 

csdn上看到一个帖子,和我的需求相关,于是 运行了一下代码,发现可行,只是不知道运作原理。

代码为:


listctrl中嵌入一个processctrl

代码来自csdn




对话框调用代码:
CMyListCtrl m_listCtrl;
m_listCtrl.InsertUserData();
m_listCtrl.InsertUserData();






listctrl的风格为view: report, owner draw fixed:true


 封装的ListCtrl代码

//ListCtrl.h

#pragma once
#include<vector>
using std::vector;


//{"软件名字" ,"软件大小", "软件类别", "安装", "安装进度"};

typedef struct tagListCtrlData
{
TCHAR szSoftName[100];
TCHAR szSoftSize[20]; //用户使用的时候格式化字符串即可
TCHAR szSoftType[20];
TCHAR szSoftAction[20]; //软件行为:安装否,这里仅仅是一个演示
CProgressCtrl m_pProgressCtrl; //进度条
}ListCtrlData,* PListCtrlData;





class CMyListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CMyListCtrl)
private:
vector<PListCtrlData> m_progressPtrVec; //保存指针

public: 
CMyListCtrl();
virtual ~CMyListCtrl();

public:
BOOL InsertUserData(); //暂时只演示进度条

protected:
DECLARE_MESSAGE_MAP()
public:
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
protected:
virtual void PreSubclassWindow();
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
};



//ListCtrl.cpp


#include "stdafx.h"

#include "MyListCtrl.h"

#define  PROCESS_CTRL_ID 2000

IMPLEMENT_DYNAMIC(CMyListCtrl, CListCtrl)

CMyListCtrl::CMyListCtrl()
{

}

CMyListCtrl::~CMyListCtrl()
{
}


BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
END_MESSAGE_MAP()



void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO:  添加您的代码以绘制指定项
PListCtrlDatapListCtrlData=m_progressPtrVec[lpDrawItemStruct->itemID];
if(pListCtrlData)
{
CRect subRC;
GetSubItemRect(lpDrawItemStruct->itemID,4,LVIR_BOUNDS  ,subRC);
pListCtrlData->m_pProgressCtrl.MoveWindow(&subRC);
pListCtrlData->m_pProgressCtrl.ShowWindow(SW_SHOW);
}
}


void CMyListCtrl::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类

//增加ListCtrl列头
LVCOLUMN lvc = {LVCF_FMT | LVCF_TEXT | LVCF_WIDTH};
TCHAR* pszText[] = {_T("软件名字") ,_T("软件大小"), _T("软件类别"), _T("安装"), _T("安装进度")};
int cx[] = {150, 100, 150, 45, 500};
int i=0;
for (i = 0; i < sizeof(cx) / sizeof(int); i ++)
{
lvc.pszText = pszText[i];
lvc.cx = cx[i];
lvc.fmt = LVCFMT_CENTER;
InsertColumn(i, &lvc);
}

CListCtrl::PreSubclassWindow();
}



BOOL CMyListCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此添加专用代码和/或调用基类

return CListCtrl::PreCreateWindow(cs);
}


BOOL CMyListCtrl::InsertUserData()
{
PListCtrlData pListCtrl=new ListCtrlData();
ASSERT(pListCtrl);
m_progressPtrVec.push_back(pListCtrl);
static int nStep=0;
InsertItem(nStep,NULL);//问题在这里,为什么会有这么奇怪的代码??? 插入空行! 我去掉后, 则不会出现进度条
nStep++;
RECT rect={0,0,0,0};


pListCtrl->m_pProgressCtrl.Create(WS_CHILD,rect,this,PROCESS_CTRL_ID+nStep);
pListCtrl->m_pProgressCtrl.SetRange(0,99);
pListCtrl->m_pProgressCtrl.SetStep(10);
pListCtrl->m_pProgressCtrl.SetPos(10);
return TRUE;
}







[解决办法]
InsertItem是插入一行数据,注释掉肯定什么都没有,第二个参数是第一列的数据,插入一行后可以用
SetITemText设置其他列的数据
[解决办法]
DT_SINGLELINE
[解决办法]
DT_VCENTER 
[解决办法]
 DT_LEFT

热点排行