天天看點

MFC/VC DLL導出對話框,焦點混亂問題

vs建立dll,然後在dll裡面建立對話框,并通過導出函數的方式建立時,會碰到各種各樣的問題。比如edit控件擷取不了焦點,無法輸入;子對話框無法移動;各種button的焦點混亂等各種問題。

原因分析:

dll中建立的mfc對話框底層有自己的視窗map清單,exe中的某些消息有可能傳遞不到dll中,是以需要将exe中的程式傳遞到dll,具體的底層原因,以後在分析加入

//dll中導出函數:
BOOL WINAPI FilterDllMsg(LPMSG lpMsg)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    TRY
    {
        return AfxGetThread()->PreTranslateMessage(lpMsg);
    }
    END_TRY
    return FALSE;
}

//如果是dll導出的非子對話框在exe的app中如下調用:

BOOL CScreenCapApp::PreTranslateMessage(MSG* pMsg)
{
    if (CWinApp::PreTranslateMessage(pMsg))
        return(TRUE);

    return(FilterDllMsg(pMsg));
}

// 如果dll導出的是子對話框,則需要在相應父對話框的PreTranslateMessage内調用,如下:
BOOL CYourDialog::PreTranslateMessage(MSG* pMsg)
{
    // 傳遞給子對話框的消息和傳遞給父對話框的消息是有交集的,是以注意某些消息需要隻交給一方處理。
    // ? 不隻為何先處理Prexxx,再調用Filter不行
    if (FilterDllMsg(pMsg))
        return(TRUE);

    return(CDialogEx::PreTranslateMessage(pMsg));
}
           
MFC