热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c语言gtk图形界面编程,「分享」C语言如何编写图形界面

该楼层疑似违规已被系统折叠隐藏此楼查看此楼贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面。大家也都有回答,需要其他的库。MFC&

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

贴吧内经常有人问C语言是不是只能用于字符终端界面开发,不能用于图形界面。大家也都有回答,需要其他的库。MFC,GTK,QT。

本人近期刚用GTK库加上纯C写成了第一个LINUX实用程序。现在与大家分享:

acbec432f0fe38f3ba8eaec10217c494.png

主界面程序gmaxtrix.c

#include

#include"client_socket.h"

#define MAX_BUFFER 1024

static GtkWidget *IP_entry;

static GtkWidget *port_entry;

static gint sockfd;

static gint tag;

gchar buffer[MAX_BUFFER];

void g_show_alarm_dialog(const gchar *message){

GtkWidget *dialog;

dialog = gtk_message_dialog_new(NULL,

GTK_DIALOG_DESTROY_WITH_PARENT,

GTK_MESSAGE_WARNING,

GTK_BUTTONS_OK,

"%s",message);

gtk_window_set_title(GTK_WINDOW(dialog),"警告");

gtk_dialog_run(GTK_DIALOG(dialog));

gtk_widget_destroy(dialog);

}

void g_client_send(GtkWidget *widget, gpointer textbuffer){

if (sockfd > 0){

client_send(sockfd, gtk_entry_buffer_get_text(GTK_ENTRY_BUFFER(textbuffer)), gtk_entry_buffer_get_bytes(GTK_ENTRY_BUFFER(textbuffer)));

}else{

g_show_alarm_dialog("未连接到中控主机");

}

}

void g_client_recv(gpointer data, gint source, GdkInputCondition condition){

gint count = client_recv(source, buffer, MAX_BUFFER);

buffer[count] = 0;

GtkTextIter iter;

gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(data),&iter);

gtk_text_buffer_insert(GTK_TEXT_BUFFER(data),&iter,buffer,-1);

}

void g_client_connect(GtkWidget *widget, gpointer date){

if (sockfd > 0){

client_close(sockfd);

gtk_button_set_label(GTK_BUTTON(widget),"连接");

gdk_input_remove(tag);

}else{

sockfd = client_connect(gtk_entry_get_text(GTK_ENTRY(IP_entry)),atoi(gtk_entry_get_text(GTK_ENTRY(port_entry))));

gtk_button_set_label(GTK_BUTTON(widget),"断开");

tag = gdk_input_add(sockfd, GDK_INPUT_READ, g_client_recv,date);

}

}

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

gtk_init(&argc, &argv);

GtkWidget *window;

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit),NULL);

gtk_widget_set_size_request(window, 260, 250);

gtk_container_set_border_width(GTK_CONTAINER(window),5);

GtkWidget *vbox;

vbox = gtk_vbox_new(FALSE,1);

gtk_container_add(GTK_CONTAINER(window),vbox);

GtkWidget *hbox1;

hbox1 = gtk_hbox_new(FALSE,1);

gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE ,0);

GtkWidget *table = gtk_table_new(2,2,FALSE);

gtk_box_pack_start(GTK_BOX(hbox1), table, TRUE , TRUE , 0);

GtkWidget *IP_label = gtk_label_new("地址:");

gtk_table_attach_defaults(GTK_TABLE(table),IP_label,0,1,0,1);

IP_entry = gtk_entry_new();

gtk_table_attach_defaults(GTK_TABLE(table),IP_entry,1,2,0,1);

GtkWidget *port_label = gtk_label_new("端口:");

gtk_table_attach_defaults(GTK_TABLE(table),port_label,0,1,1,2);

port_entry = gtk_entry_new();

gtk_table_attach_defaults(GTK_TABLE(table),port_entry,1,2,1,2);

GtkWidget *connect_button = gtk_button_new_with_label("连接");

gtk_box_pack_start(GTK_BOX(hbox1), connect_button, TRUE, TRUE ,0);

GtkWidget *hseparator = gtk_hseparator_new();

gtk_box_pack_start(GTK_BOX(vbox), hseparator, FALSE, FALSE, 0);

GtkWidget *hbox2;

hbox2 = gtk_hbox_new(FALSE,1);

gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE ,0);

GtkWidget *send_entry = gtk_entry_new();

gtk_box_pack_start(GTK_BOX(hbox2), send_entry, TRUE, TRUE ,0);

GtkWidget *send_button = gtk_button_new_with_label("发送");

gtk_box_pack_start(GTK_BOX(hbox2), send_button, TRUE, TRUE ,0);

g_signal_connect(send_button, "clicked", G_CALLBACK(g_client_send), gtk_entry_get_buffer(GTK_ENTRY(send_entry)));

GtkWidget *recv_text = gtk_text_view_new();

gtk_box_pack_start(GTK_BOX(vbox), recv_text, TRUE, TRUE, 0);

g_signal_connect(connect_button, "clicked", G_CALLBACK(g_client_connect), gtk_text_view_get_buffer(GTK_TEXT_VIEW(recv_text)));

gtk_widget_show_all(window);

gtk_main();

return 0;

}

后台网络通迅模型接口声明client_socket.h

#ifndef CLIENT_SOCKET_H

#define CLIENT_SOCKET_H

int client_connect(const char *IP, const int port);

void client_close(int sockfd);

void client_send(int sockfd,const unsigned char *buffer, const size_t count);

size_t client_recv(int sockfd,unsigned char *buffer,size_t count);

#endif

后台网络通迅模型实现client_socket.c(采用POSIX接口,WIN下需改为win32API接口)

#include

#include

#include

#include

#include

#include

#include "client_socket.h"

int client_connect(const char *IP, const int port){

static struct sockaddr_in servaddr;

int sockfd = socket(AF_INET,SOCK_STREAM,0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

inet_pton(AF_INET, IP, &servaddr.sin_addr);

servaddr.sin_port = htons(port);

connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

return sockfd;

}

void client_close(int sockfd){

close(sockfd);

}

void client_send(int sockfd,const unsigned char *buffer, const size_t count){

send(sockfd,buffer,count,0);

}

size_t client_recv(int sockfd,unsigned char *buffer,size_t count){

return recv(sockfd,buffer,count,0);

}

编译脚本makefile

gmaxtrix: gmaxtrix.o client_socket.o

gcc gmaxtrix.o client_socket.o -o gmaxtrix `pkg-config --cflags --libs gtk+-2.0`

gmaxtrix.o: gmaxtrix.c client_socket.h

gcc -c gmaxtrix.c `pkg-config --cflags --libs gtk+-2.0`

client_socket.o: client_socket.h client_socket.c

gcc -c client_socket.c `pkg-config --cflags --libs gtk+-2.0`

clean:

@echo "cleanning project"

-rm gmaxtrix *.o

@echo "clean completed"



推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
author-avatar
94Wong_386
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有