如何编写背景透明的MFC ActiveX控件

    我找了很久这方面的文章,一直觉得要做很复杂的工作,其实非常简单。MFC本身就给我们提供了很好的实现:无窗口激活。

    看看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。虽然简单,总比没有的好。呵呵

你可能感兴趣的:(ActiveX)