65.9K
CodeProject 正在变化。 阅读更多。
Home

BCGToolControlBar 扩展示例

2001年5月3日

4分钟阅读

viewsIcon

102140

downloadIcon

2014

为 Stas Levin 出色的工具栏库添加的扩展。

Sample Image - SkinPage.gif

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 没有任何关系,除了我在日常工作中都使用该库。

© . All rights reserved.