老调重谈,拖动控件重绘的问题怎么解决?
我在一个全屏透明的自定义控件上动态创建了一个透明自定义控件,给这个动态创建的自定义控件贴了背景图片,我要拖拽移动这个控件,可是出现的效果让人恶心,控件移动的每一步都在窗体上显示出来了,一个个叠加,出现很多个控件,我认为是重绘的问题,大家来看看问题出在哪,帮解决下,我提前先谢谢你们。
//全屏透明自定义控件代码,CTransprentPanel.cpp: 实现文件
void CTransprentPanel::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CWnd::OnPaint()
}
//
void CTransprentPanel::OnLButtonUp(UINT nFlags, CPoint point)
{
unitWnd = new CUnitPanel();//创建一个自定义控件
unitWnd->Create(_T("CTransprentPanel"),_T("UnitPanel"),CS_HREDRAW | CS_VREDRAW | CS_OWNDC,m_rectInfo,panel,IDC_CUSTOM_NEWUNIT);
unitWnd->ShowWindow(SW_SHOW);
unitWnd->DrawTransprentWnd(unitWnd->GetSafeHwnd(),200);//调用此函数使控件透明
}
//动态创建的这个自定义控件代码, UnitPanel.cpp : 实现文件
/*传进指定的窗口句柄,使其窗口透明*/
BOOL CUnitPanel::DrawTransprentWnd(HWND hWnd,BYTE transprt)
{
//m_brush.CreateSolidBrush(RGB(255,0,255));//背景设置为粉红色
//设置背景
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,NULL);
//SetWindowsLong将窗体设置为层级窗体
DWORD dwExStyle = GetWindowLong(hWnd,GWL_EXSTYLE);//获取窗体信息
SetWindowLong(hWnd,GWL_EXSTYLE,dwExStyle|0x80000);//去掉当前窗口一个属性,原属性和
//设置透明色:
//用SetLayeredWindowAttributes设置透明色为0,它比UpdateLayeredWindow的使用要简单些
HMODULE hInst= LoadLibrary(_T("User32.DLL"));//加载动态链接库
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);//定义函数指针类型
MYFUNC SetLayeredWindowAttributes = NULL;//定义一个该函数指针类型的变量
//得到动态连接库的SetLayeredWindowAttributes函数,用SetLayeredWindowAttributes指向它
SetLayeredWindowAttributes = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
SetLayeredWindowAttributes(hWnd,0,transprt,2);//调用SetLayeredWindowAttributes函数
//SetLayeredWindowAttributes(hWnd,0,transprt,ULW_ALPHA);
FreeLibrary(hInst);//释放DLL
return true;
}
BOOL CUnitPanel::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return CWnd::OnEraseBkgnd(pDC);
}
void CUnitPanel::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
/*CTransprentPanel * panel = new CTransprentPanel();*/
Graphics graphics(this->m_hWnd);//Graphi
TCHAR EXEPULLPATH[MAX_PATH];
GetModuleFileName(NULL,EXEPULLPATH,sizeof(EXEPULLPATH));
CString strCurDir = EXEPULLPATH;
strCurDir = strCurDir.Left(strCurDir.ReverseFind('\\'));
strCurDir = strCurDir.Left(strCurDir.ReverseFind('\\'));
strCurDir += "\\Image\\Blue\\单元窗口.png";
Image img(strCurDir);
graphics.DrawImage(&img,0,0,m_rectInfo.Width(),m_rectInfo.Height());
// 不为绘图消息调用 CWnd::OnPaint()
}
/*通过此响应事件移动控件*/
void CUnitPanel::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//禁止显示移动矩形窗体框
::SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,TRUE,NULL,0);
//非标题栏移动整个窗口
SendMessage(WM_SYSCOMMAND,0xF012,0);
//PostMessage(WM_PAINT,HTCAPTION,MAKELPARAM(point.x,point.y));
CWnd::OnLButtonDown(nFlags, point);
}