博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ucgui界面设计演示样例2
阅读量:4958 次
发布时间:2019-06-12

本文共 21393 字,大约阅读时间需要 71 分钟。


ucgui界面设计演示样例2

本文博客链接:,作者:jdh,转载请注明.

环境:

主机:WIN8

开发环境:MDK4.72

ucgui版本号:3.90

mcu: stm32f103VE

说明:

本程序基于ucgui对话框机制设计了一个界面,并用6个实体按键对界面进行控制,并添加了进度条显示

效果图:

 

源代码:

gui_match.h

/**********************************************************************						对码绑定界面模块头文件*						(c)copyright 2014,jdh*						  All Right Reserved*新建时间:2014/10/24 by jdh**********************************************************************/#ifndef _GUI_MATCH_H_#define _GUI_MATCH_H_/**********************************************************************							头文件**********************************************************************/#include "world.h"/**********************************************************************							宏定义**********************************************************************//**********************************************************************							工作间隔*单位:ms**********************************************************************/#define INTERVAL_GUI_MATCH			100  /**********************************************************************							进度条显示时间*单位:ms**********************************************************************/#define TIME_PROGBAR_GUI_MATCH		3000 /**********************************************************************							函数**********************************************************************//**********************************************************************							模块加载**********************************************************************/void gui_match_load(void);/**********************************************************************							模块执行**********************************************************************/void gui_match_run(void);/**********************************************************************							设置显示状态*參数:enable:0:关闭显示,1:打开显示**********************************************************************/void gui_match_show(uint8_t enable);/**********************************************************************							得到当前的显示状态*返回:0:关闭显示,1:打开显示**********************************************************************/uint8_t gui_match_get_show(void);/**********************************************************************							得到绑定的脚镣id*返回:0:未绑定,其它:脚镣id**********************************************************************/uint16_t gui_match_get_fetter_id_bind(void);#endif

gui_match.c

/**********************************************************************						对码绑定界面模块主文件*						(c)copyright 2014,jdh*						  All Right Reserved*新建时间:2014/10/24 by jdh*改动时间:2014/10/29 by jdh**********************************************************************//**********************************************************************							头文件**********************************************************************/#include "gui_match.h"#include "cc1100.h"#include "gui_main.h"/**********************************************************************							宏定义**********************************************************************/#define ID_FRAMEWIN            		(GUI_ID_USER + 0x10)#define ID_BUTTON_OK            	(GUI_ID_USER + 0x11)#define ID_BUTTON_CANCEL            (GUI_ID_USER + 0x12)#define ID_BUTTON_UP            	(GUI_ID_USER + 0x13)#define ID_BUTTON_DOWN            	(GUI_ID_USER + 0x14)#define ID_BUTTON_LEFT            	(GUI_ID_USER + 0x15)#define ID_BUTTON_RIGHT            	(GUI_ID_USER + 0x16)#define ID_TEXT_MATCH           	(GUI_ID_USER + 0x17)#define ID_TEXT_ID           		(GUI_ID_USER + 0x18)#define ID_TEXT_PROGBAR           	(GUI_ID_USER + 0x19)#define ID_LISTBOX           		(GUI_ID_USER + 0x1A)#define ID_PROGBAR           		(GUI_ID_USER + 0x1B)/**********************************************************************							列表框存储的数据数量**********************************************************************/#define LIST_LEN					20/**********************************************************************							数据结构**********************************************************************//**********************************************************************							按键状态**********************************************************************/struct _Key_State{	uint8_t ok;	uint8_t cancel;	uint8_t up;	uint8_t down;	uint8_t left;	uint8_t right;};/**********************************************************************							列表框缓存**********************************************************************/struct _List{	uint8_t len;	uint16_t buf[LIST_LEN];};/**********************************************************************							静态变量**********************************************************************//**********************************************************************							界面句柄**********************************************************************/static WM_HWIN Handle_Gui;/**********************************************************************							资源表**********************************************************************/static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {  { FRAMEWIN_CreateIndirect, 	"Frame3", 	ID_FRAMEWIN, 			0, 0, 240, 320, 0, 0x0},  { BUTTON_CreateIndirect, 		"OK", 		ID_BUTTON_OK, 		5, 255, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect, 		"Button", 	ID_BUTTON_DOWN, 	95, 280, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect, 		"UP", 		ID_BUTTON_UP, 		95, 255, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect, 		"CANCEL", 	ID_BUTTON_CANCEL, 	185, 255, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect, 		"RIGHT", 	ID_BUTTON_RIGHT, 	140, 270, 40, 20, 0, 0x0},  { BUTTON_CreateIndirect, 		"LEFT", 	ID_BUTTON_LEFT, 	50, 270, 40, 20, 0, 0x0},  { TEXT_CreateIndirect, 		"Match", 	ID_TEXT_MATCH, 		140, 15, 80, 20, 0, 0x0},  { TEXT_CreateIndirect, 		"ID", 		ID_TEXT_ID, 		140, 40, 80, 20, 0, 0x0},  { TEXT_CreateIndirect, 		"", 		ID_TEXT_PROGBAR, 	140, 65, 80, 20, 0, 0x0},  { LISTBOX_CreateIndirect, 	"Listbox", 	ID_LISTBOX, 		5, 10, 120, 220, 0, 0x0},  { PROGBAR_CreateIndirect, 	"Progbar", 	ID_PROGBAR, 		140, 85, 80, 20, 0, 0x0},  // USER START (Optionally insert additional widgets)  // USER END};/**********************************************************************							上次工作时间**********************************************************************/static struct _Time Time_Last = {    .s = 0,    .ms = 0,    .us = 0};/**********************************************************************							进度条開始的时间**********************************************************************/static struct _Time Time_Progbar = {    .s = 0,    .ms = 0,    .us = 0};/**********************************************************************							接收CC1100的时间**********************************************************************/static struct _Time Time_Recv_CC1100 = {    .s = 0,    .ms = 0,    .us = 0};/**********************************************************************							按键状态**********************************************************************/static struct _Key_State Key_State = {	.ok = 0,	.cancel = 0,	.up = 0,	.down = 0,	.left = 0,	.right = 0};/**********************************************************************							当前显示状态*0:未显示,1显示**********************************************************************/static uint8_t State_Show = 0;/**********************************************************************							进度条动画開始标志*0:终止,1:扫描,2:绑定**********************************************************************/static uint8_t Flag_Progbar = 0;/**********************************************************************							列表框存储器**********************************************************************/static struct _List List = {	.len = 0};/**********************************************************************							已绑定脚镣ID*0:未绑定,其它:ID**********************************************************************/static uint16_t Fetter_Id_Bind = 0;/**********************************************************************							静态函数**********************************************************************//**********************************************************************							回调函数**********************************************************************/static void _cbDialog(WM_MESSAGE * pMsg);/**********************************************************************							定时工作**********************************************************************/static void slot_tick(void);/**********************************************************************							按键处理**********************************************************************/static void deal_key(void);/**********************************************************************							进度条动画*參数:percent:百分比**********************************************************************/static void progbar_show(uint8_t percent);/**********************************************************************							发送125k绑定信号**********************************************************************/static void emit_125k_bind(void);/**********************************************************************							处理cc1100接收数据*參数:task:0:扫描,1:绑定**********************************************************************/static void deal_cc1100(uint8_t task);/**********************************************************************							产生激发数据*參数:cmd:功能码*     data:产生的2字节激发数据**********************************************************************/static void generate_exciter_data(uint8_t cmd,uint8_t *data);/**********************************************************************							函数**********************************************************************//**********************************************************************							模块加载**********************************************************************/void gui_match_load(void){	//新建界面	Handle_Gui = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), 									 _cbDialog, WM_HBKWIN, 0, 0);	gui_match_show(OFF);}/**********************************************************************							模块执行**********************************************************************/void gui_match_run(void){	struct _Time time;		//推断当前是否显示	if (State_Show == 0)	{		return;	}		//推断当前是否处于扫描状态	if (Flag_Progbar == 1)	{		deal_cc1100(0);	}	else	{		//推断当前是否处于绑定状态		if (Flag_Progbar == 2)		{			deal_cc1100(1);		}	}	    //得到当前时间    get_time(&time);    //推断是否到工作时间	if (sub_time(time,Time_Last) >= INTERVAL_GUI_MATCH * 1000)    {        //更新时间        Time_Last = time;                //定时工作        slot_tick();    }}/**********************************************************************							设置显示状态*參数:enable:0:关闭显示,1:打开显示**********************************************************************/void gui_match_show(uint8_t enable){	WM_HWIN hItem;		State_Show = enable;	if (enable)	{		//设置列表框为焦点		hItem = WM_GetDialogItem(Handle_Gui, ID_LISTBOX);		WM_SetFocus(hItem);				WM_ShowWindow(Handle_Gui);	}	else	{		WM_HideWindow(Handle_Gui);	}}/**********************************************************************							得到当前的显示状态*返回:0:关闭显示,1:打开显示**********************************************************************/uint8_t gui_match_get_show(void){	return State_Show;}/**********************************************************************							得到绑定的脚镣id*返回:0:未绑定,其它:脚镣id**********************************************************************/uint16_t gui_match_get_fetter_id_bind(void){	//return Fetter_Id_Bind;	return 0x100;}/**********************************************************************							定时工作**********************************************************************/static void slot_tick(void){	uint32_t ms = 0;	uint8_t percent = 0;	WM_HWIN hItem;		//按键处理	deal_key();		//推断当前进度条是否须要显示	if (Flag_Progbar)	{		//推断是否是扫描		if (Flag_Progbar == 1)		{			//推断激发信号是否结束			if (inf_exciter_get_busy() == 0)			{				//关闭激发模块电源				inf_exciter_power(OFF);			}		}				//推断是否到工作时间		ms = sub_time(Time_Last,Time_Progbar) / 1000;		if (ms < TIME_PROGBAR_GUI_MATCH)		{			percent = ms * 100 / TIME_PROGBAR_GUI_MATCH;			progbar_show(percent);		}		else		{			//结束进度条动画			Flag_Progbar = 0;			progbar_show(100);						//文本:结束			hItem = WM_GetDialogItem(Handle_Gui, ID_TEXT_PROGBAR);			TEXT_SetFont(hItem, &GUI_FontHZ12);			TEXT_SetText(hItem,"结束");		}	}}/**********************************************************************							按键处理**********************************************************************/static void deal_key(void){	WM_HWIN hItem;	uint8_t index = 0;	uint16_t id = 0;	uint8_t data[3] = {0};		//推断下键是否按下	if (inf_key_detect_hold(KEY_DOWN))	{		if (Key_State.down == 0)		{			Key_State.down = 1;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_DOWN);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);						//发送按键信号			GUI_SendKeyMsg(GUI_KEY_DOWN, 1);		}	}	else	{		if (Key_State.down == 1)		{			Key_State.down = 0;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_DOWN);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);		}	}		//推断上键是否按下	if (inf_key_detect_hold(KEY_UP))	{		if (Key_State.up == 0)		{			Key_State.up = 1;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_UP);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);						//发送按键信号			GUI_SendKeyMsg(GUI_KEY_UP, 1);		}	}	else	{		if (Key_State.up == 1)		{			Key_State.up = 0;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_UP);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);		}	}		//推断扫描键是否按下	if (inf_key_detect_hold(KEY_OK) && (Flag_Progbar == 0))	{		if (Key_State.ok == 0)		{			Key_State.ok = 1;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_OK);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);						//文本:開始扫描			hItem = WM_GetDialogItem(Handle_Gui, ID_TEXT_PROGBAR);			TEXT_SetFont(hItem, &GUI_FontHZ12);			TEXT_SetText(hItem,"開始扫描");						//開始扫描			Flag_Progbar = 1;			//保存当前时间			get_time(&Time_Progbar);						//打开125k电源			inf_exciter_power(ON);			//发送125k绑定信号			emit_125k_bind();						//清空列表框			List.len = 0;			hItem = WM_GetDialogItem(Handle_Gui, ID_LISTBOX);			listbox_clear(hItem);		}	}	else	{		if (Key_State.ok == 1)		{			Key_State.ok = 0;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_OK);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);		}	}		//推断清除键是否按下	if (inf_key_detect_hold(KEY_LEFT))	{		if (Key_State.left == 0)		{			Key_State.left = 1;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_LEFT);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);						//清空列表框			List.len = 0;			hItem = WM_GetDialogItem(Handle_Gui, ID_LISTBOX);			listbox_clear(hItem);		}	}	else	{		if (Key_State.left == 1)		{			Key_State.left = 0;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_LEFT);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);		}	}		//推断绑定键是否按下	if (inf_key_detect_hold(KEY_RIGHT) && (Flag_Progbar == 0))	{		if (Key_State.right == 0)		{			Key_State.right = 1;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_RIGHT);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);						//推断当前是否有项			if (List.len == 0)			{				return;			}			//得到脚镣id			hItem = WM_GetDialogItem(Handle_Gui, ID_LISTBOX);			index = LISTBOX_GetSel(hItem);			if (index >= List.len)			{				//清空列表框				List.len = 0;				hItem = WM_GetDialogItem(Handle_Gui, ID_LISTBOX);				listbox_clear(hItem);				return;			}			id = List.buf[index];			//数据			data[0] = 0;			data[1] = 0;			data[2] = 0;			//等待能够发送			while (cc1100_judge_tx() == 0);			//发送对码绑定帧			cc1100_tx(CMD_RF_BIND,id,data);						//開始绑定			Flag_Progbar = 2;			//保存当前时间			get_time(&Time_Progbar);						//更新绑定的脚镣ID			Fetter_Id_Bind = 0;			//更新文本			hItem = WM_GetDialogItem(Handle_Gui, ID_TEXT_MATCH);			TEXT_SetFont(hItem, &GUI_FontHZ12);			TEXT_SetText(hItem,"未绑定脚镣");						hItem = WM_GetDialogItem(Handle_Gui, ID_TEXT_ID);			TEXT_SetFont(hItem, &GUI_FontHZ12);			TEXT_SetText(hItem,"ID:0");						//更新文本			hItem = WM_GetDialogItem(Handle_Gui, ID_TEXT_PROGBAR);			TEXT_SetFont(hItem, &GUI_FontHZ12);			TEXT_SetText(hItem,"正在绑定");		}	}	else	{		if (Key_State.right == 1)		{			Key_State.right = 0;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_RIGHT);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);		}	}		//推断返回键是否按下	if (inf_key_detect_hold(KEY_CANCEL) && (Flag_Progbar == 0))	{		if (Key_State.cancel== 0)		{			Key_State.cancel = 1;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_CANCEL);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS | BUTTON_STATE_PRESSED);		}	}	else	{		if (Key_State.cancel == 1)		{			Key_State.cancel = 0;						//按键状态改变			hItem = WM_GetDialogItem(Handle_Gui, ID_BUTTON_CANCEL);			BUTTON_SetState(hItem,BUTTON_STATE_HASFOCUS);						//返回主界面			gui_match_show(OFF);			gui_main_show(ON);		}	}}/**********************************************************************							进度条动画*參数:percent:百分比**********************************************************************/static void progbar_show(uint8_t percent){	WM_HWIN hItem;		//进度条显示	hItem = WM_GetDialogItem(Handle_Gui, ID_PROGBAR);	PROGBAR_SetValue(hItem,percent);}/**********************************************************************							发送125k绑定信号**********************************************************************/static void emit_125k_bind(void) {	uint8_t data[2] = {0};		//生成激活数据	generate_exciter_data(CMD_125K_BIND,data);	//生成新的激发序列	inf_exciter_generate_frame(data,2);	//等待空暇	while (inf_exciter_get_busy());	//发送	inf_exciter_start();}/**********************************************************************							处理cc1100接收数据*參数:task:0:扫描,1:绑定**********************************************************************/static void deal_cc1100(uint8_t task){	struct _Rx_Buf_CC1100 buf;	WM_HWIN hItem;	char str[20] = {0};		buf = cc1100_get_rx_buf();	//推断是否是最新帧	if (compare_time(buf.time,Time_Recv_CC1100) != 2)	{		return;	}		//保存时间	Time_Recv_CC1100 = buf.time;		if (task == 0)	{		//推断功能码是否是上传脚镣ID帧		if (buf.cmd != CMD_RF_UP_FETTER_ID)		{			return;		}				//推断是否还有存储空间		if (List.len >= LIST_LEN)		{			return;		}				//更新数据		List.buf[List.len++] = buf.src_id;		sprintf(str,"%d",List.buf[List.len - 1]);		//更新列表框		hItem = WM_GetDialogItem(Handle_Gui, ID_LISTBOX);		LISTBOX_AddString(hItem, str);				return;	}		if (task == 1)	{		//推断功能码是否是确认对码绑定		if (buf.cmd != CMD_RF_ACK_BIND)		{			return;		}				//更新绑定的脚镣ID		Fetter_Id_Bind = buf.src_id;		//更新文本		hItem = WM_GetDialogItem(Handle_Gui, ID_TEXT_MATCH);		TEXT_SetFont(hItem, &GUI_FontHZ12);		TEXT_SetText(hItem,"已绑定脚镣");				hItem = WM_GetDialogItem(Handle_Gui, ID_TEXT_ID);		TEXT_SetFont(hItem, &GUI_FontHZ12);		sprintf(str,"ID:0x%x",Fetter_Id_Bind);		TEXT_SetText(hItem,str);				return;	}}/**********************************************************************							产生激发数据*參数:cmd:功能码*     data:产生的2字节激发数据**********************************************************************/static void generate_exciter_data(uint8_t cmd,uint8_t *data){	uint8_t temp = 0;	uint8_t check = 0;		temp = cmd << 6;	temp |= LOCAL_ID >> 4;	data[0] = temp;	temp = LOCAL_ID << 4;		check = checksum4(data,2);	temp |= check;	data[1] = temp;}/**********************************************************************							回调函数**********************************************************************/static void _cbDialog(WM_MESSAGE * pMsg) {	WM_HWIN hItem;	switch (pMsg->MsgId) 	{	case WM_INIT_DIALOG:		{			//初始化窗口			//添加小按键			FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);			FRAMEWIN_AddMaxButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 1);			FRAMEWIN_AddMinButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 2);			FRAMEWIN_SetFont(pMsg->hWin, &GUI_FontHZ12);			FRAMEWIN_SetText(pMsg->hWin,"对码绑定");						//初始化列表框			hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX);//			//设置内容//			LISTBOX_SetFont(hItem, &GUI_FontHZ12);//			LISTBOX_AddString(hItem, "0x10");//			LISTBOX_AddString(hItem, "0x11");//			LISTBOX_AddString(hItem, "0x12");//			LISTBOX_AddString(hItem, "0x13");//			LISTBOX_AddString(hItem, "0x14");//			List.buf[0] = 0x10;//			List.buf[1] = 0x11;//			List.buf[2] = 0x12;//			List.buf[3] = 0x13;//			List.buf[4] = 0x14;//			List.len = 5;						//设置为焦点			WM_SetFocus(hItem);			SCROLLBAR_CreateAttached(hItem, SCROLLBAR_CF_VERTICAL);						//初始化按键			hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_OK);			BUTTON_SetFont(hItem, &GUI_FontHZ12);			BUTTON_SetText(hItem,"扫描");						hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_CANCEL);			BUTTON_SetFont(hItem, &GUI_FontHZ12);			BUTTON_SetText(hItem,"返回");						hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_UP);			BUTTON_SetFont(hItem, &GUI_FontHZ12);			BUTTON_SetText(hItem,"上");						hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_DOWN);			BUTTON_SetFont(hItem, &GUI_FontHZ12);			BUTTON_SetText(hItem,"下");						hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_LEFT);			BUTTON_SetFont(hItem, &GUI_FontHZ12);			BUTTON_SetText(hItem,"清除");						hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_RIGHT);			BUTTON_SetFont(hItem, &GUI_FontHZ12);			BUTTON_SetText(hItem,"绑定");						//初始化文本			hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_MATCH);			TEXT_SetFont(hItem, &GUI_FontHZ12);			TEXT_SetText(hItem,"未绑定脚镣");						hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_ID);			TEXT_SetFont(hItem, &GUI_FontHZ12);			TEXT_SetText(hItem,"ID:0");						hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_PROGBAR);			TEXT_SetFont(hItem, &GUI_FontHZ12);			TEXT_SetText(hItem,"结束");						//初始化进度条			hItem = WM_GetDialogItem(pMsg->hWin, ID_PROGBAR);			PROGBAR_SetBarColor(hItem,0,GUI_RED);			PROGBAR_SetBarColor(hItem,1,GUI_GREEN);						break;		}	default:		{			WM_DefaultProc(pMsg);			break;		}	}}

转载于:https://www.cnblogs.com/jhcelue/p/7214445.html

你可能感兴趣的文章
会话_课后回顾和相关案例
查看>>
Linux 系统/etc/profile 内配置 系统脚本命令
查看>>
七夕许愿
查看>>
SpringMVC中使用Interceptor拦截器
查看>>
Spring Cloud与微服务构建:微服务简介
查看>>
自动化过程遇到的问题
查看>>
Mybatis 使用PageHelper封装通用Dao分页方法
查看>>
Matlab神经网络
查看>>
【转】浅谈Java中的hashcode方法
查看>>
Git branch 分支与合并分支
查看>>
8. input限制手机输入
查看>>
状态码
查看>>
前端跨域之jsonp跨域
查看>>
自己用h5写的转盘。写贴上来吧。
查看>>
Python开发基础 day12 模块2
查看>>
Socket编程 (异步通讯,解决Tcp粘包) - Part3
查看>>
OSI七层协议
查看>>
Linux 空闲空间的格式化与加载
查看>>
Linux 终端 Bash 常用快捷键介绍及经验
查看>>
关于twitter的GIF变mp4的测试
查看>>