奇怪的 自绘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: 添加您的代码以绘制指定项
PListCtrlData pListCtrlData=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;
}