热键与快捷键
熱鍵及快捷鍵(GtkAccelGroup)
熱鍵:一般是字母帶下劃線.在當前控件內(如打開的菜單)可以用alt+字母來代替點擊的功能
快捷鍵:一般指,在本窗口任何位置內,按某組合鍵,都可以代替點擊的功能.
:) 如果你的理解與我的有沖突,請以我的理解為準!
試舉例證:
#include
#include
const char *txtShow = "http://tresss.com";
GtkWidget *frmMain, *tblTop, *txtTest, *lblShow,*btnSet,*btnGet;
GtkAccelGroup *agMain;
void destroy (GtkWidget *widget, gpointer *data)
{
gtk_main_quit ();
}
//set Caption
void txt_setCaption (GtkWidget *widget, gpointer *data)
{
gtk_entry_set_text(GTK_ENTRY(txtTest), txtShow);
}
//get Caption
void txt_getCaption (GtkWidget *widget, gpointer *data)
{
gtk_label_set_text(GTK_LABEL(lblShow), gtk_entry_get_text(GTK_ENTRY(txtTest)));
}
int main(int argc, char *argv[])
{
gtk_init (&argc, &argv);
frmMain = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (frmMain), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_border_width (GTK_CONTAINER (frmMain), 10);
gtk_widget_add_events(frmMain, GDK_BUTTON_PRESS_MASK);
tblTop = gtk_table_new(5,2,TRUE);
gtk_container_add(GTK_CONTAINER(frmMain),tblTop);
//controls create
txtTest = gtk_entry_new();
gtk_table_attach_defaults(GTK_TABLE(tblTop),txtTest,0,2,0,1);
lblShow = gtk_label_new("Entry Info");
gtk_table_attach_defaults(GTK_TABLE(tblTop),lblShow,0,2,1,2);
btnSet = gtk_button_new_with_mnemonic("Set _Caption");
gtk_table_attach_defaults(GTK_TABLE(tblTop),btnSet,0,1,2,3);
btnGet = gtk_button_new_with_mnemonic("_Get Caption");
gtk_table_attach_defaults(GTK_TABLE(tblTop),btnGet,1,2,2,3);
//signal
gtk_signal_connect(GTK_OBJECT(btnSet), "clicked", GTK_SIGNAL_FUNC(txt_setCaption), NULL);
gtk_signal_connect(GTK_OBJECT(btnGet), "clicked", GTK_SIGNAL_FUNC(txt_getCaption), NULL);
//bind Accelerate
agMain = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(frmMain), agMain);
gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_g,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
//Show everything;
gtk_widget_show (frmMain);
gtk_widget_show (tblTop);
gtk_widget_show (txtTest);
gtk_widget_show (lblShow);
gtk_widget_show (btnSet);
gtk_widget_show (btnGet);
gtk_main ();
return 0;
}
熱鍵
可以看出.熱鍵的使用很簡單.
僅僅是用gtk_button_new_with_mnemonic代替了原來的創建函數gtk_button_new_with_label.
而且在想設為熱鍵的字母前加一個下劃線"_",這與其它語言也是有很大差異的.其它所有我了解的語言中,都是用"&"+字母來設定熱鍵的,而這里是"_"+字母.
當然,你有可能會在字符中使用"_"這個字符本身.這時,你可以用"__"連續的兩個下劃線來實現.在顯示時,就會顯示出字符"_".
編譯后可以按"alt"+c,就會執行btnSet所連接的txt_setCaption()函數.
快捷鍵
GTK中的快捷鍵是通過GtkAccelGroup控件來實現的.
gtk_accel_group_new();創建函數沒有任何參數.
gtk_window_add_accel_group(GTK_WINDOW(frmMain), agMain);這里是將GtkAccelGroup添加到窗體frmMain中.即表示只要是在窗體frmMain中按鍵,都會判斷觸發agMain設定的快捷鍵.
gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_g,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
這里是真正的注冊一個快捷鍵.第一個參數表示快捷鍵觸發后要執行的對象.
第二個參數表示按鍵后,要觸發這個對象的某個信號,這里是點擊.
第三個參數表示是哪一個鍵.它定義在gdk/gdkkeysyms.h文件中,需要手動包含此文件.
第四個表示控件鍵.這里是ctrl鍵.
第五個參數是快捷鍵標志.官方文檔沒有太多說明.這個參數表示的是會在GtkAccelLabel控件中顯示按鍵名.
第一和第二個參數其實就是表示,當按鍵被按下后要觸發哪個控件的哪個信號.
第三和第四個參數就是表示注冊的是哪個快捷鍵.
普通鍵在gdk/gdkkeysyms.h中有定義,你可以自已查找.
而控制鍵是一個掩碼結構.說明如下:
enum GdkModifierType
typedef enum
{
GDK_SHIFT_MASK = 1 << 0,
GDK_LOCK_MASK = 1 << 1,
GDK_CONTROL_MASK = 1 << 2,
GDK_MOD1_MASK = 1 << 3,
GDK_MOD2_MASK = 1 << 4,
GDK_MOD3_MASK = 1 << 5,
GDK_MOD4_MASK = 1 << 6,
GDK_MOD5_MASK = 1 << 7,
GDK_BUTTON1_MASK = 1 << 8,
GDK_BUTTON2_MASK = 1 << 9,
GDK_BUTTON3_MASK = 1 << 10,
GDK_BUTTON4_MASK = 1 << 11,
GDK_BUTTON5_MASK = 1 << 12,
/* The next few modifiers are used by XKB, so we skip to the end.
* Bits 15 - 25 are currently unused. Bit 29 is used internally.
*/
GDK_SUPER_MASK = 1 << 26,
GDK_HYPER_MASK = 1 << 27,
GDK_META_MASK = 1 << 28,
GDK_RELEASE_MASK = 1 << 30,
GDK_MODIFIER_MASK = 0x5c001fff
} GdkModifierType;
說明:
GDK_SHIFT_MASK
the Shift key.
GDK_LOCK_MASK
a Lock key (depending on the modifier mapping of the X server
this may either be CapsLock or ShiftLock).
GDK_CONTROL_MASK
the Control key.
GDK_MOD1_MASK
the fourth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier, but normally it is the Alt key).
GDK_MOD2_MASK
the fifth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier).
GDK_MOD3_MASK
the sixth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier).
GDK_MOD4_MASK
the seventh modifier key (it depends on the modifier mapping of the X server which key
is interpreted as this modifier).
GDK_MOD5_MASK
the eighth modifier key (it depends on the modifier mapping of the X server which key
is interpreted as this modifier).
GDK_BUTTON1_MASK
the first mouse button.
GDK_BUTTON2_MASK
the second mouse button.
GDK_BUTTON3_MASK
the third mouse button.
GDK_BUTTON4_MASK
the fourth mouse button.
GDK_BUTTON5_MASK
the fifth mouse button.
GDK_SUPER_MASK
the Super modifier. Since 2.10
GDK_HYPER_MASK
the Hyper modifier. Since 2.10
GDK_META_MASK
the Meta modifier. Since 2.10
GDK_RELEASE_MASK
not used in GDK itself. GTK+ uses it to differentiate between (keyval, modifiers) pairs from
key press and release events.
GDK_MODIFIER_MASK
a mask covering all modifier types.
可以看到,連鼠標按鍵都包含其中,但"win"鍵是不在其中的.
說明:這里的GDK_MOD1_MASK就是表示"alt"鍵的.
但現在有一個問題.就是,如果我想設快捷鍵為"F1"呢?即沒有控制鍵.
很抱歉,GTK本身不提供這個功能.因為它們缺少一個成員來表示空值(已提交到官方bug網站,建議其添加一個成員).
所以只能如此做gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_F1,(GdkModifierType)0, GTK_ACCEL_VISIBLE);
用0來表示不需要控制鍵,只要按F1就會觸發事件.
同樣,如果要設定"ctrl + alt + F1"這樣的組合鍵,就如此gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_F1,(GdkModifierType)(GDK_SHIFT_MASK | GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE);
第五個參數表示的是在GtkAccelLabel控件中顯示按鍵名.即在右側顯示"ctrl+F1"字樣.
但這里我們測試的是按鈕.按鈕上沒有GtkAccelLabel.如果是菜單的話,由于GtkMenuItem默認會使用GtkAccelLabel控件來顯示字符,所以菜單上會提示此字樣.
如果你要在變通按鈕上使用快捷鍵,就只能手動添加上去了.
總體來說GTK的快捷鍵設置比較麻煩.但相對Windows開發,比較獨立.
2008.12.03
熱鍵:一般是字母帶下劃線.在當前控件內(如打開的菜單)可以用alt+字母來代替點擊的功能
快捷鍵:一般指,在本窗口任何位置內,按某組合鍵,都可以代替點擊的功能.
:) 如果你的理解與我的有沖突,請以我的理解為準!
試舉例證:
#include
#include
const char *txtShow = "http://tresss.com";
GtkWidget *frmMain, *tblTop, *txtTest, *lblShow,*btnSet,*btnGet;
GtkAccelGroup *agMain;
void destroy (GtkWidget *widget, gpointer *data)
{
gtk_main_quit ();
}
//set Caption
void txt_setCaption (GtkWidget *widget, gpointer *data)
{
gtk_entry_set_text(GTK_ENTRY(txtTest), txtShow);
}
//get Caption
void txt_getCaption (GtkWidget *widget, gpointer *data)
{
gtk_label_set_text(GTK_LABEL(lblShow), gtk_entry_get_text(GTK_ENTRY(txtTest)));
}
int main(int argc, char *argv[])
{
gtk_init (&argc, &argv);
frmMain = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (frmMain), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_border_width (GTK_CONTAINER (frmMain), 10);
gtk_widget_add_events(frmMain, GDK_BUTTON_PRESS_MASK);
tblTop = gtk_table_new(5,2,TRUE);
gtk_container_add(GTK_CONTAINER(frmMain),tblTop);
//controls create
txtTest = gtk_entry_new();
gtk_table_attach_defaults(GTK_TABLE(tblTop),txtTest,0,2,0,1);
lblShow = gtk_label_new("Entry Info");
gtk_table_attach_defaults(GTK_TABLE(tblTop),lblShow,0,2,1,2);
btnSet = gtk_button_new_with_mnemonic("Set _Caption");
gtk_table_attach_defaults(GTK_TABLE(tblTop),btnSet,0,1,2,3);
btnGet = gtk_button_new_with_mnemonic("_Get Caption");
gtk_table_attach_defaults(GTK_TABLE(tblTop),btnGet,1,2,2,3);
//signal
gtk_signal_connect(GTK_OBJECT(btnSet), "clicked", GTK_SIGNAL_FUNC(txt_setCaption), NULL);
gtk_signal_connect(GTK_OBJECT(btnGet), "clicked", GTK_SIGNAL_FUNC(txt_getCaption), NULL);
//bind Accelerate
agMain = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(frmMain), agMain);
gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_g,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
//Show everything;
gtk_widget_show (frmMain);
gtk_widget_show (tblTop);
gtk_widget_show (txtTest);
gtk_widget_show (lblShow);
gtk_widget_show (btnSet);
gtk_widget_show (btnGet);
gtk_main ();
return 0;
}
熱鍵
可以看出.熱鍵的使用很簡單.
僅僅是用gtk_button_new_with_mnemonic代替了原來的創建函數gtk_button_new_with_label.
而且在想設為熱鍵的字母前加一個下劃線"_",這與其它語言也是有很大差異的.其它所有我了解的語言中,都是用"&"+字母來設定熱鍵的,而這里是"_"+字母.
當然,你有可能會在字符中使用"_"這個字符本身.這時,你可以用"__"連續的兩個下劃線來實現.在顯示時,就會顯示出字符"_".
編譯后可以按"alt"+c,就會執行btnSet所連接的txt_setCaption()函數.
快捷鍵
GTK中的快捷鍵是通過GtkAccelGroup控件來實現的.
gtk_accel_group_new();創建函數沒有任何參數.
gtk_window_add_accel_group(GTK_WINDOW(frmMain), agMain);這里是將GtkAccelGroup添加到窗體frmMain中.即表示只要是在窗體frmMain中按鍵,都會判斷觸發agMain設定的快捷鍵.
gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_g,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
這里是真正的注冊一個快捷鍵.第一個參數表示快捷鍵觸發后要執行的對象.
第二個參數表示按鍵后,要觸發這個對象的某個信號,這里是點擊.
第三個參數表示是哪一個鍵.它定義在gdk/gdkkeysyms.h文件中,需要手動包含此文件.
第四個表示控件鍵.這里是ctrl鍵.
第五個參數是快捷鍵標志.官方文檔沒有太多說明.這個參數表示的是會在GtkAccelLabel控件中顯示按鍵名.
第一和第二個參數其實就是表示,當按鍵被按下后要觸發哪個控件的哪個信號.
第三和第四個參數就是表示注冊的是哪個快捷鍵.
普通鍵在gdk/gdkkeysyms.h中有定義,你可以自已查找.
而控制鍵是一個掩碼結構.說明如下:
enum GdkModifierType
typedef enum
{
GDK_SHIFT_MASK = 1 << 0,
GDK_LOCK_MASK = 1 << 1,
GDK_CONTROL_MASK = 1 << 2,
GDK_MOD1_MASK = 1 << 3,
GDK_MOD2_MASK = 1 << 4,
GDK_MOD3_MASK = 1 << 5,
GDK_MOD4_MASK = 1 << 6,
GDK_MOD5_MASK = 1 << 7,
GDK_BUTTON1_MASK = 1 << 8,
GDK_BUTTON2_MASK = 1 << 9,
GDK_BUTTON3_MASK = 1 << 10,
GDK_BUTTON4_MASK = 1 << 11,
GDK_BUTTON5_MASK = 1 << 12,
/* The next few modifiers are used by XKB, so we skip to the end.
* Bits 15 - 25 are currently unused. Bit 29 is used internally.
*/
GDK_SUPER_MASK = 1 << 26,
GDK_HYPER_MASK = 1 << 27,
GDK_META_MASK = 1 << 28,
GDK_RELEASE_MASK = 1 << 30,
GDK_MODIFIER_MASK = 0x5c001fff
} GdkModifierType;
說明:
GDK_SHIFT_MASK
the Shift key.
GDK_LOCK_MASK
a Lock key (depending on the modifier mapping of the X server
this may either be CapsLock or ShiftLock).
GDK_CONTROL_MASK
the Control key.
GDK_MOD1_MASK
the fourth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier, but normally it is the Alt key).
GDK_MOD2_MASK
the fifth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier).
GDK_MOD3_MASK
the sixth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier).
GDK_MOD4_MASK
the seventh modifier key (it depends on the modifier mapping of the X server which key
is interpreted as this modifier).
GDK_MOD5_MASK
the eighth modifier key (it depends on the modifier mapping of the X server which key
is interpreted as this modifier).
GDK_BUTTON1_MASK
the first mouse button.
GDK_BUTTON2_MASK
the second mouse button.
GDK_BUTTON3_MASK
the third mouse button.
GDK_BUTTON4_MASK
the fourth mouse button.
GDK_BUTTON5_MASK
the fifth mouse button.
GDK_SUPER_MASK
the Super modifier. Since 2.10
GDK_HYPER_MASK
the Hyper modifier. Since 2.10
GDK_META_MASK
the Meta modifier. Since 2.10
GDK_RELEASE_MASK
not used in GDK itself. GTK+ uses it to differentiate between (keyval, modifiers) pairs from
key press and release events.
GDK_MODIFIER_MASK
a mask covering all modifier types.
可以看到,連鼠標按鍵都包含其中,但"win"鍵是不在其中的.
說明:這里的GDK_MOD1_MASK就是表示"alt"鍵的.
但現在有一個問題.就是,如果我想設快捷鍵為"F1"呢?即沒有控制鍵.
很抱歉,GTK本身不提供這個功能.因為它們缺少一個成員來表示空值(已提交到官方bug網站,建議其添加一個成員).
所以只能如此做gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_F1,(GdkModifierType)0, GTK_ACCEL_VISIBLE);
用0來表示不需要控制鍵,只要按F1就會觸發事件.
同樣,如果要設定"ctrl + alt + F1"這樣的組合鍵,就如此gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_F1,(GdkModifierType)(GDK_SHIFT_MASK | GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE);
第五個參數表示的是在GtkAccelLabel控件中顯示按鍵名.即在右側顯示"ctrl+F1"字樣.
但這里我們測試的是按鈕.按鈕上沒有GtkAccelLabel.如果是菜單的話,由于GtkMenuItem默認會使用GtkAccelLabel控件來顯示字符,所以菜單上會提示此字樣.
如果你要在變通按鈕上使用快捷鍵,就只能手動添加上去了.
總體來說GTK的快捷鍵設置比較麻煩.但相對Windows開發,比較獨立.
2008.12.03
轉載于:https://www.cnblogs.com/wangtianxj/archive/2009/06/29/1513306.html
總結
- 上一篇: 帮助别人是一种快乐!
- 下一篇: 巧合?模仿还是抄袭?水木年华的《秋日恋歌