看看MSDN的说明:
执行窗口创建代码(即调用 CreateWindow 时发生的事情)的费用很大。维护屏幕窗口的控件不得不管理窗口的消息。因此无窗口控件比有窗口控件快。
无窗口控件的另一个优点在于,与有窗口控件不同,无窗口控件支持透明绘制和非矩形屏幕区域。透明控件的一个常见示例是具有透明背景的文本 (Literal) 控件。文本 (Literal) 控件绘制文本但不绘制背景,因此文字下方的内容都显露出来。较新的窗体常使用非矩形控件,如箭头和圆按钮。
只需要在建立项目的时候(VS.NET 2003),在“控件设置”中选择“无窗口激活”,就可以了。
如果已经建立了项目,也不要紧,只需要重写GetControlFlags()函数就可以了。具体实现如下:
DWORD CTransRectCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
dwFlags |= windowlessActivate;
return dwFlags;
}
不过使用了无窗口激活之后,控件就没有了自己的窗口,刷新就成了问题,Invalidate()是不能用的,否则,ASSERT(::IsWindow(m_hWnd));可不是吃素的。
这个时候就要使用InvalidateControl()来进行刷新了。
还有其他的问题,可参考:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_providing_windowless_activation.asp。虽然简单,总比没有的好。呵呵