描述:
VC++下
我按下面的方面实现控件背景透明,我在控件上画了一个圆,但一改变控件大小,控件重画时,上一次的圆还显示,
请问高手怎样处理?
背景透明控件
有时我们希望控件的背景不要遮盖其身后相应的容器或其他控件。这样,就必须将其制作成背景透明的控件。例如,Visual BASIC中的Shape控件就属于此类。请大家注意:我们所说的背景是指控件的整个区域,而不包括控件上的某些元素(如图形、文本)的背景,因为根据需要,用户可以指定控件上某些元素的背景不透明。但这并不能说控件的背景是不透明的。为了深入理解这一点,大家可以体会一下Visual BASIC的Shape控件的特性。
背景透明控件的制作方法是:在MFC ActiveX Control Wizard向导的第二步中的Advanced按钮对话框中选中Windowless activation复选框。
同样,要想修改已生成的控件项目,则可在该控件类的.cpp文件中重置控件类成员函数GetControlFlags(),当然还要在控件类的.h文件中首先声明该成员函数:
(1)在MyControlCtl.h文件中加入:
virtual DWORD GetControlFlags();
(2)在MyControlCtl.cpp文件中加入:
DWORD CMyControlCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
dwFlags != windowlessActivate;//设置控件为非窗体型
return dwFlags;
}
这里需要说明的是:之所以将控件定制为非窗体型,是因为窗体都是不透明的,因此控件透明的前提必须是非窗体型的。不过,如果将控件制作为容器控件,则背景透明将无效。另外,一旦控件被定制成非窗体型,那么控件上的坐标是相对于容器的坐标原点,而不是相对于控件自身的坐标原点。所以,我们在控件上显示其他元素(如图形、文本等)时,应使用COleControl类的成员函数GetRectInContainer()或ClientToParent()将控件的内部坐标转换为相对于容器的坐标值,这一点请大家特别留意。