2010-02-11 171 views
2

我剛開始使用對話框,我非常喜歡在資源文件中定義佈局的可能性。但是,是否可以設置一個對話框並將其嵌入到另一個對話框中(即沒有浮動對話框)?Win32 GUI:對話框中的對話框

使用普通窗口,我創建了帶有一個子窗口的主窗口。然後,我創建了更多的窗口(如「編輯」,「靜態」等),並將它們添加到孩子身上。我這樣做是爲了將這幾個窗口分組到一個窗口,以便我可以輕鬆控制所有編輯和靜態的可見性。有點像分組(但它沒有GroupBox的邊框)。

是否有可能重寫上述內容,但是在.rc文件中寫下了對話框?

我使用的是純C和Win32。我所做的

例子:

main = CreateWindow(...); 
container = CreateWindow(... hWndParent = main ...); 
label = CreateWindow("static", ... container); 
edit = CreateWindow("edit", ... container); 

現在,如果我可以隱藏或調整標籤和編輯,但只是控制container

什麼例子,我想有:

MAIN_DIALOG DIALOG 10, 20, 30, 40 STYLE ... 
BEGIN 
CONTROL "container" ... 
END 

如何添加「標籤」和「編輯」,以「集裝箱」控制?

+0

我不確定我是否理解你的問題,但可以使用CreateDialog()創建一個無模式對話框,並將此控件嵌入到資源文件中。 – anno 2010-02-11 15:22:56

+0

假設我有基於對話框的應用程序。如果我創建了您提到的無模式對話框,可以將其嵌入到我的應用程序中?我的意思是,是否有可能創建一個對話框,讓父母的另一個對話框? – 2010-02-12 03:48:27

回答

2

你想要做的可能與選項卡式對話有點相似。有一些控件是通過外部對話框從不同的資源中嵌入的。然後,您可以顯示/隱藏選項卡中的所有控件調用的ShowWindow只是爲子對話框:

在您主對話框回調添加像

HWND SubDlgHwnd; // Global or probably within a struct/array etc. 

case WM_INITDIALOG: 
{ 
    HRSRC  hrsrc; 
    HGLOBAL  hglobal; 
    hrsrc = FindResource(sghInstance, MAKEINTRESOURCE(SubDlgResId), RT_DIALOG); 

    hglobal = ::LoadResource(sghInstance, hrsrc); 

    SubDlgHwnd = CreateDialogIndirect(sghInstance, (LPCDLGTEMPLATE)hglobal, hDlg, ChildDialogCallback); 
    SetWindowPos(SubDlgHwnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); 
    break; 
} 

case WM_COMMAND: 
{ 
    ... 
    if(UpdateVisibility) 
     ShowWindow(SubDlgHwnd, showSubDialog ? SW_SHOW : SW_HIDE); 
} 

This東西可能是微軟的文檔良好的起始點之。

+0

只有一個問題:爲什麼你使用CreateDialogIndirect()而不是CreateDialog()?我的意思是,可以直接鏈接到.rc文件,根據文檔,它們具有相同的功能。 – 2010-02-12 14:50:00

+0

沒關係,我只是在某處看過,如果在資源文件中定義了對話框,我可以使用CreateDialog()。 – 2010-02-12 15:23:53

+0

您可能需要在內部對話框中設置[WS_EX_CONTROLPARENT](http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v = vs.85).aspx)EX樣式位在.rc模板中),以確保您可以在內部和外部對話框上的控件之間無縫切換。 – BrendanMcK 2012-01-20 04:21:21

3

此外,在資源編輯器中將對話框樣式設置爲'child'並將邊框設置爲'none'。

2

您還必須將DS_CONTROL樣式添加到要嵌入的對話框中。沒有它,嵌入式對話窗口將顯示窗口標題,這是幾乎不可能的。