博文
[zt]vc LoadImage的使用(2009-02-12 14:17:00)
摘要:【函数】
LoadImage
【操作系统】
Win9x:Y
WinNT:Y
【声明】
Function ulong LoadImage(ulong hInst,ref string lpsz,ulong un1,ulong n1,ulong n2,ulong un2) LIBRARY "user32.dll" ALIAS FOR "LoadImageA"
【说明】
载入一个位图、图标或指针
函数功能:该函数装载目标,光标,或位图。
函数原型:HANDLE LoadImage(NINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad);
参数:
hinst:处理包含被装载图像模块的特例。若要装载OEM图像,则设此参数值为O。
lpszName:处理图像装载。如果参数hinst为非空,而且参数fuLoad不包括LR_LOADFROMFILE的值时,那么参数lpszName是一个指向保留在hinst模块中装载的图像资源名称,并以NULL为结束符的字符串。
如果参数hinst为空,并且LR_LOADFROMFILE被指定,那么这个参数低位字一定是被装载的OEM图像标识的。OEM图像标识符是在WINUSER.H头文件中定义的,下面列举出前缀的含义:
OBM_ OEM:位图;OIC_OEM图标;OCR_OEM:光标。
如果参数fuLoad包含LR_LOADFROMFILE值,那么参数lpszName是包含有图像的文件名。
uType:指定被装载图像类型。此参数可以为下列值,其含义如下:
IMAGE_BITMAP:装载位图;IMAGE_CURSOR:装载光标;......
[zt]在VC中使用自定义资源(2009-02-12 13:27:00)
摘要:在VC中使用自定义资源,FindResource,LoadResource,
一、前言
在VC环境中除了我们所常用的Dialog、Menu和Bitmap等标准资源类型之外,它还支持自定义资源类型(Custom Resource),我们自定义的资源类型能做些什么呢?呵呵,用处多多。
1. 默认的皮肤压缩包或语言包。一些支持换肤的软件特别是一些媒体播放器常常有自定义的皮肤文件(你可以尝试将Media Player或千千静听等软件的Skins目录下的文件的扩展名改为.zip,然后使用WinZip打开看一下),但为了防止Skin文件丢失导致软件无 法显示,他们常常会在EXE文件中内置一套Skin作为默认的皮肤文件。同样,一些支持多语言的EXE文件中存在默认语言包也是这个道理(当然也可以使用 "String Table"资源类型);
2. 做为一些病毒/木马程序的寄生方式。如果不小心执行了带有病毒/木马的程序,它们会在你运行时释放出病毒/木马文件。当然许多病毒是将自身写入PE文件头来实现;
3. 合并EXE与它所需要的DLL文件。出于某些原因程序作者有时可能需要将DLL文件嵌入到可执行的EXE文件中,这可以通过使用自定义资源来实现;
4. 其它需要在程序中播放一个AVI动画等等,都可以通过将二进制的数据文件作为自定义资源加入到可执行文件中来实现;
二、添加
添加资源时选择自定义,IDE会为你生成一个新的二进制资源,然后你就可以将你已经存在的二进制文件作为自定义的资源类型导入到项目中来了。
三、使用
要使用自定义资源,我们可能要用到的几个API函数有FindResource、LoadResource和LockResource等,这里每一个函数的返回值分别作为下一个函数的参数,我来简要介绍一下。
1. FindResource用来在一个指定的模块中定位所指定的资源:
2. &nbs......
[ZT]怎样使用资源文件(2009-02-12 11:34:00)
摘要:下面介绍如何将光标和声音作为资源编译到可执行文件中,及其使用方法。
第一步:建立一个rc文件.
例如:zpg.rc,内容如下:
DemHint WAVE D:\zpg2000Res\DemHint.wav
PrintType BITMAP D:\zpg2000Res\PrintType.bmp
ArrowDown BITMAP D:\zpg2000Res\ArrowDown.bmp
ArrowUp BITMAP D:\zpg2000Res\ArrowUp.bmp
ZoomIn CURSOR D:\zpg2000Res\ZoomIn.cur
ZoomOut CURSOR D:\zpg2000Res\ZoomOut.cur
其中第一列为资源名称,第二列为资源类型,第三列为文件名.
第二步:编译这个文件.
>BRCC32 zpg.rc
BRCC32.exe 在.../borland/C++ Builder6/bin/目录下,
编译后生成一个资源文件zpg.res
第三步:在程序中声明对资源的使用
在程序中要用到这些资源的单元的#pragma resource "*.dfm"语句后前面添上
#pragma resource "zpg.res"
有时还需添上#pragma package(smart_init)
或在工程主CPP文件中添上
USERES("Zpg.res");
最后怎样调用这个资源呢?看:
调用位图:
Graphics::TBitmap *pBitmap=new Graphics::TBitmap;
pBitmap->LoadFromResourceName((unsigned int)HInstance,"PrintType");
播放声音:
PlaySound("DemHint",HInstance,SND_RESOURCE);
改变光标:
Screen->Cursors[crZoomIn......
用VC++MFC做文本编辑器(单文档模式)(2007-07-06 17:06:00)
摘要:原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下:
1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默认完成。
2,在系统自动生成的CTextview_1Doc类里面增加一个控件,用于文本文档的暂时存放:
class CTextview_1Doc : public CDocument
{
......
public:
CStringArray m_strContent;
}
然后在CTextview_1Doc类的Serialize函数里面增加打开、保存文本文件的程序:
void CTextview_1Doc::Serialize(CArchive& ar)
{
CString str;
if (ar.IsStoring())
{
// TODO: add storing code here
int nLines = (int)m_strContent.GetSize();
for ( int i=0; i<nLines; i++ )
{
str = m_strContent.GetAt( i );
ar.WriteString( str ); // 将字符串集合类对象中文本保存到硬盘
}
}
else
{
// TODO: add loading code here
while ( ar.ReadString( str ) )
{
m_strContent.Add( str ); // 将行文本添加到字符串集合类对象中
&......
C++中typedef关键字的用法 [zt](2007-05-25 15:51:00)
摘要:(http://blog.sina.com.cn/u/4862c01601000665 )
Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮。
typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。
如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?
使用 typedefs 为现有类型创建同义字。定义易于记忆的类型名
typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右边。例如:typedef int size;
此声明定义了一个 int 的同义字,名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用
size:void measure(size * psz);
size array[4];
size len = file.getlength();
std::vector <si......
C++中的i++和++i的问题(2007-05-25 13:49:00)
摘要:搞了半天区分不明白,现在总算知道一点了,记录下来。
main()
{
int i=1,k;
k=i++;
printf("k=%d,i=%d\n",k,i) ;
i=1;
k=++i;
printf("k=%d,i=%d\n",k,i) ;
i=1;
i=i++ ;
printf("i=%d\n",i) ;
i=1;
&nb......
关于使用ifstream读取文件的一个问题及其解决(2007-02-05 10:43:00)
摘要:今天在用vC++编写一个文件操作时发现一个问题,原来程序如下:
//LLK.h
class CLLK {
public:
CLLK();
virtual ~CLLK();
BOOL LoadMap(const char *path);
}
//LLK.cpp
#include <fstream>
using namespace std;
BOOL CLLK::LoadMap(const char *path)
{
ifstream fin(path, ios::in);//
if (!fin)
return FALSE;
...
return TRUE;
}
编译时出现以下错误:
--------------------Configuration: Game - Win32 Release--------------------
Compiling...
Game.cpp
GameView.cpp
LLK.cpp
D:\game\LLK.cpp(914) : error C2079: 'fin' uses undefined class 'basic_ifstream<char,struct std::char_traits<char> >'
D:\game\LLK.cpp(914) : error C2078: too many initializers
MainFrm.cpp
MapManager.cpp
Generating Code...
Error executing cl.exe.
Creating browse info file...
Game.exe - 2 error(s), 1 warning(s)
在网上查找半天,都说是因为缺少“#include <fstream>”之故,但是我明明已经在LLK.cpp一开头就加上了啊?
后来终于发现,把它转移到LLK.h的开头,问题解决了。奇怪。......
[ZT]虚函数与多态性、纯虚函数(2007-01-31 10:04:00)
摘要:虚函数与多态性、纯虚函数
1.虚函数与多态性
因为鱼的呼吸是吐泡泡,和一般动物的呼吸不太一样,所以我们在fish类中重新定义breathe方法。程序代码如例2-16所示。
例2-16
#include <iostream.h>
class animal{
public:
void breathe(){ cout<<"animal breathe"<<endl; }};
class fish:public animal{
public:
void breathe(){ cout<<"fish bubble"<<endl; }};
void fn(animal *pAn){ pAn->breathe();}
void main(){
animal *pAn;
fish fh;
pAn=&fh;
fn(pAn);// 输出的结果应该是“animal breathe”
}
为什么输出的结果不是“fish bubble”呢?这是因为在我们将fish类的对象fh的地址赋给pAn时,C++编译器进行了类型转换,此时C++编译器认为变量pAn保存就是animal对象的地址。当在fn函数中执行pAn->breathe()时,调用的当然就是animal对象的breathe函数。
现在我们在animal类的breathe()方法前面加上一个virtual关键字,结果如例2-17所示。
例2-17
#include <iostream.h>
class animal{
public:
//用virtual关键字申明的函数叫做虚函数
virtual void breathe(){ cout<<"animal breathe"<<endl; }};
class fish:public animal{
public:
void breathe(){ cout<<"fish bub......
[ZT]VC++指针使用基础(2007-01-05 14:04:00)
摘要:概述
指针基本上和其它的变量一样,唯一的一点不同就是指针并不包含实际的数据,而是包含了一个指向内存位置的地址,你可以在这个地址找到某些信息。这是一个很重要的概念,并且许多程序或者思想都是将指针作为它们的设计基础,例如链表。
定义一个指针,需要在变量名之前添加一个星号。例如,下面的代码创建了指向整数的指针:
int* pNumberOne;
变量名的前缀“p”用来表示这个变量是一个指针。
pNumberOne=&some_number;
“&”标志读作“the address of(……的地址)”,作用是返回一个变量的内存地址,而不是这个变量本身。
如果希望由pNumberOne而使用some_number的值,可以用*pNumberOne。“*”读作“the memory location pointed to by(由……指向的内存位置)”,它用来取得指针所指向的值。不过指针声明的情况例外,如“int*pNumber”。 见下例:
#include
void main()
{
int nNumber;
int*pPointer;
nNumber= 15;
pPointer=&nNumber;
printf("nNumber is equal to:%d\n", nNumber); //=15
*pPointer= 25;
printf("nNumber is equal to:%d\n", nNumber); //=25
}
内存的动态分配
&nb......
[ZT]关于STL中的list,vector,deque队列容器(2007-01-03 11:42:00)
摘要:STL是 C++的ANSI/ISO 标准的一部分,可以用于所有C++语言编译器和所有平台(Windows/Unix/Linux..)。STL的同一版本在任意硬件配置下都是可用的;
STL 提供了大量的可复用软件组织。例如,程序员再也不用自己设计排序,搜索算法了,这些都已经是STL的一部分了。 使用STL编写的代码更容易修改和阅读,因为代码更短了,很多基础工作代码已经被组件化了。
STL 的组成
STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件。
容器(container):容器是数据在内存中组织的方法,例如,数组、堆栈、队列、链表或二叉树(不过这些都不是STL标准容器)。STL中的容器是一种存储T(Template)类型值的有限集合的数据结构,容器的内部实现一般是类。这些值可以是对象本身,如果数据类型T代表的是Class的话。
算法(algorithm):算法是应用在容器上以各种方法处理其内容的行为或功能。例如,有对容器内容排序、复制、检索和合并的算法。在STL中,算法是由模板函数表现的。这些函数不是容器类的成员函数。相反,它们是独立的函数。令人吃惊的特点之一就是其算法如此通用。不仅可以将其用于STL容器,而且可以用于普通的C++数组或任何其他应用程序指定的容器。
迭代器(iterator):一旦选定一种容器类型和数据行为(算法),那么剩下唯一要他做的就是用迭代器使其相互作用。可以把达代器看作一个指向容器中元素的普通指针。可以如递增一个指针那样递增迭代器,使其依次指向容器中每一个后继的元素。迭代器是STL的一个关键部分,因为它将算法和容器连在一起。
下面我将依次介绍STL的这三个主要组件。
容器
STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。
在本文中,我将介绍list,vector,deque等队列容器,和set和multisets,map和multimaps等关联容器,一共7......