如何编程窗口关闭与ESC键 [英] how to program window to close with escape key

查看:164
本文介绍了如何编程窗口关闭与ESC键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在寻找所有的地方,找出如何让我的程序中使用ESC键来关闭。没有那么多的人使用GTK +我承担。另外,如果它不要求太多,有的请告诉我如何使用Gnome的开发者网站,所以我能找到这个东西自己出去?谢谢。因此,缩小与ESC键的窗口,这里是我的code:

 的#include<&stdio.h中GT;
#包括LT&;&string.h中GT;
#包括LT&; GTK / gtk.h>
#包括LT&;&stdlib.h中GT;
#包括LT&;&文件ctype.h GT;
#包括LT&;&curses.h里GT;#定义KEY_ESC'\\ 033'静态的GtkWidget *进入;静态gboolean kill_window(* GtkWidget的部件,GdkEvent *事件,gpointer数据)
{
    gtk_main_quit();
    返回FALSE;
}静态无效button_ preSS(* GtkWidget的部件,gpointer数据)
{
    为const char *文字= gtk_entry_get_text(GTK_ENTRY(入门));
    //系统(CD的文字);
    //的printf(%S \\ n,文本);
    为const char *文本2 =放大器;;
    字符*串联;
    级联=的malloc(strlen的(文本)+2);
    的strcpy(串联,文本);
    strcat的(串联,文本2);
    系统(串联);
    gtk_main_quit();
}    INT主(INT ARGC,CHAR *的argv [])
    {* GtkWidget的窗口;
* GtkWidget的按钮;
* GtkWidget的按钮1;
GtkWidget的*横向盒;
gtk_init(安培; ARGC,&安培; argv的);窗口= gtk_window_new(GTK_WINDOW_TOPLEVEL);
按钮= gtk_button_new_with_label(运行);
按钮1 = gtk_button_new_with_label(取消);
条目= gtk_entry_new();
横向盒=用gtk_vbox_new(FALSE,2);gtk_window_set_title(GTK_WINDOW(窗口),运行..);gtk_window_set_position(GTK_WINDOW(窗口),GTK_WIN_POS_CENTER_ALWAYS);
g_signal_connect(窗口delete_event,G_CALLBACK(kill_window),NULL);g_signal_connect(按钮,点击,G_CALLBACK(button_ preSS),NULL);g_signal_connect(按钮1,点击,G_CALLBACK(kill_window),NULL);
g_signal_connect(入门,激活,G_CALLBACK(button_ preSS),NULL);
g_signal_connect(按钮1,delete_event,G_CALLBACK(kill_window),NULL);
gtk_window_set_resizable(GTK_WINDOW(窗口),FALSE);
gtk_window_set_default_size(GTK_WINDOW(窗口),250,100);
gtk_window_set_decorated(GTK_WINDOW(窗口),TRUE);gtk_box_pack_start(GTK_BOX(横向盒),入境,不错,不错,2);gtk_box_pack_start(GTK_BOX(横向盒),按钮,FALSE,FALSE,2);
gtk_box_pack_start(GTK_BOX(横向盒),按钮1,FALSE,FALSE,2);
gtk_container_add(GTK_CONTAINER(窗口),横向盒);
gtk_widget_show_all(窗口);进入主循环();返回0;
}


解决方案

连接到顶层窗口上的 KEY_ press_event 信号:

  g_signal_connect(窗口KEY_ press_event,G_CALLBACK(check_escape),NULL);

check_escape 回调将是这样的:

 的#include< GDK / gdkkeysyms.h>
...
静态gboolean check_escape(* GtkWidget的部件,GdkEventKey *事件,gpointer数据)
{
  如果(事件 - > KEYVAL == GDK_KEY_Escape){
    gtk_main_quit();
    返回TRUE;
  }
  返回FALSE;
}

另外,你不需要< curses.h里> 包括,也不是 KEY_ESC 定义。

如果您的顶层窗口基本上是一个对话框,你可以考虑使用,而不是一个 GtkDialog A 的GtkWindow 。一个对话框提供股票反应,如确定和取消,用输入和逃生键调用预期的响应。

I've been searching all over the place to find out how to get my program to close using the escape key. Not that many people use GTK+ I assume. Also, if it's not asking too much, can some please show me how to use the Gnome developer website so I could find this stuff out on my own? Thanks. So, closing the window with escape key, here's my code:

#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
#include <stdlib.h>
#include <ctype.h>
#include <curses.h>

#define KEY_ESC '\033'

static GtkWidget *entry;

static gboolean kill_window(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    gtk_main_quit();
    return FALSE;
}

static void button_press(GtkWidget *widget, gpointer data)
{
    const char *text = gtk_entry_get_text(GTK_ENTRY(entry));
    //system("cd" text);
    //printf("%s\n", text);
    const char *text2 = "&";
    char *concatenation;
    concatenation = malloc(strlen(text)+2);
    strcpy(concatenation, text);
    strcat(concatenation, text2);
    system(concatenation); 
    gtk_main_quit();
}

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

GtkWidget *window;
GtkWidget *button;
GtkWidget *button1;
GtkWidget *hbox;


gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
button = gtk_button_new_with_label("Run");
button1 = gtk_button_new_with_label("Cancel");
entry = gtk_entry_new();
hbox = gtk_vbox_new(FALSE, 2);

gtk_window_set_title(GTK_WINDOW(window), "Run..");

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
g_signal_connect(window, "delete_event", G_CALLBACK(kill_window), NULL);

g_signal_connect(button, "clicked", G_CALLBACK(button_press), NULL);

g_signal_connect(button1, "clicked", G_CALLBACK(kill_window), NULL);
g_signal_connect(entry, "activate", G_CALLBACK(button_press), NULL);
g_signal_connect(button1, "delete_event", G_CALLBACK(kill_window), NULL);
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 100);
gtk_window_set_decorated(GTK_WINDOW(window), TRUE);

gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 2);

gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 2); 
gtk_box_pack_start(GTK_BOX(hbox), button1, FALSE, FALSE, 2);
gtk_container_add(GTK_CONTAINER(window), hbox);
gtk_widget_show_all(window);

gtk_main(); 

return 0;
}

解决方案

Connect to the key_press_event signal on the top-level window:

g_signal_connect(window, "key_press_event", G_CALLBACK(check_escape), NULL);

The check_escape callback will look like this:

#include <gdk/gdkkeysyms.h>
...
static gboolean check_escape(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
  if (event->keyval == GDK_KEY_Escape) {
    gtk_main_quit();
    return TRUE;
  }
  return FALSE;
}

Also, you don't need the <curses.h> include, nor the KEY_ESC definition.

If your top-level window is essentially a dialog, you might consider using a GtkDialog instead of a GtkWindow. A dialog provides stock responses such as "OK" and "Cancel", with enter and escape keys invoking the expected response.

这篇关于如何编程窗口关闭与ESC键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆