BCG注册表清除:
第一次在CXXXApp::ExitInstance() 加入CleanState(),
运行一次
接着注释掉,再在On
估计在BCG控件要写注册表的时候,它自己的写入注册表函数会判断m_bSaveState
1.VC2008集成了BCGControlBar的相关功能,用wizard生成的话如果选与BCGControlBar有关的性能,如预定皮肤,则应用程序是从CWinAppEx派生,再加CBCGPWorkspace似乎不行。
2.BCG 为了方便程序员,在注册表中保存了窗口的大小、位置等信息,包括工具栏的相应信息。这样减少了程序员保存和恢复用户上次使用过的界面的重复劳动。但也会造成改变菜单之类出现无反应的现象,让人摸不着头脑。可以采用的一个方法是,删除 BCG 为你保存的注册表键:
HKEY_CURRENT_USER/Software/[your corporation]/[your application]/Workspace
里面 your corporation 是指在 app 类里面 SetRegistryKey 指定的路径;your application 就是你的应用程序名。
把这个删掉之后,还是用你最上面的代码,运行。OK!
更方便的是InitInstance里设m_bSaveState=FALSE;
如果已经有注册内容了再加一句CleanState();
程序成型后再加上。
3.应用皮肤的过程
(1)找一个BCG的例子,将菜单与皮肤相关的项复制粘贴到你的菜单下,ID值是连续的。
(2)CMainFrame的头文件中
#define CFrameWnd CBCGPFrameWnd//类定义前。这样可以省很多替换工作哦
UINT m_nAppLook;//指示应用哪个皮肤
CBCGPMenuBar m_wndMenuBar;
//手动加入消息响应:
afx_msg void On
afx_msg void On
(3)CMainFrame的Cpp文件
//消息映射增加
ON_COMMAND_RANGE(ID_VIEW_APPLOOK_2000, ID_VIEW_APPLOOK_VS2008, On
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_2000, ID_VIEW_APPLOOK_VS2008, On
//初始化函数
m_nAppLook = theApp.GetInt (_T("ApplicationLook"), ID_VIEW_APPLOOK_2003);//初始的样子
//On
On
if (!m_wndMenuBar.Create (this))
{
TRACE0("Failed to create menubar/n");
return -1; // fail to create
}
m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() | CBRS_SIZE_DYNAMIC);
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
EnableAutoHideBars(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMenuBar); //可浮动
//直接把以下两个函数拷贝上去就OK了。
void CMainFrame::On
{
CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
m_nAppLook = id;
switch (m_nAppLook)
{
case ID_VIEW_APPLOOK_2000:
// enable Office 2000 look:
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager));
break;
case ID_VIEW_APPLOOK_XP:
// enable Office XP look:
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManagerXP));
break;
case ID_VIEW_APPLOOK_WIN_XP:
// enable Windows XP look (in other OS Office XP look will be used):
CBCGPWinXPVisualManager::m_b3DTabsXPTheme = TRUE;
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPWinXPVisualManager));
break;
case ID_VIEW_APPLOOK_2003:
// enable Office 2003 look:
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2003));
CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
break;
case ID_VIEW_APPLOOK_VS2005:
// enable VS 2005 look:
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManagerVS2005));
CBCGPVisualManager::GetInstance ();
CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
break;
case ID_VIEW_APPLOOK_VS2008:
// enable VS 2008 look:
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManagerVS2008));
CBCGPVisualManager::GetInstance ();
CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
break;
case ID_VIEW_APPLOOK_2007_1:
// enable Office 2007 look:
CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_LunaBlue);
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
break;
case ID_VIEW_APPLOOK_2007_2:
// enable Office 2007 look:
CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_ObsidianBlack);
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
break;
case ID_VIEW_APPLOOK_2007_3:
// enable Office 2007 look:
CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_Aqua);
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
break;
case ID_VIEW_APPLOOK_2007_4:
// enable Office 2007 look:
CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_Silver);
CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
break;
default:
ASSERT (FALSE);
}
CBCGPDockManager* pDockManager = GetDockManager ();
if (pDockManager != NULL)
{
ASSERT_VALID (pDockManager);
pDockManager->AdjustBarFrames ();
}
RecalcLayout ();
RedrawWindow (NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
theApp.WriteInt (_T("ApplicationLook"), m_nAppLook);
}
void CMainFrame::On
{
pCmdUI->SetRadio (m_nAppLook == pCmdUI->m_nID);
}
4.上下文菜单
(1)当然是新建一个需要的上下文菜单
(2)应用程序类的头文件下
virtual void PreLoadState ();
Cpp文件
void C***App::PreLoadState ()
{
GetContextMenuManager()->AddMenu (_T("My menu"), IDR_CONTEXT_MENU);//IDR_CONTEXT_MENU是菜单的ID
// TODO: add another context menus here
}
(3)响应上下文菜单的视图类中增加对上下文菜单消息的响应
void C***View::On
{
theApp.ShowPopupMenu (IDR_CONTEXT_MENU, point, this);
// TODO: 在此处添加消息处理程序代码
}
2.
BCG例子BCGPExplorer:
1.BCG的菜单、工具栏、动画图标和地址栏
这是BCG的主要特色,也比较繁琐。
(1)如果要支持自定义工具。
首先在String表定义入口ID:ID_TOOLS_ENTRY,与某菜单项关联。然后定义连续的ID,如ID_USER_TOOL1、ID_USER_TOOL2......。
在App下增加 EnableUserTools (ID_TOOLS_ENTRY, ID_USER_TOOL1, ID_USER_TOOL10);
(2)主要是修改CMainFrame
头文件声明
CBCGPMenuBar m_wndMenuBar;
CBCGPStatusBar m_wndStatusBar;
CBCGPToolBar m_wndToolBar;
CBCGPReBar m_wndReBar; //菜单、工具栏、地址栏的容器
CBCGPAnimCtrl m_wndAnimate;//动画控件
CComboBoxEx m_wndAddress;//地址栏
增加响应自定义工具的消息函数On
手动添加消息响应
afx_msg LRESULT On
afx_msg LRESULT On
虚函数virtual BOOL On
Cpp文件
ON_REGISTERED_MESSAGE(BCGM_RESETTOOLBAR, On
ON_REGISTERED_MESSAGE(BCGM_TOOLBARMENU, On
On
CBCGPToolBar::EnableQuickCustomization ();
CBCGPToolBar::SetSizes (CSize (28, 28), CSize (22, 22));//工具栏大小
CBCGPToolBar::SetMenuSizes (CSize (22, 22), CSize (16, 16));//工具栏中下拉菜单项大小
//指定常用的工具,其它会自动收缩。每个下拉(pulldown)菜单条至少要有一项
CList<UINT, UINT> lstBasicCommands;
lstBasicCommands.AddTail (ID_VIEW_TOOLBARS);
lstBasicCommands.AddTail (ID_APP_EXIT);
lstBasicCommands.AddTail (ID_APP_ABOUT);
lstBasicCommands.AddTail (ID_VIEW_TOOLBAR);
lstBasicCommands.AddTail (ID_VIEW_CUSTOMIZE);
lstBasicCommands.AddTail (ID_COMMAND_HISTORY);
lstBasicCommands.AddTail (ID_VIEW_LARGEICON);
lstBasicCommands.AddTail (ID_VIEW_SMALLICON);
lstBasicCommands.AddTail (ID_VIEW_LIST);
lstBasicCommands.AddTail (ID_VIEW_DETAILS);
lstBasicCommands.AddTail (ID_EDIT_CUT);
lstBasicCommands.AddTail (ID_EDIT_COPY);
lstBasicCommands.AddTail (ID_EDIT_PASTE);
CBCGPToolBar::SetBasicCommands (lstBasicCommands);
if (!m_wndMenuBar.Create (this))//菜单的创建
{
TRACE0("Failed to create menubar/n");
return -1; // fail to create
}
m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() | CBRS_SIZE_DYNAMIC);
// Remove menubar gripper and borders:
m_wndMenuBar.SetBarStyle (m_wndMenuBar.GetBarStyle() &
~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
//动画控件的创建,AFX_IDW_TOOLBAR为标准ID,IDB_ANIMATION是连续位图
if (!m_wndAnimate.Create (_T(""), WS_CHILD | WS_VISIBLE, CRect(0, 0, 20, 20), this, AFX_IDW_TOOLBAR + 2) ||
!m_wndAnimate.SetBitmap (IDB_ANIMATION, 20))
{
TRACE0("Failed to create aimation/n");
return -1; // fail to create
}
m_wndAnimate.Play (500);
//检测颜色深度是256还是真彩色
CClientDC dc (this);
BOOL bIsHighColor = dc.GetDeviceCaps (BITSPIXEL) > 8;
UINT uiToolbarHotID = bIsHighColor ? IDB_TOOLBAR256 : 0; //IDB_TOOLBAR256真彩色图像(用作工具栏)
UINT uiToolbarColdID = bIsHighColor ? IDB_TOOLBARCOLD256 : 0;
UINT uiMenuID = bIsHighColor ? IDB_MENU256 : IDB_MENU16;
if (!m_wndToolBar.CreateEx(this) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME, uiToolbarColdID, uiMenuID, FALSE, 0, 0, uiToolbarHotID))//IDR_MAINFRAME是256色的预定义工具栏
{
TRACE0("Failed to create toolbar/n");
return -1; // fail to create
}
// Remove toolbar gripper and borders:
m_wndToolBar.SetBarStyle (m_wndToolBar.GetBarStyle() &
~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
//创建地址栏
if (!m_wndAddress.Create (CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
{
TRACE0("Failed to create combobox/n");
return -1; // fail to create
}
//将各项加入rebar面板
DWORD dwStyle = RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP | RBBS_BREAK;
if (!m_wndReBar.Create(this) ||
!m_wndReBar.AddBar (&m_wndMenuBar) ||
!m_wndReBar.AddBar (&m_wndToolBar, NULL, NULL, dwStyle) ||
!m_wndReBar.AddBar(&m_wndAnimate, NULL, NULL, RBBS_FIXEDSIZE | RBBS_FIXEDBMP) ||
!m_wndReBar.AddBar(&m_wndAddress, _T("Address"), NULL, dwStyle))
{
TRACE0("Failed to create rebar/n");
return -1; // fail to create
}
m_wndMenuBar.AdjustLayout ();
m_wndToolBar.AdjustLayout ();
//--------------------------------------------------------------
// Set up min/max sizes and ideal sizes for pieces of the rebar:
//--------------------------------------------------------------
REBARBANDINFO rbbi;
CRect rectToolBar;
m_wndToolBar.GetItemRect(0, &rectToolBar);
rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_SIZE;
rbbi.cxMinChild = rectToolBar.Width();
rbbi.cyMinChild = rectToolBar.Height();
rbbi.cx = rbbi.cxIdeal = rectToolBar.Width() * m_wndToolBar.GetCount ();
m_wndReBar.GetReBarCtrl().SetBandInfo (1, &rbbi);
rbbi.cxMinChild = 0;
CRect rectAddress;
m_wndAddress.GetEditCtrl()->GetWindowRect(&rectAddress);
rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
rbbi.cyMinChild = rectAddress.Height() + 10;
rbbi.cxIdeal = 200;
m_wndReBar.GetReBarCtrl().SetBandInfo (3, &rbbi);//基于上面的AddBar所定的顺序
// 菜单和工具栏允许增加自定义按钮
m_wndMenuBar.EnableCustomizeButton (TRUE, (UINT)-1, _T(""));
m_wndToolBar.EnableCustomizeButton (TRUE, (UINT)-1, _T(""));
EnableDocking (CBRS_ALIGN_ANY);
m_wndReBar.EnableDocking (CBRS_TOP);//可以浮动和停靠
DockControlBar (&m_wndReBar);
CString strMainToolbarTitle;
strMainToolbarTitle.LoadString (IDS_MAIN_TOOLBAR);
m_wndToolBar.SetWindowText (strMainToolbarTitle);
// TODO: Remove this if you don't want tool tips
m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY);
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY);
void CMainFrame::On
{
//------------------------------------
// Create a customize toolbars dialog:
//------------------------------------
CBCGPToolbarCustomize* pDlgCust = new CBCGPToolbarCustomize (this,
TRUE
);
pDlgCust->Create ();
}
LRESULT CMainFrame::On
{
CPoint point (BCG_GET_X_LPARAM(lp), BCG_GET_Y_LPARAM(lp));
CMenu menu;
VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CBCGPPopupMenu* pPopupMenu = new CBCGPPopupMenu;
pPopupMenu->Create (this, point.x, point.y, pPopup->Detach ());
return 0;
}
//替换256色标准工具栏IDR_MAINFRAME为真彩色
afx_msg LRESULT CMainFrame::On
{
UINT uiToolBarId = (UINT) wp;
if (uiToolBarId != IDR_MAINFRAME)
{
return 0;
}
// Replace "Back" and "Forward" buttons by the menu buttons
// with the history lists:
CMenu menuHistory;
menuHistory.LoadMenu (IDR_HISTORY_POPUP);
CBCGPToolbarMenuButton btnBack (ID_GO_BACK, menuHistory,
CImageHash::GetImageOfCommand (ID_GO_BACK), _T("Back"));//带菜单的按钮
btnBack.m_bText = TRUE;
m_wndToolBar.ReplaceButton (ID_GO_BACK, btnBack);
m_wndToolBar.ReplaceButton (ID_GO_FORWARD,
CBCGPToolbarMenuButton (ID_GO_FORWARD, menuHistory,
CImageHash::GetImageOfCommand (ID_GO_FORWARD), _T("Forward")));
// "Folders" button has a text label:
m_wndToolBar.SetToolBarBtnText (m_wndToolBar.CommandToIndex (ID_VIEW_FOLDERS),
_T("Folders"));
// Replace "Views" button by the menu button:
CMenu menuViews;
menuViews.LoadMenu (IDR_VIEWS_POPUP);
m_wndToolBar.ReplaceButton (ID_VIEW_VIEWS,
CBCGPToolbarMenuButton ((UINT)-1, menuViews,
CImageHash::GetImageOfCommand (ID_VIEW_VIEWS), _T("Views")));
return 0;
}
BOOL CMainFrame::On
{
//---------------------------------------------------------
// 将占位的ID_VIEW_TOOLBARS菜单项替换为IDR_POPUP_TOOLBAR:
//---------------------------------------------------------
CFrameWnd::On
if (pMenuPopup != NULL &&
pMenuPopup->GetMenuBar ()->CommandToIndex (ID_VIEW_TOOLBARS) >= 0)
{
if (CBCGPToolBar::IsCustomizeMode ())
{
//----------------------------------------------------
// Don't show toolbars list in the cuztomization mode!
//----------------------------------------------------
return FALSE;
}
pMenuPopup->RemoveAllItems ();
CMenu menu;
VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
pMenuPopup->GetMenuBar ()->Imp
}
return TRUE;
}
3.
补充CBCGPToolBar的使用
CMainFrame::On
(1) CBCGPToolBar::EnableQuickCustomization ();//按Alt键时可以拖动工具栏上的图标重新排列
(2) m_wndToolBar.EnableCustomizeButton (TRUE, ID_VIEW_CUSTOMIZE, _T("Customize..."));
//允许自定义工具栏,名字“Customize”,并与菜单项ID_VIEW_CUSTOMIZE关联。
void CMainFrame::On
{//在BCG标准的自定义工具栏中加入新的属性页
CList <CRuntimeClass*, CRuntimeClass*> lstCustomPages;
lstCustomPages.AddTail (RUNTIME_CLASS (CMyCustomizationPage));
//CMyCustomizationPage是一个自定义的属性页
//------------------------------------
// Create a customize toolbars dialog:
//------------------------------------
CBCGPToolbarCustomize* pDlgCust = new CBCGPToolbarCustomize (this,
TRUE ,
BCGCUSTOMIZE_MENU_SHADOWS | BCGCUSTOMIZE_TEXT_LABELS |
BCGCUSTOMIZE_LOOK_2000 | BCGCUSTOMIZE_MENU_ANIMATIONS, // default parameters
&lstCustomPages); // pointer to the list of runtime classes of the custom property pages
pDlgCust->Create ();
}
(3)将占位菜单项ID_VIEW_TOOLBARS替换为菜单IDR_POPUP_TOOLBAR
virtual BOOL On
BOOL CMainFrame::On
{
//---------------------------------------------------------
// Replace ID_VIEW_TOOLBARS menu item to the toolbars list:
//---------------------------------------------------------
CFrameWnd::On
if (pMenuPopup != NULL &&
pMenuPopup->GetMenuBar ()->CommandToIndex (ID_VIEW_TOOLBARS) >= 0)
{
if (CBCGPToolBar::IsCustomizeMode ())
{
//----------------------------------------------------
// Don't show toolbars list in the cuztomization mode!
//----------------------------------------------------
return FALSE;
}
pMenuPopup->RemoveAllItems ();
CMenu menu;
VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
pMenuPopup->GetMenuBar ()->Imp
}
return TRUE;
}