博文
VS2008工程 转 VS2005工程 侧记(2010-05-24 17:15:00)
摘要:本文一直使用的是VS.Net 2005环境。以前也接触了VS2008编译的应用程序,但是当时只需要执行,好像是下了个VS2008 distribution 包就可以了。没想到,今天来了个VS2008的解决方案,里面有10几个项目。并且必要要打开分析其源代码,可是又没有VS2008环境。 当然,在VS2005下是不可能直接能打开VS2008的项目的。 再说,咱又不能用盗版的,现在国家抓盗版这么严,连美国都要把咱们国家例如世界盗版观察国了,废话了。
转换步骤:
1. 找到解决方案文件, 即 .sln 文件。在记事本中打开
2. .sln
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
修改为
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
.vcproj
<VisualStudioProject ProjectType="Visual C++" Version="9.00" Name="wowmodelview" ProjectGUID="{DCA0C667-2A7A-4FCE-AD02-466F7A380E0C}" RootNamespace="wowmodelview" Keyword="Win32Proj" TargetFrameworkVersion="131072">
开头的这句把9.00改为8.00就可以了。
3. 如果解决方案中还有其他的项目的话,打开每个项目的 .vcproj 文件,将其中的
Version="9.00"
改成
Version = "8.00"
以上,如果项目不是很复杂,且在VS2008中没有用到一些 新的特征的话,(如果用到了新的特征,需要安装 VC2008FeaturePack.ex......
ReadRegistry与WriteRegistry读写注册表(2010-05-24 16:41:00)
摘要:在安装一些软件的时候,我们会看到一些提示,如 “正在写入注册表”等。在win 32时代,系统启动或者应用程序启动时,会有一个.ini文件会事先被加载。然后系统或者应用程序才能正常运行。但是,现在,我们一般都只需要把启动信息写入注册表,这样就可以很方便的进行读写。
本文,我不打算介绍利用注册表读写一套函数来将如何读写注册表信息。而是想要讲讲ReadRegistry 和 WriteRegistry 这两个函数在VC/MFC编程中如何将一些系统配置信息写入注册表,并在需要的时候读出。
在MFC 程序中,生成Project 的时候会在 InitInstance 中有一句
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
其中 "Local AppWizard-Generated Applications" 是注册表中相对于
HKEY_CURRENT_USE\Software 的路径,然后当你利用ReadRegistry 和
WriteRegistry 这两个函数对注册表读写都是在该路径下进行操作。比如我们可以把
一些系统全局配置信息写入注册表,然后在需要的时候读出,这样就避免每次都
要进行文件配置。
如下例:
void CRealTimeDicDlg::ReadRegistry( void )
{
DWORD nVersion;
nVersion = theApp.GetProfileInt( _T(""), _T("Version"), 0 );
if ( GetVersionMJ(nVersion) < REGISTRY_VERSION_MJ )
return;
&n......
不用函数的开根号计算(2010-05-12 11:15:00)
摘要:在很多特定场合,一些硬件可能不允许使用一些高等计算函数,如开根号,幂计算等。这时候就要自己写这些函数。一般都是用一些逼近方法来求取一个逼近值代替。下面就是两种自己写的求开根号的方法。
方法1 :
short HWR_sqrt_16(unsigned short M)
{
short N, i;
short tmp, ttp;
if (M == 0) return 0;
else if (M < 4) return 1;
else if (M < 9) return 2;
else if (M < 16) return 3;
else if (M < 25) return 4;
else if (M < 36) return 5;
else {
N = 0;
tmp = (M >> 14);
M <<= 2;
if (tmp > 1){
N ++;
/* tmp -= N; */
tmp = tmp - N;
}
for (i=7; i>0; i--){
N <<= 1;
tmp <<= 2;
&n......
PGM图像格式及处理(2010-04-12 09:45:00)
摘要:本文系引用蒋志强先生的博客文章,在这里表示感谢。原文地址
http://blog.csdn.net/gamer_gerald/archive/2007/06/17/1655756.aspx
.NET framework框架类库中的Image类和Bitmap类提供了常用图像格式的解析读取和存储,这些常用格式包括BMP,JEPG,GIF,PNG,EXIF,TIFF.但是可惜的是不支持PGM格式,我们要自己来处理PGM格式的文件.
1.PGM图像详解
PGM 是便携式灰度图像格式(portable graymap file format),在黑白超声图像系统中经常使用PGM格式的图像.文件的后缀名为".pgm",PGM格式图像格式分为两类:P2和P5类型.不管是P2还是P5类型的PGM文件,都由两部分组成,文件头部分和数据部分.
文件头部分
文件头包括的信息依次是:
1.PGM文件的格式类型(是P2还是P5);
2.图像的宽度;
3.图像的高度;
4.图像灰度值可能的最大值;
文件头的这四部分信息都是以ASCII码形式存储的,所以可以直接在将P2或P5格式的PGM文件在记事本中打开看到文件头的信息.
P5格式的PGM文件在记事本中打开(如下图)
P2格式的PGM文件在记事本中打开(如下图)
在P2或P5类型的PGM文件头的4个信息之间用分割符分开,PGM的合法分隔符包括:空格,TAB,回车符,换行符.PGM文件头的信息应该由合法分割符号分开,如上面两幅图所展.文件头的第4个信息,图像灰度值可能的最大值标明了文件数据部分可能出现的像素灰度值的最大值.上面两幅图都是指定的255,所以在数据区的像素数据取值范围在0到255.
数据部分
数据部分记录图像每个像素的灰度值,按照图像从上到下,从左到右的顺序依次存储每个像素的灰度值.对于像素灰度值的表示P2格式和P5格式有所不同.
P5格式
P5格式的文件,每个像素用可以用二进制表示.比如有一幅P5格式图像,灰度值可能的最大值为255,它的第一行第一列像素值为100,那么该图像每个像素使用一个字节表示,第一行第一列为数值为100的二进制一个字节表示.如果这副图灰度值可能的最大值是65535,那么它的第一行第一列为数值为100的二进制两个字节表示(因为表示到65......
五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)(2010-04-02 17:11:00)
摘要:转至:www.awflasher.com/blog/archives/939
这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考。
BSD开源协议(original BSD license、FreeBSD license、Original BSD license)
BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:
如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
Apache Licence 2.0(Apache License, Version 2.0、Apache License, Version 1.1、Apache License, Version 1.0)
Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:
需要给代码的用户一份Apache Licence
如果你修改了代码,需要再被修改的文件中说明。
在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构......
VC设置Button的字体颜色(2010-04-01 14:30:00)
摘要: 相信大家在用VC做UI的时候,肯定是要用Button的,并且很多时候想要改变Button中显示的字体,颜色,以及大小等。如果这个都没有遇到过,那么说明你根本就没用过VC,那么下面的文章也就不用接着看了。
尝试方法1:
CButton类是继承自CWnd类,而CWnd类有一个SetFont() 函数,所以对话框的程序可以用GetDlgItem(ID)->SetFont(CFont *font)来设置该对话框的字体。
结果,当我改变font的字体时,结果不起作用。
尝试方法2:
查询MSDN以及CSDN,发现原来在VC中上述方法是不能改变字体和颜色等属性的。而CSDN中提到的一种改变对话框属性中字体的方法,这种方法只能改变显示在对话框控件的大小和字体大小。而不能改变将要显示在对话框控件中的字体大小或者颜色。
所以,这种方法只能从CButton类中继承下来,生成自己的Button类。然后重写设置字体和颜色等函数。
// .h 文件
class CBitButtonNL : public CButton
{
virtual CBitButtonNL& SetFont(LOGFONT lf, BOOL bRepaint = TRUE);
virtual CBitButtonNL& SetFontSize(int nSize, BOOL bRepaint = TRUE);
virtual CBitButtonNL& SetFontItalic(BOOL bSet, BOOL bRepaint = TRUE);
}
// .c 文件
CBitButtonNL& CBitButtonNL::SetFontItalic(BOOL bSet, BOOL bRepaint)
{
m_lf.lfItalic = bSet;
ReconstructFont();
if (bRepaint) Invalidate();
return *this;
}
CBitButtonNL& CBitButtonNL::SetFontSize(int nSize, ......
AT91samRLek 评估板内核编译(2010-03-30 15:39:00)
摘要:
本 文主要介绍如何构建在x86平台上交叉编译各平台上的嵌入式Linux内核。要完成这个过程,首先必须确认有相应的交叉编译工具链。工具链可以自己编译获 得,但是对于初学者我们不推荐这么作,网上大有许多编译好的优秀的工具链。本文将以编译Atmel的AT91sam9RL_EK评估板的内核为例子,其他平台基本步骤差异不大。为了显示最 新性,也采用可2.6.26版本的内核。
首先必须获得最新版本的内核,可以在ftp.kernel.org上下载我们需要的2.6.26的内核。获得相应内核包后,解压:
对于 Linux-2.6.26.tar.gz为
tar zxvf Linux-2.6.26.tar.gz
对于 Linux-2.6.26.tar.bz2为
tar xjvf Linux-2.6.26.tar.bz2
之后进入Linux-2.6.26文件夹内。
如果机器上已有2.6.26内核代码,也可以直接使用,但要清除上次编译的遗留物,可以
make distclean
或者
make mrproper
准 备结束后,我们开始配置内核。在本机编译内核时,我们可以直接make menuconfig之类,就合根据我们机器当前内核的配置生产.config文件。但对于嵌入式当然就很困难。幸亏Linux支持上百种平台。对于不同 平台都有默认的配置文件,对于我们使用的arm,可以在/arch/arm/configs文件夹下看到
我们要根据自己所使用的平台来选择。例如我们这里使用的Ateml的AT91sam9RL_EK评估板,可以选择at91sam9rlek_defconfig。之后只要运行
make ARCH=arm CROSS_COMPILE=arm-Linux- at91sam9rlek_defconfig
成功后会显示:
#
# Configuration written to .config
#
其中,.config 是生成的配置文件,在主Makefile中可以看到有这么一行。
KCONFIG_CONFIG ?= .config
同时会在 include/linux下生成一个autoconf.h的文件,这个文件在Makefile的后面会用到。
对于我们使用的两个宏ARCH和CROSS_COMPILE,分别是指我......
控制台程序下输出UNICODE汉字(2010-03-22 17:25:00)
摘要:其实,我在UNICODE环境下进行开发已经很久了,原来也对UNICODE的一些操作非常多。但是,今天同事突然想在控制台程序中输出几个UNICODE汉字,是根据这些汉字的UNICODE码来输出。开始他试图用printf来输出,这样肯定不行。我就让他利用 wprintf来输出看看可以吧。结果好像用 wprintf也不行。
这让我很郁闷的,这么简单的问题我以前难道没有注意吗。于是想了想,好像我以前自己做了一套各种字符集之间转码的程序,一般中文的话,我都转成GB码在输出,好像是没有接触到这个问题。
没办法,只有虚心的再google了。发现,其实在控制台下,系统默认的local 字符集是GB码的(指安装中文操作系统的)。而在我们使用UNICODE的东西时候,是系统帮助我们进行宽字符转到多字节字符的。
所以,如果想让控制台程序下直接显示UNICODE的汉字,必须对控制台的编码进行一些local设置。代码如下,
#include <locale.h>
setlocale(LC_ALL, "chs");
wchar_t ch = 0x4e2d;
wprintf(L"%c\n",ch);
// _tprintf(_T("%c"),ch);
这个还有一个好处,就是,这种设置的方法不会影响本来用printf输出的多字符集的汉字输出。
......
SHFILEOPSTRUCT 文件夹操作 困惑(2010-03-10 09:24:00)
摘要:相信对文件夹操作是大家都会经常碰到的问题。而在文件夹操作中,利用 SHFILEOPSTRUCT 进行操作是最快最方便的,而Windows本身自己也用这个进行文件夹的操作,如移动,复制,粘帖等操作。
而最近我在用SHFILEOPSTRUCT进行文件夹移动的时候,却发现它有好几个需要注意的问题。
首先,给出MSDN以及大部分网上会给出的示例代码:
SHFILEOPSTRUCT sfo;
sfo.hwnd = NULL;
sfo.wFunc = FO_MOVE;
sfo.pFrom = "D:\\1";
sfo.pTo = "D:\\2";
sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
hr ......
文档,视图,框架类之间的关系及其互相调用(2010-02-21 09:58:00)
摘要:
了解文档和视图的相互作用关系是编写MFC程序的基本功。但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。
几个概念:
(虽然大家都知道了,雷神还是要重申一次)
文档对象:是用来保存数据的。
视图对象:是用来显示和编辑数据的。
应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。为什么不用视图?为的是把界面管理独立的拿出来。
文档模板:MFC把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。这个工作在在应用程序初始化时完成,如下:
BOOL CMyHtmlApp::InitInstance()
{
//。。。。。。
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyHtmlDoc),
RUNTIME_CLASS(CMainFrame), ......