Frage

Mit Corefoundation, kann ich einen Alarm Dialog mit folgenden Anzeige:

CFUserNotificationDisplayAlert(0.0, 
                               kCFUserNotificationPlainAlertLevel, 
                               NULL, NULL, NULL, 
                               CFSTR("Alert title"), 
                               CFSTR("Yes?), 
                               CFSTR("Affirmative"), 
                               CFSTR("Nah"), 
                               NULL, NULL);

Wie replizieren ich diese mit dem Windows-C-API? Der nächstgelegene ich bekommen habe ist:

MessageBox(NULL, "Yes?", "Alert title", MB_OKCANCEL);

aber der hart-Codes „OK“ und „Abbrechen“, wie die Schaltfläche Titel, die nicht das, was ich will. Gibt es eine Möglichkeit, um diesen, oder eine alternative Funktion zu benutzen?

War es hilfreich?

Lösung

Sie können SetWindowText verwenden, um die Legende auf den Tasten zu ändern. Da die MessageBox () blockiert den Fluss der Ausführung Sie einen Mechanismus benötigen das zu umgehen, -. Der folgende Code verwendet einen Timer

Ich denke, der Findwindow-Code auf es abhängig sein kann für MessageBox keinen Elternteil (), aber ich bin nicht sicher.

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 );
}

Andere Tipps

Die Windows MessageBox Funktion unterstützt nur eine begrenzte Anzahl von Arten. Wenn Sie wollen etwas komplizierter, was vorgesehen ist, müssen Sie Ihr eigenes Dialogfeld erstellen. Siehe MessageBox für eine Liste möglicher MessageBox Typen.

Wenn Sie Ihr eigenes Dialogfeld zu machen, würde ich vorschlagen, suche auf dem DialogBox Windows-Funktion.

Wenn Sie bereit sind, sich auf Windows Vista zu binden und darüber, möchten Sie vielleicht die berücksichtigen „ Taskdialog " Funktion. Ich glaube, es können Sie tun, was Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top