8
votes

(C ++) MessageBox pour Linux comme dans MS Windows

Je dois implémenter une zone de message graphique simple pour une application Linux (SDL) similaire à la messagerie WindowsBox dans C ++ (GCC / G ++ 4.4.0). Tout ce qu'il faut faire est d'afficher une légende, un message et un bouton OK ou Fermer et de revenir à la fonction d'appel lorsque ce bouton est cliqué.

SDL utilise simplement X (11) pour ouvrir une fenêtre pour le rendu (OpenGL).

J'ai parcouru un fil similaire concernant une implémentation GTK, mais que cette mise en œuvre ne semble pas fonctionner correctement.

J'ai également essayé la fonction WXMessageBox WXWidgets 'WxWidgets, mais la compilation des en-têtes permet aux messages d'erreur du compilateur sur les erreurs de syntaxe Inclure / C ++ / 4.4.0 / BITS / STL_ALGOBASE.H (GCC 4.4.0 32 bits sur openSUSE 11.1 32 morceaux). L'utilisation de WxWidgets signifie également avoir à relier une tonne de bibliothèques, ajoutant STL à mon application (dont il n'a pas besoin autrement) et qui sait quoi d'autre, donc je ne veux pas utiliser WxWidgets.

x11 / motif (openmotif) a ce que j'ai besoin (XMCreate {erreur | Avertissement | Infodialog), mais ceux-ci ont besoin d'un widget parent (par exemple, une fenêtre de niveau supérieur) que je n'ai pas et n'accepte pas un paramètre null pour ces .

Donc je suis exclu maintenant. Y a-t-il un moyen simple de faire ce que je veux? Ou au moins une mi-chemin simple / facile / simple? Si oui, lequel (donnant autant de détails que possible serait très apprécié).


0 commentaires

5 Réponses :


3
votes

J'utilise personnellement QMessagebox .

Exemple: xxx


4 commentaires

Merci. Quel est le nom de la bibliothèque QT4 s'il vous plaît (-L )?


@ karx11erx: QT est plus qu'une simple bibliothèque, il s'agit d'une solution totale de la plate-forme croix (et plus). L'utilisation de cela nécessite plus que de simplement relier une bibliothèque particulière. Souvent, il est préférable d'utiliser son système de construction dans l'ensemble. Qt est souvent un choix "tout ou rien".


L'utilisation de Qt4 fait que GCC 4.4.0 jette beaucoup d'erreurs pour moi, et je n'ai pas besoin d'un BeHemoth sur mon application.


Eh bien, la plupart des totaux d'interface graphique de Gui vont être un "Behemoth" comparer à n'utiliser aucun (pensez à la taille de la taille de la GUN32!). Les erreurs sont presque certainement dues à ne pas utiliser correctement le système de construction QT.



2
votes

On dirait que vous devrez créer une fenêtre de haut niveau x11 / motif. Voici un certain code pour vous aider à démarrer:

#include <Xm/Xm.h> 
#include <Xm/PushB.h>

/* Prototype Callback function */

void pushed_fn(Widget , XtPointer , 
               XmPushButtonCallbackStruct *);


main(int argc, char **argv) 

{   Widget top_wid, button;
    XtAppContext  app;

    top_wid = XtVaAppInitialize(&app, "Push", NULL, 0,
        &argc, argv, NULL, NULL);

    button = XmCreatePushButton(top_wid, "Push_me", NULL, 0);

    /* tell Xt to manage button */
                XtManageChild(button);

                /* attach fn to widget */
    XtAddCallback(button, XmNactivateCallback, pushed_fn, NULL);

    XtRealizeWidget(top_wid); /* display widget hierarchy */
    XtAppMainLoop(app); /* enter processing loop */ 

}

void pushed_fn(Widget w, XtPointer client_data, 
               XmPushButtonCallbackStruct *cbs) 
  {   
     printf("Don't Push Me!!\n");
  }


5 commentaires

SDL crée évidemment une fenêtre de haut niveau pour le rendu OpenGL - J'ai mentionné que dans ma question initiale. Il n'y a aucun moyen d'obtenir sa poignée sauf la modification du SDL.


En fait, tout ce dont j'ai besoin, c'est de faire x (11) afficher une telle fenêtre pour moi, mais d'après ce que j'ai trouvé sur l'INET sur cette programmation, tout cas de X n'est pas trivial.


Serait-il possible de créer un widget Motif de la poignée de la fenêtre X11 SDL?


Cela semblerait si, mais je ne sais vraiment pas. Avez-vous essayé de simplement passer votre poignée de fenêtre X11 à la fonction de boîte de message? On dirait que cela fonctionnerait.


Comment puis-je tuer Xtappmainloop à partir de l'intérieur du programme ou vous terminer une fois que l'utilisateur a cliqué sur le bouton OK de ma boîte de message?



1
votes

Je suggérerais de regarder dans l'une des bibliothèques d'interface graphique qui prennent en charge SDL en tant que backend. Une de ces bibliothèques serait GG, qui a la classe ThreeButTondLG . Lorsque sa course () retourne, vous pouvez regarder son résultat (). Voir la méthode initiale dans leur Exemple minimal .


0 commentaires

2
votes

Voici ma solution. J'ai choisi d'utiliser Motif (OpenMotif) car il nécessite des bibliothèques de manière comparable (XM, XT, X11). Selon la taille du message, mon implémentation ouvre une boîte de message simple ou une boîte de dialogue plus sophistiquée avec un texte non modifiable et défilé (ce dernier tiré du manuel du programmeur de motifs et adapté à mes fins).

Inclure les fichiers et les données globales: p> xxx pré>

fonction d'assistance pour déterminer les lignes et max. Cols d'un message texte: p>

void XmMessageBox (const char* pszMsg, bool bError)
{
   Widget   topWid;
   int      nRows, nCols;

nRows = MsgSize (const_cast<char*>(pszMsg), nCols);
if ((nRows > 3) || (nCols > 360))
   XmMessageDialog (pszMsg, nRows, nCols, bError);
else { // use the built-in message box
   topWid = XtVaAppInitialize (&appShell, "D2X-XL", NULL, 0, &argC, argv, NULL, NULL);
   // setup message box text
   Arg args [1];
   XmString xmString = XmStringCreateLocalized (const_cast<char*>(pszMsg));
   XtSetArg (args [0], XmNmessageString, xmString);
   // create and label message box
   Widget xMsgBox = bError
                    ? XmCreateErrorDialog (topWid, const_cast<char*>("Error"), args, 1)
                    : XmCreateWarningDialog (topWid, const_cast<char*>("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));
   // add callback to the "close" button that signals closing of the message box
   XtAddCallback (xMsgBox, XmNokCallback, XmCloseMsgBox, NULL);
   XtManageChild (xMsgBox);
   XtRealizeWidget (topWid);
   }
XtAppMainLoop (appShell);
XtUnrealizeWidget (topWid);
XtDestroyApplicationContext (appShell);
}


0 commentaires

6
votes

dans sdl2, vous pouvez maintenant afficher des boîtes de messages:

http://wiki.libsdl.org/sdl_showsimplemessageagbox xxx

http: //wiki.libsdl. org / sdl_showmessagbox xxx


0 commentaires