MFC 进度条的实现
我想做一个对话框,用来实现一个进度条。在DLG类里面我写了一个函数Step();其内容如下给进度条控件添加变量,类型为CProgressCtrl,变量名拟为m_prom_...
我想做一个对话框,用来实现一个进度条。在DLG类里面我写了一个函数
Step();其内容如下
给进度条控件添加变量,类型为CProgressCtrl,变量名拟为m_pro
m_Pro.SetRange(0,100);
for(int i = 0; i < 100; i++)
{
m_Pro.SetPos(10);
Sleep(10);
}
然后通过该类的对象调用这个函数发现出现一个m_pro找不到句柄的错误。
不知道各位高手能否帮我下。谢谢
m_pro我是在DLG上申明的,也和DLG关联了。关于单独的线程,这个我不太清楚怎么弄能明确解释下吗 展开
Step();其内容如下
给进度条控件添加变量,类型为CProgressCtrl,变量名拟为m_pro
m_Pro.SetRange(0,100);
for(int i = 0; i < 100; i++)
{
m_Pro.SetPos(10);
Sleep(10);
}
然后通过该类的对象调用这个函数发现出现一个m_pro找不到句柄的错误。
不知道各位高手能否帮我下。谢谢
m_pro我是在DLG上申明的,也和DLG关联了。关于单独的线程,这个我不太清楚怎么弄能明确解释下吗 展开
1个回答
展开全部
你进度条具体的建立过程不知道有没有遗漏的?
将 progress控件拖放到dlg上,然后用mfc向导为他建立一个变量,m_Pro,为dlg类的成员变量。(这时vc会自动帮你把变量与控件建立好联系)
还有就是,进度条的进度显示你最好单弄一个线程,不要影响dlg的本身操作。
--------------------
线程问题不是你这问题的重点,具体要看你的工程需求,我看到你这里用了for循环,如果一直在循环里,可能在短时间内造成你的dlg假死现象。把进度显示和里面的操作放到一个循环中时,最好是在线程里。这里只是优化而已,线程的创建使用可以单查下教程了。
你的问题重点是那个无效句柄
你的无效句柄问题设个断点具体调试看看吧。我只能向你猜测几种可能。
也许你的工程是个文档工程,然后临时创建了一个包含进度条对话框。如果是这种情况,大概就是你的对话框对象提前析构导致的。你可以把声明dlg对象的代码 改成 new一个dlg指针 来替代(记得在dlg析构里delete this)
也许你是用DoModle方法调用的dlg,当IDOK后调用一些列函数,包括Step()
这种情况类似上面,IDOK后dlg析构了,再调用dlg对象可能会产生一些错误。可以改用非模态方法创建。
将 progress控件拖放到dlg上,然后用mfc向导为他建立一个变量,m_Pro,为dlg类的成员变量。(这时vc会自动帮你把变量与控件建立好联系)
还有就是,进度条的进度显示你最好单弄一个线程,不要影响dlg的本身操作。
--------------------
线程问题不是你这问题的重点,具体要看你的工程需求,我看到你这里用了for循环,如果一直在循环里,可能在短时间内造成你的dlg假死现象。把进度显示和里面的操作放到一个循环中时,最好是在线程里。这里只是优化而已,线程的创建使用可以单查下教程了。
你的问题重点是那个无效句柄
你的无效句柄问题设个断点具体调试看看吧。我只能向你猜测几种可能。
也许你的工程是个文档工程,然后临时创建了一个包含进度条对话框。如果是这种情况,大概就是你的对话框对象提前析构导致的。你可以把声明dlg对象的代码 改成 new一个dlg指针 来替代(记得在dlg析构里delete this)
也许你是用DoModle方法调用的dlg,当IDOK后调用一些列函数,包括Step()
这种情况类似上面,IDOK后dlg析构了,再调用dlg对象可能会产生一些错误。可以改用非模态方法创建。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询