在别的函数或者线程函数里使用 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_STATETEXT
return 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所在对话框来间接修改它的文本