日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

热键与快捷键

發(fā)布時(shí)間:2023/12/4 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 热键与快捷键 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
熱鍵及快捷鍵(GtkAccelGroup)


熱鍵:一般是字母帶下劃線.在當(dāng)前控件內(nèi)(如打開的菜單)可以用alt+字母來(lái)代替點(diǎn)擊的功能
快捷鍵:一般指,在本窗口任何位置內(nèi),按某組合鍵,都可以代替點(diǎn)擊的功能.
:) 如果你的理解與我的有沖突,請(qǐng)以我的理解為準(zhǔn)!
試舉例證:
#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;
}


熱鍵
可以看出.熱鍵的使用很簡(jiǎn)單.
僅僅是用gtk_button_new_with_mnemonic代替了原來(lái)的創(chuàng)建函數(shù)gtk_button_new_with_label.
而且在想設(shè)為熱鍵的字母前加一個(gè)下劃線"_",這與其它語(yǔ)言也是有很大差異的.其它所有我了解的語(yǔ)言中,都是用"&"+字母來(lái)設(shè)定熱鍵的,而這里是"_"+字母.
當(dāng)然,你有可能會(huì)在字符中使用"_"這個(gè)字符本身.這時(shí),你可以用"__"連續(xù)的兩個(gè)下劃線來(lái)實(shí)現(xiàn).在顯示時(shí),就會(huì)顯示出字符"_".
編譯后可以按"alt"+c,就會(huì)執(zhí)行btnSet所連接的txt_setCaption()函數(shù).

快捷鍵
GTK中的快捷鍵是通過GtkAccelGroup控件來(lái)實(shí)現(xiàn)的.
gtk_accel_group_new();創(chuàng)建函數(shù)沒有任何參數(shù).
gtk_window_add_accel_group(GTK_WINDOW(frmMain), agMain);這里是將GtkAccelGroup添加到窗體frmMain中.即表示只要是在窗體frmMain中按鍵,都會(huì)判斷觸發(fā)agMain設(shè)定的快捷鍵.
gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_g,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
這里是真正的注冊(cè)一個(gè)快捷鍵.第一個(gè)參數(shù)表示快捷鍵觸發(fā)后要執(zhí)行的對(duì)象.
第二個(gè)參數(shù)表示按鍵后,要觸發(fā)這個(gè)對(duì)象的某個(gè)信號(hào),這里是點(diǎn)擊.
第三個(gè)參數(shù)表示是哪一個(gè)鍵.它定義在gdk/gdkkeysyms.h文件中,需要手動(dòng)包含此文件.
第四個(gè)表示控件鍵.這里是ctrl鍵.
第五個(gè)參數(shù)是快捷鍵標(biāo)志.官方文檔沒有太多說明.這個(gè)參數(shù)表示的是會(huì)在GtkAccelLabel控件中顯示按鍵名.

第一和第二個(gè)參數(shù)其實(shí)就是表示,當(dāng)按鍵被按下后要觸發(fā)哪個(gè)控件的哪個(gè)信號(hào).
第三和第四個(gè)參數(shù)就是表示注冊(cè)的是哪個(gè)快捷鍵.
普通鍵在gdk/gdkkeysyms.h中有定義,你可以自已查找.
而控制鍵是一個(gè)掩碼結(jié)構(gòu).說明如下:
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.

可以看到,連鼠標(biāo)按鍵都包含其中,但"win"鍵是不在其中的.
說明:這里的GDK_MOD1_MASK就是表示"alt"鍵的.

但現(xiàn)在有一個(gè)問題.就是,如果我想設(shè)快捷鍵為"F1"呢?即沒有控制鍵.
很抱歉,GTK本身不提供這個(gè)功能.因?yàn)樗鼈內(nèi)鄙僖粋€(gè)成員來(lái)表示空值(已提交到官方bug網(wǎng)站,建議其添加一個(gè)成員).
所以只能如此做gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_F1,(GdkModifierType)0, GTK_ACCEL_VISIBLE);
用0來(lái)表示不需要控制鍵,只要按F1就會(huì)觸發(fā)事件.
同樣,如果要設(shè)定"ctrl + alt + F1"這樣的組合鍵,就如此gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_F1,(GdkModifierType)(GDK_SHIFT_MASK | GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE);
第五個(gè)參數(shù)表示的是在GtkAccelLabel控件中顯示按鍵名.即在右側(cè)顯示"ctrl+F1"字樣.
但這里我們測(cè)試的是按鈕.按鈕上沒有GtkAccelLabel.如果是菜單的話,由于GtkMenuItem默認(rèn)會(huì)使用GtkAccelLabel控件來(lái)顯示字符,所以菜單上會(huì)提示此字樣.
如果你要在變通按鈕上使用快捷鍵,就只能手動(dòng)添加上去了.

總體來(lái)說GTK的快捷鍵設(shè)置比較麻煩.但相對(duì)Windows開發(fā),比較獨(dú)立.
2008.12.03

轉(zhuǎn)載于:https://www.cnblogs.com/wangtianxj/archive/2009/06/29/1513306.html

總結(jié)

以上是生活随笔為你收集整理的热键与快捷键的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。