注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Kandy

长风破浪会有时,直挂云帆济沧海!

 
 
 

日志

 
 

VC++的系统注册区在哪?  

2009-03-26 23:52:57|  分类: MFC学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天在学习MFC的时候,主要实现的功能是“保存应用程序屏幕”,其描述是这样的:

目标
保存应用程序屏幕的大小、位置和状态,包括每个工具栏或对话条的位置和大小,以便
应用程序在下一次运行时能恢复它们。
策略
当应用程序关闭时,不仅保存主窗口的大小和位置,而且还把工具栏和状态栏的状态保
存到系统的一个注册区。因此,当应用程序被再次打开时,我们将检索这些消息,并恢复窗
口和工具栏等等。
步骤
1. 保存设置值
1) 在系统注册区中定义一个位置,在该位置用一个全局包含文件保存这些信息。
“C o m p a n y”是“公司”名。
#define COMPANY_KEY "C o m p a n y"
#define SETTINGS_KEY "S e t t i n g s"
#define WINDOWPLACEMENT_KEY "Window Placement"
2) 在应用程序类的InitInstance( )成员函数中,把C O M PA N Y _ K E Y添加到SetRegistryKey( )
中。
S e t R e g i s t r y K e y ( C O M PA N Y _ K E Y ) ;
3) 用C l a s s Wi z a r d把一个W M _ C L O S E消息处理函数添加到C M a i n F r a m e类中,用
SaveBarState( ) 可以保存条的位置和大小。用G e t WindowPlacement( )可以得到应用程序的当
前大小和位置,用WriteProfileBinary( )把它的结果保存到系统注册区。
void CMainFrame::OnClose()
{
// save state of control bars
S a v e B a r S t a t e ("Control Bar States") ;
// save size of screen
WINDOWPLACEMENT wp;
G e t Wi n d o w P l a c e m e n t ( & w p ) ;
A f x G e t A p p ( ) - > Wr i t e P r o f i l e B i n a r y ( S E T T I N G S _ K E Y,
W I N D O W P L A C E M E N T _ K E Y, (BYTE*)&wp,
s i z e o f ( W I N D O W P L A C E M E N T ) ) ;
C M D I F r a m e W n d : : O n C l o s e ( ) ;
}
2. 恢复设置值
1) 再次执行应用程序后,恢复工具栏到它们的初始状态,把下面的代码添加到C M a i n F r a m e
类的OnCreate( )成员函数的开始位置。
LoadBarState("Control Bar States");
2) 要从系统注册表中恢复应用程序的主窗口,在应用程序类中找到S h o w Window( )函数,
并用下面的代码替换它。注意,现在我们用S e t WindowPlacement( )恢复主窗口到它的初始大
小和位置。
BYTE *p;
UINT size;
WINDOWPLACEMENT *pWP;
if (GetProfileBinary(SETTINGS_KEY, WINDOWPLACEMENT_KEY, pWP, &size))
{
p M a i n F r a m e - > S e t Wi n d o w P l a c e m e n t ( p W P ) ;
delete []pWP;
}
e l s e
{
p M a i n F r a m e - > S h o w Wi n d o w ( m _ n C m d S h o w ) ;
}
p M a i n F r a m e - > U p d a t e Wi n d o w ( ) ;

 

但是找了半天也没有找到哪里是系统的注册区,后来想想,一般的程序从应用程序开始的,应用程序类从C WA p p派生,并不对任何窗口进行控制。除了控制应用程序的创建和卸载外,它自身应该有少数重要的附加功能,这些功能包括处理命令行标志和提供一种定制的打开文档的方法。应用程序类还提供一些应用程序范围的服务,诸如后台处理和超分类等。所以就将如下几句放到了应用程序类里面,结果就没有出错了。

#define COMPANY_KEY "C o m p a n y"
#define SETTINGS_KEY "S e t t i n g s"
#define WINDOWPLACEMENT_KEY "Window Placement"


 

后来查看了这本书的源代码,发现和我猜测的一样,其注册区就在应用程序类,只是这本书的代码将这些语句放到另外一个文件里面,然后在应用程序类里面调用。

 

  评论这张
 
阅读(430)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018