SUBEDIT 示例:创建标准 Windows 控件的超类

更新:2007 年 11 月

SUBEDIT 示例说明如何创建 ATL 控件作为标准 Windows“编辑”(Edit) 控件的超类。

SUBEDIT 属性示例是此示例的属性化版本。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行此示例

  1. 打开解决方案文件 SubEdit.sln。

  2. 从“生成”菜单中单击“生成”。

  3. 示例生成后,在 Web 浏览器中打开 AtlEdit.htm,试验该控件。

可以通过打开 ATLEdit 类在 ActiveX 控件测试容器中测试该控件。有关访问测试容器和用它来测试控件的详细信息,请参见用测试容器测试属性和事件

为 Windows 控件创建超类

ATL 提供创建控件作为标准 Windows 控件的超类的能力。创建超类使您得以创建基于现有类但使用不同窗口过程的窗口类。然后创建基于此新窗口类的窗口。当为控件创建超类时,在将消息发送到控件的原始窗口过程之前,先由 ATL 消息映射进行处理。这使您得以修改标准 Windows 控件的默认行为。

在使用“ATL 控件向导”创建 ActiveX 控件时,可选择添加基于标准窗口类的控件。在这种情况下,向导向您的 ActiveX 控件的类中添加一个 CContainedWindow 类型的成员变量。然后 CContainedWindow::Create 创建一个窗口作为您指定的窗口类的超类。该窗口使用 CContainedWindow::WindowProc 通过消息映射路由其消息。如果消息需要进一步处理,则将其发送到窗口类的原始窗口过程。

检查 SUBEDIT 示例代码 (AtlEdit.h)

CAtlEdit 类的构造函数将 m_bWindowOnly 成员变量设置为 TRUE。这确保了该控件永远不会作为无窗口控件激活。

CContainedWindow 成员变量 m_EditCtrlCAtlEdit 构造函数初始化。CContainedWindow 构造函数采用三个参数:要为其创建超类的窗口类的名称(这里是指“EDIT”);指向 CAtlEdit 类(它包含消息映射)的指针;以及将处理 m_EditCtrl 的消息的消息映射的标识符。默认情况下,m_EditCtrl 使用由 ALT_MSG_MAP 宏声明的替换消息映射。

默认的消息映射为发送到 CAtlEdit 控件的 WM_CREATEWM_CTLCOLOREDIT 消息声明处理函数的名称。OnCreate 处理程序调用 CContainedWindow::Create 来创建 m_EditCtrl 的窗口。OnCtlColorEdit 处理程序为 m_EditCtrl 指定新的背景色和文本颜色。

替换消息映射为发送到 m_EditCtrlWM_CHAR 消息声明处理函数。该处理程序仅接受字符,不接受符号和数字,然后将 WM_CHAR 消息传递到由 Windows Edit 类定义的原始窗口过程。

关键字

此示例使用以下关键字:

CComCoClass、CComControl、CComModule::GetClassObject、CComModule::GetLockCount、CComModule::Init、CComModule::RegisterServer、CComModule::Term、CComModule::UnregisterServer、CComObjectRoot、CContainedWindow::DefWindowProc、DisableThreadLibraryCalls、GetStockObject、GetWindowRect、IDataObjectImpl、IDispatchImpl、IOleControlImpl、IOleInPlaceActiveObjectImpl、IOleInPlaceObjectWindowlessImpl、IOleInPlaceObjectWindowlessImpl::SetObjectRects、IOleObjectImpl、IPersistStorageImpl、IPersistStreamInitImpl、IProvideClassInfo2Impl、IQuickActivateImpl、ISpecifyPropertyPagesImpl、IViewObjectExImpl、SetBkColor、SetTextColor、SetWindowPos

请参见

其他资源

ATL 示例