在别的函数或者线程函数里使用 PostMessage

 

在别的函数或者线程函数里使用 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)小收获

分类: VC++ 189人阅读 评论(0) 收藏 举报

 这是我从使用 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)给主框架发送消息来让主框架调用自身函数修改对话框上控件文本的小经验。因为出现的错误在网上找了很久没有找到解决办法,后来我自己解决了。所以很想在此分享下。

首先这个错误是这样的:主框架Cmainframe里有个响应消息函数,用来动态改变控件IDC_STATETEXT的文本的

  1. LRESULT CMainFrame::SetStateText(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     int ctrID=(int)wParam;  
  4.     GetDlgItem(ctrID)->SetWindowText("why");//这里ctrID=IDC_STATETEXT   
  5.     return 0;  
  6. }  
LRESULT CMainFrame::SetStateText(WPARAM wParam, LPARAM lParam)
{
	int ctrID=(int)wParam;
	GetDlgItem(ctrID)->SetWindowText("why");//这里ctrID=IDC_STATETEXT
	return 0;
}


在另外的类函数里调用PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_STATE_TEXT,IDC_STATETEXT,0)给主框架发送消息来调用上面的函数修改控件文本

  1. void CSRImageCtrl::GetImgFeatures(int et1,int dt2)  
  2. {  
  3.     //给主框架传递消息更新状态   
  4.     state_text="状态:正在转换为二值图像...";  
  5.     //::AfxGetMainWnd()->SendMessage(WM_STATE_TEXT,IDC_STATETEXT,0);   
  6.     PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_STATE_TEXT,IDC_STATETEXT,0);  
void CSRImageCtrl::GetImgFeatures(int et1,int dt2)
{
	//给主框架传递消息更新状态
	state_text="状态:正在转换为二值图像...";
	//::AfxGetMainWnd()->SendMessage(WM_STATE_TEXT,IDC_STATETEXT,0);
	PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_STATE_TEXT,IDC_STATETEXT,0);
  1. }  
}


程序运行得到这样的报错:

Debug Assertion Failed!
> Program F:\......\MyProject.exe
> File: F:\dd\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\winocc.cpp
> Line: 245

> For information...
> Could anybody give me a help, thanks in advance

其实我F盘只是数据盘,根本没装有任何程序,可是报错里无故出现f盘的路径。不管这个,使用F11逐步调试跟踪,发现winocc.cpp里面的函数SetWindowText的第一句assert(this)不能通过,原因是this指针为空。网上找了好几个方法都不行,比如有人说不用PostMessage,直接在函数里调用AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_STATETEXT)->SetWindowText(state_text),可是同样报错,错误原理一样。

 

最终解决办法

依然使用PostMessage函数不变,即下面发送消息函数不修改:

  1. void CSRImageCtrl::GetImgFeatures(int et1,int dt2)  
  2. {  
  3.     //给主框架传递消息更新状态   
  4.     state_text="状态:正在转换为二值图像...";  
  5.     //::AfxGetMainWnd()->SendMessage(WM_STATE_TEXT,IDC_STATETEXT,0);   
  6.     PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_STATE_TEXT,IDC_STATETEXT,0);  
void CSRImageCtrl::GetImgFeatures(int et1,int dt2)
{
	//给主框架传递消息更新状态
	state_text="状态:正在转换为二值图像...";
	//::AfxGetMainWnd()->SendMessage(WM_STATE_TEXT,IDC_STATETEXT,0);
	PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_STATE_TEXT,IDC_STATETEXT,0);
  1. }  
}

将主框架里的函数修改如下:

  1. LRESULT CMainFrame::SetStateText(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     int ctrID=(int)wParam;  
  4.     //GetDlgItem(IDC_STATETEXT)->SetWindowText("why");//这句会报错   
  5.     <SPAN style="COLOR: #ff0000">COLHSRView *pView=(COLHSRView*)m_wndSplitter1.GetPane(0,1);  
  6.     (pView->m_pCtrlDlg->GetDlgItem(IDC_STATETEXT))->SetWindowText("why");  
  7.   
  8. </SPAN> return 0;  
  9. }  
LRESULT CMainFrame::SetStateText(WPARAM wParam, LPARAM lParam)
{
	int ctrID=(int)wParam;
	//GetDlgItem(IDC_STATETEXT)->SetWindowText("why");//这句会报错
	COLHSRView *pView=(COLHSRView*)m_wndSplitter1.GetPane(0,1);
	(pView->m_pCtrlDlg->GetDlgItem(IDC_STATETEXT))->SetWindowText("why");

	return 0;
}

红色的代码为修改后代码,是通过获取控件IDC_STATETEXT所在对话框来间接修改它的文本

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值