キャンセルボタンのみのメッセージボックスを作成できますか?もしそうなら、何かヒントはありますか?キャンセルボタンのみのメッセージボックスのみを取得するための組み込みのAPIメソッドはありますか/
カスタムモーダルダイアログを作成する方法は?リンクはありますか?
キャンセルボタンのみのメッセージボックスを作成できますか?もしそうなら、何かヒントはありますか?キャンセルボタンのみのメッセージボックスのみを取得するための組み込みのAPIメソッドはありますか/
カスタムモーダルダイアログを作成する方法は?リンクはありますか?
必要に応じてダイアログ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, ...);
通知のみを表示するメッセージ ボックスの場合は、"OK" ボックスを使用するのが慣例だと思います。キャンセルは少し冗長に思えますか?
しかし、やりたい場合は、独自のメッセージボックスオブジェクトを定義し、テキスト属性として「キャンセル」を使用して自分でボタンを指定することで実行できると思います。
C++ やその他の言語には、「OK」が慣例であるため、「キャンセル」だけでメッセージ ボックスを定義する組み込み関数がありません。
MessabeBoxでは無理だと思います。独自のダイアログを簡単に作成し、単一のキャンセル ボタンを追加できます。
こちらのリンクからもご覧いただけます
それはあなたの問題を解決するかもしれません