BCGToolControlBar扩展示例

BCGToolbar图书馆 本文是Stas Levin编写的一个优秀工具栏库的扩展。本文使用的是该库的5.2版本,但是要了解最新版本,请查看BCGSoft网站。我不会介绍你如何使用和安装这个库。这篇文章描述了如何在自定义对话框中添加一个自定义页面,当你右键点击工具栏或菜单并选择“自定义…”时,这个对话框就会显示出来。示例程序基于库附带的示例“CustomPages”。部分代码还基于BCGSkins示例,该示例演示了如何使用BCGControlBar库向应用程序添加皮肤。我将不详细描述CSkinPage类,而是描述如何使用它。 开始 使用现有的BCGControlBar应用程序或使用应用程序向导创建新应用程序。从示例项目复制以下文件到您的应用程序目录: Macstyle。* Funnystyle。* MyVisualManager。* SkinPage。* 还要从. rc文件中添加必要的资源。 CSkinPage类 要添加的页面是一个名为CSkinPage的CPropertyPage派生。它通过方法AddSkin()和SelectSkin()扩展了CPropertyPage。隐藏,复制Code

void AddSkin(LPCSTR szName, LPCSTR szDescription, UINT nIDBitmapPreview);

返回值 没有一个 参数 szName 显示在列表中的皮肤的名称。 szDescription 对皮肤的简短描述,显示在可用皮肤列表的下面。 nIDBitmapPreview 当从列表中选择皮肤时,显示作为预览的位图资源。 讲话 您可以通过将nidbitm街景设置为0来省略预览。这样就不会显示预览,但您仍然可以在实际应用程序中看到更改的实时预览。 位图资源应该是256色,并且完全支持调色板。隐藏,复制Code

void SelectSkin(int iSkin); 

返回值 没有一个 参数 iSkin 最初应该选择的列表中的皮肤的索引。 讲话 没有一个 1. 添加自定义页面 在CMainFrame::OnViewCustomize()中,插入这段代码,当您选择定制工具栏和菜单时,它将被执行。隐藏,收缩,复制Code

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()函数,并对其进行了一些修改。隐藏,收缩,复制Code

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()中,您应该在显示主窗口之前添加以下代码。隐藏,复制Code

// Set the skin that is active right now
int iSelectedSkin = GetInt("ActiveSkin", 0);
SetSkin(iSelectedSkin);

这段代码将确保在启动时选择的是正确的皮肤。 3.连接 现在我们将连接定制页面和应用程序类,以便激活正确的皮肤。作为额外的奖励,我们将在应用程序窗口中获得实时预览。 每次在列表中选择另一个皮肤时,都会向应用程序的主窗口发送一条已注册的Windows消息。要处理此消息,请在CMainFrame的消息映射中添加一个ON_REGISTERED_MESSAGE()处理程序。我已经调用了函数OnNewSkin()。下面是实现。隐藏,复制Code

// 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()中处理索引的顺序完全相同——从1开始,因为第一个条目总是“<no skin>”。 就是这样!去试试吧。如果您不熟悉BCGControlBar库,可以下载一个副本。图书馆是免费使用的对于免费软件开发来说,与Stingray和Dundas提供的类似库相比,对于商业应用程序来说是相当便宜的。继续努力吧,斯塔斯!! 请注意,我没有以任何方式连接到BCGSoft,除了我在日常工作中使用这个库。 本文转载于:http://www.diyabc.com/frontweb/news12264.html

posted @ 2020-08-11 09:56  Dincat  阅读(240)  评论(0编辑  收藏  举报