【发布时间】:2014-02-12 03:22:38
【问题描述】:
我有一个GtkTextView 小部件,我想在用户右键单击某个单词时显示一个自定义弹出菜单。为了显示适当的菜单,我需要知道那个位置是什么词。
像下面这样:
我正在阅读文档,但我还没有找到方法。
有人知道怎么做吗?
【问题讨论】:
我有一个GtkTextView 小部件,我想在用户右键单击某个单词时显示一个自定义弹出菜单。为了显示适当的菜单,我需要知道那个位置是什么词。
像下面这样:
我正在阅读文档,但我还没有找到方法。
有人知道怎么做吗?
【问题讨论】:
我已经通过将来自GtkTextView 的button-press-event 信号连接到创建菜单的函数来实现它
g_signal_connect(text_view, "button-press-event", G_CALLBACK(right_click_menu), NULL);
当事件不是由预期的按钮(右键单击)生成时,处理菜单创建的函数将忽略该事件
if(event->button.button != 3)
return FALSE;
只需使用GdkEvent 传入的坐标调用gtk_text_view_window_to_buffer_coords 即可获得消息
int x, y;
gtk_text_view_window_to_buffer_coords( GTK_TEXT_VIEW(text_view),
GTK_TEXT_WINDOW_WIDGET,
event->button.x,
event->button.y,
&x,
&y );
并使用
请求迭代器GtkTextIter iter;
gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(text_view), &iter, x, y);
然后使用GtkTextIter 函数 (https://developer.gnome.org/gtk3/stable/GtkTextIter.html) 来确定单词边界。
【讨论】:
GTK+ 使用 Pango 库进行文本布局。 Pango API 提供了函数pango_layout_xy_to_index(),当在布局内给定坐标时,将为您提供创建布局所针对的文本的字节索引。
使用此信息,您可以通过向前/向后搜索适当的标点符号来识别给定字符所在的单词。
如果您使用GtkEntry 作为您的小部件,那么要将鼠标坐标从单击转换为布局坐标,则需要使用gtk_entry_get_layout_offsets() 来检索布局相对于小部件的位置。
【讨论】: