窗口发生的代码创建 (即内容,当您调用 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;
}