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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top