使用 CreateIndirect 创建非模态对框,只有一个LPCDLGTEMPLATE类型变量
我的创建方式是:CreateIndirect(m_lpDialogTemplate, pParentWnd); pParentWnd是父窗口指针,没有指定第三个参数 :lpDialogInit 因为我的程序中无法获得这个值(不知道能不能只直接通过m_lpDialogTemplate获得?)。
我创建非模态对话框成功了,能够正常显示。但是窗口中有一个按钮控件,只要一点按钮整个窗口就没有反应了,也无法调到相应的单击事件处理函数,请问这是怎么回事儿?
我的创建方式是:CreateIndirect(m_lpDialogTemplate, pParentWnd); pParentWnd是父窗口指针,没有指定第三个参数 :lpDialogInit 因为我的程序中无法获得这个值(不知道能不能只直接通过m_lpDialogTemplate获得?)。
我创建非模态对话框成功了,能够正常显示。但是窗口中有一个按钮控件,只要一点按钮整个窗口就没有反应了,也无法调到相应的单击事件处理函数,请问这是怎么回事儿?
还有就是你是这样用CMyDlg m_Dlg;
m_Dlg.CreateIndirect(m_lpDialogTemplate),这样用的吗
CPIDSET * dlg; //CPIDSET型指针对象dlg
dlg = new CPIDSET; // 创建dlg并分配内存
dlg->Create(IDD_PIDSET,this); //创建dlg对象
dlg->ShowWindow(SW_SHOW); //显示dlg无模对话框
2.看看这篇文章 http://www.vckbase.com/document/viewdoc/?id=1524
3.你的代码贴出来
Hook 第一个参数为UINT类型CDialog::Create函数
BOOL CDialogEx::MyCreateByID(UINT nIDTemplate, CWnd* pParentWnd )
{
///////////////////////////////////////////////////////////////////////////
//这部分加载XML文件中的资源 创建dialog template,会保存在m_lpDialogTemplate中
CResourceMgrImpl* pResource = CResourceMgrImpl::GetInstance();
ASSERT(pResource);
HRESULT hr = pResource->LoadDialogDirect(nIDTemplate, this); if (hr == S_OK) m_lpszTemplateName = ATL_MAKEINTRESOURCE(nIDTemplate);
/////////////////////////////////////////////////////////////////////////// BOOL ret = (this->*oldCreateByID)(hr == S_OK? 0 : nIDTemplate, pParentWnd);
if(hr == S_OK)
SetTemplate(NULL);
return FALSE;
}
Hook 第一个参数为字符串类型CDialog::Create函数
BOOL CDialogEx::MyCreateByName(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
{
///////////////////////////////////////////////////////////////////////////
//这部分加载XML文件中的资源 创建dialog template,会保存在m_lpDialogTemplate中
BOOL bInXml = FALSE;
if(!lpszTemplateName)
{
bInXml = TRUE;
lpszTemplateName = m_lpszTemplateName;
} HRESULT hr = S_FALSE;
if(lpszTemplateName)
{
CResourceMgrImpl* pResource = CResourceMgrImpl::GetInstance();
ASSERT(pResource);
hr = pResource->LoadDialogDirect(lpszTemplateName, this);
}
///////////////////////////////////////////////////////////////////////////
BOOL ret = FALSE;
if (bInXml)
{
ret = CreateIndirect(m_lpDialogTemplate, pParentWnd);
//ret =(this->*oldCreateByName)(lpszTemplateName, pParentWnd);
//SendMessage(WM_INITDIALOG, NULL, NULL);
}
else
ret =(this->*oldCreateByName)(lpszTemplateName, pParentWnd);
if(hr == S_OK)
SetTemplate(NULL);
return ret;
}
在创建的时候调用m_Dialog.Create(IDD_DIALOG1, pParentWnd);
创建成功了,窗口可以正确显示,消息函数也指定了,但是一点按钮窗口就没有反应了。帮忙看看,谢谢!
BOOL CCTestDlg::Create(CWnd* pParentWnd, LPCTSTR lpszTemplateName)
{
ASSERT(HIWORD(lpszTemplateName) == 0 ||
AfxIsValidString(lpszTemplateName));
m_lpszTemplateName = lpszTemplateName; // used for help
if (HIWORD(m_lpszTemplateName) == 0 && m_nIDHelp == 0)
m_nIDHelp = LOWORD((DWORD)m_lpszTemplateName);
#ifdef _DEBUG
if (!_AfxCheckDialogTemplate(lpszTemplateName, FALSE))
{
ASSERT(FALSE); // invalid dialog template name
PostNcDestroy(); // cleanup if Create fails too soon
return FALSE;
}
#endif //_DEBUG
HINSTANCE hInst = AfxFindResourceHandle(lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, lpszTemplateName, RT_DIALOG);
HGLOBAL hTemplate = LoadResource(hInst, hResource);
// BOOL bResult = CreateIndirect(hTemplate, pParentWnd, hInst);
// write own CreateIndirect
ASSERT(hTemplate != NULL);
LPCDLGTEMPLATE lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hTemplate);
// BOOL bResult = CreateIndirect(lpDialogTemplate, pParentWnd, NULL, hInst);
ASSERT(lpDialogTemplate != NULL);
if (pParentWnd == NULL)
pParentWnd = AfxGetMainWnd();
m_lpDialogInit = NULL;
AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState);
CreateDlgIndirect(lpDialogTemplate, pParentWnd, hInst);
UnlockResource(hTemplate);
FreeResource(hTemplate);
// ASSERT(pParentWnd != NULL);
ASSERT(lpszTemplateName != NULL);
return TRUE;
}
你还是用Create创建好了