2009-09-06 15 views
1

我想要一個類似於Windows的Linux消息框:它應該彈出,顯示一些文本,並且當用戶單擊Ok按鈕時,它應該消失並將控制權返回給調用函數。用於Linux的類似於Windows的消息框 - 此C++/Motif實現的工作原理是什麼?

即使根本沒有應用程序窗口,消息框也應該可以工作。所以它創建了一個應用程序上下文,通過XmCreate *對話框連接到一個對話框,當用戶點擊對話框的確定​​按鈕時,告訴應用程序上下文主循環退出。

這項工作是否像預期的那樣工作? 這是否會自動銷燬所有在過程中創建的小部件和應用程序上下文(如果沒有,那該怎麼辦?)?

下面的代碼:

 

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

碰巧,你的最後一個問題http://stackoverflow.com/questions/1386319/ho-to-kill-xtappmainloop-motif得到了相當及時的回答,但是您還沒有投入,接受它,或者留下了一條要求更多幫助的評論。 事實上,你似乎沒有接受任何問題的答案。你覺得你沒有得到有用的答案嗎? – DigitalRoss 2009-09-06 21:45:52

+0

其實上面代碼的主要問題是當我設置appContext.exit_flag = 1時,topWidget和appContext會發生什麼。我是否必須以某種方式將它們返回Motif(如何),還是會自動釋放它們?這是一件很難嘗試的事情 - 不像測試上面的代碼是否顯示消息框 – karx11erx 2009-09-06 21:57:26

+0

我認爲我不能滿足<100的聲望。在另一個問題中提出並標記了您的回覆。 – karx11erx 2009-09-06 22:00:55

回答

1

我認爲下面的代碼可能是什麼我問:

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 
相關問題