2010-07-27 175 views
2

我正在处理用于显示上下文菜单的GTK代码中的缺陷。创建一个包含多个菜单项的菜单后,我使用gtk_menu_popup()来显示菜单。该功能采用GtkMenuPositionFunc类型的函数指针,可以让我定位菜单。除了告诉GTK保持当前位置外,我没有在这里做任何事情,但是如果菜单的一部分在监视器之外(使用函数的第四个参数),则将菜单推入。我的问题是,当GTK推入菜单时,菜单项的绝对位置不会改变。因此它们的滚动位置改变导致菜单中的滚动条。我希望菜单中菜单项的相对位置保持不变。有什么办法可以做到吗? GTK文档确实警告了这个问题,但没有说明如何解决这个问题。有链接以供参考:GTK:定位上下文菜单项w.r.t上下文菜单

http://library.gnome.org/devel/gtk/unstable/GtkMenu.html#GtkMenuPositionFunc

编辑:我本来希望包括一些代码,但逻辑太散了点。

回答

0

我一直没有找到任何方法来重新调整菜单项的滚动偏移量。所以,我使用的解决方法是避免让GTK垂直推菜单。因此,原始请求是在位置(x,y)上创建菜单,但导致菜单的长度为L不在屏幕上,我在位置函数中将菜单重新定位在(x,y-L)。同样,如果y<0我更改将其设置为(x,0)。我仍然告诉GTK推入屏幕外的任何菜单,以便处理左右页边的菜单。

0

如果您只是想要默认行为,则不需要提供定位功能。默认行为是保持当前位置,但确保菜单适合显示器,因此您可以通过NULL作为定位功能。

您还可以看看默认的定位功能是怎么写的:http://git.gnome.org/browse/gtk+/tree/gtk/gtkmenu.cgtk_menu_position()目前行4288

PS。如果你的逻辑过于分散,无法发布代码示例,那么你应该考虑清理它。

+0

传递'NULL'并不是真正的选择,因为它在某些情况下使用。我试过为这个特定的情况传递NULL,并解决了这个问题。这是否意味着我不能要求GTK重新定位菜单,并要求它将菜单推入屏幕之外?这似乎不大可能。 – 341008 2010-07-27 10:03:28

+0

我包含了源代码的链接,以便您可以复制默认定位功能并从那里开始。如果GTK可以做你想做的事,那么你也可以做到。 – ptomato 2010-07-27 10:12:14