MFC 对话框程序控件局部刷新方法!
2016-09-30 10:36
183 查看
初学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
[b]xxxxDlg::RefreshIndividualControl(UINT
uCtlID);(注意添加xxxxDlg::,否则会报错,具体原因自行百度)。[/b]
下面是代码的实现:
{
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对话框程序静态控件透明的实现,以及控件局部刷新的方法介绍完毕!
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
[b]xxxxDlg::RefreshIndividualControl(UINT
uCtlID);(注意添加xxxxDlg::,否则会报错,具体原因自行百度)。[/b]
下面是代码的实现:
{
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对话框程序静态控件透明的实现,以及控件局部刷新的方法介绍完毕!
相关文章推荐
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- MFC中edit控件中同一程序中对话框间的传值与显示方法
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- VC++无标题窗口以及控件拖动的方法,MFC中的对话框怎么拖动不了
- 回调函数中使用MFC类的成员或对话框控件的简单方法。
- 用MFC写对话框形式的DLL并用程序进行调用方法
- 不用splitter控件 简单实现对mfc对话框的分割的方法
- VC2012下MFC程序各控件的常用方法
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法
- 两种方法实现MFC 对话框最大化时控件也随比例最大化或者还原
- MFC对话框程序中当鼠标移动到控件上后改变形状
- MFC基于对话框风格按钮控件添加图片的方法(大神止步)
- MFC子线程访问主线程对话框程序的控件对象
- MFC对话框程序EDIT类控件的自动换行,垂直滚动条自动下移
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法
- 控件方法MFC对话框编程(二):控件的访问
- 基于对话框的MFC程序启动时完全隐藏的简单方法