我通过搜索发现,无法使用居中对齐的文本创建 MessageBox()。
无法创建居中对齐的MessageBox() 对话框,因为 API 没有为此提供选项。但是是可以操纵标准 MessageBox()` 对话框通过一些小技巧来强制它居中对齐。
使用SetWindowsHookEx() 为调用MessageBox() 的线程创建一个WH_CBT 挂钩(不需要DLL)。 hook callback 允许您发现 MessageBox() 创建的对话框的 HWND。有了它,你可以随心所欲地操纵它。在这种情况下,您可以使用FindWindowEx() 获取对话框文本的STATIC 控件的HWND,然后使用SetWindowLong() 对其应用SS_CENTER 样式。例如:
LRESULT CALLBACK CenterMsgBoxTextProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HCBT_ACTIVATE)
{
HWND hDlg = (HWND) wParam;
HWND hTxt = FindWindowEx(hDlg, NULL, TEXT("STATIC"), NULL);
if (hTxt)
SetWindowLong(hTxt, GWL_STYLE, GetWindowLong(hTxt, GWL_STYLE) | SS_CENTER);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
HHOOK hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) &CenterMsgBoxTextProc, NULL, GetCurrentThreadId());
MessageBox(...);
if (hHook) UnhookWindowsHookEx(hHook);
或者,您可以使用SetWinEventHook() 代替SetWindowsHookEx():
void CALLBACK CenterMsgBoxTextProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
HWND hTxt = FindWindowEx(hwnd, NULL, TEXT("STATIC"), NULL);
if (hTxt)
SetWindowLong(hTxt, GWL_STYLE, GetWindowLong(hTxt, GWL_STYLE) | SS_CENTER);
}
HWINEVENTHOOK hHook = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_CREATE, NULL, &CenterMsgBoxTextProc, GetCurrentProcessId(), GetCurrentThreadId(), 0);
MessageBox(NULL, TEXT("test"), TEXT("test"), MB_OK);
if (hHook) UnhookWinEvent(hHook);
以下是两种情况下的结果: