初学mfc编程的小伙伴通常会遇到控件透明制作,小白就来讲一下“基于对话框程序控件透明”的方法:
1、打开类向导(ClassWizard),VC6.0快捷键Ctrl + W, VS2010快捷键Ctrl + Shift + X。
2、重载OnCtlColor,添加如下函数:
if (nCtlColor == CTLCOLOR_STATIC)
{
CRect rc;
pWnd->GetWindowRect(&rc);
ScreenToClient(&rc);
CDC* dc = GetDC();
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), dc, rc.left, rc.top, SRCCOPY); //把父窗口背景图片先画到按钮上
ReleaseDC(dc);
pDC->SetTextColor(RGB(255, 255, 255));//设置字体颜色
pDC->SetBkMode(TRANSPARENT);//设置透明控件
hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);
}
return hbr;
至此,Static控件已经实现透明效果了!
2.在透明的static上改变文字显示时会出现文字重叠现象,需调用函数 Invalidate(true); 即可,但这样是对所有的控件进行刷新,会造成屏幕闪烁现象,最好的办法就是对控件进行局部刷新,这样就可以保证只刷新单一控件,解决不断闪屏的问题:
二、 局部刷新透明控件:
我们需要自己定义一个函数,再 xxxxDlg.h中的 public:下添加自定义函数
void RefreshIndividualControl(UINT uCtlID);
在xxxxDlg.cpp中实现函数:
void xxxxDlg::RefreshIndividualControl(UINT uCtlID);(注意添加xxxxDlg::,否则会报错,具体原因自行百度)。
下面是代码的实现:
{
CRect rect;
GetDlgItem(uCtlID)->GetWindowRect(&rect); //获取控件区域
ScreenToClient(&rect); //屏幕区域对客户区域的转换
InvalidateRect(rect);//刷新
}
最后在你改变文字代码后面添加该函数即可,示例如下:
GetDlgItem(IDC_STATIC1)->SetWindowText("123");
RefreshIndividualControl(IDC_STATIC1);
三、 小白在做项目的过程中还发现一种方法就是在改变控件文字之后可以用 显示,隐藏来解决静态控件文字重叠的现象:
该方法仅供参考,不太实用:
GetDlgItem(IDC_STATIC1)->SetWindowText("123");
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);
至此,基于MFC对话框程序静态控件透明的实现,以及控件局部刷新的方法介绍完毕!