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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top