配置文件( .INI )操作
1.SetRegistryKey 把配置文件写入注册表
使用CWinApp类的WriteProfileString 、GetProfileString等函数。
1、如果不调用SetRegistryKey(),CWinApp会把信息保存系统目录的的Test.ini文件中(C:\Windows\Test.ini)
2、如果调用SetRegistryKey(<companyname>),CWinApp会把信息保存系统目录的的注册表中
HKEY_CURRENT_USER\Software\<companyname>\Test\<section name>\<value name>.
注:SetRegistryKey()是CWinApp的保护成员,只能被CWinApp的成员函数调用。而WriteProfileString、GetProfileString等函数则是公共成员,可以随便调用,一般调用形式如:
theApp->WriteProfileString(); //在Test.cpp中。
AfxGetApp()->WriteProfileString(); 在其它源文件中
HKEY_CURRENT_USER\Software\LocalAppWizard-Generated Applications\Msg\A
AfxGetApp()->WriteProfileString(L"A",L"B",L"V");
CStringset = AfxGetApp()->GetProfileString(L"A",L"B");
2.信息写入.INI文件
2.1所用的WINAPI函数原型为:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);
其中各参数的意义
LPCTSTR lpAppName 是INI文件中的一个字段名.
LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.
LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.
LPCTSTR lpFileName 是完整的INI文件名,如果没有指定完整路径名,则会在windows目录(默认)查找文件。如果文件没有找到,则函数会在windows目录创建它。
2.2具体使用方法:
设现有一名学生,需把他的姓名和年龄写入 c:\stud\student.ini 文件中.
CString strName,strTemp;
int nAge;
strName="张三";
nAge=12;
::WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini");
此时c:\stud\student.ini文件中的内容如下:
[StudentInfo]
Name=张三
3.要将学生的年龄保存下来,只需将整型的值变为字符型即可:
strTemp.Format("%d",nAge);
::WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini");
3.将信息从INI文件中读入程序中的变量
3.1所用的WINAPI函数原型为:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);
其中各参数的意义
前二个参数与 WritePrivateProfileString中的意义一样.
lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.
lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.
nSize : 目的缓存器的大小.
lpFileName : 是完整的INI文件名.
3.2具体使用方法:
现要将上一步中写入的学生的信息读入程序中.
CString strStudName;
int nStudAge;
GetPrivateProfileString("StudentInfo","Name","默认姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\\stud\\student.ini");
执行后 strStudName的值为:"张三",若前两个参数有误,其值为:"默认姓名".
注意:如果在读入的ini文件不存在,则按默认值生成相应的ini文件
3.3读出整型值要用另一个WINAPI函数:
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);
这里的参数意义与上相同.使用方法如下:
nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini");
4. 最近文件列表及 LoadStdProfileSettings
最近文件列表可以让你很方便地打开你以前曾经打开过的文
件,那么,如何为自己的应用程序加入最近文件列表功能呢?
最简单的方法就是在你新建工程的时候选择包含最近文件列
表功能,也就是在 MFC AppWizard 的第 4 步的时候使 “How
many files would you like on your recent file list?” 的
值不为 0 即可。
如果你在新建工程的时候没有选择包含最近文件列表功能,
那么可以按照如下的方法为你的工程加入它:
1.在你的“文件”菜单中添加一个名称为“最近文件”的菜
单项,其 ID 为 ID_FILE_MRU_FILE1。
2.在你的工程的 App 类的 InitInstance 方法中将
LoadStdProfileSettings(0);
改成:
LoadStdProfileSettings();
即可。
这样,你的工程就有了最近文件列表功能。
事实上,以这种方法生成的最近文件列表项是保存在注册表
中 HKEY_CURRENT_USER/Sofrware/Loacl Appwizard-Generated
Applications 下以你的工程名为主键的 Recent File List 主
键中 File? 格式的字符串值中。LoadStdProfileSettings 的参
数值决定了保存在这里的最近文件的数目,其默认值(没有参数
时)为 4。 Loacl Appwizard-Generated Applications 主键是
Visual C++ 默认的,在工程的 App 类的 InitInstance 方法中
由 SetRegistryKey() 函数创建的,你可以将其改成你需要的名
称,例如:
SetRegistryKey(_T("skyice software"));
那么,如何处理从菜单中选择的最近文件列表中的文件呢?
由于在菜单中只有 ID_FILE_MRU_FILE1 这一个菜单项,其余的
菜单项都是由 LoadStdProfileSettings(); 动态的加上的,因
此,用一般的方法难以实现对菜单项的响应。此时,可以采用如
下的方法:
1.在 CMainFrame 类中加入对菜单项 ID_FILE_MRU_FILE1的
响应。
2.在 MainFrm.cpp 中将
ON_COMMAND(ID_FILE_MRU_FILE1,OnFileMruFile1)
改成
ON_COMMAND_RANGE(ID_FILE_MRU_FILE1,ID_FILE_MRU_FILE4,
OnFileMruFile1)
即可。
以后,所有对最近文件列表中文件的选择都由 CMainFrame
方法 OnFileMruFile1 响应,你可以在此函数中判断具体是选择
了哪个文件,进而做出相应的处理。
5.注意事项
1.INI文件的路径必须完整,文件名前面的各级目录必须存在,否则写入不成功,该函数返回 FALSE 值.
2.文件名的路径中必须为 \\ ,因为在VC++中, \\ 才表示一个 \ .
3.也可将INI文件放在程序所在目录,此时 lpFileName 参数为: ".\\student.ini".