老调重谈,拖动控件重绘的问题怎么解决?

_Sodo_ 2011-03-11 09:56:55
我在一个全屏透明的自定义控件上动态创建了一个透明自定义控件,给这个动态创建的自定义控件贴了背景图片,我要拖拽移动这个控件,可是出现的效果让人恶心,控件移动的每一步都在窗体上显示出来了,一个个叠加,出现很多个控件,我认为是重绘的问题,大家来看看问题出在哪,帮解决下,我提前先谢谢你们。

//全屏透明自定义控件代码,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);
}
...全文
138 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-04-01
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
普通网民 2011-04-01
  • 打赏
  • 举报
回复
小弟弟,用双缓冲呀!WS_CLIPCHILDREN WS_CLIPSIBLINGS 效果有没?
hztj2005 2011-04-01
  • 打赏
  • 举报
回复
我想你不能用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);
}
Eleven 2011-03-11
  • 打赏
  • 举报
回复
父窗口设置WS_CLIPCHILDREN属性试试

BOOL CUnitPanel::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

return CWnd::OnEraseBkgnd(pDC);
}
直接return TRUE;
_Sodo_ 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xianglitian 的回复:]

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

好像不行,我的这个是个透明的自定义控件,贴图模拟不规则窗体,然后上面还要承载其它控件,郁闷了。
向立天 2011-03-11
  • 打赏
  • 举报
回复
_Sodo_ 2011-03-11
  • 打赏
  • 举报
回复
谁能告诉我是什么问题造成的?如果看不懂要看源码我上传,急急急。
east_0012 2011-03-11
  • 打赏
  • 举报
回复
等待牛人
_Sodo_ 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualeleven 的回复:]

父窗口设置WS_CLIPCHILDREN属性试试

BOOL CUnitPanel::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

return CWnd::OnEraseBkgnd(pDC);
}
直接return TRUE;
[/Quote]

不行呀,大哥!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧