在线程中控制进度条的问题?急!急!急!

zhengque 2005-09-20 11:58:15
在一弹出对话框中对进度条控制。
代码是这样写的。
HWND g_hWndMain=NULL;
BOOL CMydlg::OnInitDialog()
{

g_hWndMain =this->GetSafeHwnd();
...
}

UINT MyThreadProc(LPVOID pParam) //工作线程函数
{
CProgressCtrl wndProgress;
wndProgress.Attach(::GetDlgItem(g_hWndMain, IDC_PROGRESS));
//在对话框中已经添加了IDC_PROGRESS进度条资源
wndProgress.SetPos(0);
...
}
编译没有问题,但是在运行到wndProgress.SetPos(0);时程序停止。也就是说我定义的进度条对象根本没有绑定到资源上。请各位高手救急!
...全文
291 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2005-09-20
  • 打赏
  • 举报
回复
向UI线程发送消息,由UI线程来操作进度条。

GetDlgItem一样的出问题了。要传递HWND应该传递ProcessCtrl的HWND.
zhengque 2005-09-20
  • 打赏
  • 举报
回复
谢谢楼上的几位,我找到原因了,WaitForSingleObject函数的最后一个参数不能设置成INFINITE。
phoenix96_2000 2005-09-20
  • 打赏
  • 举报
回复
这里有个HTTP下载文件的例子,是用的单独线程,对话框下载显示进度的:
http://www.codeproject.com/internet/downloaddlg.asp


zhengque 2005-09-20
  • 打赏
  • 举报
回复
我做了一个简单的基于对话框的例子,还是没成功。不知道哪里弄错了?
zhengque 2005-09-20
  • 打赏
  • 举报
回复
是的,程序死住了。
zhengque 2005-09-20
  • 打赏
  • 举报
回复
谁有这样的例子吗?给我发一个,我将非常感激。
我的邮箱是zeng_wei8860@sina.com
谢谢!
phoenix96_2000 2005-09-20
  • 打赏
  • 举报
回复
停住了的意思是 程序因此被阻塞了?
zhengque 2005-09-20
  • 打赏
  • 举报
回复
还是不行,句柄返回的有效,但程序运行到::SendMessage(hWnd,PBM_SETPOS, 10 , 0L);就停住了。
phoenix96_2000 2005-09-20
  • 打赏
  • 举报
回复
AfxMessageBox("invalid window handle");
这句话执行到了么??
zhengque 2005-09-20
  • 打赏
  • 举报
回复
非常感谢楼上的几位帮忙,可是这两种方法我都试了,还是不好使,消息发送了可是进度条没有反应。
phoenix96_2000 2005-09-20
  • 打赏
  • 举报
回复
那你再试试这样,看看返回的句柄是否有效:

HWND hWnd = GetDlgItem(g_hWndMain, IDC_PROGRESS);
if( !IsWindow(hWnd) )
{
AfxMessageBox("invalid window handle");
return 0;
}

::SendMessage(hWnd,PBM_SETPOS, 10 , 0L);
zhengque 2005-09-20
  • 打赏
  • 举报
回复
CProgressCtrl * pCtrl = (CProgressCtrl*)(AfxGetMainWnd()->GetDlgItem(IDC_PROGRESS));

我试了,可是得到指针是空的,仍然出错。
zhengque 2005-09-20
  • 打赏
  • 举报
回复
::GetDlgItem(g_hWndMain, IDC_PROGRESS);返回的是IDC_PROGRESS的句柄,有错误吗?
phoenix96_2000 2005-09-20
  • 打赏
  • 举报
回复
CProgressCtrl * pCtrl = (CProgressCtrl*)(AfxGetMainWnd()->GetDlgItem(IDC_PROGRESS));
pCtrl->SetPos(,,);

或者,你直接用PBM_SETPOS的消息:

::SendMessage(::GetDlgItem(g_hWndMain, IDC_PROGRESS), PBM_SETPOS, nPos, 0L);
zhengque 2005-09-20
  • 打赏
  • 举报
回复
如果传递进度条的句柄运行就出错,请问有什么好的解决办法?
mynamelj 2005-09-20
  • 打赏
  • 举报
回复
wndProgress.Attach(::GetDlgItem(g_hWndMain, IDC_PROGRESS));
这个句柄不是对话框的句柄吗?怎么附加到进度条上了?

2,586

社区成员

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

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