微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我在 Motif 小部件列表中的垂直填充不均匀?

如何解决为什么我在 Motif 小部件列表中的垂直填充不均匀?

我使用的是 Motif Widget Scrolledlist。列表创建如下:

/* COMMAND GROUP LIST */
ac = 0;
XtSetArg(al[ac],XmNselectionPolicy,xmsINGLE_SELECT); ac++;
XtSetArg(al[ac],XmNtopAttachment,XmATTACH_WIDGET); ac++;
XtSetArg(al[ac],XmNtopWidget,printer_menu_button); ac++;
XtSetArg(al[ac],XmNleftAttachment,XmATTACH_FORM); ac++;
XtSetArg(al[ac],XmNrightAttachment,XmNbottomAttachment,XmATTACH_POSITION); ac++;
XtSetArg(al[ac],XmNbottomPosition,50); ac++;
command_group_list = XmCreateScrolledList(form,"command_group_list",al,ac);
XtManageChild(command_group_list);

the items are added by a callback function when the printer is selected.从添加项目的例程中,唯一相关的 Motif 相关命令是:

XmListDeleteallItems(command_group_list);
...
str = xmstringCreateLocalized(command_group_line);
XmListAddItem(command_group_list,str,0); 
xmstringFree(str);

但是,当我显示列表时,我得到了一个奇怪的底部填充,似乎列表中每个单独项目的高度都大于文本的高度。这可以在这图片中看到:

Motif Widget List

虽然在文档中(例如 O'Reilly 第六卷 A),列表的项目似乎具有“正常”高度。我不知道可能缺少什么。我已经查看了 6A 中的示例代码是否将更多资源应用于列表,但我找不到任何东西。

例如,从 6A提取的此列表屏幕截图显示了您通常在列表中期望的高度:

enter image description here

我使用的是 FreeBSD 和 OpenMotif 2.3.8_1。

会不会是字体问题?

更新:这是添加项目的整个例程,如上所述,唯一的 Motif/X11 代码是 Xm 函数删除所有项目并在 for 循环中添加单个项目。

这是填充项目的例程(请注意,大多数是与实际 Motif 问题无关的 C 代码):

/* THIS FUNCTION READS COMMAND GROUPS USED BY THIS PRINTER */
void read_command_group(char *printer_name) {

    /* BUILD FILE PATH */
    char filepath[256];
    strcpy(filepath,"/etc/xcmdprinter/");
    strcat(filepath,printer_name);

    /* OPEN AND READ FILE */
    char line[256];
    FILE *fp = fopen(filepath,"r");
    while(fgets(line,sizeof(line),fp)) {
        if(line[0]=='G') {
            xmstring str;
            char command_group_line[256];
            int i=2;
            while(line[i]!='\0') {
                command_group_line[i-2] = line[i];
                i++;
            }
            command_group_line[i-2] = '\0';
            str = xmstringCreateLocalized(command_group_line);
            XmListAddItem(command_group_list,0); 
            xmstringFree(str);
        }
    }
    fclose(fp);

}

/* CALLBACK FUNCTION FOR PRINTER SELECTION */
void select_printer(Widget w,XtPointer client_data,XtPointer call_data) {

    XmListDeleteallItems(command_group_list);
    read_command_group((char *)client_data);
}

解决方法

每一项都包含一个换行符;删除它。

我也想知道为什么焦点用这么强的虚线显示。

这是由列表小部件的资源 XmNhighlightThickness 设置的, 其默认值为 2。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。