2009-12-10 13 views
0

En utilisant CoreFoundation, je peux afficher une boîte de dialogue d'alerte avec les éléments suivants:Afficher l'alerte avec des titres de bouton personnalisés sous Windows?

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 un moyen de contourner cela, ou une autre fonction à utiliser?

Répondre

4

Vous pouvez utiliser SetWindowText pour modifier la légende sur les boutons. Parce que le MessageBox() bloque le flux d'exécution, vous avez besoin d'un mécanisme pour contourner ce - le code ci-dessous utilise un minuteur.

Je pense que le code FindWindow peut dépendre de l'absence de 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); 
} 
+0

+1 pour le mal pur! – Eric

+0

+1 LOL cela fonctionnerait réellement –

+0

code niice. en effet, Dumb Guy. +1 – Hobhouse

4

La fonction Windows MessageBox ne prend en charge qu'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 des types MessageBox possibles.

Si vous décidez de créer votre propre boîte de dialogue, je suggère de regarder la fonction Windows DialogBox.

1

Si vous souhaitez vous connecter à Windows Vista et aux versions ultérieures, vous pouvez envisager la fonction "TaskDialog". Je crois que cela vous permettra de faire ce que vous voulez.

+0

Les noms des boutons sont cependant prédéfinis. –