视觉对象管理器是控制整个应用程序外观的对象。 它充当单个类,可在其中放置应用程序的所有绘图代码。 MFC 库包括多个视觉对象管理器。 如果想要为应用程序创建自定义视图,还可以创建自己的视觉对象管理器。 启用不同的视觉管理器时,下图显示了相同的应用程序:
使用 CMFCVisualManagerWindows 视觉管理器的 MyApp
使用 CMFCVisualManagerVS2005 视觉管理器的 MyApp
使用 CMFCVisualManagerOfficeXP 视觉管理器的 MyApp
使用 CMFCVisualManagerOffice2003 视觉对象管理器的 MyApp
使用 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();
}