2

更新:可能な解決策。ヘッダーで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;

私は何か間違ったことをしていますか?

助けてくれてありがとう。

更新:個々の関数内で呼び出すと、正常に機能します!

4

3 に答える 3

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;
}
于 2012-09-08T07:04:33.190 に答える
1

ダイアログの最初だけでなく、更新後にも手動でメッセージを送信する必要があります。このようなもの:

void CProgressDialog::SetProgress(int Progress) 
{
    m_progressBar.SetPos(Progress);

    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
于 2015-01-15T21:04:32.047 に答える
0

使用する:

m_progressBar.SetPos(Progress + 1);

m_progressBar.SetPos(Progress);

表示されます。理由を聞かないでください...PS.:最後のプログレスステップに到達するときの注意!

于 2018-12-07T13:15:35.827 に答える