GTK<ip地址控件>

該控件共有三個文件myipaddress.c姆打、myipaddress.h璃岳、test.c文件

**********************? myipaddress.h ******************************

#ifndef __MY_IP_ADDRESS_H__

#define __MY_IP_ADDRESS_H__

#include

#include

#include

G_BEGIN_DECLS

#define MY_IP_ADDRESS_TYPE? ? ? ? ? (my_ip_address_get_type ())

#define MY_IP_ADDRESS(obj)? ? ? ? ? (G_TYPE_CHECK_INSTANCE_CAST ((obj),? \

MY_IP_ADDRESS_TYPE, MyIPAddress))

#define MY_IP_ADDRESS_CLASS(klass)? (G_TYPE_CHECK_CLASS_CAST ((klass),? \

MY_IP_ADDRESS_TYPE, MyIPAddressClass))

#define IS_MY_IP_ADDRESS(obj)? ? ? ? (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \

MY_IP_ADDRESS_TYPE))

#define IS_MY_IP_ADDRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \

MY_IP_ADDRESS_TYPE))

typedef struct _MyIPAddress? ? ? ? ? ? ? ? MyIPAddress;

typedef struct _MyIPAddressClass? ? ? ? ? ? MyIPAddressClass;

struct _MyIPAddress

{

GtkEntry entry;

};

struct _MyIPAddressClass

{

GtkEntryClass parent_class;

void (* ip_changed) (MyIPAddress *ipaddress);

};

GType my_ip_address_get_type(void);

static void my_ip_address_set_property(GObject *object,guint prop_id,const GValue *value,GParamSpec *pspec);

static void my_ip_address_class_init (MyIPAddressClass *klass);

static void my_ip_address_get_property(GObject *object,guint prop_id,GValue *value,GParamSpec *pspec);

static void my_ip_address_init (MyIPAddress *ipaddress);

static void my_ip_address_render(MyIPAddress *ipaddress);

static void my_ip_address_move_cursor(GObject *entry,GParamSpec *spec);

static gboolean my_ip_address_key_pressed(GtkEntry *entry,GdkEventKey *event);

GtkWidget *my_ip_address_new();

gchar *my_ip_address_get_address(MyIPAddress *ipaddress);

void my_ip_address_set_address(MyIPAddress *ipaddress,gint address[4]);

G_END_DECLS

#endif

**********************? myipaddress.c ******************************

#include

#include

#include

#include

#include "myipaddress.h"

#define MY_IP_ADDRESS_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj),MY_IP_ADDRESS_TYPE,MyIPAddressPrivate))

typedef struct _MyIPAddressPrivate

{

guint address[4];

};

enum

{

CHANGED_SIGNAL,

LAST_SIGNAL

};

enum

{

PROP_0,

PROP_IP1,

PROP_IP2,

PROP_IP3,

PROP_IP4

};

typedef struct _MyIPAddressPrivate MyIPAddressPrivate;

static guint my_ip_address_signals[LAST_SIGNAL] = {0};

GType my_ip_address_get_type(void)

{

static GType entry_type = 0;

if (!entry_type)

{

static const GTypeInfo entry_info =

{

sizeof (MyIPAddressClass),

NULL,

NULL,

(GClassInitFunc)my_ip_address_class_init,

NULL,

NULL,

sizeof(MyIPAddress),

0,

(GInstanceInitFunc)my_ip_address_init,

};

entry_type = g_type_register_static(GTK_TYPE_ENTRY, "MyIPAddress",&entry_info, 0);

}

return entry_type;

}

static void my_ip_address_set_property(GObject *object,guint prop_id,const GValue *value,GParamSpec *pspec)

{

MyIPAddress *ipaddress = MY_IP_ADDRESS(object);

gint address[4] = {-1, -1, -1, -1};

switch(prop_id)

{

case PROP_IP1:

address[0] = g_value_get_int(value);

my_ip_address_set_address(ipaddress,address);

break;

case PROP_IP2:

address[1] = g_value_get_int(value);

my_ip_address_set_address(ipaddress,address);

break;

case PROP_IP3:

address[2] = g_value_get_int(value);

my_ip_address_set_address(ipaddress,address);

break;

case PROP_IP4:

address[3] = g_value_get_int(value);

my_ip_address_set_address(ipaddress,address);

break;

default:

G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);

break;

}

}

static void my_ip_address_class_init (MyIPAddressClass *klass)

{

GObjectClass *gobject_class = G_OBJECT_CLASS (klass);

gobject_class->set_property = my_ip_address_set_property;

gobject_class->get_property = my_ip_address_get_property;

g_type_class_add_private (klass, sizeof (MyIPAddressPrivate));

my_ip_address_signals[CHANGED_SIGNAL] =

g_signal_new ("ip-changed", G_TYPE_FROM_CLASS (klass),

G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,

G_STRUCT_OFFSET (MyIPAddressClass, ip_changed),

NULL, NULL,g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);

g_object_class_install_property (gobject_class, PROP_IP1,

g_param_spec_int ("ip-number-1",

"IP Address Number 1",

"The first IP address number",

0, 255, 0,

G_PARAM_READWRITE));

g_object_class_install_property (gobject_class, PROP_IP2,

g_param_spec_int ("ip-number-2",

"IP Address Number 2",

"The second IP address number",

0, 255, 0,

G_PARAM_READWRITE));

g_object_class_install_property (gobject_class, PROP_IP3,

g_param_spec_int ("ip-number-3",

"IP Address Number 3",

"The third IP address number",

0, 255, 0,

G_PARAM_READWRITE));

g_object_class_install_property (gobject_class, PROP_IP4,

g_param_spec_int ("ip-number-4",

"IP Address Number 1",

"The fourth IP address number",

0, 255, 0,

G_PARAM_READWRITE));

}

#define G_SIGNAL_OFFSET(struct_type,member)? ((glong)((guint8*) &((struct_type*)0)->member))

void (*callback)(gpointer instance,gpointer data);

void (*callback)(gpointer instance,gboolean arg,gpointer data);

static void my_ip_address_get_property(GObject *object,guint prop_id,GValue *value,GParamSpec *pspec)

{

MyIPAddress *ipaddress? = MY_IP_ADDRESS(object);

MyIPAddressPrivate *priv = MY_IP_ADDRESS_GET_PRIVATE(ipaddress);

switch(prop_id)

{

case PROP_IP1:

g_value_set_int(value,priv->address[0]);

break;

case PROP_IP2:

g_value_set_int(value,priv->address[1]);

break;

case PROP_IP3:

g_value_set_int(value,priv->address[2]);

break;

case PROP_IP4:

g_value_set_int(value,priv->address[3]);

break;

default:

G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);

break;

}

}

static void my_ip_address_init (MyIPAddress *ipaddress)

{

MyIPAddressPrivate *priv = MY_IP_ADDRESS_GET_PRIVATE (ipaddress);

PangoFontDescription *fd;

guint i;

for (i = 0; i < 4; i++)

priv->address[i] = 0;

fd = pango_font_description_from_string ("Monospace");

gtk_widget_modify_font (GTK_WIDGET (ipaddress), fd);

my_ip_address_render (ipaddress);

pango_font_description_free (fd);

g_signal_connect (G_OBJECT (ipaddress), "key-press-event",G_CALLBACK (my_ip_address_key_pressed), NULL);

g_signal_connect (G_OBJECT (ipaddress), "notify::cursor-position",G_CALLBACK (my_ip_address_move_cursor), NULL);

}

static void my_ip_address_render(MyIPAddress *ipaddress)

{

MyIPAddressPrivate *priv = MY_IP_ADDRESS_GET_PRIVATE(ipaddress);

GString *text;

gint i;

text = g_string_new(NULL);

for(i=0; i<4; i++)

{

gchar *temp = g_strdup_printf("%3i.",priv->address[i]);

text = g_string_append(text,temp);

g_free(temp);

}

text = g_string_truncate(text,15);

gtk_entry_set_text(GTK_ENTRY(ipaddress),text->str);

g_string_free(text,TRUE);

}

static void my_ip_address_move_cursor(GObject *entry,GParamSpec *spec)

{

gint cursor = gtk_editable_get_position(GTK_EDITABLE(entry));

if(cursor <= 3)

{

gtk_editable_set_position(GTK_EDITABLE(entry),3);

}

else if(cursor <= 7)

{

gtk_editable_set_position(GTK_EDITABLE(entry),7);

}

else if(cursor <= 11)

{

gtk_editable_set_position(GTK_EDITABLE(entry),11);

}

else

gtk_editable_set_position(GTK_EDITABLE(entry),15);

}

static gboolean my_ip_address_key_pressed(GtkEntry *entry,GdkEventKey *event)

{

MyIPAddressPrivate *priv = MY_IP_ADDRESS_GET_PRIVATE(entry);

guint k = event->keyval;

gint cursor,value;

if((k >= GDK_0 && k <= GDK_9) || (k >= GDK_KP_0 && k <= GDK_KP_9))

{

cursor = floor(gtk_editable_get_position(GTK_EDITABLE(entry))/4);

value = g_ascii_digit_value(event->string[0]);

if((priv->address[cursor] == 25) && (value > 5))

return TRUE;

if(priv->address[cursor] < 26)

{

priv->address[cursor] *= 10;

priv->address[cursor] += value;

my_ip_address_render(MY_IP_ADDRESS(entry));

gtk_editable_set_position(GTK_EDITABLE(entry),(4 * cursor) + 3);

g_signal_emit_by_name((gpointer)entry,"ip-changed");

}

}

else if(k == GDK_Tab)

{

cursor = (gint)(floor(gtk_editable_get_position(GTK_EDITABLE(entry))/4)+1);

gtk_editable_set_position(GTK_EDITABLE(entry),(4 * (cursor%4)) + 3);

}

else if(k == GDK_BackSpace)

{

cursor = (gint)floor(gtk_editable_get_position(GTK_EDITABLE(entry))/4);

priv->address[cursor] /= 10;

my_ip_address_render(MY_IP_ADDRESS(entry));

gtk_editable_set_position(GTK_EDITABLE(entry),(4*cursor)+3);

g_signal_emit_by_name((gpointer)entry,"ip-changed");

}

else if((k == GDK_Return) || (k == GDK_KP_Enter))

gtk_widget_activate(GTK_WIDGET(entry));

return TRUE;

}

GtkWidget *my_ip_address_new()

{

return GTK_WIDGET(g_object_new(my_ip_address_get_type(),NULL));

}

char *my_ip_address_get_address(MyIPAddress *ipaddress)

{

MyIPAddressPrivate *priv = MY_IP_ADDRESS_GET_PRIVATE(ipaddress);

return g_strdup_printf("%d.%d.%d.%d",priv->address[0],priv->address[1],

priv->address[2],priv->address[3]);

}

void my_ip_address_set_address(MyIPAddress *ipaddress,gint address[4])

{

MyIPAddressPrivate *priv = MY_IP_ADDRESS_GET_PRIVATE(ipaddress);

guint i;

for(i=0; i<4; i++)

{

if(address[i] >= 0 && address[i] <= 255)

{

priv->address[i] = address[i];

}

}

my_ip_address_render(ipaddress);

g_signal_emit_by_name((gpointer)ipaddress,"ip-changed");

}

**********************? test.c ******************************

#include

#include "myipaddress.h"

static void ip_address_changed(MyIPAddress* ipaddress);

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

{

GtkWidget? ? *window,*ipaddress;

gtk_init(&argc,&argv);

gint address[4] = {0,0,0,0};

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window),"MyIPAddress");

ipaddress = my_ip_address_new();

my_ip_address_set_address(MY_IP_ADDRESS(ipaddress),address);

g_signal_connect(G_OBJECT(ipaddress),"ip-changed",G_CALLBACK(ip_address_changed),NULL);

gtk_container_add(GTK_CONTAINER(window),ipaddress);

gtk_widget_show_all(window);

gtk_main();

return 0;

}

static void ip_address_changed(MyIPAddress* ipaddress)

{

gchar *address = my_ip_address_get_address(ipaddress);

g_print("%s\n",address);

g_free(address);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惫搏,一起剝皮案震驚了整個濱河市骗露,隨后出現(xiàn)的幾起案子师枣,更是在濱河造成了極大的恐慌互拾,老刑警劉巖歪今,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颜矿,居然都是意外死亡寄猩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門骑疆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來田篇,“玉大人,你說我怎么就攤上這事封断。” “怎么了舶担?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵坡疼,是天一觀的道長。 經(jīng)常有香客問我衣陶,道長柄瑰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任剪况,我火速辦了婚禮教沾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘译断。我一直安慰自己授翻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堪唐,像睡著了一般巡语。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淮菠,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天男公,我揣著相機與錄音,去河邊找鬼合陵。 笑死枢赔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拥知。 我是一名探鬼主播踏拜,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼举庶!你這毒婦竟也來了执隧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤户侥,失蹤者是張志新(化名)和其女友劉穎镀琉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕊唐,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡屋摔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了替梨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钓试。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖副瀑,靈堂內(nèi)的尸體忽然破棺而出弓熏,到底是詐尸還是另有隱情,我是刑警寧澤糠睡,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布挽鞠,位于F島的核電站,受9級特大地震影響狈孔,放射性物質(zhì)發(fā)生泄漏信认。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一均抽、第九天 我趴在偏房一處隱蔽的房頂上張望嫁赏。 院中可真熱鬧,春花似錦油挥、人聲如沸潦蝇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽护蝶。三九已至华烟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間持灰,已是汗流浹背盔夜。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堤魁,地道東北人喂链。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像妥泉,于是被迫代替她去往敵國和親椭微。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盲链,服務(wù)發(fā)現(xiàn)蝇率,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc閱讀 2,861評論 0 0
  • 用了mysql好多年刽沾,很少關(guān)注mysql自帶庫本慕,自然也不知道這個庫里存放些什么,在看《MySQL排錯指南》時看到它...
    灼灼2015閱讀 1,877評論 1 3
  • 人以群分侧漓。緣分這東西锅尘,它就在那兒等著你,不早不晚布蔗。 我至今想不明白藤违,是什么樣的吸引力使我在剛剛完成川藏行丹锹、身心俱疲...
    飛閑雲(yún)閱讀 756評論 5 4
  • 每一個做父母的都希望孩子受到最好的教育兔毒。陳淑紅研究漢語教學(xué)的初衷也是如此恃锉。60年代出生的她棺牧,從小學(xué)習(xí)優(yōu)異隔盛,老師同學(xué)...
    海外企業(yè)家閱讀 2,340評論 1 2