Files
2026-11-07 13:30:45 +07:00

174 lines
3.6 KiB
C++

// ListCtrlEx.cpp : implementation file
//
#include "stdafx.h"
#include "ListCtrlEx.h"
#include <tchar.h>
// CListCtrlEx
IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl)
CListCtrlEx::CListCtrlEx() : m_ProgressColumn(0)
{
m_progress = NULL;
}
CListCtrlEx::~CListCtrlEx()
{
}
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
ON_WM_PAINT()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
// CListCtrlEx message handlers
void CListCtrlEx::OnPaint()
{
// TODO: Add your message handler code here
// Do not call CListCtrl::OnPaint() for painting messages
int Top=GetTopIndex();
int Total=GetItemCount();
int PerPage=GetCountPerPage();
int LastItem=((Top+PerPage)>Total)?Total:Top+PerPage;
CHeaderCtrl* pHeader=GetHeaderCtrl();
POSITION pos = m_ProgressList.GetHeadPosition();
for(int i=Top;i<LastItem;i++)
{
if(pos != NULL)
{
CTextProgressCtrl* progress = m_ProgressList.GetAt(pos);
CRect ColRt;
pHeader->GetItemRect(m_ProgressColumn,&ColRt);
// get the rect
CString Data=GetItemText(i,m_ProgressColumn);
//SetItemText(i,m_ProgressColumn,_T(""));
CRect rt;
GetItemRect(i,&rt,LVIR_BOUNDS);
rt.top+=1;
rt.bottom-=1;
rt.right -= 10;
rt.left+=ColRt.left;
int Width=ColRt.Width() ;
rt.right=rt.left+Width-4;
int Percent=_ttoi(Data.GetBuffer());
// set the position on the control
progress->MoveWindow(rt);
progress->SetPos(Percent);
progress->ShowWindow(SW_SHOWNORMAL);
m_ProgressList.GetNext(pos);
}
}
CListCtrl::OnPaint();
}
void CListCtrlEx::InitProgressColumn(int ColNum/*=0*/)
{
m_ProgressColumn=ColNum;
// create the progress control and set their position
}
int CListCtrlEx::InsertItem( _In_ const LVITEM* pItem )
{
m_ProgressList.AddTail(CreateProgress());
return CListCtrl::InsertItem(pItem);
}
int CListCtrlEx::InsertItem( _In_ int nItem, _In_z_ LPCTSTR lpszItem )
{
m_ProgressList.AddTail(CreateProgress());
return CListCtrl::InsertItem(nItem,lpszItem);
}
int CListCtrlEx::InsertItem( _In_ int nItem, _In_z_ LPCTSTR lpszItem, _In_ int nImage )
{
m_ProgressList.AddTail(CreateProgress());
return CListCtrl::InsertItem(nItem,lpszItem,nImage);
}
BOOL CListCtrlEx::SetItemText( _In_ int nItem, _In_ int nSubItem, _In_z_ LPCTSTR lpszText )
{
return CListCtrl::SetItemText(nItem,nSubItem,lpszText);
}
BOOL CListCtrlEx::DeleteItem( _In_ int nItem )
{
CTextProgressCtrl* progress = m_ProgressList.RemoveTail();
delete progress;
return CListCtrl::DeleteItem(nItem);
}
BOOL CListCtrlEx::DeleteAllItems()
{
POSITION pos = m_ProgressList.GetHeadPosition();
while(pos)
{
CTextProgressCtrl* progress = m_ProgressList.GetAt(pos);
delete progress;
m_ProgressList.GetNext(pos);
}
m_ProgressList.RemoveAll();
return CListCtrl::DeleteAllItems();
}
CTextProgressCtrl* CListCtrlEx::CreateProgress()
{
CTextProgressCtrl* pControl=new CTextProgressCtrl();
CRect rt;
pControl->Create(NULL,rt,this,IDC_PROGRESS_LIST+ m_ProgressList.GetCount());
pControl->ShowWindow(SW_HIDE);
return pControl;
}
#if 0
void CListCtrlEx::SetProgressRange( int progressIndex, int min, int max )
{
if(m_ProgressList.GetSize() < progressIndex)
{
CProgressCtrl* progress = m_ProgressList.GetAt(progressIndex);
}
}
#endif
void CListCtrlEx::OnSetFocus(CWnd* pOldWnd)
{
CListCtrl::OnSetFocus(pOldWnd);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
}
void CListCtrlEx::OnKillFocus(CWnd* pNewWnd)
{
CListCtrl::OnKillFocus(pNewWnd);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
}