??xml version="1.0" encoding="utf-8" standalone="yes"?>伊人久久大香线焦综合四虎,久久精品亚洲乱码伦伦中文 ,一级做a爰片久久毛片人呢http://www.shnenglu.com/geforcex/category/419.htmlzh-cnFri, 23 May 2008 18:52:33 GMTFri, 23 May 2008 18:52:33 GMT60BitBlt()双缓冲解军_象闪??http://www.shnenglu.com/geforcex/articles/12199.htmlgeforceXgeforceXSat, 09 Sep 2006 09:23:00 GMThttp://www.shnenglu.com/geforcex/articles/12199.htmlhttp://www.shnenglu.com/geforcex/comments/12199.htmlhttp://www.shnenglu.com/geforcex/articles/12199.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/12199.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/12199.html 
昄囑Ş如何避免闪烁Q如何提高显C效率是问得比较多的问题。而且多数为MFC的绘囑և数效率很低,L惛_求其它的解决Ҏ?br />MFC的绘图效率的不高但也不差,而且它的l图函数使用非常单,只要使用Ҏ得当Q再加上一些技巧,用MFC可以得到效率很高的绘囄序?br />我想我长期Q呵呵当然也只有2q多Q用MFCl图的经验谈谈我的一些观炏V?br />
1、显C的囑ŞZ么会闪烁Q?br />   我们的绘图过E大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏q显C时是由OnPaintq行调用的。当H口׃M原因需要重l时QL先用背景色将昄区清除,然后才调用OnPaintQ而背景色往往与绘囑ֆ容反差很大,q样在短旉内背景色与显C图形的交替出现Q得显C窗口看h在闪。如果将背景刯|成NULLQ这h论怎样重绘囑Ş都不会闪了。当Ӟq样做会使得H口的显CZؕ成一团,因ؓ重绘时没有背景色对原来绘制的囑Şq行清除Q而又叠加上了新的囑Ş。有的h会说Q闪烁是因ؓl图的速度太慢或者显C的囑Ş太复杂造成的,其实q样说ƈ不对Q绘囄昄速度寚w烁的影响不是Ҏ性的。例如在OnDraw(CDC *pDC)中这样写Q?br />pDC->MoveTo(0,0);
pDC->LineTo(100,100);
q个l图q程应该是非常简单、非常快了吧Q但是拉动窗口变化时q是会看见闪烁。其实从道理上讲Q画囄q程复杂越慢闪烁应该越,因ؓl图用的旉与用背景清除屏幕所q旉的比例越大h寚w烁的感觉会越不明显。比如:清楚屏幕旉?sl图旉也是?sQ这样在10s内的q箋重画中就要闪?ơ;如果清楚屏幕旉?s不变Q而绘图时间ؓ9sQ这?0s内的q箋重画只会闪烁一ơ。这个也可以试验Q在OnDraw(CDC *pDC)中这样写Q?br />for(int i=0;i<100000;i++)
{
pDC->MoveTo(0,i);
pDC->LineTo(1000,i);
}
呵呵Q程序有点变态,但是能说明问题?br />   说到q里可能又有说了Qؓ什么一个简单图形看h没有复杂囑Ş那么闪呢Q这是因为复杂图形占的面U大Q重L造成的反差比较大Q所以感觉上要闪得厉害一些,但是闪烁频率要低。那Z么动ȝ重画频率高,而看h却不闪?q里Q我p再次了,闪烁是什么?闪烁是反差Q反差越大,闪烁厉実뀂因为动ȝq箋两个帧之间的差异很小所以看h不闪。如果不信,可以在动ȝ每一帧中间加一张纯白的帧,不闪才怪呢?br />

2、如何避免闪?br />   在知道图形显C闪烁的原因之后Q对症下药就好办了。首先当然是LMFC提供的背景绘制过E了。实现的Ҏ很多Q?br />* 可以在窗口Ş成时l窗口的注册cȝ背景刷付NULL
* 也可以在形成以后修改背景
   static CBrush brush(RGB(255,0,0));
   SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);
* 要简单也可以重蝲OnEraseBkgnd(CDC* pDC)直接q回TRUE
   q样背景没有了,l果囑Ş昄的确不闪了,但是昄也象前面所说的一P变得一团ؕ。怎么办?q就要用到双~存的方法了。双~冲是除了在屏q上有图形进行显CZ外,在内存中也有囑Ş在绘制。我们可以把要显C的囑Ş先在内存中绘制好Q然后再一ơ性的内存中的图形按照一个点一个点地覆盖到屏幕上去Q这个过E非常快Q因为是非常规整的内存拷贝)。这样在内存中绘图时Q随便用什么反差大的背景色q行清除都不会闪Q因为看不见。当贴到屏幕上时Q因为内存中最l的囑Ş与屏q显C图形差别很(如果没有q动Q当然就没有差别Q,q样看v来就不会闪?br />

3、如何实现双~冲
   首先l出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:

CDC MemDC; //首先定义一个显C备对?br />CBitmap MemBitmap;//定义一个位囑֯?br />
//随后建立与屏q显C兼容的内存昄讑֤
MemDC.CreateCompatibleDC(NULL);
//q时q不能绘图,因ؓ没有地方?^_^
//下面建立一个与屏幕昄兼容的位图,至于位图的大嘛Q可以用H口的大?br />MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);

//位N入到内存显C备中
//只有选入了位囄内存昄讑֤才有地方l图Q画到指定的位图?br />CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

//先用背景色将位图清除q净Q这里我用的是白色作?br />//你也可以用自己应该用的颜?br />MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

//l图
MemDC.MoveTo(…?;
MemDC.LineTo(…?;

//内存中的图拯到屏q上q行昄
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

//l图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();

上面的注释应该很详尽了,废话׃多说了?br />

 



geforceX 2006-09-09 17:23 发表评论
]]>
VC 6操作技?/title><link>http://www.shnenglu.com/geforcex/articles/1844.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sat, 17 Dec 2005 05:36:00 GMT</pubDate><guid>http://www.shnenglu.com/geforcex/articles/1844.html</guid><wfw:comment>http://www.shnenglu.com/geforcex/comments/1844.html</wfw:comment><comments>http://www.shnenglu.com/geforcex/articles/1844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/geforcex/comments/commentRss/1844.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/geforcex/services/trackbacks/1844.html</trackback:ping><description><![CDATA[1.程序中的括h否匹?<BR> 把光标移动到需要检的括号Q如大括号{}、方括号[]、圆括号Q)和尖括号<>Q前面,键入快捷键“CtrlQ]”。如果括号匹配正,光标p到匹配的括号处,否则光标不移动,q且机箱喇叭q会发出一声警告声?<BR><BR>2.查看一个宏Q或变量、函敎ͼ的宏定义 <BR> 把光标移动到你想知道的一个宏上,比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的Go To Defition Of ?,如果没有建立Browse filesQ会出现提示对话框,定Q然后就会蟩到定义那些东西的地方?<BR><BR>3.格式化一Dؕ七八p的源代?<BR> 选中那段源代码,按ATL+F8?<BR><BR>4.在编辑状态下发现成员变量或函C能显C?<BR> 删除该项目扩展名?ncb文gQ重新打开该项目?<BR><BR>5.如何整理ClassView视图中大量的c?<BR> 可以在classview 视图中右键新建文件夹Qnew folderQ,再把h相近性质的类拖到对应的文件夹中,使整个视囄上去清晰明了. <BR><BR>6.定位预处理指?<BR>在源文g中定位光标到对称?if, #endif,使用Ctrl+K. <BR><BR>7.如何dpȝ中Lib到当前项?<BR> 在Project | Settings | Link | Object/library modulesQ输入Lib名称Q不同的Lib之间用空格格开. <BR><BR>8.如何dpȝ中的头文?.h)到当前项? <BR> #include <FILENAME.H />,告诉~译到VCpȝ目录L;使用#include "FileName.h"Q告诉编译在当前目录? <BR><BR>9.如何在Studio使用汇编调试 <BR> 在WorkBench的Debugger状态下按CTRL+F7. <BR><BR>10.怎样处理ClassZiard找不到的pȝ消息 <BR> 如果要在ClassWizard中处理WM_NCHITTEST{系l消息,请在ClassWizard中Class Info中Message filter改ؓWindow有? <BR><BR>11.如何q净的删除一个类 <BR> 先从Workspace中的FileView中删除对应的.h?cpp文g,再关闭项目,从实际的文g夹中删除对应?h?cpp文g?clw文g?<BR><BR>12.如果让控制台应用E序支持mfccd <BR> 可以在控制台应用E序中include 来引入mfc库,但是控制台应用程序缺省是单线E的Qmfc是多U程的,册矛盾Q在project setting->c/c++ 选项Q选择code generation,在use run-time library 下拉框中选择debug multithread?<BR><BR>13.如何汉化只有可执行代码的.exe 文g <BR> 在nt 下利用vc open file 以resources方式打开*.exe 文gQ直接修改资源文Ӟ然后保存卛_?<BR><BR>附:VC目文g说明 <BR>.opt 工程关于开发环境的参数文g。如工具条位|等信息Q?<BR><BR>.aps (AppStudio File),资源辅助文g,二进制格?一般不用去他. <BR><BR>.clw ClassWizard信息文g,实际上是INI文g的格?有兴可以研I一?有时候ClassWizard出问?手工修改CLW文g可以解决.如果此文件不存在的话,每次用ClassWizard的时候绘提示你是否重? <BR><BR>.dsp (DeveloperStudio Project):目文g,文本格式,不过不熟悉的话不要手工修?DSW(DeveloperStudio Workspace)是工作区文g,其他特点和DSP差不? <BR><BR>.plg 是编译信息文?~译时的error和warning信息文gQ实际上是一个html文gQ?一般用处不?在Tools->Options里面有个选项可以控制q个文g的生? <BR><BR>.hpj (Help Project)是生成帮助文件的工程,用microsfot  Help Compiler可以处理. <BR><BR>.mdp (Microsoft DevStudio Project)是旧版本的项目文?如果要打开此文件的?会提CZ是否转换成新的DSP格式. <BR><BR>.bsc 是用于浏览项目信息的,如果用Source Brower的话必Lq个文g.如果不用q个功能的话,可以在Project Options里面LGenerate Browse Info File,可以加快~译速度. <BR><BR>.map 是执行文件的映像信息U录文g,除非对系l底层非常熟?q个文g一般用不着. <BR><BR>.pch (Pre-Compiled File)是预~译文g,可以加快~译速度,但是文g非常? <BR><BR>.pdb (Program Database)记录了程序有关的一些数据和调试信息,在调试的时候可能有? <BR><BR>.exp 只有在编译DLL的时候才会生?记录了DLL文g中的一些信?一般也没什么用. <BR><BR>.ncb 无编译浏览文?no compile browser)。当自动完成功能出问题时可以删除此文件。build后会自动生成?<img src ="http://www.shnenglu.com/geforcex/aggbug/1844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/geforcex/" target="_blank">geforceX</a> 2005-12-17 13:36 <a href="http://www.shnenglu.com/geforcex/articles/1844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struct多种声明定义写法的小l?/title><link>http://www.shnenglu.com/geforcex/articles/1308.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Fri, 25 Nov 2005 07:04:00 GMT</pubDate><guid>http://www.shnenglu.com/geforcex/articles/1308.html</guid><wfw:comment>http://www.shnenglu.com/geforcex/comments/1308.html</wfw:comment><comments>http://www.shnenglu.com/geforcex/articles/1308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/geforcex/comments/commentRss/1308.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/geforcex/services/trackbacks/1308.html</trackback:ping><description><![CDATA[<P>详细讲解structq个Ҏh的写法的书是有的Q《C专家~程》中有详细的描q。可惜大家喜Ƣ问问题有甚于喜Ƣ看书,于是BBS上泛滥着前h早已l解冟뀁说明清楚的问题。哎Q中国勤学好问者的悲哀。这里简要说明一下structQؓ大家省钱?/P><PRE><DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_0_93_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_93_Open_Text.style.display='none'; Codehighlighter1_0_93_Closed_Image.style.display='inline'; Codehighlighter1_0_93_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_93_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_93_Closed_Text.style.display='none'; Codehighlighter1_0_93_Open_Image.style.display='inline'; Codehighlighter1_0_93_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_93_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_93_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"> struct.c<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>*  本程序演CZstruct的种U写法。注意,所有这些写法都能编译通过<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>*  author: smileonce<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>*  date  : 2005-01-14<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> q种写法是最要命的,但是它却可以通过, 最后面那个foo是结构体的实?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">struct</SPAN><SPAN style="COLOR: #000000"> foo<BR><IMG id=Codehighlighter1_147_162_Open_Image onclick="this.style.display='none'; Codehighlighter1_147_162_Open_Text.style.display='none'; Codehighlighter1_147_162_Closed_Image.style.display='inline'; Codehighlighter1_147_162_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_147_162_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_162_Closed_Text.style.display='none'; Codehighlighter1_147_162_Open_Image.style.display='inline'; Codehighlighter1_147_162_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_147_162_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_147_162_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>    </SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> foo;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> foo;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> 有了typedefQ意义明显与上面不同Q注意的是struct后面那个标签可以不写Q最后面那个bar是匿名结构体的别?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">typedef </SPAN><SPAN style="COLOR: #0000ff">struct</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_248_263_Open_Image onclick="this.style.display='none'; Codehighlighter1_248_263_Open_Text.style.display='none'; Codehighlighter1_248_263_Closed_Image.style.display='inline'; Codehighlighter1_248_263_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_248_263_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_248_263_Closed_Text.style.display='none'; Codehighlighter1_248_263_Open_Image.style.display='inline'; Codehighlighter1_248_263_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_248_263_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_248_263_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>    </SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> bar;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> bar;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> q种写法是最没h用的Q因为它的定义是一ơ性的,struct1是一个匿名struct的实?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">struct</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_327_342_Open_Image onclick="this.style.display='none'; Codehighlighter1_327_342_Open_Text.style.display='none'; Codehighlighter1_327_342_Closed_Image.style.display='inline'; Codehighlighter1_327_342_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_327_342_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_327_342_Closed_Text.style.display='none'; Codehighlighter1_327_342_Open_Image.style.display='inline'; Codehighlighter1_327_342_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_327_342_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_327_342_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>    </SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> aaa;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> mystruct1;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">最常用的写法,清晰不言自明Qmy_struct_tag是结构体标签Qmy_struct_type是struct my_struct_tag的别?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">typedef </SPAN><SPAN style="COLOR: #0000ff">struct</SPAN><SPAN style="COLOR: #000000"> my_struct_tag<BR><IMG id=Codehighlighter1_460_475_Open_Image onclick="this.style.display='none'; Codehighlighter1_460_475_Open_Text.style.display='none'; Codehighlighter1_460_475_Closed_Image.style.display='inline'; Codehighlighter1_460_475_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_460_475_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_460_475_Closed_Text.style.display='none'; Codehighlighter1_460_475_Open_Image.style.display='inline'; Codehighlighter1_460_475_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_460_475_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_460_475_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>    </SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> aaa;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> my_struct_type;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> 下面两种定义的写法都可以Q当然用typedef定义的写法更z些</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">my_struct_type mystruct2;             </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">通过typedef定义的结构别名来定义变量</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">struct</SPAN><SPAN style="COLOR: #000000"> my_struct_tag mystruct3;       </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">通过l构标签定义变量</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> main(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> argc, </SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">argv[])<BR><IMG id=Codehighlighter1_679_692_Open_Image onclick="this.style.display='none'; Codehighlighter1_679_692_Open_Text.style.display='none'; Codehighlighter1_679_692_Closed_Image.style.display='inline'; Codehighlighter1_679_692_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_679_692_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_679_692_Closed_Text.style.display='none'; Codehighlighter1_679_692_Open_Image.style.display='inline'; Codehighlighter1_679_692_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_679_692_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_679_692_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top> </SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></PRE> <P>-------------</P><img src ="http://www.shnenglu.com/geforcex/aggbug/1308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/geforcex/" target="_blank">geforceX</a> 2005-11-25 15:04 <a href="http://www.shnenglu.com/geforcex/articles/1308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C++中ؓ普通程序添加ODBC应用http://www.shnenglu.com/geforcex/articles/1288.htmlgeforceXgeforceXThu, 24 Nov 2005 05:42:00 GMThttp://www.shnenglu.com/geforcex/articles/1288.htmlhttp://www.shnenglu.com/geforcex/comments/1288.htmlhttp://www.shnenglu.com/geforcex/articles/1288.html#Feedback0http://www.shnenglu.com/geforcex/comments/commentRss/1288.htmlhttp://www.shnenglu.com/geforcex/services/trackbacks/1288.html
  数据库属于最行的应用程序之一Q几乎每个商业部门都使用数据库来记录、管理各U各L数据。在VC下我们可以在创徏工程旉择数据库支持,q定数据源和相关的表Qƈ选择CRecordView作ؓ我们q个E序的基c,q样做可以毫不费力的应用程序和数据库徏立了兌Q而几乎不用编什么代码,但这样做的前提是在新建工E时已明知道用到哪个数据库Qƈ且有相关的数据库。事实上我们往往有许多已做好的应用程序和c,其功能除了未和数据源建立兌外以基本满要求Q我们只要在其基上添加ODBC接口Q之与数据库徏立关联即可,q样做避免了与数据库无关部分代码的重新编写所造成的重复性操作,大大提高了代码的重用性和利用率。所以在普通程序上通过dODBC应用而与数据库徏立关联的Ҏ是完全行之有效的?BR>
  二?ODBC技?BR>
  ODBCQOpen Database Conectivity 开攑ּ数据库互联)技术,作ؓMicrosoft公司Ҏ据库q行讉K的标准应用程序接?API)和Windows开攑ּ服务体系l构OSA的一个重要组成部分已qؓ众多的WindowsE序员所熟悉、认可。ODBC的工作依赖于数据库制造商提供的驱动程序,使用ODBC API的时候,Windows的ODBC理E序Q把数据库访问的h传递给正确的驱动程序,驱动E序再用SQL语句指示DBMS完成数据库访问工作,因此QODBC的存在ؓ我们开发应用数据库E序提供了非常强大的能力和灵zL?

  三?E序CZ

  (一)打开Visual C++Q在"File"菜单上点?New?Q然后在弹出?New"对话框中选定"MFC AppWizard(exe)"cȝ目Q?Project name"为NormalQ按下OK键,下一Step 1屏幕中?Single document"单文档支持,用到后面的选项除在最后一步选择"CFormView"作ؓ本工E视cȝ基类外均为确省|此时卛_按下Finish键,l果pȝ生成一个新的项目Normal?BR>
  我们将此工E当做原有的工程Q接下来我们便在此工E基上对其添加ODBC应用Q该工E能同数据源建立兌Q能Ҏ据库中的数据q行操作和管理?BR>
  (?打开"控制面板"上的"ODBC (32bits)"Q对数据源进行注册。ؓ了ODBC能与数据库一起工作,必L数据库注册到ODBC驱动E序理器,q项工作可以通过定义一个DSN或数据源名字来完成。在弹出?ODBC数据源管理器"中选择"User DSN"属性页Q点?Add?按钮。选择"Microsoft Access Driver(*.mdb)"作ؓ数据源的驱动器,点击"完成"按钮。在弹出?ODBC Microsoft Access 97 Setup"对话框中?Data Source Name:"栏添入RP97,"Description:"栏只h释说明的作用Q可以不填,然后点击"Select?按钮Q选择所要注册的数据源,然后点击"OK"完成了Ҏ据源的注册,到这一步,本机上的LE序只要通过ODBC接口和数据源?RP97"p完成Ҏ据库的访问了?BR>
  (?在VC?Workspace"zdH口中选择"FileView"属性页Q打开标准框架头文?StdAfx.h",q在最后一?include后面d?afxdb.h"的引用:#include <afxdb.h>

  (? ?Workspace"zdH口中选择"ClassView"属性页Q在"Normal Classes"上右键,?New Class?,在弹出的"New Class"对话框的"Base Class"栏选择"CRecordSet"做ؓ新添加的cȝ基类Q在"Name"栏填写类?CODBCSet",点击"OK"Q在随后弹出的对话框?ODBC"栏选择刚注册的"RP97"数据源,点击"OK"后选择该数据库的一个表Q点?OK"?ClassView"里就多了一个以CRecordSet为基cȝ新类"CODBCSet"。下面三个函数完成了数据库各U元素的l定工作Q?BR>
CString CODBCSet::GetDefaultConnect()
{
 
return _T("ODBC;DSN=RP97");
}


CString CODBCSet::GetDefaultSQL()
{
 
return _T("[单据表]");
}


void CODBCSet::DoFieldExchange(CFieldExchange* pFX)
{
 
//{{AFX_FIELD_MAP(CODBCSet)
 pFX->SetFieldType(CFieldExchange::outputColumn);
 RFX_Text(pFX, _T(
"[单据ID]"), m_column1);
 RFX_Text(pFX, _T(
"[单据名称]"), m_column2);
 RFX_Text(pFX, _T(
"[报帐人]"), m_column3);
 
//}}AFX_FIELD_MAP
}
 

  (?按同LҎ再添加一个基?generic CWnd"的新c?CConnectDB"。在该类的源文g里添加对"ODBCSet.h"的引用:#include "ODBCSet.h"。在该类的头文g?class CconnectDB"前添加class CODBCSetQƈ在该c里d公有型成员变量和函数Q?BR>
CDatabase m_dbData;
CODBCSet
* m_pSet;
void CConnectDB::Initial()
{
 
//打开数据源RP97
 CString os=_T("odbc; dsn=RP97");
 m_dbData.Open(NULL,FALSE,FALSE,
0);
 m_pSet
=new CODBCSet(&m_dbData);
 
//通过SQLl构化查询语a打开RP97里的单据?/SPAN>
 CString sql="SELECT * FROM 单据?/SPAN>";
 m_pSet
->Open(AFX_DB_USE_DEFAULT_TYPE,sql);
}



  (?在Form上添加一?试"按钮及其响应函数OnTest()Q?BR>
void CNormalView::OnTest() 
{
 CConnectDB connectDB;
 
//执行完Initial()后m_pSet指针才不为空Q方可安全用?/SPAN>
 connectDB.Initial();
 
if(connectDB.m_pSet==NULL)
  
return;
 connectDB.m_pSet
->MoveFirst();
 CString str
=connectDB.m_pSet->m_column3;
 AfxMessageBox(str);
}
 

  最后在该文件开始处d两个引用Q?BR>

#include 
"ConnectDB.h"
#include 
"ODBCSet.h" 

  四?q行与测?BR>
  ~译q行E序Q点?试"按钮Q就会将"RP97"数据库的"单据?的第一条记录的"报帐?字段所在的内容通过对话框弹出来?BR>
  结Q?BR>
  本程序的关键在于Ҏ据库指针m_pSet的获取,当类CConnectDB 的成员函数Initial()被执行完Ӟm_pSet已被获取到了,而在此之前该指针是空的,是不能用的Q所以在实际应用中必M证在使用m_pSet之前调用q函数Initial()。当m_pSet被获取到之后Q就可以惛_他ODBC应用E序一样用CrecordSetc里的各U函数对数据库进行各U需要的操作和管理了?

geforceX 2005-11-24 13:42 发表评论
]]>
þþƷ99Ӱ | ŷ˾þþƷ| þùҹƷһ| þþƷɫ鶹| þӰԺҹƬ | һһþۺϺݺ| þþƷ| ŷƷ˾þ| Ժձһձþ | ĻƷѾþþ| ŷ˾þۺ| ۺҹҹþ| 88þþƷһëƬ | þõӰ2021| þþþAVƬ | ŷҹƷþþþ| AVӰƬþþþþ| AëƬþþþƷëƬ| Ů㽶þ**ëƬƷ| ɫ͵͵þһ| ޾ƷNVþþþþþþþ| þۺ| ˾þþƷ鶹| þݺҹҹ| þѸƵ| 99ƷȾþ޶| ɫɫۺϾþҹҹ| Ʒþþþһ| ɫվþþþۺywww| yy6080þ| ӰȷŮAV³ɫԴþ| þþþһëþþ| Ʒݾþþþø| þۺϾɫۺ97_þþ| 97þþþ| þþƷѿ޹AV| ޾ƷŮþþ| Ӱ7777þþƷ| þþƷAVȫ| 99þ99þ| þþƷһ|