Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GTK:如何在顶部窗口边框上获取按钮释放事件_Gtk_Mouseevent_Window Resize - Fatal编程技术网

GTK:如何在顶部窗口边框上获取按钮释放事件

GTK:如何在顶部窗口边框上获取按钮释放事件,gtk,mouseevent,window-resize,Gtk,Mouseevent,Window Resize,我有一个程序,需要知道用户在调整窗口大小后何时释放鼠标按钮。我要求获取窗口的按钮释放信号,当鼠标在窗口内单击时,我会得到这些信号,但当我调整窗口大小并释放鼠标按钮时,我不会得到这些信号。下面是一个演示这一点的简短程序。有人能告诉我,我需要做些什么来获得这些活动吗 人们建议“只需使用配置信号即可”,但最后一个配置信号出现在鼠标停止移动时。在此之后,用户可能会长时间按住鼠标按钮 C代码: ''' #包括 #包括 GtkWidget*窗口; GtkBuilder*builder; int main(i

我有一个程序,需要知道用户在调整窗口大小后何时释放鼠标按钮。我要求获取窗口的按钮释放信号,当鼠标在窗口内单击时,我会得到这些信号,但当我调整窗口大小并释放鼠标按钮时,我不会得到这些信号。下面是一个演示这一点的简短程序。有人能告诉我,我需要做些什么来获得这些活动吗

人们建议“只需使用配置信号即可”,但最后一个配置信号出现在鼠标停止移动时。在此之后,用户可能会长时间按住鼠标按钮

C代码: '''

#包括
#包括
GtkWidget*窗口;
GtkBuilder*builder;
int
main(int argc,char*argv[]){
gtk_init(0,NULL);//init gtk
builder=gtk_builder_new_来自_文件(“test.glade”);
window=GTK_小部件(GTK_builder_get_对象(builder,window));
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
gtk_builder_connect_信号(builder,NULL);
gtk_widget_show(窗口);
gtk_main();
返回0;
}
gboolean
打开窗口按钮释放事件(GtkWidget*w、GdkEvent*e、gpointer p)
{
printf(“按钮释放”);
返回FALSE;
}
'''


假的
真的
假的
100
80
真的
假的
标签
113
93

''

由于单击窗口的边界,且顶部栏位于窗口外部,因此当您单击时,您将收到一个
调出事件
信号。更重要的是,当您释放鼠标按钮时,当窗口再次激活时,它会在事件中发送一个
焦点。因此,您可以尝试使用
gboolean on_focus_in(GtkWidget*w,GdkEventFocus*ef,gpointer p)
g_signal\u connect
focus in event
检测来自窗口外点击的鼠标点击释放。问题似乎忽略了信号中的其他焦点,如打开窗口、不在边界上的按压,这可能是通过
gdk\u设备获取位置来实现的(回答可能会让您走上正确的道路),等等

但这里有一个大概的想法,可能值得尝试破解:

#include <stdlib.h>
#include <gtk/gtk.h>

GtkWidget   *window;

gboolean on_focus_in (GtkWidget* w, GdkEventFocus* ef, gpointer p) {
  printf("release\n");
  return TRUE;
}
gboolean on_focus_out (GtkWidget* w, GdkEventFocus* ef, gpointer p) {
    printf("press\n");
    return TRUE;
}

int
main(int argc, char *argv[]) {

    gtk_init(0, NULL); // init Gtk

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect (window,
              "focus-in-event",
              G_CALLBACK (on_focus_in),
              NULL);
    g_signal_connect (window,
              "focus-out-event",
              G_CALLBACK (on_focus_out),
              NULL);
    gtk_widget_show(window);
    gtk_main();

    return 0;
}
#包括
#包括
GtkWidget*窗口;
gboolean on_focus_in(GtkWidget*w、GdkEventFocus*ef、gpointer p){
printf(“发布”);
返回TRUE;
}
gboolean on_focus_out(GtkWidget*w、GdkEventFocus*ef、gpointer p){
printf(“press\n”);
返回TRUE;
}
int
main(int argc,char*argv[]){
gtk_init(0,NULL);//init gtk
窗口=gtk_窗口_新建(gtk_窗口_顶层);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
g_信号_连接(车窗,
“关注事件”,
G_回调(在焦点处),
无效);
g_信号_连接(车窗,
“聚焦事件”,
G_回调(在焦点处),
无效);
gtk_widget_show(窗口);
gtk_main();
返回0;
}

我没有看到你说我应该看到的信号。我在代码中添加了一个焦点输出信号并进行了测试:在窗口处于焦点的情况下,我单击边界,拖动它,然后释放它。根本没有信号。在窗口未聚焦的情况下,我单击边界(聚焦),拖动它,释放它(无信号)。简言之,我从来没有得到任何释放鼠标按钮的信号。我遗漏了什么吗?@tgphelps上面的代码示例根本没有打印“release”?焦点输出也没有输出?让我想想……你的gtk版本是什么?当我点击边界时,窗口没有聚焦,它打印了“发布”。在窗口处于焦点的情况下单击边界并没有像您所想的那样给出“焦点输出”。@tgphelps Hmmm不寻常。。。我已经更新了代码和gif,这是您的系统生成的吗/这是您期望发生的吗?我运行了您的代码,没有任何更改。发生这种情况:(1)启动(“释放”),(2)移动窗口(无),(3)调整窗口大小(无),(4)单击窗口外部(“按下”),(5)单击并按住窗口边界(“释放”),(6)拖动窗口边缘并释放(无)。显然,你看到的结果非常不同。我被难住了。我从来没有看到按钮释放的信号,只有当(a)在、和(b)在窗口边框上单击,焦点在,和(b)在窗口边框上单击,或在焦点在外时单击,我才看到按钮按下的信号。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.4 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="window">
    <property name="can_focus">False</property>
    <signal name="button-release-event" handler="on_window_button_release_event" swapped="no"/>
    <child>
      <object class="GtkFixed" id="fixed1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkLabel">
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Label</property>
          </object>
          <packing>
            <property name="x">113</property>
            <property name="y">93</property>
          </packing>
        </child>
      </object>
    </child>
    <child type="titlebar">
      <placeholder/>
    </child>
  </object>
</interface>
#include <stdlib.h>
#include <gtk/gtk.h>

GtkWidget   *window;

gboolean on_focus_in (GtkWidget* w, GdkEventFocus* ef, gpointer p) {
  printf("release\n");
  return TRUE;
}
gboolean on_focus_out (GtkWidget* w, GdkEventFocus* ef, gpointer p) {
    printf("press\n");
    return TRUE;
}

int
main(int argc, char *argv[]) {

    gtk_init(0, NULL); // init Gtk

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect (window,
              "focus-in-event",
              G_CALLBACK (on_focus_in),
              NULL);
    g_signal_connect (window,
              "focus-out-event",
              G_CALLBACK (on_focus_out),
              NULL);
    gtk_widget_show(window);
    gtk_main();

    return 0;
}