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窗体是非模式的)
{
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窗体是非模式的)
不多说,改用
AfxGetMain()->m_progress.SetPos(...)另外不建议在线程中直接操作界面
可用PostMessage或SendMessage
若是模式化窗体可以接收到。这是为什么?该怎么处理?
然后通过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);
}