Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > 用VC6.0实现透明位图的自由拖动
全文

用VC6.0实现透明位图的自由拖动

2003-09-25 10:05 作者: 明 文 华 出处: yesky 责任编辑:方舟
  一、透明位图的显示:

  首先我们要学会使用一个SDK函数TransparentBlt,其原型如下:

BOOL TransparentBlt(
 HDC hdcDest, // 目标DC句柄
 int nXOriginDest, // 目标左上角X坐标
 int nYOriginDest, // 目标左上角Y坐标
 int nWidthDest, // 目标矩形宽度
 int hHeightDest, // 目标矩形高度
 HDC hdcSrc, // 源DC句柄
 int nXOriginSrc, // 源左上角X坐标
 int nYOriginSrc, // 源左上角Y坐标
 int nWidthSrc, // 源矩形宽度
 int nHeightSrc, // 源矩形高度
 UINT crTransparent // 要置为透明的颜色
);

  如同StretchBlt 函数,该函数也可以缩放显示位图。

  此函数在Win98以后的windows操作系统中均可使用,但使用此函数要包含静态链接库Msimg32.lib,方法是:在VC集成开发环境中,Project->Setting->Link页,在Object/libray modules 下填入:Msimg32.lib即可。

  透明位图显示方法如下:

  从Visual C++ 6.0 集成开发环境中将背景图片和书法图片导入资源中,ID标识分别为IDB_BJ, IDB_SHUFA.,然后重写其视图类的OnDraw函数:

void CTransparentBltView::OnDraw(CDC* pDC)
{
CTransparentBltDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBitmap bj;
CBitmap shufa;
bj.LoadBitmap(IDB_BJ);
shufa.LoadBitmap(IDB_SHUFA);
BITMAP BT;
bj.GetBitmap(&BT);//获得bj位图信息
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* poldbitmap=memDC.SelectObject(&bj);
//先显示背景图
pDC->BitBlt(0,0, BT.bmWidth,BT.bmHeight,&memDC,0,0,SRCCOPY);
shufa.GetBitmap(&BT);//获得shufa位图信息
memDC.SelectObject(&shufa); //选入前景图
//透明位图显示,将前景图画到pDC中,指定RGB(255,255,255)为透明掩码。即此//处只显示背景图,从前景图看起来这块好像透明一样。
TransparentBlt(pDC->m_hDC,0,0, BT.bmWidth,BT.bmHeight, memDC.m_hDC,
0,0,BT.bmWidth,BT.bmHeight,RGB(255,255,255));
memDC.SelectObject(poldbitmap);
}

  二、实现透明位图拖动

  这里要使用跟踪器类CrectTracker。简单来说这个类的对象代表一个矩形,这个矩形可以被拖动,改变大小,显示不同的外形。类似于在Word中插入一个对象,选定该对象后会出现一个矩形,有8个拖动点,该矩形能缩放,移动。

  首先,在视图类中添加成员变量:CRectTracker m_tracker;在构造函数中设置跟踪器矩形初始大小为书法图片的大小。

SHUFA.GetBitmap(&BT);
m_tracker.m_rect.SetRect(0,0,BT.bmWidth,BT.bmHeight);

  然后,捕获LbuttonDown消息:

void CTransparentBltView::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 if(m_tracker.Track(this,point))//拖动跟踪器时,刷新屏幕
  Invalidate(false);
  CView::OnLButtonDown(nFlags, point);
}

  再重写OnDraw函数:

void CTransparentBltView::OnDraw(CDC* pDC)
{
 CTransparentBltDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 CDC memDC;
 memDC.CreateCompatibleDC(pDC);
 CBitmap* poldbitmap=memDC.SelectObject(&bj);
 pDC->BitBlt(0,0,640,480,&memDC,0,0,SRCCOPY);//先显示背景图
 memDC.SelectObject(&shufa); //选入前景图,
 TransparentBlt(pDC->m_hDC,
 m_tracker.m_rect.TopLeft().x,m_tracker.m_rect.TopLeft().y,
 BT.bmWidth,BT.bmHeight,
 memDC.m_hDC,0,0,BT.bmWidth,BT.bmHeight,RGB(255,255,255));
 memDC.SelectObject(poldbitmap);

}

  锦上添花,再捕获视图类的OnSetCursor消息:

BOOL CTransparentBltView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
 // TODO: Add your message handler code here and/or call default
 //鼠标移动到跟踪器范围内时,改变鼠标指针形状,指示可以拖动图片
 if(m_tracker.SetCursor(pWnd,nHitTest)) /
  return true;
  return CView::OnSetCursor(pWnd, nHitTest, message);
}

  这样就可以将书法图片在背景图片上来自由拖动到自己满意的位置为止。


共2页。 9 1 2
共2页。 9 1 2
网友关注
最新上市
编辑推荐
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml