如何将进度控件与一组在 Visual C++ 的对话框中加载的数据同步

How to sync a Progress Control with a set of data which is loading in a Dialog Box in Visual C++

我正在尝试在我的对话框中添加一个进度控件,它会在循环的每次迭代中执行直到完成。我以前从未玩过进度控件,所以我完全不知道应该从哪里开始。我已经在我的对话框中添加了一个进度控制资源视图,但它只是显示为一个空的进度控件。我想在按下按钮后加载来自某处星星的图像时动态地控制进度 appear/update。 我正在尝试在 Visual c++ 环境中的对话框中添加进度控件。

添加此工具后,将以下代码添加到 main.cpp:

void CPanoramicsampleDlg::OnNMCustomdrawProgress1(NMHDR *pNMHDR, LRESULT *pResult){
}

我可以显示在文本控件中加载的过程如下:

sprintf_s(pack1,"Data%d%%",Event);
::SetWindowText(GetDlgItem(IDC_Static)->m_hWnd,pack1);

所以通过这种方式我可以在文本中将加载过程视为 %d window 但我不知道如何通过进度控制显示加载过程以及如何以及在何处定义范围甚至进度条这个进度控制的句柄等等。 最后我想知道是否有任何进度控制功能例如:

::EnableWindow(GetDlgItem(IDC_Progress1)->m_hWnd);

CProgressCtrl Class 提供了您必须使用的以下成员:

  • CProgressCtrl::SetRange:允许您设置下限和上限。这些值理想地反映了您的起始状态和结束状态。
  • CProgressCtrl::SetPos:用于更新当前位置。您将更新您用于在编辑控件中输出进度的当前位置。

作为使用显式位置值调用 CProgressCtrl::SetPos 的替代方法,您可以设置步进增量,调用 CProgressCtrl::SetStep, and update the control with a call to CProgressCtrl::StepIt。如果您提前知道步长增量,这是更新当前位置的更简单方法。

MSDN 上提供了更多信息:Using CProgressCtrl

您应该首先为控件添加一个变量,方法是右键单击对话框编辑器中的进度条,然后选择添加变量...然后您的对话框 class 将有一个 CProgressCtrl class 然后你可以调用 IInspectable 在他的回答中提到的成员。删除 OnNMCustomdrawProgress1 处理程序,您不需要它。

例如

m_progressCtrl.EnableWindow(TRUE);
m_progressCtrl.SetRange(0, 100);
m_progressCtrl.SetPos(75);

然后,无论您提到的 eventParam1 值是什么,将它按比例分配给您的起始值和终止值,然后用它调用 SetPos。


评论后更新:

在 OnInitDialog() 函数中执行 SetRange()。如果您还没有 OnInitDialog 需要覆盖它,请按照此问题的已接受答案中的说明进行操作。 VS 2008, MFC: add OnInitDialog - how?

关于放置 SetPos() 的位置:您描述了您已经可以使用某些 eventParam1 在文本控件中跟踪加载进度。这听起来像是您正在执行的任何加载操作的处理程序或回调,这就是您将在进度条实例上代替 SetPos() 的地方。