如何保存工具条位置?

时间:2021-09-10 10:27:04
在BOOL CWinApp::InitInstance()中
  SetRegistryKey(COMPANY_KEY);
在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中
  LoadBarState("Control Bar States");
在void CMainFrame::OnClose()中
  SaveBarState("ControlBarStates");
怎么不行啊?

5 个解决方案

#1


保存应用程序屏幕
目标
保存应用程序屏幕的大小、位置和状态,包括每个工具栏或对话条的位置和大小,以便
应用程序在下一次运行时能恢复它们。
策略
当应用程序关闭时,不仅保存主窗口的大小和位置,而且还把工具栏和状态栏的状态保
存到系统的一个注册区。因此,当应用程序被再次打开时,我们将检索这些消息,并恢复窗
口和工具栏等等。
步骤
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


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 ( ) ;

#3


我就是这么处理的。
可是屏幕恢复成功了,工具条位置却保持不变...

#4


另外GetProfileBinary(SETTINGS_KEY, WINDOWPLACEMENT_KEY, pWP, &size))这个调用有问题:
if(GetProfileBinary(SETTINGS_KEY,WINDOWPLACEMENT_KEY,(LPBYTE*)&pWP,&size))
这样才行。

#5


郁闷,原来是Load和Save的字符串弄错了。

#1


保存应用程序屏幕
目标
保存应用程序屏幕的大小、位置和状态,包括每个工具栏或对话条的位置和大小,以便
应用程序在下一次运行时能恢复它们。
策略
当应用程序关闭时,不仅保存主窗口的大小和位置,而且还把工具栏和状态栏的状态保
存到系统的一个注册区。因此,当应用程序被再次打开时,我们将检索这些消息,并恢复窗
口和工具栏等等。
步骤
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


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 ( ) ;

#3


我就是这么处理的。
可是屏幕恢复成功了,工具条位置却保持不变...

#4


另外GetProfileBinary(SETTINGS_KEY, WINDOWPLACEMENT_KEY, pWP, &size))这个调用有问题:
if(GetProfileBinary(SETTINGS_KEY,WINDOWPLACEMENT_KEY,(LPBYTE*)&pWP,&size))
这样才行。

#5


郁闷,原来是Load和Save的字符串弄错了。