提供无窗口的启动
窗口发生的代码创建 (即内容,当您调用 CreateWindow) 是大的执行。 维护一屏上的窗口的控件必须管理窗口的消息。 因此无窗口控件与具有窗口中的控件快。
无窗口控件的一个后期优点是不同,有窗口的控件,无窗口控件支持透明和绘制矩形屏幕区域。 透明控件的一个常见示例是一个带透明背景的文本控件。 绘制控件中的文本,但不是后台线程,因此,什么通过在文本显示在的下面。 较新的窗体通常利用矩形控件,如箭头和圆形按钮。
通常,,在容器中编写支持无窗口的对象条件下,控件不需要有自己的一个窗口,因此,相反,不能使用其容器 windows 服务。 无窗口控件与旧的容器向后兼容性。 在不编写的早期容器支持无窗口控件,无窗口控件创建窗口后,当激活。
由于无窗口控件没有自己的窗口中,包含一个窗口) 的容器 (为控件提供自己的 windows 另外提供的服务负责。 例如,在中,如果控件需要查询键盘焦点,捕获鼠标或获取设备上下文,这些操作由容器管理。 容器将用户输入信息发送到窗口设置为适当的无窗口控件,使用 IOleInPlaceObjectWindowless 接口。 (对于此接口的说明 ,参见 ActiveX SDK 。) COleControl 成员函数调用从容器的这些服务。
要使您的控件使用无窗口的启动,包括 windowlessActivate 标志。 COleControl::GetControlFlags返回的一组标志。 例如:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can activate without creating a window.
dwFlags |= windowlessActivate;
...
return dwFlags;
}
,如果选择在 MFC Activex 控件向导的 控件设置 页上, Windowless activation 选项包括此标志的代码自动生成。
当无窗口的启动启用,容器将委托输入消息发送到控件的 IOleInPlaceObjectWindowless 接口。 此接口的 entity_CODECOleControl 的实现通过控件的消息映射调度消息,在相应调整鼠标坐之后。 您可以通过将对应项处理类似普通的窗口消息的消息,向消息映射。 在您的这些消息的处理程序,请避免使用 m_hWnd 成员变量 (或使用它) 的任何成员函数,而无需先检查其值不是 NULL。
COleControl 提供调用鼠标捕获、键盘焦点、滚动和其他 windows 服务从容器根据需要的成员函数,包括:
在无窗口控件,应始终使用 COleControl 成员函数而不是相应的 CWnd 成员函数或其相关 Win32 API 函数。
您可以无窗口控件是 OLE 拖放操作的目标。 通常,这需要控件 windows 注册表作为放置目标。 因为控件不具有各自的窗口,容器使用自己的窗口作为放置目标。 控件提供容器可以委托在调用 IDropTarget 接口的实现。 若要显示此接口添加到容器,请重写 COleControl::GetWindowlessDropTarget。 例如:
IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
m_DropTarget.m_xDropTarget.AddRef();
return &m_DropTarget.m_xDropTarget;
}