Pergunta

Usando CoreFoundation, posso exibir um diálogo de alerta com o seguinte:

CFUserNotificationDisplayAlert(0.0, 
                               kCFUserNotificationPlainAlertLevel, 
                               NULL, NULL, NULL, 
                               CFSTR("Alert title"), 
                               CFSTR("Yes?), 
                               CFSTR("Affirmative"), 
                               CFSTR("Nah"), 
                               NULL, NULL);

Como faço para replicar isso usando a API do Windows C? O mais próximo que eu comecei é:

MessageBox(NULL, "Yes?", "Alert title", MB_OKCANCEL);

mas aquele duro-códigos "OK" e "Cancelar", como os títulos de botão, que não é o que eu quero. Existe alguma maneira de contornar isso, ou uma função alternativa de usar?

Foi útil?

Solução

Você pode usar SetWindowText para alterar a legenda nos botões. Porque o MessageBox () bloqueia o fluxo de execução é necessário algum mecanismo para contornar isso -. O código abaixo usa um temporizador

Eu acho que o código FindWindow pode ser dependente da existência de nenhum pai para MessageBox (), mas eu não tenho certeza.

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 );
}

Outras dicas

A função do Windows MessageBox suporta apenas um número limitado de estilos. Se quiser algo mais complicado que o que é fornecido, você vai precisar para criar sua própria caixa de diálogo. Consulte MessageBox para uma lista de possíveis MessageBox tipos.

Se você decidir fazer a sua própria caixa de diálogo, eu sugiro olhando para o DialogBox função do Windows.

Se você está disposto a amarrar-se ao Windows Vista e acima, você pode querer considerar o " TaskDialog " função. Eu acredito que ele irá permitir que você faça o que quiser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top