【MFC基础】09进度条Progress

1、首先在初始化对话框中设置进度条的范围和初始位置

CProgressCtrl* pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);
pProg->SetRange(0, 100);
pProg->SetPos(0);
//也可关联控件变量

2、在确定按钮中设置定时器

//设置定时器
SetTimer(1, 100, nullptr);
//当开始的时候,按钮不可用
CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1);
pBtn->EnableWindow(FALSE);

3、在定时器函数设置进度条的实时位置

void CMFCTESTDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    int iPos = 0;
    iPos = m_prog.GetPos();//获取当前进度条位置
    iPos += 1;
    m_prog.SetPos(iPos); 
    CString s1,s2;
    s1 = _T("%");
    s2.Format(_T("%d"), iPos);
    SetDlgItemText(IDC_STATIC_DISPLAY, s1 + s2);
    if (iPos == 100)//当达到100的时候就关闭定时器,并且事按钮可用,位置设为0
    {
        KillTimer(1);
        m_prog.SetPos(0);
        CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1);
        pBtn->EnableWindow(TRUE);
    }
    CDialogEx::OnTimer(nIDEvent);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MFC 中实现文件下载进度条可以按照以下步骤进行: 1. 创建一个 MFC 对话框应用程序。 2. 添加一个按钮和一个进度条控件到对话框中。 3. 为按钮添加一个点击事件处理函数,用于触发文件下载操作。 4. 在事件处理函数中,使用 WinINet API 进行文件下载,并获取下载进度。 5. 在下载过程中,更新进度条控件的值。 下面是一个简单的示例代码: ```cpp // 声明全局变量 UINT_PTR g_TimerID; // 定时器ID CProgressCtrl* g_pProgressBar; // 进度条控件指针 // 按钮点击事件处理函数 void CMyDlg::OnBtnDownload() { // 创建进度条控件 g_pProgressBar = new CProgressCtrl; CRect rect; rect.left = 50; rect.right = 250; rect.top = 100; rect.bottom = 120; g_pProgressBar->Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rect, this, IDC_PROGRESS); // 启动定时器 g_TimerID = SetTimer(1, 100, NULL); // 启动文件下载线程 AfxBeginThread(DownloadThread, this); } // 文件下载线程函数 UINT DownloadThread(LPVOID pParam) { CMyDlg* pDlg = (CMyDlg*)pParam; // 使用 WinINet API 进行文件下载 // 打开连接 HINTERNET hInternet = InternetOpen(L"FileDownload", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); HINTERNET hConnect = InternetOpenUrl(hInternet, L"http://www.example.com/file.txt", NULL, 0, INTERNET_FLAG_RELOAD, 0); // 获取文件大小 DWORD dwFileSize = 0; DWORD dwLength = sizeof(DWORD); HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwFileSize, &dwLength, NULL); // 创建文件 HANDLE hFile = CreateFile(L"file.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // 下载文件 BYTE pBuffer[4096]; DWORD dwBytesRead = 0; DWORD dwBytesWritten = 0; DWORD dwTotalBytesWritten = 0; while (InternetReadFile(hConnect, pBuffer, sizeof(pBuffer), &dwBytesRead) && dwBytesRead > 0) { WriteFile(hFile, pBuffer, dwBytesRead, &dwBytesWritten, NULL); dwTotalBytesWritten += dwBytesWritten; // 更新进度条 pDlg->SendMessage(WM_USER_UPDATE_PROGRESS, dwTotalBytesWritten, dwFileSize); } // 关闭连接 CloseHandle(hFile); InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); // 停止定时器 pDlg->KillTimer(g_TimerID); return 0; } // 消息映射函数,用于更新进度条控件 afx_msg LRESULT CMyDlg::OnUpdateProgress(WPARAM wParam, LPARAM lParam) { DWORD dwTotalBytesWritten = (DWORD)wParam; DWORD dwFileSize = (DWORD)lParam; int nProgress = (int)((double)dwTotalBytesWritten / dwFileSize * 100); g_pProgressBar->SetPos(nProgress); return 0; } BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx) ON_MESSAGE(WM_USER_UPDATE_PROGRESS, OnUpdateProgress) END_MESSAGE_MAP() ``` 上述代码通过使用 WinINet API 进行文件下载,并在下载过程中通过定时器更新进度条控件的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperJun12345

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值