alerta pantalla con títulos de botones personalizados en Windows?
-
19-09-2019 - |
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?
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.