如何添加随容器自适应、占满高度的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.
相关产品推荐
相关产品推荐

