ListCtrlEx.cpp
上传用户:sunnie
上传日期:2022-07-13
资源大小:4512k
文件大小:7k
- // ListCtrlEx.cpp : implementation file
- //
- #include "stdafx.h"
- #include "ListCtrl.h"
- #include "ListCtrlEx.h"
- typedef vector<CListCtrlRow*> VECLISTROW;
- // CListCtrlEx
- IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl)
- CListCtrlEx::CListCtrlEx()
- {
- }
- CListCtrlEx::~CListCtrlEx()
- {
- }
- BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
- END_MESSAGE_MAP()
- // CListCtrlEx message handlers
- /*hdr
- ** Copyright ShangHai Skoito Lamp Ltd.,China
- **
- ** 函数名: InsertItemEx
- ** 作者: RobateWang
- ** 日期: 05 - 06 - 2010
- **
- ** 描述:
- ** 向list插入一行,这一行包括三种控件:精度条、编辑、复选框
- **
- **
- ** 变量: 变量名 方向 类型 描述
- ** nItem 入参 char * 行号
- ** nCmdShow 出参 boolean 显示命令
- **
- **
- ** 返回值:
- **
- **
- ** 备注:
- **
- */
- void
- CListCtrlEx::InsertItemEx(const int nItem, int nCmdShow)
- {
- CString strTemp = "";
- int nTop = GetTopIndex();
- int nTotal = GetItemCount();
- int nPerPage = GetCountPerPage();
- int nLastItem = ((nTop + nPerPage) > nTotal) ? nTotal : nTop + nPerPage;
- if ((nItem < nTop) && (nItem > nLastItem))
- {
- return;
- }
- CRect rcCol1(0, 0, 0, 0);
- CRect rcCol2(0, 0, 0, 0);
- CRect rcCol3(0, 0, 0, 0);
- CRect rcProgBar(0, 0, 0, 0);
- CRect rcEditBox(0, 0, 0, 0);
- CRect rcChkBox(0, 0, 0, 0);
- GetHeaderCtrl()->GetItemRect(1, &rcCol1);
- GetHeaderCtrl()->GetItemRect(2, &rcCol2);
- GetHeaderCtrl()->GetItemRect(3, &rcCol3);
- //计算第一行的位置
- if (GetItemCount() == 0)
- {
- rcProgBar.top += rcCol1.bottom;
- rcProgBar.bottom = rcProgBar.top + 12;
- rcEditBox.top += rcCol2.bottom;
- rcEditBox.bottom = rcEditBox.top + 12;
- rcChkBox.top += rcCol3.bottom;
- rcChkBox.bottom = rcChkBox.top + 12;
- }
- else
- {
- GetItemRect(GetItemCount() - 1, &rcProgBar, LVIR_LABEL);
- rcProgBar.top += 1;
- rcProgBar.bottom -= 1;
- rcEditBox.top += rcProgBar.top;
- rcEditBox.bottom = rcProgBar.bottom;
- rcChkBox.top += rcProgBar.top;
- rcChkBox.bottom = rcProgBar.bottom;
- }
- //计算进度条的位置
- rcProgBar.left += rcCol1.left - 4;
- rcProgBar.right = rcProgBar.left + rcCol1.Width() + 1;
- //计算编辑框的位置
- rcEditBox.left += rcCol2.left;
- rcEditBox.right = rcEditBox.left + rcCol2.Width() - 1;
- //计算复选框的位置
- rcChkBox.left += rcCol3.left;
- rcChkBox.right = rcChkBox.left + rcCol3.Width();
- //新建一行
- CListCtrlRow * pListRow = new CListCtrlRow;
- pListRow->SetRow(nItem);
- strTemp.Format("%s%d", "CheckBox", nItem + 1);
- //开始创建对应的控件,默认显示控件
- pListRow->CreateProgBar(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rcProgBar, this, IDC_LIST_CTRL + 10);
- pListRow->CreateEditBox(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, rcEditBox, this, IDC_LIST_CTRL + 11);
- pListRow->CreateChkBox(strTemp, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, rcChkBox, this, IDC_LIST_CTRL + 11);
- //放入数组,便于以后控制,比如隐藏、删除等
- m_vecListRow.push_back(pListRow);
- }
- /*hdr
- ** Copyright ShangHai Skoito Lamp Ltd.,China
- **
- ** 函数名: ReleaseAll
- ** 作者: RobateWang
- ** 日期: 05 - 06 - 2010
- **
- ** 描述:
- ** 将所有创建的控件销毁,如果不销毁就造成内存泄露
- **
- **
- ** 变量: 变量名 方向 类型 描述
- **
- **
- ** 返回值:
- **
- **
- ** 备注:
- **
- */
- void
- CListCtrlEx::ReleaseAll()
- {
- VECLISTROW::iterator iterRow = m_vecListRow.begin();
- while (iterRow != m_vecListRow.end())
- {
- (*iterRow)->DestroyWindow();
- delete (*iterRow);
- (*iterRow) = NULL;
- iterRow++;
- }//while
- m_vecListRow.clear();
- }
- /*hdr
- ** Copyright ShangHai Skoito Lamp Ltd.,China
- **
- ** 函数名: MovePosition
- ** 作者: RobateWang
- ** 日期: 05 - 06 - 2010
- **
- ** 描述:
- ** 将已经存在的控件移动到新位置
- **
- ** 变量: 变量名 方向 类型 描述
- **
- **
- ** 返回值:
- **
- **
- ** 备注:
- **
- */
- void
- CListCtrlEx::MovePosition()
- {
- int nTop = GetTopIndex();
- int nTotal = GetItemCount();
- int nPerPage = GetCountPerPage();
- int nLastItem = ((nTop + nPerPage) > nTotal) ? nTotal : nTop + nPerPage;
- CRect rcCol(0, 0, 0, 0);
- CRect rcProgBar(0, 0, 0, 0);
- CRect rcEditBox(0, 0, 0, 0);
- CRect rcChkBox(0, 0, 0, 0);
- VECLISTROW::iterator iterRow = m_vecListRow.begin();
- for (iterRow = m_vecListRow.begin(); iterRow != m_vecListRow.end(); iterRow++)
- {
- //移动第(*iterRow)->GetRow()行的进度条控件到新位置
- GetHeaderCtrl()->GetItemRect(1, &rcCol);
- GetItemRect((*iterRow)->GetRow(), &rcProgBar, LVIR_LABEL);
- rcProgBar.top += 1;
- rcProgBar.bottom -= 1;
- rcProgBar.left += rcCol.left - 4;
- rcProgBar.right = rcProgBar.left + rcCol.Width() + 1;
- (*iterRow)->MoveProgressBar(&rcProgBar);
- //移动第(*iterRow)->GetRow()行的编辑框控件到新位置
- GetHeaderCtrl()->GetItemRect(2, &rcCol);
- GetItemRect((*iterRow)->GetRow(), &rcEditBox, LVIR_LABEL);
- rcEditBox.top += 1;
- rcEditBox.bottom -= 1;
- rcEditBox.left += rcCol.left - 2;
- rcEditBox.right = rcEditBox.left + rcCol.Width();
- (*iterRow)->MoveEditBox(&rcEditBox);
- //移动第(*iterRow)->GetRow()行的复选框控件到新位置
- GetHeaderCtrl()->GetItemRect(3, &rcCol);
- GetItemRect((*iterRow)->GetRow(), &rcChkBox, LVIR_LABEL);
- rcChkBox.top += 1;
- rcChkBox.bottom -= 1;
- rcChkBox.left += rcCol.left;
- rcChkBox.right = rcChkBox.left + rcCol.Width();
- (*iterRow)->MoveChkBox(&rcChkBox);
- }
- //刷新窗口
- Invalidate();
- }
- /*hdr
- ** Copyright ShangHai Skoito Lamp Ltd.,China
- **
- ** 函数名: SetBarPosition
- ** 作者: RobateWang
- ** 日期: 05 - 06 - 2010
- **
- ** 描述:
- ** 设置进度条的位置,你可以根据实际需求来设计这个函数
- **
- ** 变量: 变量名 方向 类型 描述
- ** nPos 入参 int 进度条位置变量
- **
- ** 返回值:
- **
- **
- ** 备注:
- **
- */
- void
- CListCtrlEx::SetBarPosition(const int nPos)
- {
- VECLISTROW::iterator iterRow = m_vecListRow.begin();
- int nPosTemp = nPos;
- //设定所有的进度条位置
- for (iterRow = m_vecListRow.begin(); iterRow != m_vecListRow.end(); iterRow++)
- {
- ((*iterRow)->GetProgressBar())->SetPos(nPosTemp);
- nPosTemp += 2;
- if (nPosTemp >= 100)
- {
- nPosTemp = 0;
- }
- }
- }
- /*hdr
- ** Copyright ShangHai Skoito Lamp Ltd.,China
- **
- ** 函数名: SetChkBox
- ** 作者: RobateWang
- ** 日期: 05 - 06 - 2010
- **
- ** 描述:
- ** 设置复选框的状态,执行后会改变当前的状态,
- **
- ** 变量: 变量名 方向 类型 描述
- **
- **
- ** 返回值:
- **
- **
- ** 备注:
- **
- */
- void
- CListCtrlEx::SetChkBox()
- {
- VECLISTROW::iterator iterRow = m_vecListRow.begin();
- int nChk = 0;
- for (iterRow = m_vecListRow.begin(); iterRow != m_vecListRow.end(); iterRow++)
- {
- if (BST_UNCHECKED == ((*iterRow)->GetChkBox())->GetCheck())
- {
- //如果非选中,则设置选中
- nChk = BST_CHECKED;
- }
- else
- {
- //如果选中,则设置非选中
- nChk = BST_UNCHECKED;
- }
- ((*iterRow)->GetChkBox())->SetCheck(nChk);
- }
- }
- /*hdr
- ** Copyright ShangHai Skoito Lamp Ltd.,China
- **
- ** 函数名: SetEdtBox
- ** 作者: RobateWang
- ** 日期: 05 - 06 - 2010
- **
- ** 描述:
- ** 设置编辑框的内容,用户可根据实际需求来设计函数
- **
- ** 变量: 变量名 方向 类型 描述
- **
- **
- ** 返回值:
- **
- **
- ** 备注:
- **
- */
- void
- CListCtrlEx::SetEdtBox()
- {
- VECLISTROW::iterator iterRow = m_vecListRow.begin();
- CString sTemp = "";
- for (iterRow = m_vecListRow.begin(); iterRow != m_vecListRow.end(); iterRow++)
- {
- sTemp.Format("%s%d%s", "第", (*iterRow)->GetRow() + 1, "行");
- (*iterRow)->GetEdit()->SetWindowText(sTemp);
- }
- }