Exibir alerta com títulos botão personalizado no Windows?
-
19-09-2019 - |
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?
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.