Alerte d'affichage avec des titres de bouton personnalisé sous Windows?
-
19-09-2019 - |
Question
Utilisation CoreFoundation, je peux afficher une boîte de dialogue d'alerte avec les éléments suivants:
CFUserNotificationDisplayAlert(0.0,
kCFUserNotificationPlainAlertLevel,
NULL, NULL, NULL,
CFSTR("Alert title"),
CFSTR("Yes?),
CFSTR("Affirmative"),
CFSTR("Nah"),
NULL, NULL);
Comment puis-je reproduire ce en utilisant l'API Windows C? Le plus proche que j'ai obtenu est:
MessageBox(NULL, "Yes?", "Alert title", MB_OKCANCEL);
mais que les disques-codes « OK » et « Rejeter » comme les titres de bouton, ce qui est pas ce que je veux. Y at-il moyen de contourner cela, ou une fonction alternative à utiliser?
La solution
Vous pouvez utiliser SetWindowText changer la légende sur les boutons. Parce que le MessageBox () bloque le flux d'exécution dont vous avez besoin d'un mécanisme pour contourner ce -. Le code ci-dessous utilise une minuterie
Je pense que le code FindWindow peut dépendre de l'existence d'aucun parent pour MessageBox () mais je ne suis pas sûr.
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 );
}
Autres conseils
La fonction MessageBox Windows prend en charge un nombre limité de styles. Si vous voulez quelque chose de plus compliqué que ce qui est prévu, vous devrez créer votre propre boîte de dialogue. Voir MessageBox pour une liste de MessageBox possible types.
Si vous décidez de faire votre propre boîte de dialogue, je vous suggère de regarder le DialogBox fonction Windows.
Si vous êtes prêt à vous attacher à Windows Vista et au-dessus, vous voudrez peut-être considérer le « TaskDialog ". Je crois qu'il vous permettra de faire ce que vous ne voulez.