Отображать оповещение с пользовательскими названиями кнопок в Windows?
-
19-09-2019 - |
Вопрос
Используя CoreFoundation, я могу отобразить диалоговое окно предупреждения со следующим:
CFUserNotificationDisplayAlert(0.0,
kCFUserNotificationPlainAlertLevel,
NULL, NULL, NULL,
CFSTR("Alert title"),
CFSTR("Yes?),
CFSTR("Affirmative"),
CFSTR("Nah"),
NULL, NULL);
Как мне воспроизвести это с помощью Windows C API?Самое близкое, что у меня получилось, это:
MessageBox(NULL, "Yes?", "Alert title", MB_OKCANCEL);
но это жестко прописывает "OK" и "Отмена" в качестве названий кнопок, а это не то, чего я хочу.Есть ли какой-нибудь способ обойти это или альтернативная функция для использования?
Решение
Вы можете использовать SetWindowText для изменения условных обозначений на кнопках.Поскольку MessageBox() блокирует поток выполнения, вам нужен какой-то механизм, чтобы обойти это - приведенный ниже код использует таймер.
Я думаю, что код FindWindow может зависеть от отсутствия родительского элемента для MessageBox(), но я не уверен.
int CustomMessageBox(HWND hwnd, const char * szText, const char * szCaption, int nButtons)
{
SetTimer( NULL, 123, 0, TimerProc );
return MessageBox( hwnd, szText, szCaption, nButtons );
}
VOID CALLBACK TimerProc(
HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
)
{
KillTimer( hwnd, idEvent );
HWND hwndAlert;
hwndAlert = FindWindow( NULL, "Alert title" );
HWND hwndButton;
hwndButton = GetWindow( hwndAlert, GW_CHILD );
do
{
char szBuffer[512];
GetWindowText( hwndButton, szBuffer, sizeof szBuffer );
if ( strcmp( szBuffer, "OK" ) == 0 )
{
SetWindowText( hwndButton, "Affirmative" );
}
else if ( strcmp( szBuffer, "Cancel" ) == 0 )
{
SetWindowText( hwndButton, "Hah" );
}
} while ( (hwndButton = GetWindow( hwndButton, GW_HWNDNEXT )) != NULL );
}
Другие советы
Функция Windows MessageBox поддерживает только ограниченное количество стилей.Если вы хотите что-то более сложное, чем то, что предусмотрено, вам нужно будет создать свое собственное диалоговое окно.Видишь Почтовый ящик для получения списка возможных типов MessageBox.
Если вы решите создать свое собственное диалоговое окно, я бы посоветовал взглянуть на Диалоговое окно Функция Windows.
Если вы готовы привязать себя к Windows Vista и выше, возможно, вам захочется рассмотреть "Каталог задач" функция.Я верю, что это позволит вам делать то, что вы хотите.