GetMainWnd()
GetMainWnd()
AfxGetApp()
AfxGetApp( )这个函数可以得到当前应用进程的CWinApp类指针,是CWinApp*类型的,一般情况下将其强制类型转换成你自己写的App类就可以调用里面的方法了。
CWnd* pWnd = AfxGetApp()->GetMainWnd();
或者:
Cwnd *Wnd = AfxGetApp()->GetMainWnd();
Wnd->ShowWindow(SW_SHOW);
说明:
(1) AfxGetApp()->GetMainWnd()相当于 m_pMainWnd,参见定义:
CWnd* m_pMainWnd; // main window (usually same AfxGetApp()->m_pMainWnd)
(2) 最好使用AfxGetApp()->GetMainWnd()->GetSafeHwnd(),不要使用AfxGetApp()->GetMainWnd()->m_hWnd,,这个不安全。
用途:常用于::PostMessage()发送消息,例如:
例1:不带消息内容
::PostMessage(AfxGetApp()->GetMainWnd()->GetSafeHwnd(), WM_SHOW_WND, 0, 0);
::PostMessage(m_hWarnDlg, WM_UPDATE_WARN, 0, 0);
例2:附带消息内容
(1) 自定义消息 #define WM_CLIENT_WARN WM_USER + 10
(2) 消息映射 ON_MESSAGE(WM_CLIENT_WARN, &CEPSConsoleDlg::HandleClientWarnMsg)
(3) 函数原型 afx_msg LRESULT HandleClientWarnMsg(WPARAM, LPARAM);//自定义消息响应"客户端告警",产生弹窗
(4) 发消息
int nLen = sMsgData.GetLength();
char *pBuff = new char[nLen + 1];
memset(pBuff, 0, nLen + 1);
memcpy_s(pBuff, nLen, sMsgData.GetString(), sMsgData.GetLength());
::PostMessage(::AfxGetApp()->GetMainWnd()->m_hWnd, WM_CLIENT_WARN_V2, (WPARAM)pBuff, 0);
(5) 原函数收消息
LRESULT CEPSConsoleDlg::HandleClientWarnV2Msg(WPARAM wParam, LPARAM lParam)
{
//强制转换消息
char *pMsgBuff = (char*)wParam;
... ...
//需要释放内存
if (pMsgBuff)
{
delete []pMsgBuff;
pMsgBuff = NULL;
}
}
GetSafeHwnd()
HWND hwnd;
CWnd* pWnd;
pWnd= AfxGetApp()->m_pMainWnd();
hwnd=pWnd->GetDlgItem(IDC_EDIT2)->GetSafeHwnd();
::SetWindowText(hwnd,m_strResult);