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);
} 展开
这是点击菜单中“打开”时的响应函数:
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);
} 展开
展开全部
首先打开文件不需要进度条,open是立刻返回,只有读入的时候,如果文件很大才需要进度条,对用户提示。
方法1 循环读入文件,每读一段数据,就更新下进度条,让它前进一小步。
方法2 多线程,在另一个线程里读入,并更新进度条,可以先把进度条做参数传入
方法1 循环读入文件,每读一段数据,就更新下进度条,让它前进一小步。
方法2 多线程,在另一个线程里读入,并更新进度条,可以先把进度条做参数传入
追问
那怎样做到一段一段的读入数据?
追答
读入一般是 read(),这里有个参数,指定这次read的长度, 你总不会一下把文件整个读进来吧,这指定的长度就是分段的长度。
首先getlengh() 得到整个文件长度,然后做循环,每次读入一段,读入一段处理一段, 直到整个处理完毕。
展开全部
首先在页面中加入进度条控件,具体叫什么记不清了,自己找一下
然后绑定变量
如果没猜错的话OnInitPlayer(); 这个函数是整个文件导入的函数吧。
应该从这个函数下手,因为只有这个函数里面才知道文件真正的导入进度。
在这个函数中,首先获取文件的大小,然后没导入一部分之后,算好比例,更新界面上的进度条就可以了。
如有不明白的地方可以Hi我。
然后绑定变量
如果没猜错的话OnInitPlayer(); 这个函数是整个文件导入的函数吧。
应该从这个函数下手,因为只有这个函数里面才知道文件真正的导入进度。
在这个函数中,首先获取文件的大小,然后没导入一部分之后,算好比例,更新界面上的进度条就可以了。
如有不明白的地方可以Hi我。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
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
参考资料: 百度一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
.StepIt();
这里的StepIt()和你int CProgressDlg::StepIt() 不是同一个函数啊。
m_Progress的定义肯定是:CProgressCtrl m_Progress;
int iResult = m_Progress.StepIt();
这里的StepIt()是调用CProgressCtrl类中的函数。
这里的StepIt()和你int CProgressDlg::StepIt() 不是同一个函数啊。
m_Progress的定义肯定是:CProgressCtrl m_Progress;
int iResult = m_Progress.StepIt();
这里的StepIt()是调用CProgressCtrl类中的函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询