更新:可能的解决方案。在标题中声明CWait对话框似乎可以解决这个问题。
UPDATE2:消息泵可能是罪魁祸首。明确的“抽”似乎解决了问题。
当某些功能在应用程序中执行时,我试图显示模态“请等待”对话框。我想要显示的对话框是这样的:
我使用此代码调用对话框。
CWait dialog;
dialog.Create(IDD_WAIT);
dialog.SetWindowTextW(L"Geocoding");
dialog.ShowWindow(SW_SHOW);
mastImageGeocode(); //Working here
slvImageGeocode();
interfImageGeocode();
cohImageGeocode();
dialog.CloseWindow();
最终显示的是:
我似乎无法弄清楚为什么控件无法呈现。
我尝试使用这种方法初始化对话框后手动处理消息循环:
MSG stMsg;
while (::PeekMessage (&stMsg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage (&stMsg);
::DispatchMessage (&stMsg);
}
没有真正奏效。
我也试过指针方法
Cwait * dialog; //THis is in header
dialog = new CWait(this);
dialog->Create(IDD_WAIT);
dialog->SetWindowTextW(L"Geocoding");
dialog->ShowWindow(SW_SHOW);
mastImageGeocode(); //Some work here
slvImageGeocode();
interfImageGeocode();
cohImageGeocode();
dialog->CloseWindow();
delete dialog;
我做错了什么。
感谢您的帮助。
更新:如果我在各个功能中调用它,它可以正常工作!
答案 0 :(得分:1)
听起来您没有从主处理循环更新对话框。我在下面放了一个我的MFC进度对话框的缩减版本。请注意,有必要定期调用 SetProgress 来更新屏幕。更一般的一点是,如果您在MFC中使用无模式对话框,则需要调用 OnUpdate(FALSE)来刷新它们,并确保它们有足够的时间来执行此操作。很多时候,当我认为我需要一个无模式对话框时,我实际上通过将任务分成不同的线程来提供更好的服务,即处理部分放在自己的工作线程中。 YMMV。
class CProgressDialog : public CDialog
{
public:
CProgressDialog(LPCTSTR Name,int Max,CWnd* pParent = NULL);
CProgressDialog(UINT NameID,int Max,CWnd* pParent = NULL);
virtual ~CProgressDialog();
int m_Max;
void SetProgress(int Progress);
void SetRange(int Range);
enum { IDD = IDD_PROGRESS_DIALOG };
CProgressCtrl m_Progress;
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
};
CProgressDialog::CProgressDialog(LPCTSTR Name,int Max,CWnd* pParent /*=NULL*/)
: CDialog(CProgressDialog::IDD, pParent)
{
Create(CProgressDialog::IDD, pParent);
SetWindowPos(&wndTop,1,1,0,0,SWP_NOSIZE | SWP_SHOWWINDOW);
SetWindowText(Name);
m_Max = Max;
}
CProgressDialog::~CProgressDialog()
{
DestroyWindow();
}
void CProgressDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_PROGRESS, m_Progress);
}
BEGIN_MESSAGE_MAP(CProgressDialog, CDialog)
END_MESSAGE_MAP()
BOOL CProgressDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_Progress.SetRange32(0,m_Max);
return TRUE;
}
void CProgressDialog::SetProgress(int Progress)
{
m_Progress.SetRange32(0,m_Max);
m_Progress.SetPos(Progress);
UpdateData(FALSE);
}
void CProgressDialog::SetRange(int Range)
{
m_Max = Range;
}
答案 1 :(得分:0)
您不仅需要在对话框开始时手动提取消息,还需要在更新后手动提取消息。 像这样:
void CProgressDialog::SetProgress(int Progress)
{
m_progressBar.SetPos(Progress);
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
答案 2 :(得分:0)
使用:
m_progressBar.SetPos(Progress + 1);
m_progressBar.SetPos(Progress);
,它将显示。不要问我为什么... PS .:到达最后一个Progressstep时要注意!