摘要: 1. 用gtk_widget_get_request_size/gtk_widget_size_request取出来的都是当初request的size,不是widget当前的size 2. 使用gdk_drawable_get_size函数可以取出当前widget的size。注意,gdk_window_get_size函数有一样的效果,不过这个函数已经deprecated了。 还有一点,这个widget必须有window,像label, progressbar这些widget,他们是没有GdkWindow的(在Foundations of GTK+书中有描述,所以,像这样的widget如果要捕 阅读全文
posted @ 2011-04-05 10:25 super119 阅读(486) 评论(0) 推荐(0) 编辑
摘要: 我简单搜了一下,好像没有现成的这样的widget。自己写一个这样的widget太费劲,于是构思了一下,简单的这样实现: GtkProgressBar没有GdkWindow,所以不能响应鼠标事件。于是我在progressbar下放了一个eventbox,响应 鼠标单机事件。在鼠标响应callback函数中,取出鼠标单击的position(X和Y坐标),再加上eventbox本身的size,就可以知道单 击的相对位置了。 阅读全文
posted @ 2011-04-05 10:24 super119 阅读(169) 评论(0) 推荐(0) 编辑
摘要: gtk_widget_realize这个函数是用来创建该widget对应的GdkWindow和相关资源的。一般我们用不到这个函数,一般是在创建自定义的widget的时候,需要用到。 我们一般不需要使用这个函数的原因是:当我们调用gtk_widget_show_all函数的时候,就会自动调用这个函数。但是 Foundations of GTK+ Developing一书中提到,对于GtkEventBox,_show_all函数并不会调用realize,所以我们需要手动调用一次这个函数。而 且,调用这个函数之前,需要首先调用gtk_container_add这样类似的函数,这是因为GTK要确定ev 阅读全文
posted @ 2011-04-05 10:24 super119 阅读(1047) 评论(0) 推荐(0) 编辑
摘要: GtkButton继承自GtkBin,所以,要想做image button,特简单。如果是只需要放上一个image的button,如下: GtkWidget *hbox, *playbtn, *pausebtn, *stopbtn, *placeholder, *dlabel; GtkWidget *playimg, *pauseimg, *stopimg; hbox = gtk_hbox_new(FALSE, 5); playbtn = gtk_button_new(); pausebtn = gtk_button_new(); stopbtn = gtk_button_new(); pla 阅读全文
posted @ 2011-04-05 10:24 super119 阅读(1187) 评论(0) 推荐(0) 编辑
摘要: 在程序中加入一句代码: gtk_rc_parse(".gtkrc"); 然后看下面的.gtkrc文件,写成这样就可以调整GtkLabel和GtkProgressBar的字体了。 Code: Select allstyle "title"{ font_name = "Sans 28"}class "GtkLabel" style "title"class "GtkProgressBar" style "title" 阅读全文
posted @ 2011-04-05 10:23 super119 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 1. GtkHBox/GtkVBox的gtk_box_pack_start函数中的expand和fill两个参数的区别: expand就是当Box给我们的widget分配了额外的空间后,我们的widget会占住这个空间,不会让给别人。 fill就是当expand为TRUE的时候,我们不仅占用Box给我们分配的空间,而且会把自己的界面扩大到这个空间上。 所以,简单来说,expand=TRUE, fill=FALSE就是占住空间但是控件本身大小不变;两个都是TRUE,就是不仅占住空间而且控件也会变得和这个空间一样大;expand=FALSE,fill就没了意义。 2. GtkHBox中只要expa 阅读全文
posted @ 2011-04-05 10:23 super119 阅读(1085) 评论(0) 推荐(0) 编辑
摘要: GNU make 指南 翻译: 哈少 译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 make 的用法。而 make 是所有想在 Unix (当然也包括 Linux )系统上编程的用户必须掌握的工具。如果你写的程序中没有用到 make ,则说明你写的程序只是个人的练习程序,不具有任何实用的价值。也许这么说有点 儿偏激,但 make 实在是应该用在任何稍具规模的程序中的。希望本文可以为中国的 Unix 编程初学者提供一点儿有用的资料。中国的 Linux 用户除了学会安装红帽子以外, 实在应该尝试写一些有用的程序。个人想法,大家参考。 C-Scene 题目 #2 多文 阅读全文
posted @ 2011-04-05 10:21 super119 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 1。gcc包含的c/c++编译器 gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2。gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字 3。为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你 用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比 阅读全文
posted @ 2011-04-05 10:21 super119 阅读(376) 评论(0) 推荐(0) 编辑
摘要: stdout和stderr都是UNIX/Linux系统两个内置的文件,他们和stdin一起,在每个进程启动后都会自动生成,编号分别是0、1、2 这里需要说明的是,对于stdout,这是一个有Buffer存在的文件流,也就是说,输出到stdout的字符串可能不会被立即就显示出来,所以,对于stdout,可以是用fflush(stdout)这样的方法来强制输出 而stderr不同,由于输出的是错误信息,所以,输出到stderr的字符串都会被立即显示 阅读全文
posted @ 2011-04-05 10:19 super119 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 假设一个数组a,数组元素都是int,数组共有3个元素,那么 a+1整个表达式就等于a[1] 此时如果假设在系统中,一个int使用2个Byte来存储,那么a+1这个表达式其实是将 a的地址向后移动了2个Byte,如果要将a的地址往后移动1个Byte的话,那么可以这样作 unsigned char *p = a; p+1 ---------------- 此时就实现了a的地址向后移动1个Byte,因为unsigned char是以1个Byte来存放 这里可能有个疑问,unsigned char和char有什么区别呢?我们都知道,char其实是ASCII码,使用8个Bit来存储,但是最高位不考虑,也 阅读全文
posted @ 2011-04-05 10:18 super119 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 1、对于单个类来说,这三个范围限定符的意义如下: 公有成员(public member) 在程序的任何地方都可以被访问。实行信息隐藏的类将其public 成员限制在成员函数上,这种函数定义了可以被一般程序用来操纵该类类型对象的操作 私有成员(private member) 只能被成员函数和类的友元访问。实行信息隐藏的类把其数据成员声明为private 被保护成员(protected member) 对派生类derived class 就像public 成员一样,对其他程序则表现得像private 总之,对于单个类的成员函数来说,无论成员变量是public、protected还是private, 阅读全文
posted @ 2011-04-05 10:17 super119 阅读(1066) 评论(0) 推荐(0) 编辑
摘要: 这种函数有两个含义: 1、本函数不会做任何改变类成员变量的事情,也就是说,只会读,不会写成员变量 2、如果new这个类的实例的时候,用的是const变量,如const ClassA handle = new ClassA(); ,那么,这个实例handle只能调用函数末尾被定义为const的函数。 阅读全文
posted @ 2011-04-05 10:17 super119 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 所有C++程序员对析构函数都不陌生,由于其简单且易理解,所以都能很快应用。这里我不说这些常用方法,若不知可参考C++书籍。而我这次所想说的是较微妙的技巧,常不被人注意,但却非常非常的重要。看以下代码: //\\////\\////\\////\\////\\////\\//\\////\\////\\// //Example 1 //author: 袁凯 //date: 2001-09-24 //\\////\\////\\////\\////\\////\\//\\////\\////\\// #include <iostream.h> class CFunction { pub 阅读全文
posted @ 2011-04-05 10:16 super119 阅读(265) 评论(0) 推荐(0) 编辑
摘要: Singleton.hclassA{private:staticA*_instance;protected:A();public:staticA*getInstance();voidsayhello();};Singleton.cpp#include<iostream>#include"singleton.h"usingnamespacestd;A*A::_instance=0;A::A(){}A*A::getInstance(){if(_instance==0)_instance=newA;return_instance;}voidA::sayhello(){ 阅读全文
posted @ 2011-04-05 10:16 super119 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 由于Linux对线程实现的一些特殊性,所以会给我们理解线程及其相关的一些函数带来疑惑,这里做个解答: 1、关于sleep 很多书籍上都说sleep这个系统调用会使整个进程sleep,而不单是sleep一个线程。这样说没错,但我们要是在Linux下写一个多线程 的程序,在一个线程中调用sleep,你会发现其他线程照样运行,这是怎么回事呢?这就是由于Linux下的线程,其实线程的注册、销毁等工作是在 pthread库里面,而在内核中,线程其实就是一个进程。Linux对线程的实现是通过__clone调用实现的,这个调用会new多个进程出来,只不 过的是, Linux会设置这些进程的共享内存空间、文件 阅读全文
posted @ 2011-04-05 10:15 super119 阅读(2152) 评论(0) 推荐(0) 编辑
摘要: union和struct的区别在于: 1、对于一个union类型的变量,所有成员变量共享一块内存,该内存的大小有这些成员变量中长度最大的一个来决定 2、union分配的内存是连续的,这一点非常重要。 更具体的看这里,还有测试代码呢(附件1): 那为什么要发明union呢?这是由于union的特性决定的,特别是上述的第二点,因为struct中成员变量虽然内存都是独立的,但是struct不能保证分配的内存是连续的。 举个例子:CPU的ax寄存器分为ah和al两部分,我们现在要给其赋值,就可以采用union: union _ax_register { int i; // 4Bytes, union将 阅读全文
posted @ 2011-04-05 10:13 super119 阅读(2213) 评论(0) 推荐(0) 编辑
摘要: 使用popen库函数的版本: #include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<limits.h>#defineBUFSZPIPE_BUFvoiderr_quit(char*msg);intmain(intargc,char*argv[]){FILE*fp;//FILEstreamforpopenchar*cmdstring="ps-aux|greproot";charbuf[BUFSZ];//createt 阅读全文
posted @ 2011-04-05 10:11 super119 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 本文参考了VIM中文用户手册的附录三-“用VIM进行C/C++编程介绍”和第29、30章 一、ctags(有了ctags,可以实现很多强大的编程辅助功能,如下) 可以写入.vimrc文件中的命令有set autowrite 1、ctags,使用了ctags.sourceforge.net上的ctags软件,也是VIM推荐的ctags版本 2、这个ctags用起来很简单,直接ctags -R /usr/include/* 就能生成一个包含所有linux下.h文件的tags文件;使用ctags -R <my develop directory>就能生成自己应用的一个tags文件。一般来 阅读全文
posted @ 2011-04-05 10:11 super119 阅读(1285) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<pthread.h>#include<sys/types.h>#include<unistd.h>#include<signal.h>#include<sys/param.h>#include<sys/sysinfo.h>voidcommand_thread(void*arg);voidsetup_daemon();voidmessage_log(char*text);voidcommand_thread(void*arg){charstr_command[1 阅读全文
posted @ 2011-04-05 10:10 super119 阅读(571) 评论(0) 推荐(0) 编辑
摘要: 若是在停电之后或是因为其它原因而无法本地开启计算机的时候,你是否想用什么办法过实现远程开机呢? 目前市面上新一代的主板都提供了键盘或鼠标开机、调制解调器唤醒开机和网络唤醒开机等功能,对于网络唤醒开机,由于需要特殊的软硬件支持,加 上一些资料对比介绍很少,因此,使得一些用户在已有硬件支持的情况下不知怎样实现网络唤醒开机。本文将详细说明如何实现网络唤醒开机。 怎样实现网络唤醒开机 如果用户想通过网络唤醒一台指定的计算机,首先需要知道能标识该计算机的身份号。由于被唤醒的计算机处于关机状态,也就没有了IP地址和计算机名字,唯一能标识其身份的只有内部网卡的物理地址,即MAC地址,该地址是唯一的,而且每块 阅读全文
posted @ 2011-04-05 10:06 super119 阅读(936) 评论(0) 推荐(0) 编辑