WS_POPUP 弹出了,是两个window
对话框在WS_POPUP与WS_CHILD之间转换
BOOL Create( UINT nIDTemplate,CWnd* pParentWnd );
BOOL CChildDialog::Create( UINT nIDTemplate,CWnd* pParentWnd )
{
HINSTANCE hInst = AfxFindResourceHandle( MAKEINTRESOURCE( nIDTemplate ), RT_DIALOG);
HRSRC hResource = ::FindResource(hInst,MAKEINTRESOURCE( nIDTemplate ), RT_DIALOG);
HGLOBAL hTemplate = LoadResource(hInst, hResource);
ASSERT( hTemplate );
LPCDLGTEMPLATE lpDialogTemplate = ( LPCDLGTEMPLATE )LockResource( hTemplate );
ASSERT( lpDialogTemplate );
DWORD *ptrStyle = ( DWORD* )&lpDialogTemplate->style;
*ptrStyle &= ~( WS_OVERLAPPEDWINDOW|WS_POPUPWINDOW );
*ptrStyle |= WS_CHILDWINDOW;
UnlockResource( hTemplate );
BOOL bResult = CreateIndirect(hTemplate, pParentWnd, hInst);
FreeResource(hTemplate);
return bResult;
}
关于WS_POPUP 和 WS_CHILD的区别
在微软的说明中写到WS_POPUP,和WS_CHILD这两种类型是不能同时使用的。可实际,同时使用了这两种修饰符WS_POPUP|WS_CHILD,windows也不会报错,我测试的结果是,它会把它当做WS_POPUP的来使用。即使申明为WS_POPUP,它仍然是可以指定父窗口的。当一个窗口被申明为WS_CHILD的时候有,以下事件可肯定会发生。
1.父窗口调用ShowWindow(SW_SHOW)时,子窗口也会可以到收到WM_PAINT的消息来重绘,
而申明为一个WS_POPUP的子窗口就不会收到WM_PAINT消息。
2.在PC上父窗口的HDC和子窗口的HDC是重叠的,也就是,通过父窗口的HDC可以子窗口的区域里画图,并且可以画到窗口的图片上面。
而申明为一个WS_POPUP窗口,父窗口的HDC和子窗口的HDC是互斥的,也就是说,你不能通过父窗口的HDC把图绘到子窗口的区域里。这个WS_POPUP的窗口对于父窗口的绘图区来说是不可见的。但是这种区别对于WINCE来说却没有,在WINCE系统中,无论子窗口被设为WS_CHILD还是WS_POPUP,父窗口和子窗口的HDC空间都是互斥的。不知道 WINCE以后的会不会改,至少在WINCE 500上是这样的。