例如三个位图重叠,一个大位图包含两个小位图,怎么实现两个小位图区域的空白,大位图其余区域的半透明?另一个问题怎么实现两个小位图区域的半透明?

解决方案 »

  1.   

    第一个效果代码:
    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 );
    }
    效果图:
      

  2.   

    第二个效果代码:
    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,所有的类和相关上面都有。
      

  3.   

    感谢Tinary3v0。追问一下如果三个图形为多边形呢?
      

  4.   

    多边形也是一样的,无非就是在绘制矩形的位置绘制成多边形。
    如果图片也是多边形的(当然图片表示肯定是矩形),可以采用透明PNG格式,具体方法和上面的都是一样的。
    这个楼主要自己去进行一些算数问题的研究。
      

  5.   

    我用Image image(_T("mei.jpg")); 运行时错误,访问冲突。 使用绝对路径L"d:\Backup\我的文档\mei.jpg"也是同样的错误。设置断点发现是这里出错。请问这是什么问题,要怎么改?使用Image是要注意哪些问题?
      

  6.   

    用 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_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    注释掉!
    其他的楼主要自己学习了,多看看GDI+
      

  7.   

    GDI+的绘图性能过于低下,我常用它来绘制GIS图形,这个真的太慢了。