2012-12-30 73 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

我真的不能幫你的第一個問題。從你提供的代碼片段中看到你做錯了什麼並不明顯。