Отображать оповещение с пользовательскими названиями кнопок в Windows?

StackOverflow https://stackoverflow.com/questions/1884850

  •  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 и выше, возможно, вам захочется рассмотреть "Каталог задач" функция.Я верю, что это позволит вам делать то, что вы хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top