2009-09-06 6 views
1

Je veux une boîte de message pour Linux similaire à celle de Windows: elle devrait apparaître, afficher du texte, et lorsque l'utilisateur clique sur le bouton Ok, il devrait disparaître et retourner le contrôle à la fonction appelante.Boîte de message semblable à Windows pour Linux - cette implémentation C++/Motif fonctionnerait-elle?

La boîte de message devrait fonctionner même s'il n'y a encore aucune fenêtre d'application. Il crée donc un contexte d'application, lie une boîte de dialogue via XmCreate * Dialog, et lorsque l'utilisateur clique sur le bouton Ok des boîtes de dialogue, il indique à la boucle principale des contextes d'application de quitter.

Est-ce que cela fonctionnerait comme prévu? Est-ce que cela détruirait automatiquement tous les widgets et le contexte de l'application qui a été créé dans le processus (si non, comment cela devrait-il être fait?)?

Voici le code:

 

static XtAppContext appContext; static Widget topWidget; void XmCloseMsgBox (Widget w, XtPointer clientData, XmPushButtonCallbackStruct *cbs) { appContext.exit_flag = 1; } void XmMessageBox (const char* pszMsg, bool bError) { Widget msgBox; XmString xmString = XmStringCreateLocalized (const_cast<char*>(pszMsg)); Arg args [1]; topWidget = XtVaAppInitialize (&appContext, "Application Name", NULL, 0, &gameData.app.argC, gameData.app.argV, NULL, NULL); // setup message box text XtSetArg (args [0], XmNmessageString, xmString); // create and label message box xMsgBox = bError ? XmCreateErrorDialog (topWidget, "Error", args, 1) : XmCreateWarningDialog (topWidget, "Warning", args, 1); // remove text resource XmStringFree (xmString); // remove help and cancel buttons XtUnmanageChild (XmMessageBoxGetChild (xMsgBox, XmDIALOG_CANCEL_BUTTON)); XtUnmanageChild (XmMessageBoxGetChild (xMsgBox, XmDIALOG_HELP_BUTTON)); XtAddCallback (xMsgBox, XmNokCallback, XmCloseMsgBox, NULL); XtRealizeWidget (topWidget); // display message box //XtManageChild (xMsgBox); XtAppMainLoop (app); }
+0

Comme il arrive, votre dernière question http://stackoverflow.com/questions/1386319/ho-to-kill-xtappmainloop-motif a été répondu assez rapidement, mais vous ne l'avez pas mis à jour, l'avez accepté, ou laissé un commentaire demandant plus d'aide. En fait, vous ne semblez jamais avoir accepté une réponse à l'une de vos questions. Avez-vous l'impression que vous n'obtenez pas de réponses utiles? – DigitalRoss

+0

En fait la question principale avec le code ci-dessus est ce qui arrive à topWidget et appContext quand je mets appContext.exit_flag = 1. Dois-je les renvoyer à Motif (comment), ou seront-ils libérés automatiquement? C'est quelque chose de difficile à essayer - contrairement à tester si le code ci-dessus affiche une boîte de message – karx11erx

+0

Je pensais que je ne peux pas mettre en avant avec <100 réputation. Upvoted et marqué votre réponse dans l'autre question. – karx11erx

Répondre

1

Je pense que le code suivant pourrait être ce que je demandais:

XtRealizeWidget (topWid); 
// display message box 
appContext.exit_flag = 0; 
XtAppMainLoop (app); 
while (!appContext.exit_flag) // wait in case XtAppMainLoop has its own thread 
    ; 
XtUnrealizeWidget (topWid); // destroy topWid and all its children 
Questions connexes