我在一个全屏透明的自定义控件上动态创建了一个透明自定义控件,给这个动态创建的自定义控件贴了背景图片,我要拖拽移动这个控件,可是出现的效果让人恶心,控件移动的每一步都在窗体上显示出来了,一个个叠加,出现很多个控件,我认为是重绘的问题,大家来看看问题出在哪,帮解决下,我提前先谢谢你们。//全屏透明自定义控件代码,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);
}
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);
}
解决方案 »
- windbg定位出的异常信息,麻烦大家给解释下,谢谢!
- 初学win32 SDK想写点儿东西练练手但又不知道搞写给点儿建议
- cin.get()与cin在这个程序中的区别???
- 主線程UpdateData()函數出錯,
- 为什么我的扩展存储过程在没有装有VC的机器上不能运行?
- 进程锁大家是否发现过问题(windows)?cowworker plz in!
- 24位RGB做Gamma变换的代码例子(我实现了灰度图像)
- 简单问题:为什么窗口出现之后马上又关闭了
- 急聘VC高手(地点深圳,工作一年以上)
- NT服务程序中如何修改线程的权限
- 通过按钮输入数据
- 无法定位程序输入点QueryFullProcessImageNameW于动态链接库KERNEL.DLL上
http://blog.csdn.net/xianglitian/archive/2010/11/20/6023656.aspx
{
// TODO: 在此添加消息处理程序代码和/或调用默认值return CWnd::OnEraseBkgnd(pDC);
}
直接return TRUE;
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);
}
希望对你有帮助~