如何实现位图重叠区域的半透明和空白? 例如三个位图重叠,一个大位图包含两个小位图,怎么实现两个小位图区域的空白,大位图其余区域的半透明?另一个问题怎么实现两个小位图区域的半透明? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 第一个效果代码:void C**View::OnDraw( CDC* pDC ){ C**Doc* pDoc = GetDocument( ); ASSERT_VALID( pDoc ); RectF rF_bg( 10, 10, 500, 400 ); //大图显示区域 RectF rF_x1( 20, 20, 140, 132 ); //小图1显示区域 RectF rF_x2( 180, 200, 156, 148 ); //小图2显示区域 Image im_bg( L"IMG_BIG.JPG" ); //加载大图 Image im_x1( L"IMG_SM1.JPG" ); //加载小图1 Image im_x2( L"IMG_SM2.JPG" ); //加载小图2 ColorMatrix colorMatrix = //设置色彩校正矩阵 { 1.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 1.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 1.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.50f, 0.00f, //0.50的位置为透明度(这里为半透明),要想了解搜索ColorMatrix 0.00f, 0.00f, 0.00f, 0.00f, 1.00f }; ImageAttributes imageAtt; imageAtt.SetColorMatrix( &colorMatrix ); Graphics gHandle( pDC->m_hDC ); //绘图句柄 INT iWidth = im_bg.GetWidth( ); //这里取得宽度,高度实际是为了后续的缩放//你可以查查DrawImage的其他重载 INT iHeight = im_bg.GetHeight( ); gHandle.DrawImage( &im_bg, rF_bg, 0, 0, iWidth, iHeight, UnitPixel, &imageAtt ); SolidBrush br( Color( 255, 0, 255, 0 ) );//画刷直接设置成你的背景色,这里使用绿色是为了提醒 gHandle.FillRectangle( &br, rF_x1 ); //绘制两个小图形的区域为背景色,看起来就是透明了 gHandle.FillRectangle( &br, rF_x2 );}效果图: 第二个效果代码:void C**View::OnDraw( CDC* pDC ){ C**Doc* pDoc = GetDocument( ); ASSERT_VALID( pDoc ); RectF rF_bg( 10, 10, 500, 400 ); //大图显示区域 RectF rF_x1( 20, 20, 140, 132 ); //小图1显示区域 RectF rF_x2( 180, 200, 156, 148 ); //小图2显示区域 Image im_bg( L"IMG_BIG.JPG" ); //加载大图 Image im_x1( L"IMG_SM1.JPG" ); //加载小图1 Image im_x2( L"IMG_SM2.JPG" ); //加载小图2 ColorMatrix colorMatrix = //设置色彩校正矩阵 { 1.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 1.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 1.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.50f, 0.00f, //0.50的位置为透明度(这里为半透明),要想了解搜索ColorMatrix 0.00f, 0.00f, 0.00f, 0.00f, 1.00f }; ImageAttributes imageAtt; imageAtt.SetColorMatrix( &colorMatrix ); Graphics gHandle( pDC->m_hDC ); //绘图句柄 gHandle.DrawImage( &im_bg, rF_bg ); INT x1wd = im_x1.GetWidth( ); INT x1ht = im_x1.GetHeight( ); gHandle.DrawImage( &im_x1, rF_x1, 0, 0, x1wd, x1ht, UnitPixel, &imageAtt ); INT x2wd = im_x1.GetWidth( ); INT x2ht = im_x1.GetHeight( ); gHandle.DrawImage( &im_x2, rF_x2, 0, 0, x2wd, x2ht, UnitPixel, &imageAtt );}效果图:参考网址:http://msdn.microsoft.com/zh-cn/site/ms533958参考网址为GDI+的MSDN,所有的类和相关上面都有。 感谢Tinary3v0。追问一下如果三个图形为多边形呢? 多边形也是一样的,无非就是在绘制矩形的位置绘制成多边形。如果图片也是多边形的(当然图片表示肯定是矩形),可以采用透明PNG格式,具体方法和上面的都是一样的。这个楼主要自己去进行一些算数问题的研究。 我用Image image(_T("mei.jpg")); 运行时错误,访问冲突。 使用绝对路径L"d:\Backup\我的文档\mei.jpg"也是同样的错误。设置断点发现是这里出错。请问这是什么问题,要怎么改?使用Image是要注意哪些问题? 用 L,不要用 _T。加入路径的话,路径中的"\"要双写成"\\"例如:L"d:\\Backup\\我的文档\\mei.jpg"另外,如果具备全局性的Image,尽量不要使用局部变量,防止多次创建新Image造成的效率损耗。创建全局的Image的时候,无法使用对象,而只能使用指针,也就是Image* img;然后在构造函数,初始化函数中new 出来,img = new Image( L"C:\\My.png" );使用new的时候如果提示报错,将CPP文件前面的这段:#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif注释掉!其他的楼主要自己学习了,多看看GDI+ GDI+的绘图性能过于低下,我常用它来绘制GIS图形,这个真的太慢了。 GDI+里的Image类问题~~~ 求助哇。。被搞的郁闷死 MFC 对话框 建立浮动窗体 “不包含xxxx字符串的任意字符”,正则表达式怎么写? 去掉窗口标题栏,怎么实现? 关于用winsock收pop3邮件的问题!100分! 关于Telnet服务器 如何用VC获取网页(由多页合并而成)中的Frame对象中的元素,并操纵这些元素。谢谢! 关于屏蔽键盘 关于MFC的一个疑问? VC++数据库编程,如何改变记录集只读属性 vs2010编译成功,运行报错:应用程序正常初始化(0xc0000000d)失败,请单击"确认",终止应用程序。 MFC 不显示打印对话框,设置打印份数
void C**View::OnDraw( CDC* pDC )
{
C**Doc* pDoc = GetDocument( ); ASSERT_VALID( pDoc );
RectF rF_bg( 10, 10, 500, 400 ); //大图显示区域 RectF rF_x1( 20, 20, 140, 132 ); //小图1显示区域
RectF rF_x2( 180, 200, 156, 148 ); //小图2显示区域 Image im_bg( L"IMG_BIG.JPG" ); //加载大图
Image im_x1( L"IMG_SM1.JPG" ); //加载小图1
Image im_x2( L"IMG_SM2.JPG" ); //加载小图2
ColorMatrix colorMatrix = //设置色彩校正矩阵
{
1.00f, 0.00f, 0.00f, 0.00f, 0.00f,
0.00f, 1.00f, 0.00f, 0.00f, 0.00f,
0.00f, 0.00f, 1.00f, 0.00f, 0.00f,
0.00f, 0.00f, 0.00f, 0.50f, 0.00f, //0.50的位置为透明度(这里为半透明),要想了解搜索ColorMatrix
0.00f, 0.00f, 0.00f, 0.00f, 1.00f
};
ImageAttributes imageAtt;
imageAtt.SetColorMatrix( &colorMatrix );
Graphics gHandle( pDC->m_hDC ); //绘图句柄
INT iWidth = im_bg.GetWidth( ); //这里取得宽度,高度实际是为了后续的缩放//你可以查查DrawImage的其他重载
INT iHeight = im_bg.GetHeight( ); gHandle.DrawImage( &im_bg, rF_bg, 0, 0, iWidth, iHeight, UnitPixel, &imageAtt ); SolidBrush br( Color( 255, 0, 255, 0 ) );//画刷直接设置成你的背景色,这里使用绿色是为了提醒
gHandle.FillRectangle( &br, rF_x1 ); //绘制两个小图形的区域为背景色,看起来就是透明了
gHandle.FillRectangle( &br, rF_x2 );
}
效果图:
void C**View::OnDraw( CDC* pDC )
{
C**Doc* pDoc = GetDocument( ); ASSERT_VALID( pDoc );
RectF rF_bg( 10, 10, 500, 400 ); //大图显示区域
RectF rF_x1( 20, 20, 140, 132 ); //小图1显示区域
RectF rF_x2( 180, 200, 156, 148 ); //小图2显示区域
Image im_bg( L"IMG_BIG.JPG" ); //加载大图
Image im_x1( L"IMG_SM1.JPG" ); //加载小图1
Image im_x2( L"IMG_SM2.JPG" ); //加载小图2
ColorMatrix colorMatrix = //设置色彩校正矩阵
{
1.00f, 0.00f, 0.00f, 0.00f, 0.00f,
0.00f, 1.00f, 0.00f, 0.00f, 0.00f,
0.00f, 0.00f, 1.00f, 0.00f, 0.00f,
0.00f, 0.00f, 0.00f, 0.50f, 0.00f, //0.50的位置为透明度(这里为半透明),要想了解搜索ColorMatrix
0.00f, 0.00f, 0.00f, 0.00f, 1.00f
};
ImageAttributes imageAtt;
imageAtt.SetColorMatrix( &colorMatrix );
Graphics gHandle( pDC->m_hDC ); //绘图句柄
gHandle.DrawImage( &im_bg, rF_bg ); INT x1wd = im_x1.GetWidth( );
INT x1ht = im_x1.GetHeight( );
gHandle.DrawImage( &im_x1, rF_x1, 0, 0, x1wd, x1ht, UnitPixel, &imageAtt );
INT x2wd = im_x1.GetWidth( );
INT x2ht = im_x1.GetHeight( );
gHandle.DrawImage( &im_x2, rF_x2, 0, 0, x2wd, x2ht, UnitPixel, &imageAtt );
}
效果图:参考网址:
http://msdn.microsoft.com/zh-cn/site/ms533958
参考网址为GDI+的MSDN,所有的类和相关上面都有。
如果图片也是多边形的(当然图片表示肯定是矩形),可以采用透明PNG格式,具体方法和上面的都是一样的。
这个楼主要自己去进行一些算数问题的研究。
加入路径的话,路径中的"\"要双写成"\\"
例如:L"d:\\Backup\\我的文档\\mei.jpg"
另外,如果具备全局性的Image,尽量不要使用局部变量,防止多次创建新Image造成的效率损耗。
创建全局的Image的时候,无法使用对象,而只能使用指针,也就是Image* img;
然后在构造函数,初始化函数中new 出来,img = new Image( L"C:\\My.png" );
使用new的时候如果提示报错,将CPP文件前面的这段:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
注释掉!
其他的楼主要自己学习了,多看看GDI+