实现明密文切换代码如下,注释清晰,编译方式:
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;
}
效果如下:
附上下面两张小图哈哈~