使用 CreateIndirect 创建非模态对框,只有一个LPCDLGTEMPLATE类型变量
我的创建方式是:CreateIndirect(m_lpDialogTemplate, pParentWnd); pParentWnd是父窗口指针,没有指定第三个参数 :lpDialogInit 因为我的程序中无法获得这个值(不知道能不能只直接通过m_lpDialogTemplate获得?)。
我创建非模态对话框成功了,能够正常显示。但是窗口中有一个按钮控件,只要一点按钮整个窗口就没有反应了,也无法调到相应的单击事件处理函数,请问这是怎么回事儿?

解决方案 »

  1.   

    创建非模态对话框我都一般是用Create,没用过这个
      

  2.   

    因为我的资源不是以普通的方式在资源文件中的。而是通过解析字符串生成的Dialog Template,所以不能通过create创建。
      

  3.   

    直接用CreateIndirect(m_lpDialogTemplate)怎么样了?
    还有就是你是这样用CMyDlg m_Dlg;
    m_Dlg.CreateIndirect(m_lpDialogTemplate),这样用的吗
      

  4.   

    你那太麻烦了吧。我创建无模对话框有更简单的。我把代码贴出来。楼主给分哦。我弄了好久。也是刚学会的,你看对你有用不,以下是代码:
             CPIDSET * dlg;        //CPIDSET型指针对象dlg
    dlg = new CPIDSET;   // 创建dlg并分配内存
    dlg->Create(IDD_PIDSET,this);  //创建dlg对象
    dlg->ShowWindow(SW_SHOW);       //显示dlg无模对话框
      

  5.   

    一般不用CreateIndirect,用create
      

  6.   

    1。DLGTEMPLATE::cdit(控件项数目)。设置了吗?
    2.看看这篇文章 http://www.vckbase.com/document/viewdoc/?id=1524
    3.你的代码贴出来
      

  7.   

    谢谢。刚来上网,我的cdit值设置了,我的代码很多,没法往出贴,我并不是只是调用create创建对话框的,中间还有Hook Create函数的部分,相关的东西太多了。我先看一下你给我的这篇文章。谢谢!
      

  8.   

    那篇文章不能解决我的问题。他使用的是InitModalIndirect 创建模式对话框,创建模式对话框时只要m_lpDialogTemplate值是正确的那么DoModal就会成功,但是非模式对话框要使用Create函数,好像不太一样。仅仅是m_lpDialogTemplate的值是正确的好像不行。比如说重载CDialog如果将m_lpDialogTemplate设置正确,然后调用domodal就可以了,但是调用Create函数却不行。 我是这么理解的,也不知道对不对,再帮帮忙,谢谢。
      

  9.   

    Create不行?调用 ShowWindow(SW_SHOW);了吗?
      

  10.   

    不是Create不行,ShowWindow也调用了,我的窗口已经正确显示了,但是只要一点窗口中的按钮就出问题了。
      

  11.   

    大概的代码是这样的:
    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);
    创建成功了,窗口可以正确显示,消息函数也指定了,但是一点按钮窗口就没有反应了。帮忙看看,谢谢!
      

  12.   

    CDialog的Create会调用CreateIndirect弄出窗口,但是创建消息循环不在其中的范例
    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创建好了