摘要:
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
阅读(516)
评论(0)
推荐(0)
摘要:
我简单搜了一下,好像没有现成的这样的widget。自己写一个这样的widget太费劲,于是构思了一下,简单的这样实现: GtkProgressBar没有GdkWindow,所以不能响应鼠标事件。于是我在progressbar下放了一个eventbox,响应 鼠标单机事件。在鼠标响应callback函数中,取出鼠标单击的position(X和Y坐标),再加上eventbox本身的size,就可以知道单 击的相对位置了。 阅读全文
posted @ 2011-04-05 10:24
super119
阅读(179)
评论(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
阅读(1106)
评论(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
阅读(1237)
评论(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
阅读(317)
评论(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
阅读(1147)
评论(0)
推荐(0)
摘要:
GNU make 指南 翻译: 哈少 译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 make 的用法。而 make 是所有想在 Unix (当然也包括 Linux )系统上编程的用户必须掌握的工具。如果你写的程序中没有用到 make ,则说明你写的程序只是个人的练习程序,不具有任何实用的价值。也许这么说有点 儿偏激,但 make 实在是应该用在任何稍具规模的程序中的。希望本文可以为中国的 Unix 编程初学者提供一点儿有用的资料。中国的 Linux 用户除了学会安装红帽子以外, 实在应该尝试写一些有用的程序。个人想法,大家参考。 C-Scene 题目 #2 多文 阅读全文
posted @ 2011-04-05 10:21
super119
阅读(272)
评论(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
阅读(388)
评论(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
阅读(326)
评论(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
阅读(180)
评论(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
阅读(1143)
评论(0)
推荐(0)
摘要:
这种函数有两个含义: 1、本函数不会做任何改变类成员变量的事情,也就是说,只会读,不会写成员变量 2、如果new这个类的实例的时候,用的是const变量,如const ClassA handle = new ClassA(); ,那么,这个实例handle只能调用函数末尾被定义为const的函数。 阅读全文
posted @ 2011-04-05 10:17
super119
阅读(388)
评论(0)
推荐(0)
摘要:
所有C++程序员对析构函数都不陌生,由于其简单且易理解,所以都能很快应用。这里我不说这些常用方法,若不知可参考C++书籍。而我这次所想说的是较微妙的技巧,常不被人注意,但却非常非常的重要。看以下代码: //\\////\\////\\////\\////\\////\\//\\////\\////\\// //Example 1 //author: 袁凯 //date: 2001-09-24 //\\////\\////\\////\\////\\////\\//\\////\\////\\// #include <iostream.h> class CFunction { pub 阅读全文
posted @ 2011-04-05 10:16
super119
阅读(280)
评论(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
阅读(189)
评论(0)
推荐(0)
摘要:
由于Linux对线程实现的一些特殊性,所以会给我们理解线程及其相关的一些函数带来疑惑,这里做个解答: 1、关于sleep 很多书籍上都说sleep这个系统调用会使整个进程sleep,而不单是sleep一个线程。这样说没错,但我们要是在Linux下写一个多线程 的程序,在一个线程中调用sleep,你会发现其他线程照样运行,这是怎么回事呢?这就是由于Linux下的线程,其实线程的注册、销毁等工作是在 pthread库里面,而在内核中,线程其实就是一个进程。Linux对线程的实现是通过__clone调用实现的,这个调用会new多个进程出来,只不 过的是, Linux会设置这些进程的共享内存空间、文件 阅读全文
posted @ 2011-04-05 10:15
super119
阅读(2171)
评论(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
阅读(2241)
评论(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
阅读(1316)
评论(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
阅读(363)
评论(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
阅读(589)
评论(0)
推荐(0)
摘要:
若是在停电之后或是因为其它原因而无法本地开启计算机的时候,你是否想用什么办法过实现远程开机呢? 目前市面上新一代的主板都提供了键盘或鼠标开机、调制解调器唤醒开机和网络唤醒开机等功能,对于网络唤醒开机,由于需要特殊的软硬件支持,加 上一些资料对比介绍很少,因此,使得一些用户在已有硬件支持的情况下不知怎样实现网络唤醒开机。本文将详细说明如何实现网络唤醒开机。 怎样实现网络唤醒开机 如果用户想通过网络唤醒一台指定的计算机,首先需要知道能标识该计算机的身份号。由于被唤醒的计算机处于关机状态,也就没有了IP地址和计算机名字,唯一能标识其身份的只有内部网卡的物理地址,即MAC地址,该地址是唯一的,而且每块 阅读全文
posted @ 2011-04-05 10:06
super119
阅读(1024)
评论(0)
推荐(0)
摘要:
近期做EasyCluster,需要创建用户,要求在Linux上能创建一个用户帐号,很自然想到了后台程序调用useradd命令行来完成,但众所周 知,密码是个麻烦事。查看了 useradd的手册,有个-p password 选项可以在创建的时候就指定密码,但要求这里的密码是已经加过密的,这就要求用crypt函数进行加密,然后再放入命令行。故测试了一下,写了一段测试代 码,用来生成密码: Code: Select all#define _XOPEN_SOURCE#include <stdio.h>#include <string.h>#include <unistd. 阅读全文
posted @ 2011-04-05 10:05
super119
阅读(505)
评论(0)
推荐(0)
摘要:
exec函数组有六个函数,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg , ..., char * const envp[]); int execv(const char *path, char *const argv[]); int exe 阅读全文
posted @ 2011-04-05 10:04
super119
阅读(659)
评论(0)
推荐(0)
摘要:
本文介绍了如何用信号来调试一个程序。众所周知,在Linux编程中,经常会遇到程序segment fault或其他类似的错误,这些错误比较难调试,本文就介绍了用信号来调试这种错误的方法。 当一个程序访问一个未分配内存的地址时或其他情况时,会产生segment fault错误,此时程序会产生一个SIGSEGV的信号,所以,我们的程序可以捕获这个信号,并打印出是哪条指令导致了该错误,及产生该错误时CPU各寄存器的值,从而定位出问题所在。 本文举了两个很好的例子,一个是对SIGILL信号的处理,比如,当一个应用程序执行了一个不被允许的操作(比如用汇编执行保存/恢复CPU特权 寄存器的指令),这种操作在 阅读全文
posted @ 2011-04-05 10:03
super119
阅读(311)
评论(0)
推荐(0)
摘要:
Mesa is a 3-D graphics library with an API which is very similar to that of OpenGL. To the extent that Mesa utilizes the OpenGL command syntax or state machine, it is being used with authorization from SGI. While Mesa is not a licensed OpenGL implementation, it is currently being tested with the Ope 阅读全文
posted @ 2011-04-05 10:02
super119
阅读(1782)
评论(0)
推荐(0)
摘要:
1. 首先在VTK的网站:http://www.vtk.org 上可以下载到VTK的源码(VTK不提供Precompiled binary版本,所以,VTK的安装都必须要手动自己编译),Down下来之后解开。VTK的网站上还有VTK Data下载,这是VTK Example程序运行时所需要的数据文件,如果我们想在安装完VTK后做一些演示和测试,那么就需要下载这个包。我的意见是不用下载了,VTK安装完成 后,我们用VTK网站上提供的两个Example Code,自己编译运行一下,就可以知道VTK有没有安装成功了。 2. 解开包,看到根目录下有一个README.html文件,这就是安装文档,基本上 阅读全文
posted @ 2011-04-05 10:01
super119
阅读(2379)
评论(0)
推荐(0)
摘要:
众所周知,通过使用条件编译,可以让我们的C代码支持不同的平台。但是在代码中大量运用#ifdef, #endif这样的预处理指令显然是不妥的,因为这些代码分散在所有的代码中,非常难维护。将来如果要再添加一个平台的支持,要在所有代码中search 这些预处理指令。所以,很容易想到的一种改良方法是专门做一个.h文件来做这个事情,比如platform_specific.h: #ifdef WIN32 inline function1() { ...... } inline function2() { ...... } #endif #ifdef LINUX inline function1() { . 阅读全文
posted @ 2011-04-05 09:59
super119
阅读(459)
评论(0)
推荐(0)
摘要:
我们都知道,可以用atexit来注册一个我们自己写的函数作为exit函数,也就是说,在程序退出的时候,会调用到我们的这个自定义exit函数。问题是: 在Linux下终结一个C程序,最普遍的有两种做法: 1、在main函数中调用return 2、在任何地方调用 "exit" system call 试验证明,这两种方法都会触发我们自定义的exit函数,写的测试程序如下: Code: Select all#include "apue.h"static void my_exit(void);int main(void){ if (atexit(my_exit) 阅读全文
posted @ 2011-04-05 09:57
super119
阅读(599)
评论(0)
推荐(0)
摘要:
Using GNU C __attribute__ reading notes 1. 本文讲述GNU编译器的一个特性-__attribute__,这个宏是一个编译器指令,我们在代码中通过定义这个东西,可以inform编译器我们代码 的一些逻辑,从而在编译器避免一些错误,在运行期提高性能。__attribute__在很多代码中都有应用,非常实用。包括我们在看一些老外写的比较成 熟的代码的时候,都能看到这个东西。 2. __attribute__ format ,这个东西能告知编译器,我们的代码在处理printf,scanf这样变参数的函数的时候,哪个参数是format string,哪个参数是参 阅读全文
posted @ 2011-04-05 09:56
super119
阅读(1130)
评论(0)
推荐(0)
摘要:
crypt函数用来加密,目前Linux平台上加密的方法大致有MD5, DES, 3 DES 在RedHat平台上MD5和DES用的多一些。crypt函数的原形是: char *crypt(const char *key, const char *salt); key就是我们要传入的明文,salt是我们指定用来加密的密钥,返回值就是加密后的密文。 关键就是这个密钥salt,这里通过我们的实验,发现: (1)salt这个字符串如果以$1$开头,以$结尾,那么这表示让crypt用MD5的方式加密,加密后出来的密文格式就是 $1$...$<密文正文> ,夹在$1$和$之间的字符串就是我们指 阅读全文
posted @ 2011-04-05 09:55
super119
阅读(4835)
评论(0)
推荐(0)
摘要:
据说每个人都回错一回的声明。 参考C++ Primer 4th pdf版的164页。typedef、指针、const这些东西揉在一起是非常复杂的,值得推敲。 cstr的类型应该是:string *const -- 指向string的一个const指针 阅读全文
posted @ 2011-04-05 09:54
super119
阅读(339)
评论(0)
推荐(0)

浙公网安备 33010602011771号