原創|其它|編輯:郝浩|2012-09-20 11:50:12.000|閱讀 5283 次
概述:1、VC2008集成了BCGControlBar的相關功能,用wizard生成的話如果選與BCGControlBar有關的性能,如預定皮膚,則應用程序是從CWinAppEx派生,再加CBCGPWorkspace似乎不行。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
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 OnAppLook(UINT id); afx_msg void OnUpdateAppLook(CCmdUI* pCmdUI);
(3)CMainFrame的Cpp文件
//消息映射增加
ON_COMMAND_RANGE(ID_VIEW_APPLOOK_2000, ID_VIEW_APPLOOK_VS2008, OnAppLook) //這是范圍的響應,所以ID要連續
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_2000, ID_VIEW_APPLOOK_VS2008, OnUpdateAppLook)
//初始化函數
m_nAppLook = theApp.GetInt (_T( "ApplicationLook"), ID_VIEW_APPLOOK_2003);//初始的樣子
//OnCreate
OnAppLook (m_nAppLook);
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::OnAppLook(UINT id)
{
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::OnUpdateAppLook(CCmdUI* pCmdUI)
{
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::OnContextMenu(CWnd* , CPoint point)
{
theApp.ShowPopupMenu (IDR_CONTEXT_MENU, point, this);
// TODO: 在此處添加消息處理程序代碼
}
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:博客園