2

キャンセルボタンのみのメッセージボックスを作成できますか?もしそうなら、何かヒントはありますか?キャンセルボタンのみのメッセージボックスのみを取得するための組み込みのAPIメソッドはありますか/

カスタムモーダルダイアログを作成する方法は?リンクはありますか?

4

3 に答える 3

6

必要に応じてダイアログSetWindowsHookEx()をカスタマイズするために、スレッドローカル CBT フックを使用できます。MessageBox()

たとえば、「OK」ボタンのテキストを「キャンセル」に変更できます。例:

HHOOK hHook = NULL;

LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
        return CallNextHookEx(hHook, nCode, wParam, lParam);

    if (nCode == HCBT_ACTIVATE)
    {
        HWND hWnd = reinterpret_cast<HWND>(wParam);
        SetWindowText(GetDlgItem(hWnd, IDOK), TEXT("Cancel"));
        return 0;
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

{
    ...
    hHook = SetWindowsHookEx(WH_CBT, reinterpret_cast<HOOKPROC>(&CBTHookProc), NULL, GetCurrentThreadId());
    int iResult = MessageBox(..., MB_OK);
    if (iResult == IDOK) iResult = IDCANCEL;
    UnhookWindowsHookEx(hHook);
    ...
}

または、標準の [OK] ボタンを非表示にして、ダイアログでネイティブの [キャンセル] ボタンを引き続き使用することもできます。

HHOOK hHook = NULL;

LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
        return CallNextHookEx(hHook, nCode, wParam, lParam);

    if (nCode == HCBT_ACTIVATE)
    {
        HWND hWnd = reinterpret_cast<HWND>(wParam);
        ShowWindow(GetDlgItem(hWnd, IDOK), SW_HIDE);
        // optionally reposition the IDCANCEL child window as well....
        return 0;
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

{
    ...
    hHook = SetWindowsHookEx(WH_CBT, reinterpret_cast<HOOKPROC>(&CBTHookProc), NULL, GetCurrentThreadId());
    int iResult = MessageBox(..., MB_OKCANCEL);
    UnhookWindowsHookEx(hHook);
    ...
}

更新: Vista 以降では、TaskDialog()orTaskDialogIndirect()の代わりに使用できます (使用する必要があります) MessageBox()。タスク ダイアログは、ダイアログに表示するボタンを指定したり、カスタム ボタンを使用したりできるなど、はるかに柔軟です。したがって、フックをまったく使用せずにキャンセルのみのダイアログを簡単に表示できます。

TaskDialog(..., TDCBF_CANCEL_BUTTON, ..., &iResult);

TASKDIALOGCONFIG TaskConfig = {0};
TaskConfig.cbSize = sizeof(TaskConfig);
TaskConfig.dwCommonButtons = TDCBF_CANCEL_BUTTON;
...
TaskDialogIndirect(&TaskConfig, &iResult, ...);
于 2012-09-24T18:36:32.593 に答える
1

通知のみを表示するメッセージ ボックスの場合は、"OK" ボックスを使用するのが慣例だと思います。キャンセルは少し冗長に思えますか?

しかし、やりたい場合は、独自のメッセージボックスオブジェクトを定義し、テキスト属性として「キャンセル」を使用して自分でボタンを指定することで実行できると思います。

C++ やその他の言語には、「OK」が慣例であるため、「キャンセル」だけでメッセージ ボックスを定義する組み込み関数がありません。

于 2012-09-24T17:56:48.850 に答える
0

MessabeBoxでは無理だと思います。独自のダイアログを簡単に作成し、単一のキャンセル ボタンを追加できます。

こちらのリンクからもご覧いただけます

XMessageBox

それはあなたの問題を解決するかもしれません

于 2012-09-24T18:03:09.800 に答える