BOOL CDlgPrompt::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
m_progerss.SetRange(0,100);
m_handle = CreateThread(NULL,0,SetProgress,NULL,0,NULL);
return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}DWORD WINAPI CDlgPrompt::SetProgress(LPVOID lpParameter)
{
while(1)
{
if(num>100)
     num=0;
dlgPrompt.m_progress.SetPos(num);//dlgPrompt是窗体类对象(全局),m_progress是进度条类对象
num+=20;
Sleep(500);
}

return 0;
}
按上面代码实现,但进度条没变化,这是怎么回事?我调试后发现执行到dlgPrompt.m_progress.SetPos(num);会卡住。(说明:dlgPrompt窗体是非模式的)

解决方案 »

  1.   

    dlgPrompt.m_progress.SetPos(...)dlgPrompt应该CDlgPrompt类实例吧(不是对象指针)
    不多说,改用
    AfxGetMain()->m_progress.SetPos(...)另外不建议在线程中直接操作界面
    可用PostMessage或SendMessage
      

  2.   

    我用PostMessage与SendMessage发送消息,窗体(非模式)接收不到。
    若是模式化窗体可以接收到。这是为什么?该怎么处理?
      

  3.   

    我用的方法是在线程中通过PostMessge发送消息给主界面.
    然后通过PreTranslateMessage来处理消息完成进度条更新的.
    BOOL CMd5FileDlg::PreTranslateMessage(MSG* pMsg)
    {
    // WM_MSG_UPDATE_PRESS是一个自定义消息
    if(pMsg->message==WM_MSG_UPDATE_PRESS)
    {
    if(pMsg->lParam){
    //初始化消息,m_setp为进度条控件
    m_step.SetRange32(0,pMsg->wParam);
    }else{
    m_step.SetPos(pMsg->wParam);
    }
    } return CDialog::PreTranslateMessage(pMsg);
    }