在透明背景上拖动图片,拖尾问题。

kennielie_net 2009-09-25 09:57:24
我自做了一个类,基类是STATIC,是透明背景,功能是在上面显示一个位图。而且能用鼠标拖动位图。现在问题是,我拖动位图时有拖尾,如何解决呢?
在OnPaint()调用函数Draw(),我的Draw()代码如下:
Draw()
{
CClientDC clientDC(this);
HDC hDC=::GetDC(this->m_hWnd);
CDC *pDC=CDC::FromHandle(hDC);
CRect crect;//client rect
GetClientRect(crect);
CBitmap bitmap;
CDC bitmapDC;
bitmapDC.CreateCompatibleDC(&clientDC);
CBitmap* pOldBitmap;

bitmap.LoadBitmap(IDB_VERTICAL_MY_THUMB);//
pOldBitmap = bitmapDC.SelectObject(&bitmap);
BITMAP m_MyBm;
bitmap.GetBitmap(&m_MyBm);

CRect m_ThumbRect;
int m_Width,m_Height;
m_Width = m_MyBm.bmWidth;
m_Height = m_MyBm.bmHeight;
m_ThumbRect.left=(m_rectClient.left+((m_rectClient.Width()-m_MyBm.bmWidth)/2));
m_ThumbRect.top=m_rectThumb.top;
DrawTransparent(pDC,m_ThumbRect.left,m_ThumbRect.top,RGB(255,0,0));
}

后来经过参考别人做法,在Draw()程序开头添加如下代码:
CClientDC clientDC(this);
//CDC *pDC=new CDC;
//pDC->Attach(clientDC.m_hDC);
HDC hDC=::GetDC(this->m_hWnd);
CDC *pDC=CDC::FromHandle(hDC);
//CDC* pDC; //表示控件窗口的设备描述表.DC
//pDC=GetDC();

CRect crect;//client rect
CRect wrect;//window rect
GetClientRect(crect);
GetWindowRect(wrect);
GetParent()->ScreenToClient(wrect);
GetParent()->InvalidateRect(crect);
GetParent()->UpdateWindow();
if (hDcBk == NULL)
{
hDcBk = CreateCompatibleDC(clientDC.m_hDC);
hBmpBk = CreateCompatibleBitmap(clientDC.m_hDC, crect.Width(), crect.Height());
hBmpBkOld = (HBITMAP)::SelectObject(hDcBk, hBmpBk);
::BitBlt(hDcBk, 0, 0, crect.Width(), crect.Height(), clientDC.m_hDC, wrect.left, wrect.top, SRCCOPY);
}
// //This bit does the tics marks transparently.
// //create a memory dc to hold a copy of the oldbitmap data that includes the tics,
// //because when we add the background in we will lose the tic marks
HDC hSaveHDC;
HBITMAP hSaveBmp;
int iWidth = crect.Width();
int iHeight = crect.Height();
hSaveHDC = ::CreateCompatibleDC(pDC->m_hDC);
hSaveBmp = ::CreateCompatibleBitmap(hSaveHDC, iWidth, iHeight);
HBITMAP hSaveCBmpOld = (HBITMAP)::SelectObject(hSaveHDC, hSaveBmp);
//set the colours for the monochrome mask bitmap
COLORREF crOldBack = ::SetBkColor(pDC->m_hDC, RGB(0,0,0));
COLORREF crOldText = ::SetTextColor(pDC->m_hDC, RGB(255,255,255));
::BitBlt(hSaveHDC, 0, 0, iWidth, iHeight, pDC->m_hDC, crect.left, crect.top, SRCCOPY);
::BitBlt(pDC->m_hDC, 0, 0, iWidth, iHeight, hDcBk, 0, 0, SRCCOPY);
::BitBlt(pDC->m_hDC, 0, 0, iWidth, iHeight, hSaveHDC, 0, 0, SRCAND);
//restore and clean up
::SetBkColor(pDC->m_hDC, crOldBack);
::SetTextColor(pDC->m_hDC, crOldText);
::SelectObject(hSaveHDC, hSaveCBmpOld);
::DeleteObject(hSaveBmp);
::DeleteDC(hSaveHDC);

即先保存透明背景DC,然后绘制透明背景,再绘制位图。拖尾是没有了,但透明背景却变成了桌面了,而且闪烁,我要的背景是对话框背景啊,如何是好呢?请高手指点迷津,跪谢!
...全文
114 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kennielie_net 2009-09-25
  • 打赏
  • 举报
回复
新手不是罪啊,各位大虾高手,别看重分啊,大家中华儿女一家亲,请献出一点爱心,帮助帮助新手,俺在这里跪谢了!谢谢,谢谢!
kennielie_net 2009-09-25
  • 打赏
  • 举报
回复
RichyMong非常感谢您!谢谢!谢谢!谢谢!
kennielie_net 2009-09-25
  • 打赏
  • 举报
回复
新手没有分:( 妈的!但是等俺有了分,送全分,扔0分!
kennielie_net 2009-09-25
  • 打赏
  • 举报
回复
上面的DrawTransparent(pDC,m_ThumbRect.left,m_ThumbRect.top,RGB(255,0,0));
是一个显示透明位图的程序,单独显示是没有问题的,只是拖动时有拖尾。
void CXScrollBar::TransparentBlt2(
HDC hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

// 设置透明色
SetBkColor(hImageDC, crTransparent);

// 生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

// 生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// 透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

// 清理、恢复
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
RichyMong 2009-09-25
  • 打赏
  • 举报
回复
lz可以看看这个是怎么实现的,在static上透明显示图片,并拖动
http://www.codeproject.com/KB/static/LayeredBitmapCtrl1.aspx

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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