|
VC++ 在clistctrl单元格中嵌入进度条,继承Cprogressctrl,
在VC++中,要在 `CListCtrl` 的单元格中嵌入一个进度条,可以创建一个自定义控件,继承自 `CProgressCtrl` ,并在 `CListCtrl` 中使用这个自定义进度条控件。以下是实现这一功能的步骤:
### 步骤 1: 创建自定义进度条控件
首先,创建一个继承自 `CProgressCtrl` 的自定义控件。
- // MyProgressCtrl.h
- #pragma once
- #include <afxcmn.h>
- class CMyProgressCtrl : public CProgressCtrl
- {
- public:
- void SetRange(int nLower, int nUpper);
- void SetPos(int nPos);
- void SetStep(int nStep);
- void StepIt();
- };
复制代码
### 步骤 2: 实现自定义进度条控件
在实现文件中,可以添加一些基本的功能。
- // MyProgressCtrl.cpp
- #include "MyProgressCtrl.h"
- void CMyProgressCtrl::SetRange(int nLower, int nUpper)
- {
- CProgressCtrl::SetRange(nLower, nUpper);
- }
- void CMyProgressCtrl::SetPos(int nPos)
- {
- CProgressCtrl::SetPos(nPos);
- }
- void CMyProgressCtrl::SetStep(int nStep)
- {
- CProgressCtrl::SetStep(nStep);
- }
- void CMyProgressCtrl::StepIt()
- {
- CProgressCtrl::StepIt();
- }
复制代码
### 步骤 3: 创建自定义列表控件
接下来,创建一个继承自 `CListCtrl` 的自定义列表控件,并在其中嵌入进度条控件。
- // MyListCtrl.h
- #pragma once
- #include <afxcmn.h>
- #include "MyProgressCtrl.h"
- class CMyListCtrl : public CListCtrl
- {
- public:
- CMyListCtrl();
- virtual ~CMyListCtrl();
- protected:
- CMyProgressCtrl* m_pProgressCtrl;
- void ShowProgressCtrl(int nItem, int nSubItem, int nPos);
- protected:
- afx_msg void OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult);
- DECLARE_MESSAGE_MAP()
- };
复制代码
### 步骤 4: 实现自定义列表控件
在实现文件中,可以处理自定义绘制和显示进度条。
- // MyListCtrl.cpp
- #include "MyListCtrl.h"
- BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
- ON_NOTIFY(NM_CUSTOMDRAW, IDC_MYLISTCTRL, &CMyListCtrl::OnNMCustomdraw)
- END_MESSAGE_MAP()
- CMyListCtrl::CMyListCtrl()
- {
- m_pProgressCtrl = new CMyProgressCtrl();
- }
- CMyListCtrl::~CMyListCtrl()
- {
- delete m_pProgressCtrl;
- }
- void CMyListCtrl::ShowProgressCtrl(int nItem, int nSubItem, int nPos)
- {
- // 获取单元格的位置
- CRect rect;
- GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
- ClientToScreen(&rect);
- // 设置进度条的位置和大小
- m_pProgressCtrl->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER | SWP_SHOWWINDOW);
- m_pProgressCtrl->SetRange(0, 100); // 设置进度范围
- m_pProgressCtrl->SetPos(nPos); // 设置当前进度
- }
- void CMyListCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
- {
- // 根据需要更新进度条的显示
- // 例如,显示第0行第0列的进度条
- ShowProgressCtrl(0, 0, 50); // 示例:在第0行第0列显示50%的进度条
- *pResult = 0;
- }
复制代码
### 步骤 5: 在对话框中使用自定义列表控件
在对话框中使用 `CMyListCtrl` 。
- // MyDialog.cpp
- #include "MyListCtrl.h"
- void CMyDialog::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- // 初始化列表控件
- m_myListCtrl.InsertColumn(0, _T("Progress"), LVCFMT_LEFT, 100);
- m_myListCtrl.InsertItem(0, _T("Item 1"));
- }
复制代码
### 注意事项
1. **进度条的显示**:在 `ShowProgressCtrl` 方法中,获取单元格的位置并在该位置显示进度条。
2. **自定义绘制**:通过重写 `OnNMCustomdraw` 方法,可以根据需要更新进度条的显示。
3. **资源管理**:确保在适当的时候创建和销毁进度条控件,以避免内存泄漏。
通过以上步骤,你就可以在 `CListCtrl` 的单元格中嵌入进度条了。
|
|