现在的位置: 首页 > 综合 > 正文

保存和恢复用户优先选项(注册表)

2017年12月07日 ⁄ 综合 ⁄ 共 3413字 ⁄ 字号 评论关闭
 目标
保存并恢复用户在前面例子中选定的选项。
策略
使用六个CWinApp函数把选项值装入并保存到系统注册表中。
步骤
1.配置应用程序
1)把下面列出的#define语句添加到主框架类的定义文件中,用用户公司名字来替换
“Company”,以及用应用程序选项的描述性名字替换“Optionx”。
#defineCOMPANY_KEY "Company"
#defineSETTINGS_KEY "Settings"
#defineOPTION1_KEY "Option1"
#defineOPTION2_KEY "Option2"
#defineOPTION3_KEY "Option3"
#defineOPTION4_KEY "Option4"
2)在CMainFrame类中,用用户公司的系统注册表项修改InitInstance()中的SetRegistrykey()
第5章应用程序与环境97
下载
调用。
SetRegistryKey(COMPANY_KEY);
2.保存应用程序选项
1)把一个新的成员函数添加到CMainFrame类中,用来保存选项。在该函数中,可用多达
三种不同的CWinApp函数来保存整型、字符和二进制选项。
voidCMainFrame::SaveOptions()
{
//integeroptions
AfxGetApp()->WriteProfileInt(SETTINGS_KEY,OPTION2_KEY,
m_nOption2);
//stringoptions
AfxGetApp()->
WriteProfileString(SETTINGS_KEY,OPTION1_KEY,m_sOption1);
//binaryoptions
AfxGetApp()->WriteProfileBinary(SETTINGS_KEY,OPTION3_KEY,
(BYTE*)&m_dOption3,sizeof(m_dOption3));
}
2)用ClassWizard把一个WM_CLOSE消息处理函数添加到CMainFrame类中,并从那里调
用SaveOptions()。
3.恢复应用程序选项
1)把另一个成员函数添加到CMainFrame类中,用来装入选项。在那里,可以用另外三个
CWinApp函数在系统注册表装入整数、字符型和二进制选项。
voidCMainFrame::LoadOptions()
{
//integeroptions
m_nOption2=AfxGetApp()->
GetProfileInt(SETTINGS_KEY,OPTION2_KEY,3);
//stringoptions
m_sOption1=AfxGetApp()->
GetProfileString(SETTINGS_KEY,OPTION1_KEY,"Default");
//binaryoptions
BYTE*p;
UINTsize;
m_dOption3=33.3;
if(AfxGetApp()->GetProfileBinary(SETTINGS_KEY,OPTION3_KEY,
&p,&size))
{
memcpy(&m_dOption3,p,size);
delete[]p;
}
}
2)在CMainFrame类的OnCreate()函数的开始处调用LoadOptions().。
GetProfileBinary()和WriteProfileBinary()是非文档化的,并且可能在所有版本的MFC中
都找不到,如果它不在用户的MFC中,下面步骤可以创建备份的LoadOptions()和
SaveOptions(),下面的方法还允许用户从系统注册表的任何位置保存和装入选项。
98第二部分用户界面实例
下载
4.备用LoadOptions()和SaveOptions()
1)在项目的包含文件中添加一项#define语句,并用应用程序名字替换“Wzd”。
#defineAPPLICATION_KEY"Software//Company//Wzd//Settings"
2)然后,把下面的代码写入SaveOptions()函数中,该函数打开系统注册表,并把选项写
到它里面,然后直接用WindowAPI关闭它。
voidCMainFrame::SaveOptions()
{
//openssystemregistryforwriting
HKEYkey;
DWORDsize,type,disposition;
if(RegOpenKeyEx(HKEY_CURRENT_USER,APPLICATION_KEY,0,
KEY_WRITE,&key)!=ERROR_SUCCESS)
{
RegCreateKeyEx(HKEY_CURRENT_USER,APPLICATION_KEY,0,"",
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,
&key,&disposition);
}
//writesanoptionthat’sastring
type=REG_SZ;
size=m_sOption1.GetLength();
RegSetValueEx(key,OPTION1_KEY,0,type,
(LPBYTE)LPCSTR(m_sOption1),size);
//writesanoptionthat’saninteger
type=REG_DWORD;
size=4;
RegSetValueEx(
key,OPTION2_KEY,0,type,(LPBYTE)&m_nOption2,size);
//writesallotheroptions
type=REG_BINARY;
size=sizeof(DOUBLE);
RegSetValueEx(
key,OPTION3_KEY,0,type,(LPBYTE)&m_dOption3,size);
//closessystemregistry
RegCloseKey(key);
}
3)在LoadOptions()中添加下面的代码,它将打开系统注册表,读进选项,然后关闭系统
注册表。
voidCMainFrame::LoadOptions()
{
HKEYkey;
DWORDsize,type;
if(RegOpenKeyEx(
第5章应用程序与环境99
下载
HKEY_CURRENT_USER,APPLICATION_KEY,0,KEY_READ,&key)==
ERROR_SUCCESS)
{
//readstringoptions
size=128;
type=REG_SZ;
LPSTRpsz=m_sOption1.GetBuffer(size);
RegQueryValueEx(
key,OPTION1_KEY,0,&type,(LPBYTE)psz,&size);
m_sOption1.ReleaseBuffer();
//readintegeroptions
size=4;
type=REG_DWORD;
RegQueryValueEx(key,OPTION2_KEY,0,&type,
(LPBYTE)&m_nOption2,&size);
//readallotheroptionsasbinarybytes
size=sizeof(DOUBLE);
type=REG_BINARY;
RegQueryValueEx(key,OPTION3_KEY,0,&type,
(LPBYTE)&m_dOption3,&size);
RegCloseKey(key);
}
}
说明
■用Windows目录中的REGEDIT.EXE应用程序可以编辑写到系统注册表的选项,可以在
HKEY_CURRENT_USER/Software/Company下找到应用程序项。
■本例中我们以整型、字符串型和二进制型来保存一个选项,事实上所有选项可以以二
进制值形式保存。然而,只要有可能,尽量使用一个整型或字符串型,因为
REGEDIT.EXE应用程序可以更轻松地编辑这些值,字符串还是以字符串出现,整型还
是以整型出现,而二进制型只以一串字节的形式出现。
■如果在本节中“配置应用程序”的第二步注释掉SetRegistryKey(),则选项将被保存到
文件中而不是系统注册表中。该文件将在你的/Windows目录下,并命名为app.ini,app
是应用程序的名字。旧版的Windows用这种方法来保存选项。

抱歉!评论已关闭.