You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何添加随容器自适应、占满高度的Scrolled Text组件

解决Motif滚动文本组件自适应窗口大小问题

问题分析

你当前的代码核心问题在于使用了不支持布局附着(attachment)属性的RowColumn作为主容器,却试图给ScrolledText设置Form专属的XmNtopAttachment等属性——这些属性仅对Form容器的子组件生效。RowColumn默认按子组件的固有尺寸排列,无法实现自动拉伸填充的效果。

修正后的代码

将主容器替换为Form,并调整组件布局属性,即可实现滚动文本占满所有可用空间:

#include <Xm/Xm.h>
#include <Xm/Text.h>
#include <Xm/ScrolledW.h>
#include <Xm/Form.h>  // 替换RowColumn为Form容器

int main(int argc, char** argv)
{
    XtAppContext app;
    Widget topLevelShell;
    Widget mainWidget;
    Widget scrolledText;

    topLevelShell = XtVaAppInitialize(&app, "Application", NULL, 0, &argc, argv, NULL, NULL);

    // 用Form代替RowColumn作为主布局容器
    mainWidget = XtVaCreateManagedWidget("mainWidget", xmFormWidgetClass, topLevelShell,
                                         NULL);

    // 创建滚动窗口,设置填充Form的所有空间
    scrolledText = XtVaCreateManagedWidget("scrolledText", xmScrolledWindowWidgetClass, mainWidget,
                                           XmNscrollingPolicy, XmAUTOMATIC,
                                           XmNtopAttachment, XmATTACH_FORM,
                                           XmNbottomAttachment, XmATTACH_FORM,
                                           XmNleftAttachment, XmATTACH_FORM,
                                           XmNrightAttachment, XmATTACH_FORM,
                                           XmNvisualPolicy, XmVARIABLE,  // 让内部组件自动适应视口大小
                                           NULL);

    // 创建文本组件,设置填充滚动窗口的视口
    Widget textWidget = XtVaCreateManagedWidget("textWidget", xmTextWidgetClass, scrolledText,
                                                XmNeditable, True,
                                                XmNscrollVertical, True,
                                                XmNscrollHorizontal, False,
                                                // 设置文本组件填充滚动窗口的所有边缘
                                                XmNtopAttachment, XmATTACH_FORM,
                                                XmNbottomAttachment, XmATTACH_FORM,
                                                XmNleftAttachment, XmATTACH_FORM,
                                                XmNrightAttachment, XmATTACH_FORM,
                                                NULL);

    XtRealizeWidget(topLevelShell);
    XtAppMainLoop(app);

    return 0;
}

关键修改点

  • 主容器从xmRowColumnWidgetClass替换为xmFormWidgetClass:Form是Motif中支持布局附着属性的容器,能精准控制子组件的拉伸填充。
  • 滚动窗口创建时直接设置四边附着到Form边缘:确保窗口大小变化时,滚动窗口自动填充所有可用空间。
  • 为滚动窗口添加XmNvisualPolicy, XmVARIABLE:让内部的文本组件自动适配滚动窗口的视口尺寸。
  • 文本组件设置四边附着到滚动窗口内部表单:使文本区域完全填充滚动窗口的可视区域。

编译用Makefile(无需修改)

你提供的FreeBSD环境Makefile可直接用于编译修正后的代码:

CC = cc
CFLAGS = -Wall -Wextra -I/usr/local/include
LIBS = -lXm -lXt -lX11
LDFLAGS = -L/usr/local/lib

SRCS = main.c
OBJS = $(SRCS:.c=.o)
TARGET = test

all: $(TARGET)

$(TARGET): $(OBJS)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -f $(OBJS) $(TARGET)

内容的提问来源于stack exchange,提问作者M.E.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:17:36