我只是想通过这个知道类的对象怎么和资源联系起来的。CMyDialog继承对话框类
CMyDialog mydia = new new CMyDialog();BOOL ret = mydia ->Create(IDD_MYDIALOG,this);mydia ->showWindow(sw_show);问题是:一个Cdialog对象,动态生成对话框的时候。mydia是怎么和对话框联系地 ,mydia能像句柄一样唯一标示这个对话框吗。为什么这样动态生成以后,就可以根据mydia操作对话框的所有行为?小弟是新手,请大家不要笑!
CMyDialog mydia = new new CMyDialog();BOOL ret = mydia ->Create(IDD_MYDIALOG,this);mydia ->showWindow(sw_show);问题是:一个Cdialog对象,动态生成对话框的时候。mydia是怎么和对话框联系地 ,mydia能像句柄一样唯一标示这个对话框吗。为什么这样动态生成以后,就可以根据mydia操作对话框的所有行为?小弟是新手,请大家不要笑!
解决方案 »
- GetOverlappedResult返回读到的数据为0
- 背景透明对话框中的图标显示
- 如何得到远程机的桌面显示
- 请问单文档程序中的OnDraw().OnPaint().OnIninialUpdate().OnSize()这几个函数的调用关系
- 为什么我的OnIdle(LONG)函数没法用?
- 高手帮忙看看!
- 要把一个对话框编辑控件中的字符串送到另一个对话框的编辑控件里
- 为什么在VC中按F1关联不上MSDN
- 请问如何手工在程序里加入“保存“,“另存为”?并使其工作?
- 怎样抛出一个异常?
- 消息映射的问题
- 满分求解!! 屏幕中多个对话框可以移动,但不能重叠,如果重叠被挡住的对话框自动向上跳动,如果上面显示不下则向右跳动。
应该是通过它将对话框资源和对话框类联系起来的
Create(IDD_MYDIALOG,this);
如果你有源代码可以在这一步打断点,然后跟进去看,我估计十有八九是十分复杂的,因为要解析一种layout格式。IDD_MYDIALOG是资源编辑器编辑的,它的下面的每个子控件都有固定的标示符,所以不用担心找不到控件,每个控件的行为都能通过标示符进行操作。
此外要获得mydia的句柄,mfc应该有相应的方法啊。
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,
用new出来的对象,必须要在最后delete。
否则内存泄露。
一般通过重载对话框的PostNcDestroy实现。
hWnd应该有个bool属性 用来表示是否 显示出来showWindow(sw_show); 就调用了某个API改变了hWnd的这个属性,不能直接改hWnd的任何属性,
还有在没CREATE之前m_hwnd 是否为NULL啊,只有CREATE之后m_hwnd 才有的值啊?
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;
}
我现在也是一知半解,反正我是这么过来的,你再等等高手吧
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.