可视化管理器

虚拟管理器是一个对象,用于控制整个应用程序的外观。 它充当一个类,可在其中放置应用程序的所有绘图代码。 MFC 库包括多个虚拟管理器。 如果要为应用程序创建自定义视图,还可以创建自己的虚拟管理器。 下图显示了当启用不同的虚拟管理器时相同的应用程序:

MyApp as rendered by CMFCVisualManagerWindows.
使用 CMFCVisualManagerWindows 虚拟管理器的 MyApp

MyApp as rendered by CMFCVisualManagerVS2005.
使用 CMFCVisualManagerVS2005 虚拟管理器的 MyApp

MyApp as rendered by CMFCVisualManagerOfficeXP.
使用 CMFCVisualManagerOfficeXP 虚拟管理器的 MyApp

MyApp as rendered by CMFCVisualManagerOffice2003.
使用 CMFCVisualManagerOffice2003 虚拟管理器的 MyApp

MyApp as rendered by CMFCVisualManagerOffice2007.
使用 CMFCVisualManagerOffice2007 虚拟管理器的 MyApp

默认情况下,虚拟管理器维护多个 GUI 元素的绘图代码。 若要提供自定义 UI 元素,需要重写虚拟管理器的相关绘图方法。 有关这些方法的列表,请参阅 CMFCVisualManager 类。 可以重写以提供自定义外观的方法是所有以 OnDraw 开头的方法。

应用程序只能有一个 CMFCVisualManager 对象。 若要获取指向应用程序虚拟管理器的指针,请调用静态函数 CMFCVisualManager::GetInstance。 由于所有虚拟管理器都继承自 CMFCVisualManager,因此 CMFCVisualManager::GetInstance 方法将获取指向相应虚拟管理器的指针,即使创建自定义虚拟管理器也是如此。

如果要创建自定义虚拟管理器,则必须从已存在的虚拟管理器派生它。 派生自的默认类是 CMFCVisualManager。 但是,如果其他虚拟管理器更贴合应用程序的需求,则可以使用该虚拟管理器。 例如,如果你想要使用 CMFCVisualManagerOffice2007 虚拟管理器,但只希望更改分隔符的外观,则可以从 CMFCVisualManagerOffice2007 中派生自定义类。 在此方案中,应只重写绘制分隔符的方法。

在应用程序中使用特定的虚拟管理器有两种可行的方法。 一种方法是调用 CMFCVisualManager::SetDefaultManager 方法,并将相应的虚拟管理器作为参数传递。 下面的代码示例演示如何通过此方法使用 CMFCVisualManagerVS2005 虚拟管理器:

CMFCVisualManager::SetDefaultManager (RUNTIME_CLASS (CMFCVisualManagerVS2005));

在应用程序中使用虚拟管理器的另一种方法是手动创建它。 然后,应用程序将使用这个新的虚拟管理器进行所有呈现。 但是,由于每个应用程序只能有一个 CMFCVisualManager 对象,因此在创建新的虚拟管理器之前,必须删除当前的虚拟管理器。 在以下示例中,CMyVisualManager 是派生自 CMFCVisualManager 的自定义虚拟管理器。 以下方法将根据索引更改用于显示应用程序的虚拟管理器:

void CMyApp::SetSkin (int index)
{
    if (CMFCVisualManager::GetInstance() != NULL)
    {
        delete CMFCVisualManager::GetInstance();
    }

    switch (index)
    {
    case DEFAULT_STYLE:
        // The following statement creates a new CMFCVisualManager
        CMFCVisualManager::GetInstance();
        break;

    case CUSTOM_STYLE:
        new CMyVisualManager;
        break;

    default:
        CMFCVisualManager::GetInstance();
        break;
    }

    CMFCVisualManager::GetInstance()->RedrawAll();
}

另请参阅

用户界面元素
CMFCVisualManager 类