2012-12-30 77 views
1

我想创建2个对话窗口,一个是另一个的子窗口。以下是代码的一部分。 当我点击菜单项“家长”,它创造了2对话框,设置一个作为另一个的孩子,因为图片显示:对话窗口内的子对话窗口

enter image description here

的问题是,它们都是无形的。它们的大小如Spy ++所示。 即使我使用ShowWindow和UpdateWindow,它也没有帮助。

这是我第一次queston:

How to fix this?

现在我想要做的创建子对话框窗口的理由是:看看下面的图片,

enter image description here

它有一个偏好包含子对话框的对话框(由黑线限定的矩形)。这些子对话窗口用于分组相关选项。因此,如果使用在左侧TreeView中选择一个项目,它将隐藏一个子对话框窗口并显示另一个子对话框窗口以提供不同的选项。

现在第二个问题:

Is my code is the correct way to achieve such work?


更新2:

这里是解决方案!

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644996%28v=vs.85%29.aspx


更新:

谢谢你们。

使用CreateDialog(儿童对话),而不是DialogBox(...),使用DS_CONTROL代替WS_CHILD,并从子对话框中删除OK键(及其相应的WndProc)后,我得到了

enter image description here

我甚至可以移动父对话框内的子对话框。删除资源脚本文件中的CAPTION "Child Dialog"不起作用。

  1. 如何(应该使用哪些标志)使Child Dialog无缝地适合父对话框,?这意味着:没有标题栏,没有边框等等。 (在创建子对话框后使用SetWindowLongWS_BORDER?或者是对话框的其他参数?)

  2. 父对话框的OK按钮不再有效。如何解决这个问题?我不明白如何管理这个父子对话框中的对话框过程。任何参考?


这里是我的代码:

1. Message handler for dialogs: 

INT_PTR CALLBACK Child(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    UNREFERENCED_PARAMETER(lParam); 
    switch (message) 
    { 
    case WM_INITDIALOG: 
     { 
      hChild = hDlg; 
      return (INT_PTR)TRUE; 
     } 
    case WM_COMMAND: 
     if (LOWORD(wParam) == IDOK) 
     { 
      EndDialog(hDlg, LOWORD(wParam)); 
      return (INT_PTR)TRUE; 
     } 
     break; 
    } 
    return (INT_PTR)FALSE; 
} 

INT_PTR CALLBACK Parent(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    UNREFERENCED_PARAMETER(lParam); 
    switch (message) 
    { 
    case WM_INITDIALOG: 
     { 
      hParent = hDlg; 
      DialogBox(hInst, MAKEINTRESOURCE(IDD_CHILD), hParent, Child); 
      SetParent(hChild, hParent); 
      return (INT_PTR)TRUE; 
     } 
    case WM_COMMAND: 
     if (LOWORD(wParam) == IDOK) 
     { 
      EndDialog(hDlg, LOWORD(wParam)); 
      return (INT_PTR)TRUE; 
     } 
    break; 
    } 
    return (INT_PTR)FALSE; 
} 

2. Dialog Templates in resource file 

IDD_CHILD DIALOGEX 0, 0, 70, 50 


STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU 
CAPTION "Child Dialog" 
FONT 8, "MS Shell Dlg" 
BEGIN 
    LTEXT   "Child Dialog",IDC_STATIC,10,5,35,8,SS_NOPREFIX 
    DEFPUSHBUTTON "OK",IDOK,10,25,50,14,WS_GROUP 
END 

IDD_DIALOG_PARENT DIALOGEX 0, 0, 250, 150 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "Parent Dialog" 
FONT 8, "MS Shell Dlg" 
BEGIN 
    LTEXT   "Parent",IDC_STATIC,42 - 20,14,35,8,SS_NOPREFIX 
    DEFPUSHBUTTON "OK",IDOK,188, 126,50,14,WS_GROUP 
END 
+3

您需要使用'CreateDialog',而不是'DialogBox'。 'DialogBox'将运行它自己的模态循环。 –

+0

它有很大的帮助,谢谢。 – user565739

+0

昨天有[几乎是重复](http://stackoverflow.com/questions/14031580/group-dialog-items-to-a-single-group-visual-studio/14031634#14031634)与源代码。 –

回答

1

这是不太正确的方法。您需要在子对话框(而不是WS_CHILD)上设置DS_CONTROL样式。这告诉窗口管理器您将创建对话框作为子窗口,而不是真正的弹出对话框。您还必须使用CreateDialog或其一个变体来代替DialogBox来创建子项(按照Raymond的评论)。

此处了解详情:http://blogs.msdn.com/b/oldnewthing/archive/2004/07/30/201988.aspx

我真的不能帮你的第一个问题。从你提供的代码片段中看到你做错了什么并不明显。