Mostra avviso con titoli pulsante personalizzato di Windows?
-
19-09-2019 - |
Domanda
Utilizzando CoreFoundation, posso visualizzare una finestra di avviso con il seguente:
CFUserNotificationDisplayAlert(0.0,
kCFUserNotificationPlainAlertLevel,
NULL, NULL, NULL,
CFSTR("Alert title"),
CFSTR("Yes?),
CFSTR("Affirmative"),
CFSTR("Nah"),
NULL, NULL);
Come faccio a replicare questo utilizzando l'API di Windows C? Il più vicino che ho ottenuto è:
MessageBox(NULL, "Yes?", "Alert title", MB_OKCANCEL);
ma che duri-codes "OK" e "Annulla", come i titoli dei pulsanti, che non è quello che voglio. C'è un modo per aggirare questo, o una funzione alternativa da usare?
Soluzione
È possibile utilizzare SetWindowText per cambiare la leggenda sui pulsanti. Poiché il MessageBox () blocca il flusso di esecuzione è necessario un meccanismo per aggirare questo -. Il codice qui sotto utilizza un timer
Credo che il codice FindWindow può dipendere dall'esistenza di nessun genitore per MessageBox (), ma non sono sicuro.
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 );
}
Altri suggerimenti
La funzione MessageBox di Windows supporta solo un numero limitato di stili. Se si desidera qualcosa di più complicato che ciò che è previsto, è necessario creare il proprio finestra di dialogo. Vedere MessageBox per un elenco di possibili MessageBox tipi.
Se si decide di fare il proprio finestra di dialogo, io suggerirei di guardare il DialogBox di Windows funzione.
Se siete disposti a legarsi a Windows Vista e sopra, si potrebbe prendere in considerazione la " TaskDialog ". Credo che vi permetterà fai quello che vuoi.