VC++.Net2005的一些常识(转)

 

 

1.

源文件:是类成员函数的实现
头文件:是类接口申明
资源文件:是程序中用到的图片和对话框等资源

2.

  stdafx.h和stdafx.cpp文件;

是第一次编译时系统按这两个文件内容创建预编译头文件(*.PCH)及预编译目标文件(stdafx.obj),而以后编译时不再重新建立这两个文件,从而提高了编译速度.

3.

在VS2005.net中为某个控件添加消息处理函数。直接在控件上点右键就可以了。这和vc++6.0是很不相同的。一定要注意啊!

 

4.MFC的文档/视图结构

 文档:是一个应用数据基本元素的集合,它构成应用程序所使用的数据单元,此外还提供了管理和维护数据的手段

 视图:数据的用户窗口,为用户提供了文档的可视化的数据显示,可以把文档的部分或者全部内容在窗口中显示出来。

 简而言之:文档对象用来保存数据,而试图对象则显示数据,并容许用户对数据进行编辑

 

5 和GUI有关的各种对象

字体对象CFont用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。颜色和背景色不属于字体的属性

刷子CBrush对象决定填充区域时所采用的颜色或模板。

画笔CPen对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等

位图CBitmap对象可以包含一幅图像,可以保存在资源中

 

6 DC对象

DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是Windows耀眼的一点设备无关性。如同你将对一幅画使用照相机或复印机将会产生不同的输出,而不需要对画进行任何调整

 

7 托管代码和托管数据

托管代码是编写为支持公共语言运行时服务的代码(请参阅“什么是公共语言运行时?”)。为了支持这些服务,代码必须向运行时提供最小级别的信息(元数据)。默认情况下,所有 C#、Visual Basic.NET 和 J.NET 代码都是托管代码。Visual Studio.NET C++ 代码在默认情况下不是托管代码,但通过指定命令行开关 (/CLR),编译器也可以生成托管代码。

  与托管代码密切相关的是托管数据。托管数据是由公共语言运行时的垃圾回收器进行分配和释放的数据。默认情况下,C#、Visual Basic 和 J.NET 数据是托管数据。不过,通过使用特殊的关键字,C# 数据可以被标记为非托管数据。Visual Studio.NET C++ 数据在默认情况下是非托管数据(即使在使用 /CLR 开关时),但是在使用 C++ 的托管扩展时,可以使用“__gc”关键字将类标记为托管类。就象该名称所显示的那样,它表示类实例的内存由垃圾回收器管理。另外,该类也完全成为 .NET 框架的成员,同时具备它所带来的好处和限制。好处的一个例子是:它可以与其他语言编写的类正确地进行互操作(如托管的 C++ 类可以从 Visual Basic 类继承);限制的一个例子是:托管类只能从一个基类继承。

 

8 二进制文件和文本文件

文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。
文件通常分为二进制文件和文本文件。
二进制文件是包含在 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。
文本文件(也称为ASCII文件):它的每一个字节存放的是可表示为一个字符的ASCII代码的文件。它是以 “行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。 

当我们按照文本方式往文件中写入数据时,一旦遇到换行字符(ASCII为10),则会转换为回车-换行(ASCII为13、10)。在读取文件时,一旦遇到回车-换行的组合(即连续的ASCII 13、10),则会转换为换行字符(ASCII为10)。
当我们按照二进制方式往文件中写入数据,则将数据在内存中的存储形式原样输出到文件中。

 

9 visual Studio2005 .net里面的messagebox的问题

  在vs 里面 ,编写MFC程序时候,如果不注意,常常会出项  error C2664: “MessageBoxW”: 不能将参数 2 从“const char [16]”转换为“LPCWSTR” 这样的错误.

是这样的,在2005中,选项里默认设置为Unicode,要么把它改为不用Unicode,或者使用::MessageBoxA(NULL,   L"Hello",   NULL,   0);

 MessageBox(_T("test"));  也可以这样,因为这样就转换成了Unicode编码,其实就是个编码问题 
 

10

. printf 只能提供ANSI/MB 的输出,不支持输出unicode stream.
例如:

wchar_t test[]=L"测试1234";
printf(
"%s",test);

是不会正确输出的

11

wprintf 同样不会提供unicode output,
   但是他会把wchar_t的string转为locale的SB/MB字符编码,然后输出
例如:

wchar_t test[] = L"测试Test";
wprintf(L
"%s",test);

会输出??1234之类的字符串,或者不输出任何结果
因为wprintf没有办法把L"测试Test"转为默认的ANSI,需要设置locale

setlocale(LC_ALL,"chs");
wchar_t test[] 
= L"测试Test";
wprintf(L
"%s",test);

会有正确的输出
等同于printf("%ls",test);

综上:  CRT I/O functions do not provide Unicode output.

==================================================================

1.最著名的问题-------本机编译好的程序无法在没有装VC的机子上运行

由于VC++2005默认采用动态链接运行时库,导致编译好的程序在运行时依赖于本机的运行时库,当然移植到别的机子上就不能运行了。真不知道微软当初怎么想的,难道把所有人都当程序员么,自己写的程序都是给自己用的?呵呵。不过微软犯迷糊我们不能跟着迷糊,这个问题解决起来也不难。就是采用静态编译就可以了。

具体如下:

对于一般的win32控制台程序,可以这样设置:

点击"项目"--- "属性",打开项目属性页,点击 "配置属性"--- "C/C++"--- "代码生成",将此页面右边的 "运行时库"由默认的 "多线程DLL(/MD)"改为 "多线程(/MT)"或 "多线程调试(/MTD)"即可。      
不过一般情况下生成release版本的应用程序时选 "多线程(/MT) "即可,因为这样生成的exe程序较小。      
而如果选了 "多线程调试(/MTD) ",则由于加入了大量的调试信息而使生成的exe程序会增大好几倍。
 

不过若是MFC程序,这种方法在VC++2005 express中却行不通。

改为静态链接后,反而提示至今我也没有找到解决的办法。不过我现在对于MFC也是刚刚接触,无奈~~~
 

2.

cl: 命令行 error D8016 :“/MTd”和“/clr:pure”命令行选项不兼容

 

也是很经典的问题---在VC++ 2005中fstream对象无法访问中午路径下的文件,

包括英文路径下的中文名文件。

这是VS的一个BUG,原因是本地化的问题,如下处理即可:

在用ifstream和ofstream打开文件前设置全局locale为本地环境,打开文件后再设置回去。                          

    ofstream writefile;
    string filename=("d:/我的文档/测试.txt");
    locale loc = locale::global(locale("")); //要打开的文件路径包含中文,设置全局locale为本地环境
    writefile.open(filename.c_str(),ios::out); //打开文件
    locale::global(loc);//恢复全局locale

用locale对象的name方法可以看到,通过locale("")构造出的locale对象的name为"Chinese_People's Republic of China.936",而原始的locale对象的name为"C",也就是缺省的ANSI_C公约。

注意:如果使用locale loc = locale::global(locale(""))设置全局locale后没有用 locale::global(loc)恢复的话,那么在程序后面的cout语句就不能输出中午了,虽然这时候操作中文文件没有问题,但是这也是很容易让人掉入陷阱的地方,应该值得注意。
 
 
               

posted @ 2007-12-04 09:19  y0umer  阅读(207)  评论(0编辑  收藏  举报