起因:
因为感到学好VC是一个点滴积累的过程,不是一蹴而就能达到目的的。即是一时感觉小有成就时,也不能代表自己就认为掌握了VC!随着时间的推移,我们的大脑在学习新东西的同时,也在忘却一些细节问题。所以从长远来看把基础打捞才是上上策,故出此文。
本部分内容仅作为个人知识的储备,不定期对不恰当的地方修改和补充。
知识点根据我的随机性而定,以序号为标识排列内容。
1、串口调试时,注意:高低字节顺序
E.g 使用单双浮点数与字节转换软件:
十进制数: 6.12345
十六进制数:40C3F34D
再用串口调试助手发送这十六进制数,应该是按照下面的顺序发送:4D F3 C3 40 .也就是从低到高的字节顺序发送.
2、浮点型(float)=单浮点数(float)+双浮点数(double)
float:字长为4 个字节共32 位二进制数, 数的范围是3.4x10-38E~3.4x10+38E
double:字长为 8个字节共 64 位二进制数, 数的范围是
1.7x10-308E~1.7x10+308E
浮点数全都是有符号的,在最高一位表示。
浮点数只有一种进制:十进制。当然我们可以根据自己的需要把十进制浮点数转化为十六进制数。见下图依单浮点数(float)为例:

至于浮点数与字节的对照关系,见下面的PDF格式文件:
请点击右侧链接下载:
浮点数原理
DATE:2007-09-11
3、void *无类型指针
1)void *可以指向任何类型的数据
2)不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换。但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
3)按照ANSI标准,不能对void指针进行算法操作
我的理解:void *的出现是为了实现某些特定类型之间转换的需要。
E.g float与unsigned char之间的转换。也许你想找到一个现有的函数来解决这个问题,那你找到时记得告诉我哟。继续前面两者转换的话题,其实现的原理:浮点数都是连续存储在字节中的,例如单浮点数是4字节连续存储在4个字节,双浮点数是连续存储在8个字节中,所以只要我们找到了对应浮点数的存储位置,也就找到了相应的浮点数。
以单浮点为例说明实现的方法:
1)可以定义一个void的指针(void * pf),并将此指针指向需要存储的浮点数(float a=6.12345)
2)然后将此指针强制转化为unsigend char型
E.g 下面的函数完成浮点数转十六进制数:
typedef unsined char BYTE
void floatTobyte(void)
{float a=6.12345;
BYTE I,*px;
void * pf;
BYTE buf[4]; /*定义无符号数组,用于存储一个浮点数对应的四个字节*/
pf=&a; /*void型指针指向浮点数首地址*/
px=buf; /*px指针指向数组buf[4]*/
For(i=0;i<4;i++)
{
*(px+i)=*((char *)pf+i); /*因为void *型指针不能参与运算,所以要其强制类型void转换为unsigend char型。"(char *)"在这里可以认为就是起到强制类型转换的作用!再看透一点,可以看到*(px+i)=*((char *)pf+i)只是比*(px+i)=*(pf+i)多了一个强制类型转换(char *)而已 ^_^*/
}
//此时数组buf[]中存放的就是:一个浮点数--四个字节
}
E.g 十六进制转浮点数.(原理:就是把十六进制数取出来合并之后,就是我们想要的浮点数)
typedef unsigned char BYTE
void byteTofloat(void)
{
float a;
BYTE I,*px;
void * pf;
BYTE buf[4];
pf=&a;
px=buf;
For(i=0;i<4;i++)
{
*((char *)pf+i)=*(pi+i); /*通过对比这两个函数,发现只把这一句话颠倒一下就可以了^_^ 爽吧*/
}
//此时a中就是我们想要的浮点数
}
DATE:2007-09-13
4、SHInitExtraControls()函数
至今没有发现这个函数到底有什么作用?只是找到一些关于这个函数的一些说明,先搜集起来。等待日后进一步补充.
[英]SHInitExtraControls operates in the same manner as the Windows CE InitCommonControls function. Only use SHInitExtraControls to initialize controls unique to Smartphone, such as the CAPEDIT control and certain ToolTips controls.
来源:http://msdn2.microsoft.com/en-us/library/aa457117.aspx
[中]函数SHInitExtraControls()与函数InitCommonControls()有相同的使用方法。对SmartPhone来说,使用函数SHInitExtraControls()仅仅是为了初始化一些特殊的控件,例如:CAPEDIT控件、TOOlTip控件等等
----
[英]SHInitExtraControls should be called once during your application's initialization to initialize any of the device specific controls such as CAPEDIT and SIPPREF.
[中]在你的应用程序的初始化函数中去初始化一些特定的控件时,应该调用一次函数SHInitExtraControls()。
----
[英]Using SHInitExtraControls() allows us to use CAPEDIT (like a normal EDIT but it capitalizes the first letter) and also WC_SIPPREF (automatic management of the SIP).
[中]使用函数SHInitExtraControls()初始化后,我们才可以使用CAPEDIT(这个控件像一个普通的编辑框控件EDIT CONTROL,但是它会使第一个字母变为大写)和WC_SIPPREF(用于自动管理软键盘SIP)
注:从上面可以看出一些共同的词汇"去初始化一些特定的控件",而这些控件具体是什么呢?例如CAPEDIT控件、TOOlTip控。
DATE:2007-09-15
5、一些快捷键
Ctrl+D :显示控件的序号
Ctrl+G :Goto
F7 :Build
F9 :断点
DATE:2007-09-17
6、怎样看待文件: stdafx.h
1)来源:
STD是Standard的缩写.
[英]AFX is an abbreviation for a group. The MFC group was originally called the "Application Framework group" during the inception of MFC. However, X doesn't stand for anything other than sounding cool. The original AFX group was renamed to MFC long ago. There is no current AFX group. But the "AFX" hasn't been changed to "MFC" for the compatibility.
[中]AFX是一组词的缩写。在MFC(Microsoft Foundation Class)起初,这个组织被叫做"应用框架组织"。而"X"不代表任何东西,只是听起来比较酷而已。在很久以前,AFX被用来命名MFC组织,并没有现在的AFX组织;但是,从MFC的兼容性上来说,AFX并没有发生改变(即至今,我们仍然使用AFX来代表MFC组织)。
std=standard, afx=application framework group.
简记:The MFC group → Application Framework group → AFX
2)作用:
Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。为避免这种浪费,AppWizard和Visual C++编译程序一起进行工作,一起工作的过程就是:
·AppWizard建立了文件stdafx.h。该文件包含了所有当前工程文件需要的MFCinclude文件。且这一文件可以随被选择的选项而变化。
·AppWizard随后就建立stdafx.cpp。这个文件通常都是一样的。
·然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp(格式应该是"工程名.cpp")。当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。但我发现这个名字不一定就是stdafx.pcb。我的是在编译调试对应的文件夹下面,是"工程名.pch")
·当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编缉了stdafx.cpp或stdafx.h
3)技巧:
当大部分.cpp文件都包含同一个.h时,就可以把这个.h放到stdafx.h中去。当然,要在每个.cpp中包含stdafx.h头文件 ^_^
7、AfxEnableControlContainer()函数
源:http://msdn2.microsoft.com/en-us/library/x1se4y1y(VS.80).aspx
依然没有感受到这个函数的作用,有待实例验证其功效。
[英]Call this function in your application object's InitInstance function to enable support for containment of OLE controls.
[中]在应用程序实例中调用函数AfxEnableControlContainer()以完成对OLE控件容器的支持.
什么是OLE控件呢?我还不知道,也需要进一步体会。不过参看一下:http://www.cppblog.com/wlwlxj/archive/2006/09/03/11998.html 和 http://www.cppblog.com/wlwlxj/archive/2006/07/22/10343.html 看完这个感觉以后要在应用程序上实现HTML嵌套,需要使用到这个函数了。哈哈,有意思。
----
有人遇到下面的问题:"我想用VC做一个对话框界面的ActiveX控件嵌入HTML网页,但是这个控件的核心功能是使用另外一个控件实现。我在界面ActiveX控件工程中添加了个对话框,然后把那个核心控件添加上去。但是这样做的控件一挂上网页就是非法操作,如果把那个核心控件去掉就一点没问题。"
最后他解决的方法是:"我在InitInstance()里面加了句AfxEnableControlContainer()使我的控件有容器功能,搞定了."
8、SetRegistryKey()函数
[英]Causes application settings to be stored in the registry instead of INI files.
[中]使应用程序设置保存在注册表(以取代早期将设置保存在INI文件)中.
----
该函数默认保存注册表的"HKEY_CURRENT_USER\Software\"路径下,推荐的格式是"HKEY_CURRENT_USER\Software\company name\application name\section name\value name".
E.g
SetRegistryKey(_T("公司名")); //这里是准备在注册表HKEY_CURRENT_USER\\software 下面生成一个"公司名"分支.为什么说是准备呢?因为如果不调用相关的实际写入读取函数,它是不会真正读写注册表的。
WriteProfileString("应用程序名","段名","段名对应的值"); //向注册表HKEY_CURRENT_USER\\software\\公司名\\应用程序名\\段名\\段名对应的值. 注意:如果此处没有WriteProfileString()函数,光有SetRegistryKey(_T("公司名"))通过观察注册表实际上是没有任何效果的。
DATE:2007-10-8
9、
评论: 0 | 引用: 0 | 查看次数: 2160 |
返回顶部