我在RasDial的回调函数中进行如下处理:VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError )
{
char szMessage[256];
CMainFrame *pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, AfxGetApp()->m_pMainWnd);
if (pMainFrame == NULL || !pMainFrame->IsKindOf(RUNTIME_CLASS(CMainFrame)))
return; CStatusBar *pStatus = (CStatusBar *)pMainFrame->GetStatusBar();
LoadString(::AfxGetApp()->m_hInstance,GetRasConnState((RASCONNSTATE)rasconnstate ),
szMessage, 64 );
// if (pStatus)
// {
// pStatus->SetPaneText(3, szMessage);
// } if (dwError) // 发 生 错 误
{
if ( RasGetErrorString( (UINT)dwError, szMessage, 256 ) != 0 )
wsprintf( (LPSTR)szMessage, " 出 错 Undefined RAS Dial Error." );
}
else if ( RASCS_DONE & rasconnstate ) // 连 接 成 功
{
CChildFrame *pChildFrm = static_cast<CChildFrame*>(pMainFrame->MDIGetActive());
CRasDialMgrView *pRasDialView = pChildFrm->GetTreeView();
if (pRasDialView)
{
pRasDialView->FinishConn(true);
} if (pStatus)
{
// 设置状态栏信息
// pStatus->SetPaneText(3, "连接成功");
}
}}结果发现都出现异常,系统提示m_hwnd不对!我设计时采用MDI结构,并在CChildFrame中进行窗体划分,并定义
GetTreeView()得到CTreeView 类指针,调试时发现指针地址正常,但就是有如下问题:
1〉
CStatusBar *pStatus = pMainFrame->GetMessageBar(); 无法得到状态栏对象句柄,后在CMainFrame中实现如下函数:
CStatusBar *GetStatusBar(void)
{ return (::IsWindow(m_wndStatusBar)) ? &m_wndStatusBar : NULL; }
这时,指针地址对了,
if (pStatus)
{
pStatus->SetPaneText(3, szMessage);
}
却还是出现异常,调试发现是因为其m_hwnd = NULL.注释后,在pMainFrame->MDIGetActive()函数调用中依然出错,调试发现得到的子框架为CTempWnd.总体感觉怪怪的!自我猜测,可能按下对话框以后,当前主框架和子窗体对应窗体被释放!看来只能使用消息传递方法了!不知道有人有这方面经验吗?我使用SDI开发却没有一点问题,相关指针都能正常工作!希望各位多多指点,教我如何实现回调函数与相关视图框架类进行交互!
{
char szMessage[256];
CMainFrame *pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, AfxGetApp()->m_pMainWnd);
if (pMainFrame == NULL || !pMainFrame->IsKindOf(RUNTIME_CLASS(CMainFrame)))
return; CStatusBar *pStatus = (CStatusBar *)pMainFrame->GetStatusBar();
LoadString(::AfxGetApp()->m_hInstance,GetRasConnState((RASCONNSTATE)rasconnstate ),
szMessage, 64 );
// if (pStatus)
// {
// pStatus->SetPaneText(3, szMessage);
// } if (dwError) // 发 生 错 误
{
if ( RasGetErrorString( (UINT)dwError, szMessage, 256 ) != 0 )
wsprintf( (LPSTR)szMessage, " 出 错 Undefined RAS Dial Error." );
}
else if ( RASCS_DONE & rasconnstate ) // 连 接 成 功
{
CChildFrame *pChildFrm = static_cast<CChildFrame*>(pMainFrame->MDIGetActive());
CRasDialMgrView *pRasDialView = pChildFrm->GetTreeView();
if (pRasDialView)
{
pRasDialView->FinishConn(true);
} if (pStatus)
{
// 设置状态栏信息
// pStatus->SetPaneText(3, "连接成功");
}
}}结果发现都出现异常,系统提示m_hwnd不对!我设计时采用MDI结构,并在CChildFrame中进行窗体划分,并定义
GetTreeView()得到CTreeView 类指针,调试时发现指针地址正常,但就是有如下问题:
1〉
CStatusBar *pStatus = pMainFrame->GetMessageBar(); 无法得到状态栏对象句柄,后在CMainFrame中实现如下函数:
CStatusBar *GetStatusBar(void)
{ return (::IsWindow(m_wndStatusBar)) ? &m_wndStatusBar : NULL; }
这时,指针地址对了,
if (pStatus)
{
pStatus->SetPaneText(3, szMessage);
}
却还是出现异常,调试发现是因为其m_hwnd = NULL.注释后,在pMainFrame->MDIGetActive()函数调用中依然出错,调试发现得到的子框架为CTempWnd.总体感觉怪怪的!自我猜测,可能按下对话框以后,当前主框架和子窗体对应窗体被释放!看来只能使用消息传递方法了!不知道有人有这方面经验吗?我使用SDI开发却没有一点问题,相关指针都能正常工作!希望各位多多指点,教我如何实现回调函数与相关视图框架类进行交互!
CStatusBar * pStatusBar =
(CStatusBar*)AfxGetMainWnd()->GetDescendantWindow (AFX_IDW_STATUS_BAR);得到子框架可以用 CMDIChildWnd* pChild =(CMDIChildWnd *)GetActiveFrame();
BOOL SetStatusInfo(LPCTSTR strInfo); 在回调函数中用mainframe的指针调用即可。同理,将对treectrl的操作视图中,保留相应的操作接口。在回调函数中取得主窗口指针,并判断指针是否有效,否则不要进行响应的操作。
pMainFrm != NULL && IsWindow(pMainFrm).界面对象指针一般不要在回调函数中保存,因为有些界面对象的句柄可能是临时的。