Motif主窗口没有系统菜单,最小化和最大化盒子怎么样? (C ++)

时间:2009-09-07 12:25:46

标签: c++ motif

如何创建没有系统菜单的Motif主窗口,最小化和最大化框?我只是不知道如何通过谷歌搜索和阅读文档和教程。我认为应该可以使用XtVaCreateManagedWindow的一些附加参数,但是哪个?

我尝试了XtVaSetValuestopWidXmNmwmDecorations,...)的几种变体,但都没有效果。相反,我收到一条错误消息,我需要使用供应商shell。但是,大多数窗口小部件类型并非来自供应商外壳,例如尝试使用对话框shell并在其中放置一个可滚动的文本小部件,然后文本小部件似乎控制对话框。

3 个答案:

答案 0 :(得分:2)

显然,不可能(轻松)摆脱窗口(系统)菜单,但似乎可以使用以下代码禁用窗口菜单项:

int i;
XtVaGetValues (widget, XmNmwmFunctions, &i);
i &= ~(MWM_FUNC_ALL | MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE | MWM_FUNC_CLOSE);
XtVaSetValues (widget, XmNmwmFunctions, i);

它也删除了相关的窗口装饰,显然甚至适用于非供应商的shell小部件。

答案 1 :(得分:2)

还应该有可能去除装饰物(即使它们看不见)。但请注意,这些“系统菜单”装饰属于Window Manager,而不属于Motif程序本身。由窗口管理器来处理您的请求或忽略它们 - 您可能会使用任何MWM资源获得特定于供应商的行为。

无论如何,这是试用的代码示例:

int decors; //bit-mask of flags defining the decorations, from Xm/MwmUtil.h
XtVaGetValues(dlg, XmNmwmDecorations, &decors, NULL);
decors &= ~MWM_DECOR_MENU;
decors &= ~MWM_DECOR_MAXIMIZE;
decors &= ~MWM_DECOR_MINIMIZE;
XtVaSetValues(dlg, XmNmwmDecorations, decors, NULL);

答案 2 :(得分:0)

如果您打算从Mwm运行您的应用程序,则可以通过设置(例如通过XtVaAppInitialize())以下X11资源来实现所需的行为:

! Title bar buttons
Mwm*YourApplicationClassHere.clientDecoration: -minimize -maximize
! Window menu functions
Mwm*YourApplicationClassHere.clientFunctions: -minimize -maximize

更详细地解释了这些资源herehere

说到窗口菜单,这个菜单取决于正在使用的特定窗口管理器。例如,Mwm允许客户端使用Mwm*YourApplicationClassHere.windowMenu资源设置菜单名称,菜单本身必须在${HOME}/.mwmrc或全局mwmrc中定义,或{{1 } XmNmwmMenu的资源。生成的自定义窗口菜单显示为VendorShell原子,现在的窗口管理器似乎忽略了它。

示例_MOTIF_WM_MENU菜单定义可能如下所示

mwmrc

(参见function descriptions)。可以使用Menu CustomMenu0 { Restore _R Alt<Key>F5 f.restore Move _M Alt<Key>F7 f.move Size _S Alt<Key>F8 f.resize Minimize _n Alt<Key>F9 f.minimize Maximize _x Alt<Key>F10 f.maximize Lower _L Alt<Key>F3 f.lower no-label f.separator Pass\ Keys _K f.pass_keys no-label f.separator Close _C Alt<Key>F4 f.kill } Menu CustomMenu1 { Your\ Application\ Name\ Here f.title no-label f.separator Close _C Alt<Key>F4 f.kill } 添加自定义菜单项(示例herehere)。

我非常确定以上所有内容也适用于f.send_msg CDE )。