博文
创造你自己的控件--子分类的艺术(2007-07-20 20:57:00)
摘要:第一次翻译哦,呵呵,原文地址为:http://www.codeproject.com/miscctrl/subclassdemo.asp
创造你自己的控件-子分类的艺术
By Chris Maunder.
介绍
作为一个程序员有许多普通的windows控件可以用在应用程序的外观上。许多的控件的从列表到按钮再到进程条都是可以现成的用。尽管如此,在如此多的控件中我们还是会碰到那些标准的控件不够用的时候。欢迎进入子分类控件的艺术。
子分类一个windows控件不像子分类一个C++类。子分类一个控件意味这你用你自己的消息处理函数取代了改控件的一些或者所有的消息处理函数。你可以有效的截获改控件的消息并使它按照你的意愿行事,而非windows的默认方式。这可以让改控件实现大多数而非全部的你想得到的行为,并且使它表现得很完美。有两种类型的子分类,局部子分类和全局子分类。局部子分类就是子分类一个实体,全局子分类就是将一个特定类型的控件全部子分成你的类型。
记住一个从CWnd类派生的类对象和一个与它相联的窗口(hwnd)的区别是很重要的。CWnd的派生类对象包含一个成员变量指向hwnd,而且包含那些通过hwnd作为参数的处理消息的函数(比如,WM_PAINT, WM_MOUSEMOVE)。当你子分类一个控件通过你的C++对象时,你就是将相应的hwnd连接到你的C++对象上并把改控件将激发的消息回调函数改成你的。
子分类是很容易的。首先,你创建一个处理了你感兴趣的所以消息的类,然后将该类来子分一个已经存在的控件使它按照你的新类的行事。某中方面上改控件已经变成了你所拥有的了。在这个例子中我们将子分一个按钮控件并且使它做一些它从来都没能够做的事。
一个新类
子分一个控件我们需要创建一个新类改类应该处理了所有我们感兴趣的消息。由于我们很懒,最好是使我们处理的消息最少,而且最好的方式是从你将要子分的控件派生你的新类,我们这里选择的是CButton。
我们设想的是使按钮在鼠标每次经过时显示出高亮的黄色。奇怪的事已经产生了。首先我们通过向导创建一个从CButton派生的新类CMyButton。
&nbs......
软考分数出来了(2007-06-28 22:04:00)
摘要:唉,软考分数出来了,50/45,同学们都考那么高,有点小失落,也怪自己没复习吧,没过也就算了,下次再考吧!......
不要VFT实现虚函数的效果(转)(2007-05-25 01:05:00)
摘要:class CMyWnd : public CWindowImpl<CMyWnd>{ ...};
这样作是合法的,因为C++的语法解释说即使CMyWnd类只是被部分定义,类名CMyWnd已经被列入递归继承列表,是可以使用的。
#include <iostream>
using std::cout;
template <class T>
class B1
{
public:
void SayHi()
{
T* pT = static_cast<T*>(this); // HUH?? 我将在下面解释
pT->PrintClassName();
}
protected:
void PrintClassName()
{
cout << "This is B1\n";
}
};
class D1 : public B1<D1>
{
// No overridden functions at all
};
class D2 ......
也谈郁闷(2007-05-14 23:55:00)
摘要: 这个词对大家应该是再熟悉不过的了,现在真是很郁闷呢,马上大四了,同学们好像都有条不紊的生活和学习着,考研的都复习N久了,考证的也都一直在准备,玩游戏的也是一如既往酣战.反正都很充实吧,而我冒似这学期来了就一直像总是很忙似的,但是又什么都没做.相当无语...,今天看了把软考那个还是从图书馆借的盗版书翻了翻,唉,一个字,郁闷.都是以前学过的什么数据结构啊,算法啊,编译啊,每个题我都有印象,可惜就是每个都忘了,真不知道我这大学都学了点什么东西?
也是的,我就搞不懂我怎么就报了那个软考,说说现在的状态,首先我要考研,这个有家里的因素也有自己的(当然主要是自己想多学点东西在去混),可是如今任何考研的书都没摸过,看看同学都高数快复习完了,急也没办法啊;报了六级,虽然这个好像不太要紧,但是怎么说也是第二次考了,再搞个过不了也还是有点不爽的,还好只交了30;报了软考,这个就件直是脑袋灌水了,白白交的120,书没翻几页,考的都是些什么概念之类的(仅指上午的题),肯定挂定了;还有一个就是上学期非常高的热情报的那个项目,现在真想找个人替啊,主要是自己能力有限,加之时间也不多;这些是和学习关系不太紧密的,学习上呢,这学期都是重量级的课程,操作系统,网络,接口,数据库,冒似没一个花时间好好学的,我真服了,时间都去干什么了,郁闷!
Oh,My god!......
转载 gcc and g++编译器和gdb调试器(2007-05-14 23:22:00)
摘要:gcc and g++分别是gnu的c & c++编译器
gcc/g++在执行编译工作的时候,总共需要4步
1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]
[参数详解]
-x language filename
设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根
据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果
你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这
个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数
的使用。
可以使用的参数吗有下面的这些
`c', `objective-c', `c-header', `c++', `cpp-output',
`assembler', and `assembler-with-cpp'.
看到英文,应该可以理解的。
例子用法:
gcc -x c hello.pig
-x none filename
关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
例子用法:
gcc -x c hello.pig -x none hello2.c
-c
只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
例子用法:
gcc -c hello.c
他将生成.o的obj文件
-S
只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法
gcc -S hello.c
他将生成.s的汇编代码,你可以用文本编辑器察看
-E
只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里
面.
例子用法:
gcc -E hello.c > pianoapan.txt
gcc -E h......
初识QT(2007-05-12 00:57:00)
摘要:下午回到寝室后,突然把下了好久的qt在windows下安装试了下,Windows下安装不用说了太简单了~~
安完后看到那个demo感觉QT真的很不错,比想象中的好多了,比MFC那个也强(当然MFC肯定是可以做出很不错的界面的),后来我直接到examples里找相应的Demo运行发现提示缺少dll,当时心里一惊难道在Windows下真的要收费,后来我照着一本很不错的英文电子书上的一个小例子,在bin目录下编译(用qmake很方便的)下发现可以运行,然来是这里的dll都没有复制到相应的Windows系统目录下,我就直接把这里的所有dll复制到System32下,后来一切正常。
随便发两个图片上来,以后有时间一定好好看下QT这学期估计没什么时间了,这学期总是感觉忙也不晓得时间都去干什么了,唉~~
后来又下了Linux版本的,想着有时在Linux也可以玩玩(那个RedHat自带的不知道怎么不行?),由于是Linux新手安了后(只用了半个小时全安“完”了),后来设置环境变量时疏忽了,弄错了点,由于是Linux新手当时也不想去找设置环境变量的命令我又按着里面的提示卸载后重新build,这次竟然一共花了一个半小时才搞定,真是把人急死了,硬是看那终端不停的在编译输出……
于是又要设环境变量,我这人总不愿看到多余的东西于是就上网找了下关于环境变量的命令把那东东搞好了,然而我运行里面make好的demo时又在终端上显示着不多什么objiect文件,唉,和Windows一样,我又把lib里面的所有文件给copy到/user的相应目录下,这下总算都搞定了,整个过程和上次弄boost差不多。......
STL之algorithm(2007-05-04 23:33:00)
摘要: 拖了这么久了,今天终于把STL算法部分的非修改性的序列操作看完了,前面的几个适配器是直接看的《c++程序设计语言》感觉有点吃力,后面是看的SGI的文档,感觉写得很不错,当然现在只是初步的熟悉下了这些算法的作用,还有待做些实质性的练习,初步打算是将以前数据结构的课设改写下,看时间吧..............
VC6.0中如何改变对话框的背景颜色(转载)(2007-04-25 17:15:00)
摘要:---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。
---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下:
---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。
---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码:
BOOL CExampleDlgApp: : InitInstance ( )
{
...
CExampleDlgDlg dlg;
m_pMainWnd = &dlg;
//先于DoModal()调用,将对话框设置为蓝色背景、红色文本
SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
int nResponse = dlg.DoModal();
...
}
---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。
---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准):
void CExampleDlgDlg::OnPaint()
{
if (IsIconic())
...
else
{
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
......
来爽一把(2007-04-21 23:34:00)
摘要: 由于前些天把linux引导搞没了,再安时老是找不到系统分区(非让格整个硬盘),今天用xp把那个分区给删了,再去试试,还是不行(提示找不到硬盘分区).相当郁闷,到网上找了个说是能修复分区的软件瞎搞了下,重启,这下完了,进不了windows而且用xp盘进入发现分区都没了,脑袋里马上一片混乱,积累了两年的软件和程序都完了?
用番茄花园的盘在去试试,上面有个硬盘工具,就侥幸的进去了,上面显示的也是几个未知的分区,无意中看到一个recovery,点了个前面的分区,让它auto执行结果竟然看到了熟悉的c盘,心里那种感觉简直是爽得没法形容,就这样把c盘给恢复了,然后重启,果然进了windows,但是其他盘还是没有,于是再次用那个把其他分区给恢复了,太爽了,接着用它把那个坏掉得linux分区也给转成了FAT32,终于又可以linxu了.
一个字'爽'!......
转__cdecl __fastcall与 __stdcall (2007-02-03 16:50:00)
摘要:__cdecl __fastcall与 __stdcall
调用约定:
__cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。
1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,
2、_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。
3、__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。
4、thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。
5、naked call采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。
调用约定可以通过工程设置:Setting...\C/C++ \Code Generation项进行选择,缺省状态为__cdecl。
名字修饰约定:
1、修饰名(Decoration name):"C"或者"C++"函数在内部(编译和链接)通过修饰名识别
2、C编译时函数名修饰约定规则:
__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8
__cde......