c语言怎么让图形界面单独显示,「分享」C语言如何编写图形界面

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

贴吧内经常有人问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"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 ASP.NET Core 中 自定义中间件

ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且高度模块化的web框架,同时扩展性也是非常强,你可以在 request -> response 请求管道中安插各种中间件来根据自己的场景定制化,比如说:监…

ASP.NET Core Authentication and Authorization

最近把一个Asp .net core 2.0的项目迁移到Asp .net core 3.1,项目启动的时候直接报错:InvalidOperationException: Endpoint CoreAuthorization.Controllers.HomeController.Index (CoreAuthorization) contains authorization metadata, but a middleware was not …

android dialog 自定义布局,如何设置AlertDialog的自定义布局?

调用我的对话框:alertDialog showInfoDialog(message "$wrongPasscodeMessage\n$retryMessage")方法如下:fun FragmentActivity.showInfoDialog(message: String?): AlertDialog? {return try {val customLayout layoutInflater.inflate(R.layout.custom_layout…

android 打开谷歌导航,国内开启google位置记录功能/android版google maps 7+上,恢复位置记录功能在国内使用(需root)...

android版google 地图在 7以后的版本上,位置记录功能在国内不能用了,提示本功能不能在中国使用。至少对本人,“位置记录”功能是非常有用的功能,尤其是骑车出行时记录自己的路线。目前还没找到替代产品。之前一段时间内恢复回旧版…

程序员过关斩将--少年派登录安全的奇幻遐想

“据说,这篇也是快餐,完全符合年轻人口味说到登录,无人不知无人不晓。每一个有用户体系的相关系统都会有登录的入口,登录是为了确认操作人的正确性。说到登录安全,其实是一个很伟大的命题,不过常用的手段也…

C# 9 新特性 —— 增强的 foreach

C# 9 新特性 —— 增强的 foreachIntro在 C# 9 中增强了 foreach 的使用,使得一切对象都有 foreach 的可能我们来看一段代码,这里我们试图遍历一个 int 类型的值思考一下,我们可以怎么做使得上面的代码编译通过呢?迭代器模式迭代器…

android系统休眠发广播,Android - BroadcastReceiver

BroadcastReceiverBroadcastReceiver,广播接收者,用来接收系统和应用的广播,并做出相应的处理,如电量过低时提示用户充电等;BroadcastReceiver 是 Android 的四大组件之一,分为 普通广播、有序广播、粘性广…

开源·共享·创新|2020年中国.NET开发者大会圆满收官!

“疫情无限续费”的2020年,对于14亿中国人而言,是必须习惯口罩长在来脸上的一年;是各种线下聚会,被迫数次延期、滞后、云上举办的一年;……而对于潜心修行,静蓄能量的中国.NET开发者而言,2020绝…

android+百度lbs云,百度——LBS.云 v2.0——云存储扩展字段——Android

今天要解决两个问题:1云存储扩展字段2上传的数据是乱码3android版本上传数据到云端使用了一段时间LBS云功能之后,随着对系统的熟悉,默认提供的字段,肯定无法满足需要。比如增加注释,价格,档次等字段的时候。…

年终将至,回顾我们一起走过的 2020

又到了年终末尾匆匆忙忙的 2020 似乎按下了倍速键一晃眼我们就从夏天走到了冬天在这不平凡的一年中我们同途共进也笑着成长让我们跟随着六大年度词条重温这一年我们共同经历的值得骄傲的瞬间吧!点击文内高亮部分,阅读文章了解更多人才“倍”出星桥计划出…

灵魂拷问:你和大佬,技术差距有多大?

今天咱们聊点技术以外的内容。前几天,有程序员在某个坛子上发帖吐槽,新来的应届生张嘴就是分布式,一堆框架,可代码根本不会写。马上有人跟贴说自己也遇到过这种情况,说之前自己遇到过一个应届生,开口闭口动…

达梦数据查询编码_查询数据库的编码方式

在Mysql中(1)查看Mysql数据库编码show variables like character_set_database 或者 show create database 数据库名称(2)查看Mysql中某张表的编码show create table 表名show create database 数据库名称、show create table 表名 ,还能够显示建库和建表语句。(3)…

玩转git-flow工作流-分支解析

概述搞开发的相信大部分人git天天都在用,那么一般我们在实际工程当中,遵循一个合理、清晰的Git使用流程,是非常重要的。否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。那么是如何来规范整个…

android中的帧动画,[Android开发] Android中的帧动画

MainActivity文件:public class MainActivity extends Activity implements OnClickListener{AnimationDrawable anim_draw;SuppressLint("NewApi")Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);set…

ksu7对讲机调频软件_数字对讲机的群呼功能原理是什么?你了解多少?

大家都明白数字对讲机能够达到组呼、群呼、选呼的用途,但对数字对讲机的群呼功能原理可能操作方并不是太熟悉,下面我们就和大家来谈谈有关数字对讲机的群呼功能原理:无线对讲机群呼是为了更好地达到1个数字对讲机能够同一时间跟多个数字对讲机…

引入Jaeger——使用

上一篇定义了两种使用Jaeger的方式:中间件和action过滤器,下面这个例子定义了两个服务 WebAPI01,请求WebAPI02,采用的是中间件的请求方式。引入JaegerSharp包(或发布到自己的Nuget库里引用)WebAPI01的Start…

抖音ai智能机器人挂机_电销秘诀 电销企业难以拒绝的AI智能电销机器人

眼下是快节奏的时代,超智能化的电销机器人已然成为了电销企业实现高速发展的首选方式。为何现代电销企业都会摒弃纯人工电销方式,采取机器人与人工协作方式呢?这就不得不说是因为AI外呼机器人的卓越性能和优势。一,提升工作效率AI…

dataset的去重计数 g2_ExcelExcel去重、计数一步到位,这个方法简单到哭

私信回复关键词【插件】,获取Excel高手都在用的“插件合集插件使用小技巧”!最近在哼哧哼哧搬家,搬家第一天,面对空荡荡的房子,我发现了一个严峻的问题——日用品还没买。我打开了一个月前写下的日用品清单&#xff1a…

【源码解读】Vue与ASP.NET Core WebAPI的集成

在前面博文【Vue】Vue 与 ASP.NET Core WebAPI 的集成中,介绍了集成原理:在中间件管道中注册SPA终端中间件,整个注册过程中,终端中间件会调用node,执行npm start命令启动vue开发服务器,向中间件管道添加路由…

ios采用什么技术_app软件公司开发宠物别APP采用什么技术?

app软件公司开发宠物别APP采用什么技术?随着经济的发展,人们生活水平的提高,养宠的家庭越来越多,宠物也逐渐成为主人家庭成员的重要组成部分,宠物识别APP在市场上也是很热门的手机软件,那么它是根据什么原理…