C++/MFC-Progress


一、CProgressCtrl控件属性   

   当我们在处理大程序时,常常需要耗很长时间(比如搜索内存,复制大文件),为了不让用户错误的认为系统已经死机,我们要给程序添加进度条。

  vertical :是否垂直显示。

  smooth :平滑过度,不显示进度方块。可以显示更细致。

二、CProgressCtrl类常用成员函数

SetRange

void SetRange( short nLower, short nUpper );

  为进度条控件设置范围的最小值和最大值,并重画进度条来反映新的范围,默认为0~100,若设置32位范围,用下面的函数。 -0x8fff~0x7FFF

SetRange32

void SetRange32( int nLower, int nUpper);

为进度条控件设置范围的最小值和最大值,并重画进度条来反映新的范围

GetRange

void GetRange( int&nLower, int&nUpper );

获取进度条控件范围的下限和上限

GetPos

获取进度条的当前位置

SetPos

设置进度条的当前位置,并重画进度条来反映新的位置

OffsetPos

在原位置上增加一段数值,并重画进度条来反映新的位置

SetStep

设置进度条前进的步长,返回原来步长。配合StepIt使用

在进度条上会以百分比的形式显示出来步长/(最大值-最小值)

 三、控件使用

方法一:用GetDlgItem的指针方式

CProgressCtrl* prgctl=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
prgctl->SetPos(50);//位置
prgctl->SetRange32(0,300);//范围
/******************三种方法增加进度**********************/
//法一:使用SetPos增加进度
static int i=0;
prgctl->SetPos(i);
i+=10;
if (i>=300)
{
       i=0;
}
//法二:使用OffsetPos增加进度
prgctl->OffsetPos(10);
//法三:使用SetStep增加进度
prgctl->SetStep(3);//设置增量
prgctl->StepIt();

方法二:控件类型的变量

CProgressCtrl m_Pro;








要解压zip文件并显示进度条,可以使用Windows API中的ShellAPI和ZipArchive库。 以下是一个简单的示例代码: ```c++ #include <afxwin.h> #include <afxcmn.h> #include <shlobj.h> #include "ZipArchive.h" class CUnzipDlg : public CDialogEx { public: CUnzipDlg(CWnd* pParent = NULL) : CDialogEx(IDD_UNZIP_DIALOG, pParent) {} protected: virtual void DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } virtual BOOL OnInitDialog(); afx_msg void OnBtnUnzipClicked(); DECLARE_MESSAGE_MAP() private: CProgressCtrl m_progress; }; BOOL CUnzipDlg::OnInitDialog() { CDialogEx::OnInitDialog(); m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, CRect(10, 10, 240, 40), this, IDC_PROGRESS1); m_progress.SetRange(0, 100); m_progress.SetPos(0); return TRUE; } BEGIN_MESSAGE_MAP(CUnzipDlg, CDialogEx) ON_BN_CLICKED(IDC_BTN_UNZIP, &CUnzipDlg::OnBtnUnzipClicked) END_MESSAGE_MAP() void CUnzipDlg::OnBtnUnzipClicked() { CString strZipFile = _T("C:\\test.zip"); CString strDstFolder = _T("C:\\unzip"); HZIP hZip = OpenZip(strZipFile, 0, ZIP_FILENAME); ZIPENTRY ze; int nCount = GetZipItems(hZip, -1, -1, -1, &ze); int nProgress = 0; for (int i = 0; i < nCount; i++) { GetZipItem(hZip, i, &ze); if (UnzipItem(hZip, i, strDstFolder) != ZR_OK) { AfxMessageBox(_T("Failed to unzip file!")); break; } nProgress = (i + 1) * 100 / nCount; m_progress.SetPos(nProgress); } CloseZip(hZip); } int main() { AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); CUnzipDlg dlg; dlg.DoModal(); return 0; } ``` 其中,ZipArchive库可以从GitHub上下载,ShellAPI中的SHGetFolderPath可以获取特定文件夹的路径,CProgressCtrl是MFC中的进度条控件。 以上代码仅提供了一个基本的思路,具体实现还需要根据自己的需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值