我在一个全屏透明的自定义控件上动态创建了一个透明自定义控件,给这个动态创建的自定义控件贴了背景图片,我要拖拽移动这个控件,可是出现的效果让人恶心,控件移动的每一步都在窗体上显示出来了,一个个叠加,出现很多个控件,我认为是重绘的问题,大家来看看问题出在哪,帮解决下,我提前先谢谢你们。//全屏透明自定义控件代码,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);
}

解决方案 »

  1.   

    这个效果你觉得可以么?
    http://blog.csdn.net/xianglitian/archive/2010/11/20/6023656.aspx
      

  2.   

    父窗口设置WS_CLIPCHILDREN属性试试BOOL CUnitPanel::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值return CWnd::OnEraseBkgnd(pDC);
    }
    直接return TRUE;
      

  3.   

    我想你不能用OnLButtonDown响应,应该用OnLButtonUp响应事件移动控件:
    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);
    }
      

  4.   

    小弟弟,用双缓冲呀!WS_CLIPCHILDREN WS_CLIPSIBLINGS   效果有没?
      

  5.   

    http://hi.baidu.com/%D0%A1%B2%DD%B2%BB%C8%DD%D2%D7/blog/item/7828bdff804464225d600837.html
    希望对你有帮助~