我只是想通过这个知道类的对象怎么和资源联系起来的。CMyDialog继承对话框类
CMyDialog mydia = new new CMyDialog();BOOL ret = mydia ->Create(IDD_MYDIALOG,this);mydia ->showWindow(sw_show);问题是:一个Cdialog对象,动态生成对话框的时候。mydia是怎么和对话框联系地 ,mydia能像句柄一样唯一标示这个对话框吗。为什么这样动态生成以后,就可以根据mydia操作对话框的所有行为?小弟是新手,请大家不要笑!

解决方案 »

  1.   

    mydia 里面有一个类似于enum { IDD = IDD_MY_DIALOG };这样的代码,
    应该是通过它将对话框资源和对话框类联系起来的
      

  2.   

    如果你想知道的话就需要了解create的行为做了哪些事。
    Create(IDD_MYDIALOG,this); 
    如果你有源代码可以在这一步打断点,然后跟进去看,我估计十有八九是十分复杂的,因为要解析一种layout格式。IDD_MYDIALOG是资源编辑器编辑的,它的下面的每个子控件都有固定的标示符,所以不用担心找不到控件,每个控件的行为都能通过标示符进行操作。
    此外要获得mydia的句柄,mfc应该有相应的方法啊。
      

  3.   

    mydia是怎么和对话框联系地 ,
    BOOL ret = mydia ->Create(IDD_MYDIALOG,this); this表示父窗口,每个窗口都用1个链表维护其下的所有子窗口mydia能像句柄一样唯一标示这个对话框吗。
    mydia是个类,它有个成员变量 m_hWnd; m_hWnd是窗口的句柄,全局唯一标识每个窗口
    m_hWnd:这个很复杂,是个内核对像,不是公开的,它里是什么我们不知道,只知道它能全局标识1个窗口,能通过API改变它的某些属性,
    它的产生与消失都不是我们直接控制的为什么这样动态生成以后,就可以根据mydia操作对话框的所有行为?
    上面说了,mydia拥有m_hWnd,mydia操作也就是通过API操作m_hWnd,
      

  4.   

    CDialog  是 继承自  CWnd的, CWnd里面就有HWND m_hWnd;  这个成员变量。这个就是窗口的句柄,mydia可以通过这个句柄来操作对话框的所有行为
      

  5.   

    楼上讲的很详细阿。无论如何,
    用new出来的对象,必须要在最后delete。
    否则内存泄露。
    一般通过重载对话框的PostNcDestroy实现。
      

  6.   

    那这句mydia ->showWindow(sw_show); ,mydia是怎么通过hWnd这个句柄来让窗口显示出来的
      

  7.   


    hWnd应该有个bool属性 用来表示是否 显示出来showWindow(sw_show); 就调用了某个API改变了hWnd的这个属性,不能直接改hWnd的任何属性,
      

  8.   

    更正一下,hWnd没有什么属性,但它表示了一个对象,那个对象维护了win32窗口的所有属性
      

  9.   

    不能直接改变,是否就像  可这样mydia.attach(m_hwnd1);但不能这样mydia.m_hwnd = hwnd1;
    还有在没CREATE之前m_hwnd 是否为NULL啊,只有CREATE之后m_hwnd 才有的值啊?
      

  10.   

    是通过资源ID与对话框资源联系的最后生成对话框在 CWnd::CreateDlgIndirect 函数生成对话框语句
    hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,
    pParentWnd->GetSafeHwnd(), AfxDlgProc);
    BOOL CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,
    CWnd* pParentWnd, HINSTANCE hInst)
    {
    ASSERT(lpDialogTemplate != NULL);
    if (pParentWnd != NULL)
    ASSERT_VALID(pParentWnd); if (hInst == NULL)
    hInst = AfxGetInstanceHandle();#ifndef _AFX_NO_OCC_SUPPORT
    _AFX_OCC_DIALOG_INFO occDialogInfo;
    COccManager* pOccManager = afxOccManager;
    #endif HGLOBAL hTemplate = NULL; HWND hWnd = NULL;
    #ifdef _DEBUG
    DWORD dwError = 0;
    #endif TRY
    {
    VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
    AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);#ifndef _AFX_NO_OCC_SUPPORT
    // separately create OLE controls in the dialog template
    if (pOccManager != NULL)
    {
    if (!SetOccDialogInfo(&occDialogInfo))
    return FALSE; lpDialogTemplate = pOccManager->PreCreateDialog(&occDialogInfo,
    lpDialogTemplate);
    } if (lpDialogTemplate == NULL)
    return FALSE;
    #endif //!_AFX_NO_OCC_SUPPORT // If no font specified, set the system font.
    CString strFace;
    WORD wSize = 0;
    BOOL bSetSysFont = !CDialogTemplate::GetFont(lpDialogTemplate, strFace,
    wSize); // On DBCS systems, also change "MS Sans Serif" or "Helv" to system font.
    if ((!bSetSysFont) && GetSystemMetrics(SM_DBCSENABLED))
    {
    bSetSysFont = (strFace == _T("MS Shell Dlg") ||
    strFace == _T("MS Sans Serif") || strFace == _T("Helv"));
    if (bSetSysFont && (wSize == 8))
    wSize = 0;
    } if (bSetSysFont)
    {
    CDialogTemplate dlgTemp(lpDialogTemplate);
    dlgTemp.SetSystemFont(wSize);
    hTemplate = dlgTemp.Detach();
    } if (hTemplate != NULL)
    lpDialogTemplate = (DLGTEMPLATE*)GlobalLock(hTemplate); // setup for modal loop and creation
    m_nModalResult = -1;
    m_nFlags |= WF_CONTINUEMODAL; // create modeless dialog
    AfxHookWindowCreate(this);
    hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,
    pParentWnd->GetSafeHwnd(), AfxDlgProc);
    #ifdef _DEBUG
    dwError = ::GetLastError();
    #endif
    }
    CATCH_ALL(e)
    {
    DELETE_EXCEPTION(e);
    m_nModalResult = -1;
    }
    END_CATCH_ALL#ifndef _AFX_NO_OCC_SUPPORT
    if (pOccManager != NULL)
    {
    pOccManager->PostCreateDialog(&occDialogInfo);
    if (hWnd != NULL)
    SetOccDialogInfo(NULL);
    }
    #endif //!_AFX_NO_OCC_SUPPORT if (!AfxUnhookWindowCreate())
    PostNcDestroy();        // cleanup if Create fails too soon // handle EndDialog calls during OnInitDialog
    if (hWnd != NULL && !(m_nFlags & WF_CONTINUEMODAL))
    {
    ::DestroyWindow(hWnd);
    hWnd = NULL;
    } if (hTemplate != NULL)
    {
    GlobalUnlock(hTemplate);
    GlobalFree(hTemplate);
    } // help with error diagnosis (only if WM_INITDIALOG didn't EndDialog())
    if (hWnd == NULL && (m_nFlags & WF_CONTINUEMODAL))
    {
    #ifdef _DEBUG
    #ifndef _AFX_NO_OCC_SUPPORT
    if (afxOccManager == NULL)
    {
    TRACE0(">>> If this dialog has OLE controls:\n");
    TRACE0(">>> AfxEnableControlContainer has not been called yet.\n");
    TRACE0(">>> You should call it in your app's InitInstance function.\n");
    }
    else if (dwError != 0)
    {
    TRACE1("Warning: Dialog creation failed!  GetLastError returns 0x%8.8X\n", dwError);
    }
    #endif //!_AFX_NO_OCC_SUPPORT
    #endif //_DEBUG
    return FALSE;
    } ASSERT(hWnd == m_hWnd);
    return TRUE;
    }
      

  11.   

    不是这么理解的,那个对象你根本看不到,也无法用什么变量表示出来,这么掰下去我也会迷糊的,建议把CreateWindow这个函数的MSDN相关函数说明看几次,E文不懂就1个1个词译过来,结果手上资料理解和实践开始不用搞的太透,有个大概认识就行,错误的也行,就怕没有,以后慢慢就差不多了,一开始就想全搞懂不太可能,
    我现在也是一知半解,反正我是这么过来的,你再等等高手吧
      

  12.   

    根代码是这样子的,最后生成对话框在 CWnd::CreateDlgIndirect 函数 
    The CreateDialogIndirect macro uses the CreateWindowEx function to create the dialog box. CreateDialogIndirect then sends a WM_INITDIALOG message to the dialog box procedure. The function displays the dialog box if the template specifies the WS_VISIBLE style. Finally, CreateDialogIndirect returns the window handle to the dialog box.