1

2つのダイアログウィンドウを作成したいのですが、1つはもう1つの子です。以下はコードの一部です。メニュー項目「親」をクリックすると、2つのダイアログが作成され、図に示すように、一方が他方の子として設定されます。

ここに画像の説明を入力してください

問題は、両方が見えないことです。これらは、Spy++で示されるサイズになっています。ShowWindowとUpdateWindowを使用しても、役に立ちません。

これが私の最初の質問です:

How to fix this?

子ダイアログウィンドウを作成したい理由は次のとおりです。次の図を見てください。

ここに画像の説明を入力してください

子ダイアログ(黒い線で囲まれた長方形)を含む設定ダイアログがあります。これらの子ダイアログウィンドウは、関連するオプションをグループ化するために使用されます。したがって、使用者が左側のTreeViewで項目を選択すると、子ダイアログウィンドウが非表示になり、別の子ダイアログウィンドウが表示されてさまざまなオプションが提供されます。

次に2番目の質問:

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(...)を使用して、子ダイアログからボタン(および対応するwndproc)を削除した後、DS_CONTROLWS_CHILDOK

ここに画像の説明を入力してください

親ダイアログ内で子ダイアログを移動することもできます。リソーススクリプトファイルでの削除CAPTION "Child Dialog"は役に立ちません。

  1. 子ダイアログを親ダイアログにシームレスに適合させるには(どのフラグを使用する必要がありますか)?つまり、タイトルバー、境界線などはありません。(子ダイアログが作成された後、使用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
4

1 に答える 1

3

これは完全に正しいアプローチではありません。(WS_CHILDではなく)子ダイアログでDS_CONTROLスタイルを設定する必要があります。これは、ダイアログを実際のポップアップダイアログではなく、子ウィンドウとして作成していることをウィンドウマネージャーに通知します。子を作成するには、DialogBoxの代わりにCreateDialogまたはそのバリアントの1つを使用する必要もあります(Raymondのコメントによる)。

詳細はこちら:https ://devblogs.microsoft.com/oldnewthing/20040730-00/?p = 38293

私は最初の質問であなたを本当に助けることはできません。提供したスニペットから、何が間違っているのかは明らかではありません。

于 2012-12-30T18:01:58.457 に答える