如何在Visual c++中同步一个进度控件和一组正在加载的对话框中的数据

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

本文关键字:一组 加载 数据 对话框 控件 一个 c++ Visual 同步      更新时间:2023-10-16

我试图在我的对话框中添加一个进度控制,这将在循环的每次迭代上进行步骤,直到完成。我之前从未尝试过进度控制,所以我完全不知道应该从哪里开始。我在对话框中添加了一个进度控件资源视图,但它只是显示为一个空的进度控件。我想有进度控制动态出现/更新时,按下按钮后,从某个地方星星正在加载图像。我试图在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在文本窗口,但我不知道如何显示加载过程的进度控制和如何以及在哪里定义范围,甚至进度条句柄为这个进度控制等等。最后我想知道是否有进度控制功能,例如:

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

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

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

然后,无论你提到的eventParam1值是什么,将它在你的开始值和停止值之间占比例,并用它调用SetPos。


注释后更新:

执行OnInitDialog()函数中的SetRange()。如果你还没有一个OnInitDialog,你需要覆盖它,按照这个问题的公认答案中的说明来做。VS 2008, MFC:添加OnInitDialog -如何?

至于你把SetPos():你描述,你已经可以跟踪加载进度在一个文本控件使用一些或其他eventParam1。这听起来像是你正在做的任何加载的处理程序或回调,这就是你将在进度条实例上代替SetPos()的地方。

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

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

作为使用显式位置值调用CProgressCtrl::SetPos的替代方法,您可以设置一个步长增量,调用CProgressCtrl::SetStep,并通过调用CProgressCtrl::StepIt来更新控件。如果您提前知道步长增量,这是更新当前位置的一种更简单的方法。

更多信息请访问MSDN: Using CProgressCtrl