c语言实现端口扫描程序_用GTK+来创建一个带界面的C语言程序6——登录界面的实现...

前面学习了水平、垂直和网格布局容器,在这一节中将学习一种新的布局方式来构建我们的窗口界面——固定布局控件(GtkFixed)。并介绍如何使用图像控件、标签控件和行编辑控件,在最后将利用这几种控件结合之前的知识来编写一个简单的登录界面。

1. 自由布局控件

GTK+提供了一种固定布局控件(GtkFixed),它允许使用者按照几何坐标的方式向其中添加排列控件,并可以移动控件的位置。

固定布局的创建:

GtkWidget *gtk_fixed_new(void);

返回值:固定布局容器指针

固定布局容器添加控件:

void gtk_fixed_put( GtkFixed *fixed,GtkWidget *widget,gint x,gint y );

fixed:容纳控件的容器

widget:要添加的控件

x, y:控件摆放位置的起点坐标

b1304e9d64a3d174dd7cdde649da5513.png

fixed的坐标

设置控件的大小( 宽和高 ):

void gtk_widget_set_size_request(GtkWidget *widget,gint width,gint height );

widget:需要设置的控件

width:宽度

height:高度

移动固定布局里控件的位置:

void gtk_fixed_move(GtkFixed *fixed,GtkWidget *widget,gint x,gint y);

fixed:固定布局容器

widget:需要移动的控件

x, y: 移动的位置

1. 图片控件

只有文字和按钮的界面有些单调,可以使用图片控件来丰富我们的窗口界面,使它看起来更加美观。图像控件在GTK+编程中会经常用到,图像控件最简单的创建方式之一就是直接从图像文件创建,使用函数gtk_image_new_from_file,它只有一个参数就是要调用的图像文件名,返回的结果就是图像控件的指针。

image = gtk_image_new_from_file("./left.jpg");

GTK+自身带有一个叫GDKPIXBUF的程序库,GTK+使用它来支持多种图像文件格式,如png、jpeg、bmp、pix等。

2. 标签控件

标签控件多数情况下在GTK+编程中起到提示作用,用gtk_label_new函数就可以直接创建一个标签文本,它的参数就是标签要显示的文本字符串。事实上我们之前创建的带标签的按钮中,就包含一个标签控件。

3. 行编辑控件

行编辑,只允许输入一行内容的控件,如密码输入框。

a7826ab401853e70f80be454f8f36e45.png

行编辑控件

关于行编辑的相关函数如下:

行编辑的创建:

GtkWidget *gtk_entry_new(void)

返回值:行编辑指针

设置行编辑内容的最大长度:

void gtk_entry_set_max_length(GtkEntry *entry, gint max);

entry:行编辑

max:长度的最大值,这里填0代表长度不作限制

设置行编辑的文本内容:

void gtk_entry_set_text(GtkEntry *entry,const gchar *text);

entry:行编辑

text:文本内容

获取行编辑的内容:

const gchar *gtk_entry_get_text(GtkEntry *entry);

entry:行编辑

返回值:获取到的行编辑内容

设置编辑控件是否允许编辑:

void gtk_editable_set_editable(GtkEditable *editable,gboolean is_editable);

editable:需要操作的控件

is_editable:TRUE代表能允许编辑,默认属性,FALSE不允许编辑

设置行编辑的内容是否可视(不能可视相当于密码模式,看不到文本的内容):

void gtk_entry_set_visibility(GtkEntry *entry,gboolean visible);

entry:行编辑

visible:TRUE可视,FALSE不可视

常用信号:"activate"

当用户在文本输入控件内部按回车键时引发activate信号;

有了上面介绍的控件,就可以编写一个简单的登录界面了。它的功能有当我们点击登录按钮时,会在终端打印出用户名和密码,并提示登录成功!如果密码或用户名输入错误,则在终端打印密码或用户名错误,登录失败!。在此我们假设我们的用户名是:suoyongxv,密码是:123456。

代码如下:

/* 登录界面的实现login.c*/

#include

//登录界面大小

const int LOGIN_WIDTH = 300;

const int LOGIN_HEIGHT = 160;

//假设的用户名和密码

const gchar * name1 = "suoyongxv";

const gchar * passwd1 = "123456";

//点击登录按钮后处理事件

void login_button_click(GtkWidget*button, gpointer userdata);

gboolean quxiao_button_click(GtkWidget*button, gpointer userdata);

//文本输入框,用户名及密码

GtkWidget * name;

GtkWidget * passwd;

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

{

//登录界面窗口

GtkWidget * login_window;

//取消按钮

GtkWidget * login_button;

GtkWidget * quxiao_button;

GtkWidget * label;

GtkWidget * image;

GtkWidget * fixed;

gtk_init(&argc, &argv);

login_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

g_signal_connect(G_OBJECT(login_window),"destroy", G_CALLBACK(gtk_main_quit), NULL);

gtk_window_set_title(GTK_WINDOW(login_window),"登录");

gtk_window_set_default_size(GTK_WINDOW(login_window), LOGIN_WIDTH, LOGIN_HEIGHT);

gtk_window_set_position(GTK_WINDOW(login_window), GTK_WIN_POS_CENTER);

//创建一个固定布局容器fixed

fixed = gtk_fixed_new();

//将fixed添加到login_window中

gtk_container_add(GTK_CONTAINER(login_window), fixed);

//创建一个图片控件

image = gtk_image_new_from_file("./left.jpg");

//将图片控件添加到固定容器fixed中,位置:x:10,y:50

gtk_fixed_put(GTK_FIXED(fixed), image, 10, 50);

label = gtk_label_new("用户名:");

name = gtk_entry_new();

gtk_fixed_put(GTK_FIXED(fixed), label, 70, 50);

gtk_fixed_put(GTK_FIXED(fixed), name, 130, 50);

label = gtk_label_new("密 码:");

passwd = gtk_entry_new();

//设置行编辑的内容是否可见(不能可视相当于密码模式,看不到文本的内容)

gtk_entry_set_visibility(GTK_ENTRY(passwd), FALSE);

gtk_fixed_put(GTK_FIXED(fixed), label, 70, 75);

gtk_fixed_put(GTK_FIXED(fixed), passwd, 130, 75);

login_button = gtk_button_new_with_label("登 录");

g_signal_connect(login_button, "clicked", G_CALLBACK(login_button_click), NULL);

gtk_fixed_put(GTK_FIXED(fixed), login_button, 50, 120);

quxiao_button = gtk_button_new_with_label("取 消");

g_signal_connect(quxiao_button, "clicked", G_CALLBACK(quxiao_button_click), NULL);

gtk_fixed_put(GTK_FIXED(fixed), quxiao_button, 170, 120);

gtk_widget_show_all(login_window);

gtk_main();

}

void login_button_click(GtkWidget*button, gpointer userdata)

{

const gchar * userName = gtk_entry_get_text(GTK_ENTRY(name));

const gchar * userPassed = gtk_entry_get_text(GTK_ENTRY(passwd));

g_print("用户名是:%s", userName);

g_print("用户密码是:%s", userPassed);

if(strcmp(userName,name1)==0 && strcmp(passwd1, userPassed)==0)

{

g_print("登录成功!");

}

else

{

g_print("登录失败,用户名或密码失败!");

}

g_print("");

}

gboolean quxiao_button_click(GtkWidget*button, gpointer userdata)

{

gtk_main_quit();

return FALSE;

}

运行结果:

1ae3b50376300742d3052456ade75fbc.png

运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值