BCGToolControlBar 扩展示例






2.93/5 (6投票s)
2001年5月3日
4分钟阅读

102140

2014
为 Stas Levin 出色的工具栏库添加的扩展。
BCGToolbar 库
本文档是作为对 Stas Levin 编写的优秀工具栏库的扩展而撰写的。本文档基于该库的 5.2 版本编写,但请访问 BCGSoft 网站获取最新版本。我将不深入讲解库的使用和安装方法。本文档描述如何向“自定义”对话框添加自定义页面,该对话框在右键单击工具栏或菜单并选择“Customize...”时显示。示例程序基于库中自带的“CustomPages”示例。部分代码也基于 BCGSkins 示例,该示例演示了如何使用 BCGControlBar 库为应用程序添加皮肤。我将不详细描述 CSkinPage
类,而是说明如何使用它。
入门
使用现有的 BCGControlBar 应用程序,或使用应用程序向导创建一个新应用程序。从示例项目中将以下文件复制到您的应用程序目录:
- Macstyle.*
- Funnystyle.*
- MyVisualManager.*
- SkinPage.*
此外,还需要从 .RC 文件添加必要的资源。
CSkinPage 类
要添加的页面是 CPropertyPage
的派生类,名为 CSkinPage
。它通过 AddSkin()
和 SelectSkin()
方法扩展了 CPropertyPage
。
void AddSkin(LPCSTR szName, LPCSTR szDescription, UINT nIDBitmapPreview);
返回值
none
参数
szName
皮肤在列表中显示的名称。
szDescription
皮肤的简短描述,显示在可用皮肤列表下方。
nIDBitmapPreview
从列表中选择皮肤时显示的预览图的位图资源 ID。
备注
您可以通过将 nIDBitmapPreview
设置为 0 来省略预览。这样将不显示预览图,但您仍然可以在实际应用程序中实时看到更改的预览。
位图资源应为 256 色,并且完全支持调色板。
void SelectSkin(int iSkin);
返回值
none
参数
iSkin
列表中应初始选择的皮肤索引。
备注
none
1. 添加自定义页面
在 CMainFrame::OnViewCustomize()
中,插入此代码,该代码将在您选择自定义工具栏和菜单时执行。
CList lstCustomPages; lstCustomPages.AddTail (RUNTIME_CLASS (CSkinPage)); //------------------------------------ // Create a customize toolbars dialog: //------------------------------------ CBCGToolbarCustomize* pDlgCust = new CBCGToolbarCustomize (this, TRUE /* Automatic menus scaning */, 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 (); // Very ugly cast!!! CMyBCGToolbarCustomize* pTemp = (CMyBCGToolbarCustomize*)pDlgCust; // Get a ptr to the skinpage and add some skins CSkinPage* pSkinPage = DYNAMIC_DOWNCAST(CSkinPage, pTemp->GetCustomPageList()->GetHead()); pSkinPage->AddSkin("Office XP", "The new Windows look", IDB_PREVIEW2); pSkinPage->AddSkin("Mac", "That ol\' mac style. For people that just can't let go :-)", IDB_PREVIEW1); pSkinPage->AddSkin("Stas on mushrooms", "A weird and strange windows look, " "that you propably won't stand for long", IDB_PREVIEW3); int iSelectedSkin = theApp.GetInt("ActiveSkin", 0); pSkinPage->SelectSkin(iSelectedSkin);
有趣的部分是最后几行,您在此添加实际页面并将其中一个选为活动页面。请注意,活动皮肤索引是从注册表中读取的 - 我稍后会回来讨论这一点。
您可能会看到我从创建的 CBCGToolbarCustomize
类进行了强制类型转换,将其转换为我自己的类 CMyBCgToolbarCustomize
,该类派生自 CBCGToolbarCustomize
。我这样做的原因是我需要访问该类的一个受保护成员。由于我无法更改库的原始源代码,所以我被迫这样做。
如果您插入此代码并选择“Customize...”,您将在众所周知的 BCGToolbar
页面中看到一个新页面。您可以尝试一下,您会发现它为列表中的每个条目显示了预览和描述 - 但除此之外并没有太多其他功能。
2. 添加皮肤支持
在您的应用程序类中添加一个新的成员函数来处理皮肤。我从库中附带的 BCGSkins 示例中获取了 SetSkin()
函数,并对其进行了一些修改。
void CCustomPagesApp::SetSkin(int iIndex) { if (CBCGVisualManager::GetInstance () != NULL) { delete CBCGVisualManager::GetInstance (); } switch (iIndex) { case 0: CBCGVisualManager::GetInstance (); break; case 1: new CMyVisualManager (); break; case 2: new CMacStyle (); break; case 3: new CFunnyStyle (); break; } CBCGVisualManager::GetInstance ()->SetLook2000 (); CBCGVisualManager::GetInstance ()->RedrawAll (); // Store the index of the active skin WriteInt("ActiveSkin", iIndex); }
最后一行是将最后使用的皮肤索引写入注册表。这个值就是 CMainFrame::OnViewCustomize()
中使用的值。
在使用皮肤时,请注意您需要释放任何动态分配的资源。有关更多信息,请参阅 BCGSkins 示例。同时,请确保包含了正确的头文件,以便应用程序能够编译。
在您的应用程序类 InitInstance()
中,应在显示主窗口之前添加以下代码:
// Set the skin that is active right now int iSelectedSkin = GetInt("ActiveSkin", 0); SetSkin(iSelectedSkin);
此代码将确保在启动时选择正确的皮肤。
3. 连接
现在我们将自定义页面和应用程序类连接起来,以便激活正确的皮肤。作为额外的奖励,我们将在应用程序窗口本身获得实时预览。
每次在列表中选择另一个皮肤时,都会向应用程序的主窗口发送一个注册的 Windows 消息。要处理此消息,请将 ON_REGISTERED_MESSAGE()
处理程序添加到 CMainFrame
的消息映射中。我已将函数命名为 OnNewSkin()
。以下是实现。
// Message handler for the BCGM_NEWSKIN message sent from the CSkinPage LRESULT CMainFrame::OnNewSkin(WPARAM wp,LPARAM lp) { int iSkindex = wp; ASSERT(iSkindex>=0); CCustomPagesApp* pApp = (CCustomPagesApp*)AfxGetApp(); ASSERT_VALID(pApp); pApp->SetSkin(iSkindex); return 0; }
此函数不执行任何有趣的操作。所选皮肤的索引从 WPARAM
参数传入,并直接传递给应用程序类中的 SetSkin()
函数。请确保您添加皮肤到列表的顺序与 SetSkin()
中处理索引的顺序完全一致 - 从一开始计算,因为第一个条目始终是“<无皮肤>”。
就是这样!现在就去试试吧。如果您不熟悉 BCGControlBar 库,请继续下载一个副本。该库可免费用于免费软件开发,对于商业应用程序而言,与 Stingray 和 Dundas 等类似库相比,价格也非常便宜。Stas 继续努力!
请注意,我与 BCGSoft 没有任何关系,除了我在日常工作中都使用该库。