⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vc++50编程经验.htm

📁 VC的一些技巧性文档
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80"><meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0"><meta NAME="GENERATOR" CONTENT="Mozilla/4.07 [en] (Win95; I) [Netscape]"><title>VC++5</title></head><body LINK="#0000FF" VLINK="#800080"><!-- FC HP BN1 START --><!-- Please do not remove the line above or the code within this section --><!-- Doing so may cause damage to your pages or insertion of multiple banners--><center><p><table border="0" cellspacing="0" cellpadding="0"><tr><td colspan="11"><img src="http://www.fortunecity.com/console2/newnav/top.gif" height="7" width="555"></td></tr><tr><td><img src="http://www.fortunecity.com/console2/newnav/left.gif" alt="FC Navigation Console" height="60" width="72" border="0" usemap="#fcleft"><map name="fcleft"><area shape="rect" coords="10,43,64,60" href="http://www2.fortunecity.com/cgi-bin/homepage/estate.pl?referer=navbar" target="_top"><area shape="rect" coords="9,21,61,36" href="http://www2.fortunecity.com/cgi-bin/showarea.pl?area=skyscraper&referer=navbar" target="_top"><area shape="rect" coords="8,0,62,15" href="http://www.fortunecity.com" target="_top"><area shape="rect" href="http://www.fortunecity.com" target="_top" coords="0,0,49,49"></map></td><td colspan="9"><A HREF="http://ad.doubleclick.net/jump/fc.us468/member/tech;s1=m;s3=tech;pos=1;tag=g;sz=468x60;mtile=1;num=17224?"><IMG SRC="http://ad.doubleclick.net/ad/fc.us468/member/tech;s1=m;s3=tech;pos=1;tag=g;sz=468x60;mtile=1;num=17224?" border=0 height="60" width="468"></A></td><td><img src="http://www.fortunecity.com/console2/newnav/right.gif" width="15" height="60"></td></tr><tr><td><img src="http://www.fortunecity.com/console2/newnav/left2.gif" height="31" width="72" target="_top"></td><td><img src="http://www.fortunecity.com/console2/newnav/gap1.gif" width="17" height="31"></td><td><a href="http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/FortuneCitycom/NavBar1/17224" target="_top"><img src="http://adex3.flycast.com/server/socket/127.0.0.1:2800/ad/FortuneCitycom/NavBar1/17224" border="0" width="88" height="31"></a></td><td><img src="http://www.fortunecity.com/console2/newnav/gap2.gif" width="24" height="31"></td><td><a href="http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/FortuneCitycom/NavBar2/17224" target="_top"><img src="http://adex3.flycast.com/server/socket/127.0.0.1:2800/ad/FortuneCitycom/NavBar2/17224" border="0" width="88" height="31"></a></td><td><img src="http://www.fortunecity.com/console2/newnav/gap3.gif" width="24" height="31"></td><td><a href="http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/FortuneCitycom/NavBar3/17224" target="_top"><img src="http://adex3.flycast.com/server/socket/127.0.0.1:2800/ad/FortuneCitycom/NavBar3/17224" border="0" width="88" height="31"></a></td><td><img src="http://www.fortunecity.com/console2/newnav/gap4.gif" width="19" height="31"></td><td><a href="http://www2.fortunecity.com/cgi-bin/homepage/navbarforward.cgi?from=nav4&referer=navbare" target="_top"><img src="http://www.fortunecity.com/console2/newnav/button4.gif" border="0" width="88" height="31"></a></td><td><img src="http://www.fortunecity.com/console2/newnav/gap5.gif" width="32" height="31"></td><td><img src="http://www.fortunecity.com/console2/newnav/right2.gif" width="15" height="31"></td></tr></table></p></center><!-- WARNING: under no circumstances remove the line below.  Doing so may damage your page.--><!-- FC HP BN1 END --><h2 align="center"><font size="5"><font FACE="Arial">VC++5.0</font><font FACE="楷体_GB2312">编程经验</font></font></h2><p align="center"><big><br></big>●高攀 李清 </p><p ALIGN="CENTER"><font face="黑体" lang="ZH-CN" size="4">回到<a href="../chinese.htm">中文教材</a></font></p><p><font size="3">Visual C++5.0<font FACE="楷体_GB2312">以其强大的可视化开发功能而深得软件编程人员的青睐,笔者在实际开发过程中积累了一些经验,仅供参考。</font></font><big> </big></p><h4 align="center"><font FACE="楷体_GB2312" size="3">一、将应用程序调用的外部数据文件集成到程序可执行文件中</font><big> </big></h4><p><font FACE="楷体_GB2312" size="3">我们知道,</font><font FACE="System,黑体" size="3">Windows</font><font FACE="楷体_GB2312" size="3">应用程序中包括执行代码和程序资源两部分。例如,应用程序的位图、图标、对话框、自串表等都被存储在应用程序资源中。对于处于应用程序外部的多个小数据文件,一方面容易丢失从而将造成程序出错,另一方面也存在安全性和保密性不强等弊端。因此,可考虑将其集成到程序可执行文件中,这样还可以加快数据的读取速度。</font><big> </big></p><p><font FACE="楷体_GB2312" size="3">实现这种功能有两个关键步骤:首先,将这些文件作为程序资源放进资源文件中;然后,在程序执行数据文件加载时,从资源内存中读取这些文件。</font><big> </big></p><p><font FACE="楷体_GB2312" size="3">1、将数据文件加到资源文件中</font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">(1)首先用文本编辑器(记事本、写字板等)打开资源文件,即带有</font>rc<font FACE="楷体_GB2312">扩展名的文件(注意:此处只能用文本编辑器打开,因为在</font>Visual C++5.0<font FACE="楷体_GB2312">的资源编辑器中不支持除加速键、位图、对话框、光标、图标、菜单、工具条、串标、版本信息等标准资源外的非标准资源的插入。为安全起见,在进行下属操作时要先备份资源文件),然后添加如下代码:</font></font><big> </big></p><p><font size="3">//</font><big> </big></p><p><font size="3">IDR_DATA0 DATA DISCARDABLE “res\\data0.dat”</font><big> <br></big><font size="3">IDR_DATA1 DATA DISCARDABLE “res\\data1.dat”</font><big> <br></big><font size="3">IDR_DATA2 DATA DISCARDABLE “res\\data2.dat”</font><big> <br></big><font size="3">IDR_DATA3 DATA DISCARDABLE “res\\data3.dat”</font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">上述资源文件代码中:</font>IDR_DATA0<font FACE="楷体_GB2312">为数据文件的资源</font>ID<font FACE="楷体_GB2312">号,</font>DATA<font FACE="楷体_GB2312">为资源类名,</font>DISCARDABLE<font FACE="楷体_GB2312">标识该资源是可抛弃型的,而</font>”res\\data0.dat”<font FACE="楷体_GB2312">表示数据文件</font>data0.dat<font FACE="楷体_GB2312">处于当前工程文件所处文件夹下的</font>res<font FACE="楷体_GB2312">子文件夹中,供应用程序编译连接时加载数据用。不要改动其他的地方,保存文件并退出。</font></font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">(</font>2<font FACE="楷体_GB2312">)然后在</font>Visual C++5.0<font FACE="楷体_GB2312">的资源编辑器中打开资源文件,将能看到以“</font>DATA<font FACE="楷体_GB2312">”表示的资源文件下面有四项,分别以“</font>IDR_DATA0<font FACE="楷体_GB2312">”、</font>……<font FACE="楷体_GB2312">、“</font>IDR_DATA3<font FACE="楷体_GB2312">”等标识。用鼠标任意单击它们,就会看到相应的二进制数据显示出来。为了在程序中应用这些</font>ID<font FACE="楷体_GB2312">号,还必须进一步修改。方法是:选择“</font>IDR<font FACE="楷体_GB2312">&amp;#0;</font>DATA0<font FACE="楷体_GB2312">”,单击鼠标右键,在谈出的快捷菜单中选择属性页(</font>porperties<font FACE="楷体_GB2312">),将</font>ID<font FACE="楷体_GB2312">名称修改为</font>IDR_DATA0<font FACE="楷体_GB2312">(即去掉双引号)。其他依此类推。</font></font><big> </big></p><p><font size="3">2<font FACE="楷体_GB2312">、从资源内存块读取数据</font></font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">读取数据的关键在于:首先要获得具有所需资源</font>ID<font FACE="楷体_GB2312">号的资源内存块地址指针,然后根据不同的数据类型对地址指针进行强制类型转换。</font></font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">获得具有所需资源</font>ID<font FACE="楷体_GB2312">号的内存块地址指针主要包括以下几个步骤:</font></font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">(</font>1<font FACE="楷体_GB2312">)首先获取当前应用程序</font>.EXE<font FACE="楷体_GB2312">的文件句柄,该句柄用于在</font>.EXE<font FACE="楷体_GB2312">文件中寻找资源:</font></font><big> <br></big><font size="3">HMODULE ghmodule=GetModuleHnadle(NULL);</font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">(</font>2<font FACE="楷体_GB2312">)接着用以上获得的应用程序文件句柄</font>ghmodule<font FACE="楷体_GB2312">作为参数之一来寻找具有指定资源</font>ID<font FACE="楷体_GB2312">和指定资源类型的资源文件中的资源位置,返回值为有名称的资源:</font></font><big> <br></big><font size="3">HRSRC hr=FindResource(ghmodule,MAKEINTRESOURCE(resourseID),”PLANE”);</font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">(</font>3<font FACE="楷体_GB2312">)然后从</font>ghmodule<font FACE="楷体_GB2312">标识的可执行文件中装入</font>hr<font FACE="楷体_GB2312">所指定的资源,该函数返回值标识了用于接受资源数据的全局数据块:</font></font><big> <br></big><font size="3">HGLOBAL hg=LoadResource(ghmodule,hr);</font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">(</font>4<font FACE="楷体_GB2312">)最后锁定</font>hg<font FACE="楷体_GB2312">所标定的内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:</font></font><big> <br></big><font size="3">LPVOID pv=(PSZ)LockResource(hg)</font><big> </big></p><p><font FACE="楷体_GB2312" size="3">注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。</font><big> </big></p><p><font size="3"><font FACE="楷体_GB2312">相应的代码如下所示,其中</font>pv<font FACE="楷体_GB2312">指针指向内存块的第一个字节,为单字节指针。因此,应该根据数据文件的类型结构对指针进行强制类型转换,并不断修改指针,使其指向下一个待读的数据单元。</font></font><big> </big></p><p align="center"><font size="3">BOOL LoadDataFromResource(WORD resourceID)</font><big> <br></big><font size="3">{</font><big> <br></big><font size="3">HMODULE ghmodule=GetModuleHandle(NULL);</font><big> <br></big><font size="3">HRSRC hr=FindResource(ghmodule,MAKEINTRESOURCE(resourceID),&quot;DATA&quot;);</font><big> <br></big><font size="3">return FALSE;</font><big> <br></big><font size="3">HGLOBAL hg=LoadResource(ghmodule,hr);</font><big> <br></big><font size="3">if(hg==NULL)</font><big> <br></big><font size="3">{</font><big> <br></big><font size="3">FreeResource(hr);</font><big> <br></big><font size="3">return FALSE;</font><big> <br></big><font size="3">}</font><big> <br></big><font size="3">LPVOID pv=(PSZ)LockResource(hg);</font><big> <br></big><font size="3">//pv指向内存块的第一个字节,为单字节指针</font><big> <br></big><font size="3">if(pv==NULL)</font><big> <br></big><font size="3">{</font><big> <br></big><font size="3">FreeResource(hr);</font><big> <br></big><font size="3">return FALSE;</font><big> <br></big><font size="3">}</font><big> <br></big><font size="3">//Read data from resource(memmory block)</font><big> <br></big><font size="3">int num;</font><big> <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -