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

本文介绍了一种使用PostMessage更新主框架控件文本时遇到的问题及解决方案。通过特定的控件定位方法,成功避免了空指针异常,实现了跨线程控件文本的安全更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

[cpp]  view plain copy
  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. }  


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

[cpp]  view plain copy
  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);  
[cpp]  view plain copy
  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函数不变,即下面发送消息函数不修改:

[cpp]  view plain copy
  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);  
[cpp]  view plain copy
  1. }  

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

[cpp]  view plain copy
  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. }  

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


转自:http://blog.youkuaiyun.com/abcdef8c/article/details/7075328

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值