<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[Programming&nbsp;C/C++]]></title>
<link>http://blog.pfan.cn/programming</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[SVN版本控制软件使用手记[原创]－－前言：一定要管理好你的源程序]]></title>
		<link>http://blog.pfan.cn/programming/24293.html</link>
		<description><![CDATA[毕业两年了，辗转过几家公司，都是程序员的干活。下面是各公司对源程序的管理方式对比，&nbsp;
PS：实际上这些是目前大多数程序公司的做法汇总，并没有涉及到什么商业秘密
个人感触对比
SVN会建立一个Repository（资源仓库），用压缩方法保存所有的代码文件（实际上可以保存任意的文件，在这里只以源代码来进行说明），并会记录所有的修改，因此你可以从中获取到任意版本的文件，可以查询到任意修改记录等等。
我在C公司里接触到SVN这个版本控制软件,第一次使用时就开始感叹此物的巧妙。随后发现她居然是免费的，遂决定在自己的电脑上也装装，以管理自己的那些垃圾代码。
首先要做的就是安装相应的软件：如果只是为了在本地使用，则不需要安装服务器端的软件。但本这学习的态度和做网络管理员的兴趣，我还是选择安装了通常在网络环境下所需软件。包括有：Apache web server 2.0.59;&nbsp;&nbsp;==在服务器端提供诸如http://等协议的网络服务，在官方网站http://httpd.apache.org 上有下载，安装在服务器端。虽然最新版本已经到了2.2.4以上，但SVN在安装时不能自动识别该版本，所以建议还是使用同样稳定的旧版本，以后比较了解的时候再更新也不迟。SVN 1.4.2;&nbsp;&nbsp;&nbsp;&nbsp;==建立在网络服务之上的应用程序，即我们最需要的版本控制软件Subversion，同样在官网http://subversion.tigris.org上有下载，此软件既是客户端又是服务器端，故两端都要安装。自己用当然只装一次就可以了。TortoiseSVN 1.4.3;&nbsp;&nbsp;&nbsp;==将SVN单调的命令行功能集成到Windows的文件浏览器和右键中，使用方便无比。再同样的，在官网http://tortoisesvn.tigris.org 上有下载，两端都安装。以下是安装步骤的说明，非菜鸟看了不要嘲笑啊。依次安装Apache，SVN和TortoiseSVN当Apache 安装到下面的画面时，填写的似乎只是一些用来记录的信息，Apache可能会将这些显示在访问失败时的网页中，并不会有实际的意义。安装完之后会提示重新启动。
接下来在IE地址栏输入http://localhost测试一下，能出现下面的类似画面表示]]></description>
		<author><![CDATA[formyprogram]]></author>
		<pubDate>2007-03-25 22:19:00</pubDate>
		</item>
				<item>
		<title><![CDATA[排序CStringArray类[网络资料收集]]]></title>
		<link>http://blog.pfan.cn/programming/22338.html</link>
		<description><![CDATA[举例：&nbsp;&nbsp;&nbsp; CSortStringArray sortArray;
&nbsp;&nbsp; sortArray.Add(CString("Zebra\r\n"));&nbsp;&nbsp; sortArray.Add(CString("Bat\r\n"));&nbsp;&nbsp; sortArray.Add(CString("Apple\r\n"));&nbsp;&nbsp; sortArray.Add(CString("Mango\r\n"));
&nbsp;&nbsp; sortArray.Sort();
/*************************************************************************/
// CSortStringArray.cpp: implementation of the CSortStringArray class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "CSortStringArray.h"
void CSortStringArray::Sort(){&nbsp;&nbsp; BOOL bNotDone = TRUE;
&nbsp;&nbsp; while (bNotDone)&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bNotDone = FALSE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int pos = 0;pos &lt; GetUpperBound();pos++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bNotDone |= CompareAndSwap(pos);&nbsp;&nbsp; }&nbsp;&nbsp; return;}
BOOL CSortStringArray::CompareAndSwap(int pos){&nbsp;&nbsp; CString temp;&nbsp;&nbsp; int posFirst]]></description>
		<author><![CDATA[formyprogram]]></author>
		<pubDate>2007-01-07 22:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[打开目录对话框类[网络资料收集]]]></title>
		<link>http://blog.pfan.cn/programming/22334.html</link>
		<description><![CDATA[举例：&nbsp;CFoldersDialog cFolderDlg;&nbsp;cFolderDlg.BrowseFolder(m_hWnd,&amp;m_strDirPath,_T("请选择文件夹"));浏览文件夹的对话框会显示“请选择文件夹”提示字符，确定之后的文件夹路径会返回到m_strDirPath中，取消后不返回。
// FoldersDialog.cpp: implementation of the CFoldersDialog class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "FoldersDialog.h"
//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////
CFoldersDialog::CFoldersDialog(){
}
CFoldersDialog::~CFoldersDialog(){
}
&nbsp;
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData) {&nbsp;switch(uMsg) &nbsp;{
&nbsp;&nbsp;case BFFM_INITIALIZED: &nbsp;&nbsp;&nbsp;::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;}
&nbsp;return&nbsp;0;}
int CFoldersDialog::BrowseFolder(HWND hWnd, CString* pBrowsePath, LPS]]></description>
		<author><![CDATA[formyprogram]]></author>
		<pubDate>2007-01-07 20:19:00</pubDate>
		</item>
				<item>
		<title><![CDATA[避免重定义（redefinition）错误[总结]]]></title>
		<link>http://blog.pfan.cn/programming/21658.html</link>
		<description><![CDATA[在一段时间的编程中，时常会遇到重定义（redefinition）问题。一般都是#include在包含头.h文件时出现了重复包含的关系。运气好的话可以比较容易的发现问题，运气不好的话只好列出所有的头文件.h中的包含关系，挨个检查是哪里出了问题。最近发现如果遵循“在头文件.h中不再包含头文件.h”的原则，可以从根本上避免这个问题。虽然这样做会使得在代码文件.c或.cpp中必须各自包含进来所需的头文件.h，还要注意在包含时可能会存在顺序的问题，但这比起查找何处进行了重定义来说简单了许多，也使包含关系更加清晰。
对原来的项目中的所有文件按上述原则进行了修改，暂未发现不良影响，感觉还不错。]]></description>
		<author><![CDATA[formyprogram]]></author>
		<pubDate>2006-12-17 15:51:00</pubDate>
		</item>
				<item>
		<title><![CDATA[OSD仿真_MFC程序01[原创]]]></title>
		<link>http://blog.pfan.cn/programming/21265.html</link>
		<description><![CDATA[Windows系统具有强大的绘图功能，可以用来模拟OSD显示。接下来将设计一个简单的模拟显示终端的程序，用于后续显示功能和菜单系统的开发。说明一下，对于Windows下的MFC编程我不怎么了解，只知道一些皮毛东西，所以望大家能指出其中的不足和错误。另外，这次开发的最终目标是建立一个可以移植的菜单系统，所以重点是模拟器端的运行情况而不是Windows程序的运行效率。
为了能比较真实的模拟显示内存（OSD Buffer）到显示终端的过程，用一个和显存等大的数组来模拟OSD Buffer，用一个和显示终端等大小的控件作为模拟显示，用一个和色板等大的数组来模拟硬件色板。相应的变量为：BYTE OSDBuffer[OSD_BUFFER_LENGTH];m_staEmuDisplay;COLORREF OSDPalette[OSD_COLORNUMBER];
步骤参考如下：1、建立一个基于对话框的MFC工程；2、添加一个静态文本框，ID为IDC_STATIC_EmuDisplay，对应的Static变量为m_staEmuDisplay；3、更新模拟终端的显示与Windows程序自身的重绘显示相互独立处理，故定义一个和静态文本框兼容的成员CDC变量m_cdcEmuDisplay，在OnInitDialog()中进行初始化：&nbsp;CBitmap&nbsp;cBitmap;&nbsp;CPaintDC&nbsp; staLCDDC(&amp;m_staEmuDisplay);&nbsp;cBitmap.CreateCompatibleBitmap(&amp;staLCDDC,OSD_WIDTH,OSD_HEIGHT);&nbsp;m_cdcEmuDisplay.CreateCompatibleDC(&amp;staLCDDC);&nbsp;m_cdcEmuDisplay.SelectObject(&amp;cBitmap);&nbsp;cBitmap.DeleteObject();在OnPaint()时重绘静态文本框:&nbsp;CPaintDC&nbsp; EmuDisplayCPaintDC(&amp;m_staEmuDisplay);&nbsp;EmuDisplayCPaintDC.StretchBlt(*,&amp;m_cdcEmuDisplay,*,SRCCOPY]]></description>
		<author><![CDATA[formyprogram]]></author>
		<pubDate>2006-12-04 17:40:00</pubDate>
		</item>
				<item>
		<title><![CDATA[绘图驱动-OSD原理2[原创]]]></title>
		<link>http://blog.pfan.cn/programming/21209.html</link>
		<description><![CDATA[现在已经可以通过修改存储单元内容来改变OSD的像素，但还有个关键的问题是如何根据需要来进行操作，即如何将某个像素设置为指定颜色。接下来就要介绍一下色板的概念。
如下图，某个Byte中的低四Bit内容与一个像素一一对应，其值为“3”，那么数字“3”所代表的颜色便由色板来决定，然后再驱动OSD屏幕将像素设置为制定颜色。同样地，这种色板和物理OSD显示屏幕的对应关系一般也是通过寄存器设置，由硬件上来保障实现的。对于特定的显示环境，这种色板一般是固定的。

为了能使固定的图像数据在进行OSD显示时可以以不同的颜色输出，便可以采用逻辑色板这种方法。逻辑色板实际上是长度为颜色数的数组，将图像数据写入OSDBuffer时，可以通过该数组进行特定映射，本质上还是只能使用物理色板上的颜色数，只是颜色被改变。原理如下图。]]></description>
		<author><![CDATA[formyprogram]]></author>
		<pubDate>2006-12-03 00:23:00</pubDate>
		</item>
				<item>
		<title><![CDATA[绘图驱动-OSD原理1[原创]]]></title>
		<link>http://blog.pfan.cn/programming/21207.html</link>
		<description><![CDATA[OSD（On Screen Display）是屏幕显示技术的一种，用于在显示终端上显示字符、图形和图像。实现的过程为：存储器（一般为内存的一段）的内容与显示终端上的像素一一对应。这种一一对应的关系一般通过寄存器设置，然后由硬件上来负责实现。对存储器内容的操作便改变了屏幕的像素，从而可以实现特定界面的显示。实际上这也是一般数字显示器进行显示的方法。例如：320*240 单色（1 Bit）像素的OSD，需要40*240 Bytes的存储空间与其对应；320*240 16色（4 Bits）像素的OSD，需要160*240 Bytes的存储空间与其对应。存储器空间为一维的，而OSD空间为二维的，并且对于小于256色（1 Byte）的OSD，还存在同一字节内每个Bit与像素的对应关系：（1）字节中的低位Bit与OSD的低像素对应（H2H或L2L）；（2）字节中的高位与OSD的低像素对应（H2L或L2H）。下图以16色（4 Bits），320*240像素 H2H（L2L） 的OSD为例分析存储器空间与OSD空间的映射关系。

图1-1 每一个格子代表一个像素
OSD中的2个像素对应1 Byte，所以一行显示内容所占的存储空间为320/2=160 Bytes，设pOSDBuffer指向OSD对应存储空间的首地址，为了将OSD上坐标（x，y）的像素设置值为PixelValue（值的范围为0x00--0x0f），即改变该像素的颜色，则需要先确定坐标（x，y）像素对应的字节存储空间地址为pOSDDes=pOSDBuffer+y*160+x/2由于该字节空间中存储不止一个像素的信息，所以还需要确定具体的Bits位：如果x为偶数，则该像素对应字节的低4Bits，需要保护字节的高4Bits；如果x为奇数，则对应字节的高4Bits，需要保护该字节的低4Bits。算法如下，
OldValue=*pOSDDes;if(x%2)&nbsp;*pOSDDes=OldValue&amp;0x0f(PixelValue&lt;&lt;4);else&nbsp;*pOSDDes=OldValue&amp;0xf0|PixelValue;]]></description>
		<author><![CDATA[formyprogram]]></author>
		<pubDate>2006-12-03 00:09:00</pubDate>
		</item>
				<item>
		<title><![CDATA[开张大吉！]]></title>
		<link>http://blog.pfan.cn/programming/18639.html</link>
		<description><![CDATA[今天刚来到了这里，新申请了个帐号，庆贺一下。
-----首先要谢谢CCTV 和 Progamfan网站的大力支持和赞助，要是没有你们就没有这个博客诞生，另外还要谢谢Baidu搜索引擎，让我顺利搜索到这个网站。最后希望大家在以后的日子里能继续支持我，我一定会更加努力的！]]></description>
		<author><![CDATA[formyprogram]]></author>
		<pubDate>2006-09-22 10:45:00</pubDate>
		</item>
		</channel>
</rss>