这个问题我查了好多资料都没解决,我自己最后想了一种办法来解决它,大家一起可以交流。
1、首先创建MFC工程,edit control将背景设置透明,以及怎么添加滚轮(设置几个属性即可),这些我都不介绍了的童鞋可以下方评论,我会详细讲解。
2、现在问题是当我们滚动滑轮时会出现文字叠影问题。如图:
3、出现这样的问题是由于我们的主界面背景图片与控件透明设置冲突造成的,我们只需要在滚轮移动式刷新edit control文本即可解决这个问题。刷新edit control文本通过下面代码完成:
CWnd* pWnd = GetDlgItem(IDC_EDIT1);
CRect rc;
pWnd->GetWindowRect(&rc);
ScreenToClient(&rc);
InvalidateRect(&rc);
4、但是,又有一个问题,怎么刷新呢?刷新时机何在呢?(就是把代码加在哪?)我的解决方法是通过定时器来完成的。
5、我们首先再OnInitDialog()函数里面设置一个定时器,SetTimer(1, 1000, NULL);有不了解这个函数可以自己百度,第一个参数是定时器的编号,第二个参数是每隔多长时间刷新,第三个参数是回调函数。
6、添加完后再添加一个OnTime()函数,右键--》 类向导----》消息-----》找一个VM_TIMER这个消息,会自动产生这个函数,不用大家自己添加
7、在这个函数里面添加如下代码
void C背景图片Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1:
{
int n = GetDlgItem(IDC_EDIT1)->GetScrollPos(SB_VERT);//这个是获取滑轮的位置
if (n != old){//old是先前滑轮的位置,如果新的滑轮位置不相同,再刷新,相同就不刷新
old = n;
CWnd* pWnd = GetDlgItem(IDC_EDIT1);
CRect rc;
pWnd->GetWindowRect(&rc);
ScreenToClient(&rc);
InvalidateRect(&rc);
}
break;
}
CDialogEx::OnTimer(nIDEvent);
}
注意:old需要我们自己在创建的类中添加,并且初始化。在类中添加成员变量 int old。 并且在OnTime()函数中先获取滑轮初始位置GetDlgItem(IDC_EDIT1)->GetScrollPos(SB_VERT);
大家可以把刷新事件设置短一些。。我一般设置500ms,嘿嘿。。。
9、至此解决。有不明白的童鞋可以下方评论。。。。