在别的函数或者线程函数里使用 PostMessage
来源:互联网 发布:python里的while break 编辑:程序博客网 时间:2024/06/06 02:28
在别的函数或者线程函数里使用 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)小收获
这是我从使用 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)给主框架发送消息来让主框架调用自身函数修改对话框上控件文本的小经验。因为出现的错误在网上找了很久没有找到解决办法,后来我自己解决了。所以很想在此分享下。
首先这个错误是这样的:主框架Cmainframe里有个响应消息函数,用来动态改变控件IDC_STATETEXT的文本的
- LRESULT CMainFrame::SetStateText(WPARAM wParam, LPARAM lParam)
- {
- int ctrID=(int)wParam;
- GetDlgItem(ctrID)->SetWindowText("why");//这里ctrID=IDC_STATETEXT
- return 0;
- }
LRESULT CMainFrame::SetStateText(WPARAM wParam, LPARAM lParam){int ctrID=(int)wParam;GetDlgItem(ctrID)->SetWindowText("why");//这里ctrID=IDC_STATETEXTreturn 0;}
在另外的类函数里调用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);
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);
- }
}
程序运行得到这样的报错:
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函数不变,即下面发送消息函数不修改:
- 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);
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);
- }
}
将主框架里的函数修改如下:
- LRESULT CMainFrame::SetStateText(WPARAM wParam, LPARAM lParam)
- {
- int ctrID=(int)wParam;
- //GetDlgItem(IDC_STATETEXT)->SetWindowText("why");//这句会报错
- <SPAN style="COLOR: #ff0000">COLHSRView *pView=(COLHSRView*)m_wndSplitter1.GetPane(0,1);
- (pView->m_pCtrlDlg->GetDlgItem(IDC_STATETEXT))->SetWindowText("why");
- </SPAN> return 0;
- }
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所在对话框来间接修改它的文本
- 在别的函数或者线程函数里使用 PostMessage
- 在别的函数或者线程函数里使用 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)小收获
- 在别的函数或者线程函数里使用 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)小收获
- python里使用Future对象进行回调别的函数
- PostMessage函数
- 在PostMessage或SendMessage中通过WPARAM或者LPARAM将数组传递给消息处理函数
- PostMessage函数和SendMessage函数的使用
- 当构造函数定义在private或者protected里时
- 关于为什么在线程函数中使用afxMessageBox或者messageBox都不能弹出?
- PostMessage函数参数介绍
- 转:PostMessage函数介绍
- PostMessage函数介绍
- API函数 postmessage 初探
- PostMessage()API函数
- 关于在构造函数中使用memset或者ZeroMemery问题
- GetDlgItem、EnableWindow等函数在线程函数中无法使用
- Windows线程入口函数--静态或者全局!
- PostMessage 与 SendMessage 函数对比
- Linux中man的使用
- 杭电acm1012 u Calculate e
- 【面试题】求两个数的2进制差异位的个数
- Java Bit Computing
- 多级菜单的横向导航通过非递归方式实现
- 在别的函数或者线程函数里使用 PostMessage
- poj3468 A Simple Problem with Integers 线段树区间累加求和
- SVN服务器端安装、配置与管理
- what is NAPI
- 杭电acm1085 Holding Bin-Laden Captive!
- 虚拟机(VMware)安装centos后的IP设置
- Window 命令
- JSP中的include
- WP7中的页面导航与传值