GtkAda开发:DrawingArea滚动条无法拖动,如何配置及动态调整范围?
GtkAda中ScrolledArea滚动条无法拖动的解决方法
我之前也碰到过这个问题!GtkAda里的ScrolledArea要正常工作,核心是得让它知道滚动内容的实际尺寸——你现在的代码里没给DrawingArea设置合适的大小,ScrolledArea根本不知道它要滚动的范围有多大,自然拖不动滚动条。下面是具体的解决步骤:
一、让滚动条正常拖动需要添加的内容
1. 给DrawingArea设置固定/动态尺寸
ScrolledArea是根据子部件的最小尺寸或自然尺寸来计算滚动范围的,所以你需要给DrawingArea设置一个能覆盖你绘图内容的大小。比如如果你的绘图内容是1000x800像素,就添加:
Set_Size_Request (MainWindow.DrawingArea, 1000, 800);
如果你的绘图内容是动态变化的(比如用户绘制后内容变大),那每次绘图完成后都要更新这个尺寸。
2. (可选)简化ScrolledArea的结构
其实GtkAda的ScrolledArea可以直接添加DrawingArea,不需要额外嵌套Viewport——Viewport主要是用来把非滚动部件变成可滚动的,而DrawingArea本身可以直接作为ScrolledArea的子部件。你可以把代码改成这样,减少层级:
Gtk_New (MainWindow.Scrolledwindow); Set_Policy (MainWindow.Scrolledwindow, Policy_Always, Policy_Always); Set_Shadow_Type (MainWindow.Scrolledwindow, Shadow_None); Set_Placement (MainWindow.Scrolledwindow, Corner_Top_Left); Gtk_New (MainWindow.DrawingArea); Set_Size_Request (MainWindow.DrawingArea, 1000, 800); -- 关键:设置绘图区域尺寸 MainWindow.Scrolledwindow.Add(MainWindow.DrawingArea); Pack_Start (MainWindow.Main_Box1, MainWindow.Scrolledwindow, Expand => True, Fill => True, Padding => 0);
当然如果坚持用Viewport也没问题,只要给DrawingArea设置尺寸就行。
二、运行时修改滚动条范围的方法
当你的绘图内容大小变化时,只需要更新DrawingArea的尺寸,然后通知ScrolledArea重新计算布局:
-- 假设New_Width和New_Height是你新的绘图内容尺寸 Set_Size_Request (MainWindow.DrawingArea, New_Width, New_Height); Queue_Resize (MainWindow.Scrolledwindow); -- 让ScrolledArea重新计算滚动范围
如果需要直接控制滚动条的位置(比如滚动到指定坐标),可以通过调整滚动条的Adjustment对象来实现:
declare H_Adjust : Gtk_Adjustment; -- 水平滚动条的调整对象 V_Adjust : Gtk_Adjustment; -- 垂直滚动条的调整对象 begin -- 获取水平滚动条的调整对象 H_Adjust := MainWindow.Scrolledwindow.Get_Hadjustment; H_Adjust.Set_Value (300.0); -- 水平滚动到300像素的位置 -- 获取垂直滚动条的调整对象 V_Adjust := MainWindow.Scrolledwindow.Get_Vadjustment; V_Adjust.Set_Value (200.0); -- 垂直滚动到200像素的位置 end;
内容的提问来源于stack exchange,提问作者ldries46




