CWnd类临时对象会在主线程OnIdle时被DeleteTempMap函数清除掉。

CWnd类临时对象会在主线程OnIdle时被DeleteTempMap函数清除掉。 

 为什么我使用Sleep函数后改变了我的CWnd指针对象的m_pCtrlSite的值
悬赏分:30 - 提问时间2008-4-30 15:22 问题为何被关闭
我想使用线程控制我的按钮的摆动,可是当我使用sleep函数后,我的CWnd *pWnd的m_pCtrlSize值被改变,使得程序无法继续,请问该如何解决
部分代码如下:UINT ButtonFlutterThread(LPVOID pParam)
{
FLT_THREAD *pStruct =static_cast<FLT_THREAD *>(pParam);
CWnd *pWnd;
CRect rectMain,rectButton1,rectButton2,rectButton3,rectButton;
int offset=3;

pStruct->pViewWnd->GetWindowRect(rectMain);
pStruct->pWnd1->GetWindowRect(rectButton1);
pStruct->pWnd2->GetWindowRect(rectButton2);
pStruct->pWnd3->GetWindowRect(rectButton3);
while(WaitForSingleObject(pStruct->hEvent,0)==WAIT_TIMEOUT)
{
switch(*pStruct->pnThreadType)
{
case SHIJUANXINXI:
rectButton.left=rectButton1.left-rectMain.left;
rectButton.top=rectButton1.top-rectMain.top;
rectButton.right=rectButton1.right-rectMain.left;
rectButton.bottom=rectButton1.bottom-rectMain.top;
pWnd=pStruct->pWnd1;
break;
case JIANKAOXINXI:
rectButton.left=rectButton2.left-rectMain.left;
rectButton.top=rectButton2.top-rectMain.top;
rectButton.right=rectButton2.right-rectMain.left;
rectButton.bottom=rectButton2.bottom-rectMain.top;
pWnd=pStruct->pWnd2;
break;
case KAOCHANGANPAI:
rectButton.left=rectButton3.left-rectMain.left;
rectButton.top=rectButton3.top-rectMain.top;
rectButton.right=rectButton3.right-rectMain.left;
rectButton.bottom=rectButton3.bottom-rectMain.top;
pWnd=pStruct->pWnd3;
break;
default:
break;
}
pWnd->MoveWindow(rectButton.left-offset,rectButton.top+offset
,rectButton.Width(),rectButton.Height());
Sleep(200);

pWnd->MoveWindow(rectButton.left,rectButton.top,rectButton.Width()
,rectButton.Height());
Sleep(200);

pWnd->MoveWindow(rectButton.left+offset,rectButton.top+offset
,rectButton.Width(),rectButton.Height());
Sleep(200);

pWnd->MoveWindow(rectButton.left,rectButton.top,rectButton.Width()
,rectButton.Height());
Sleep(1000);
}
return true;
}

void CMyView::ButtonThreadInit(void)
{
m_pStruct->pViewWnd=(CWnd *)this;
m_pStruct->pWnd1=GetDlgItem(IDC_BUTTON_SHIJUAN);
m_pStruct->pWnd2=GetDlgItem(IDC_BUTTON_JIANKAO);
m_pStruct->pWnd3=GetDlgItem(IDC_BUTTON_KAOCHANG);
m_pStruct->hEvent=m_hEventFlutter;

m_wtFlutter=AfxBeginThread(ButtonFlutterThread,m_pStruct,THREAD_PRIORITY_ABOVE_NORMAL);
}
问题补充:可是这个方法在我的另外一个程序中用的好好的,在这两个程序中,这个线程都是单独的模块,没有和其他的东西发生联系的.
提问者: a40520 - 试用期 一级
答复     1
问题出在GetDlgItem,
这个函数返回的CWnd*是用CWnd::FromHandle产生的,
如果返回的窗口不是CWnd类或其派生类的对象,
这个操作会返回一个临时对象,
而这个临时对象会在主线程OnIdle时被DeleteTempMap函数清除掉。
如果一定要这么用,可以为每个控件创建一个对象,就不会有问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值