實現明密文切換代碼如下,註釋清晰,編譯方式:
gcc test.c `pkg-config --cflags --libs gtk+-3.0`
唯一需要注意的地方可能大家沒有16x16的png圖標,想辦法自己p兩張吧~~
#include <gtk/gtk.h>
static void cb_entry_icon_press(GtkWidget *entry)
{
GError *error = NULL;
GdkPixbuf *pixbuf = NULL;
if (gtk_entry_get_visibility(GTK_ENTRY(entry))) {
gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
gtk_entry_set_icon_tooltip_markup(GTK_ENTRY(entry),
GTK_ENTRY_ICON_SECONDARY, "顯示密碼");
pixbuf = gdk_pixbuf_new_from_file("closeeye.png", &error);
if (!pixbuf) {
g_error_free(error);
}
gtk_entry_set_icon_from_pixbuf(GTK_ENTRY(entry), GTK_ENTRY_ICON_SECONDARY, pixbuf);
} else {
gtk_entry_set_visibility(GTK_ENTRY(entry), TRUE);
gtk_entry_set_icon_tooltip_markup(GTK_ENTRY(entry),
GTK_ENTRY_ICON_SECONDARY, "隱藏密碼");
pixbuf = gdk_pixbuf_new_from_file("openeye.png", &error);
if (!pixbuf) {
g_error_free(error);
}
gtk_entry_set_icon_from_pixbuf(GTK_ENTRY(entry), GTK_ENTRY_ICON_SECONDARY, pixbuf);
}
}
int main(int argc,char *argv[])
{
//gtk環境初始化
gtk_init(&argc, &argv);
//創建一個窗口
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//設置窗口標題
gtk_window_set_title(GTK_WINDOW(window), "window");
//窗口在顯示器中居中顯示
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
//設置整個屏幕周圍空出來的的空間
gtk_container_set_border_width(GTK_CONTAINER(window), 15);
//創建輸入框
GtkWidget *entry_passwd = gtk_entry_new();
//設置輸入框最大輸入字符數量
gtk_entry_set_max_length(GTK_ENTRY(entry_passwd), 32);
//輸入框字符不可見
gtk_entry_set_visibility((GtkEntry *)entry_passwd, FALSE);
GError *error = NULL;
//讀取本地icon圖標(16x16的png圖片)
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file("closeeye.png", &error);
if (!pixbuf) {
g_error_free(error);
}
//將圖標設置進輸入框
gtk_entry_set_icon_from_pixbuf(GTK_ENTRY(entry_passwd),
GTK_ENTRY_ICON_SECONDARY, pixbuf);
//圖標的鼠標懸浮提示
gtk_entry_set_icon_tooltip_markup(GTK_ENTRY(entry_passwd),
GTK_ENTRY_ICON_SECONDARY, "顯示密碼");
//將輸入框放入窗口
gtk_container_add(GTK_CONTAINER(window), entry_passwd);
//顯示所有窗口
gtk_widget_show_all(window);
//"destroy"與gtk_main_quit鏈接
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
//點擊圖標切換明密文顯示情況
g_signal_connect(G_OBJECT(entry_passwd), "icon-press", G_CALLBACK(cb_entry_icon_press), NULL);
//9.主事件循環
gtk_main();
return 0;
}
效果如下:
附上下面兩張小圖哈哈~