DoModal()数据交换问题!

jackfeige 2009-02-23 08:52:23
在主界面DoModal();出一个对话框,对话框里就一个CProgressCtrl进度条控件,
想让这个进度条根据主界面里的某些信息来更新进度。进度到最后的时候退出DoModal();出的对话框

不知道该如何传递不断更新得进度值来更新进度条显示!
...全文
271 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
stock888 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 fanlehai 的回复:]
建议在InitDialog里建立一个线程,显示进度
[/Quote]
我一般用多线程
Learn-anything 2009-02-24
  • 打赏
  • 举报
回复
建议在InitDialog里建立一个线程,显示进度
ok1234567 2009-02-24
  • 打赏
  • 举报
回复
进度消息类界面最好不要使用模态对话框(DoModal),而使用非模态,
自行控制主窗口和对话框,使用消息(::PostMessage)在窗口间进行信息传递
summersdw1 2009-02-24
  • 打赏
  • 举报
回复
可以选择定义一个CProgress m_progress,在空白得地方Create一下
然后m_progress.ShowWindow(SW_HIDE)
需要得时候就m_progress.ShowWindow(SW_SHOW)
然后操作m_progress参数就可以了
用完了就m_progress.ShowWindow(SW_HIDE)

这样就省去了DLG和主界面参数传递问题和DoModal后代码不能执行问题
arong1234 2009-02-24
  • 打赏
  • 举报
回复
你的执行代码不会紧跟着DoModal吧?DoModal在你对话框结束前是不返回的
jackfeige 2009-02-24
  • 打赏
  • 举报
回复
刚发现这个问题~prog.DoModal()以后当弹出进度条后,程序就停止往下运行了,所以后面得相关进度信息都无法都到了~
当关掉对话框后面得程序才运行~
allenhiman 2009-02-23
  • 打赏
  • 举报
回复
domodal对话框设定timer,timer读取相关变量
YMIW163 2009-02-23
  • 打赏
  • 举报
回复
void CProgressDlg::StepIt(void)
{
CProgressCtrl *pWnd = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);
if(pWnd)
{
pWnd->StepIt();
int pos=pWnd->GetPos();
if(pos==m_upper)//如果进度条到最后就退出窗口
PostMessage(WM_CLOSE,0,0);
}
}

如何传值,你实在没办法就定义个全局函数来搞吗。
xmrforever 2009-02-23
  • 打赏
  • 举报
回复
mark
帮顶
jackfeige 2009-02-23
  • 打赏
  • 举报
回复
我是在DoModal之前算好了运行的步骤,比如需要50步,那我就在InitDlg中将CProgressCtrl的RANGE设置为50,然后在主程序中每运行一步进度条就进一
biaozai06 2009-02-23
  • 打赏
  • 举报
回复
在你的对话框类中使用GetParent( )得到父窗口句柄即可
jackfeige 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Conry 的回复:]
对话框提供一个StepIt供主窗口调用

C/C++ code
void CProgressDlg::StepIt(void)
{
CProgressCtrl *pWnd = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);
if(pWnd)
{
pWnd->StepIt();
int pos=pWnd->GetPos();
if(pos==m_upper)//如果进度条到最后就退出窗口
PostMessage(WM_CLOSE,0,0);
}
}
[/Quote]

主窗口如何DoModal()??主窗口如何传值给对话框
闪破风浪 2009-02-23
  • 打赏
  • 举报
回复
类成员变量传递数据~
Allen_zhang 2009-02-23
  • 打赏
  • 举报
回复
用消息即可。
bitwwzhang130 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Conry 的回复:]
对话框提供一个StepIt供主窗口调用

C/C++ code
void CProgressDlg::StepIt(void)
{
CProgressCtrl *pWnd = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);
if(pWnd)
{
pWnd->StepIt();
int pos=pWnd->GetPos();
if(pos==m_upper)//如果进度条到最后就退出窗口
PostMessage(WM_CLOSE,0,0);
}
}
[/Quote]
这个好
Conry 2009-02-23
  • 打赏
  • 举报
回复
对话框提供一个StepIt供主窗口调用

void CProgressDlg::StepIt(void)
{
CProgressCtrl *pWnd = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);
if(pWnd)
{
pWnd->StepIt();
int pos=pWnd->GetPos();
if(pos==m_upper)//如果进度条到最后就退出窗口
PostMessage(WM_CLOSE,0,0);
}
}



yyg0110 2009-02-23
  • 打赏
  • 举报
回复
可用一个定时器响应变量,设定一个时间点即可
捕鲸叉 2009-02-23
  • 打赏
  • 举报
回复
OnTimer
showxier 2009-02-23
  • 打赏
  • 举报
回复
"根据主界面的某些信息.."所以是主界面发送进度值给对话框,对话框根据这个进度值相应的设置进度条位置,当进度值最大时再OnCancel()

定时器
::PostMessage(对话框.m_hWnd, 自定义消息, (int)类型, (int)当前进度值);

对话框
LRESULT MyProgress(WPARAM wParam, LPARAM lParam)//参数:wParam进度类型,最大值等之类的, lParam当前进度值

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧