Pregunta

Uso CoreFoundation, puedo mostrar un diálogo de alerta con lo siguiente:

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

¿Cómo replicar este uso de la API de Windows C? Lo más cerca que he recibido es:

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

pero eso duro-códigos "Aceptar" y "Cancelar", como los títulos de los botones, que no es lo que quiero. ¿Hay alguna forma de evitar esto, o una función alternativa de usar?

¿Fue útil?

Solución

Puede utilizar SetWindowText para cambiar la leyenda en los botones. Debido a que el cuadro de mensaje () bloquea el flujo de ejecución que necesita algún mecanismo para conseguir alrededor de esto -. El código siguiente se utiliza un temporizador

Creo que el código FindWindow puede depender de la existencia de ningún padre de MessageBox (), pero no estoy seguro.

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

Otros consejos

La función de mensaje de Windows sólo admite un número limitado de estilos. Si quieres algo más complicado que lo que está previsto, tendrá que crear su propio cuadro de diálogo. Ver de mensaje para obtener una lista de posibles MessageBox tipos.

Si usted decide hacer su propio cuadro de diálogo, sugeriría mirar el DialogBox de Windows función.

Si usted está dispuesto a atarse a Windows Vista y superior, es posible que desee considerar la " TaskDialog " nofollow función noreferrer. Creo que va a permitir que usted haga lo que quiera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top