VC++基于对话框编程中如何实现文件加载时,进度条的同步更新?

我在对话框中设置了一个菜单,当点击“打开”时出现选择文件对话框,选择文件,打开。这时我想用个进度条来同步显示文件加载时的进度。我VC菜鸟啊。。。网上说要用多线程,我就更晕... 我在对话框中设置了一个菜单,当点击“打开”时出现选择文件对话框,选择文件,打开。这时我想用个进度条来同步显示文件加载时的进度。我VC菜鸟啊。。。网上说要用多线程,我就更晕了。是不是要创建一个线程来获取文件加载的进度啊?恳请哪位大侠帮帮忙啊!
这是点击菜单中“打开”时的响应函数:
void CXkvtPlayerDlg::On32771()
{
// TODO: 在此添加命令处理程序代码
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,"virtools文件(*.cmo)|*.cmo");
if (IDOK!=dlg.DoModal())
{
return;
}

filename1=dlg.GetPathName();

OnInitPlayer(); //加载文件的函数,该文件使用Virtools做的一个三维视图文件。
GetMenu()->GetSubMenu(0)->EnableMenuItem(0,MF_BYPOSITION|MF_DISABLED|MF_GRAYED);
}
展开
 我来答
bd101203
推荐于2021-01-28
知道答主
回答量:18
采纳率:0%
帮助的人:0
展开全部
首先打开文件不需要进度条,open是立刻返回,只有读入的时候,如果文件很大才需要进度条,对用户提示。
方法1 循环读入文件,每读一段数据,就更新下进度条,让它前进一小步。
方法2 多线程,在另一个线程里读入,并更新进度条,可以先把进度条做参数传入
追问
那怎样做到一段一段的读入数据?
追答
读入一般是 read(),这里有个参数,指定这次read的长度, 你总不会一下把文件整个读进来吧,这指定的长度就是分段的长度。
首先getlengh() 得到整个文件长度,然后做循环,每次读入一段,读入一段处理一段, 直到整个处理完毕。
TeaKerY
2011-03-02 · TA获得超过287个赞
知道小有建树答主
回答量:191
采纳率:0%
帮助的人:234万
展开全部
首先在页面中加入进度条控件,具体叫什么记不清了,自己找一下
然后绑定变量
如果没猜错的话OnInitPlayer(); 这个函数是整个文件导入的函数吧。
应该从这个函数下手,因为只有这个函数里面才知道文件真正的导入进度。
在这个函数中,首先获取文件的大小,然后没导入一部分之后,算好比例,更新界面上的进度条就可以了。
如有不明白的地方可以Hi我。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
n6k677
2011-03-02 · TA获得超过1343个赞
知道小有建树答主
回答量:792
采纳率:0%
帮助的人:581万
展开全部
1.在MainFrm.h中生命对象:
CProgressCtrl m_progres;
2.在CMainFrame::OnCreate函数中创建状态栏样式:
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);

3.添加WM_PAINT消息,在消息的处理函数中:
CRect rect;
m_wndStatusBar.GetItemRect(0,&rect);
if(!m_progres.m_hWnd)
{
m_progres.Create(WS_CHILD | WS_VISIBLE ,//| PBS_SMOOTH,
rect,&m_wndStatusBar,123);
}
else
{
m_progres.MoveWindow(rect);
}

4.添加一个菜单,对其进行测试:
void CMainFrame::OnRun()
{
m_progres.StepIt();
}

这是个简单的例子,起码不会导致程序无法运行。
http://www.codeproject.com/KB/miscctrl/progressbar.aspx

参考资料: 百度一下

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户52746
2011-03-05 · TA获得超过418个赞
知道答主
回答量:160
采纳率:0%
帮助的人:139万
展开全部
.StepIt();
这里的StepIt()和你int CProgressDlg::StepIt() 不是同一个函数啊。

m_Progress的定义肯定是:CProgressCtrl m_Progress;
int iResult = m_Progress.StepIt();
这里的StepIt()是调用CProgressCtrl类中的函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式