我在DLG上显示了一张背景图. 上面又加了几个PIC控件,PIC要显示的图不是长方形的,例如有一张图是三个星星,我想让这个PIC控件除了这三个星星之外,其他部分跟背景图一样,请问应该怎么处理? 谢谢.

解决方案 »

  1.   

    这样的话应该不能用PIC吧,直接用内存画了再显示,可能会涉及到图像叠加的一些问题。
    楼主看有看看这方面的知识。
      

  2.   

    需要设置控件的裁剪窗口,就是按照你图片的所取得内容进行相应窗体的裁剪,一般控件都有SetRgn方法,如果你的图片是星星那么图片上除星星以外的颜色就是掩码,通过获取像素值得到图片的裁剪区域,然后在设置这个裁剪区域到控件,这样你的控件就被裁减成与图片一样形状了。
      

  3.   

    根据图片创建regeion,在为这几个控件SetWindowRegeion
      

  4.   

    pDC是设备句柄,rect是控件客户区,clrMask是图片掩码(即不需要显示的部分的颜色),rgn是裁剪后得到的裁剪区域,将rgn通过SetWindowRgn进行设置
    BOOL GetClipRgn(CDC* pDC, const CRect& rect, COLORREF clrMask, CRgn& rgn)
    {
    int x, y;
    for ( y = rect.top; y < rect.bottom; y++ )
    {
    CRgn rgnTemp;
    x = rect.left;
    do 
    {
    while ( x < rect.right && pDC->GetPixel(x, y) == clrMask )
    ++x; int leftx = x; while ( x < rect.right && pDC->GetPixel(x, y) != clrMask )
    ++x; rgnTemp.CreateRectRgn(leftx, y, x, y+1); rgn.CombineRgn(&rgn, &rgnTemp, RGN_OR); rgnTemp.DeleteObject(); } while (x < rect.right);
    } return TRUE;
    }
    图片的掩码就是不需要显示出来的颜色,比如一个星星主体的黄色,而你要显示黄色,那么其他颜色(不唯一)就是掩码,这时你要裁剪窗口就需要设置掩码为黄色,那么上面的代码就需要将第一while的等于改为不等于,第二while的不等于改为等于;如果其他颜色(唯一)即红色,那么红色就是掩码,这时你要裁剪窗口就需要设置掩码为红色,那么上面的代码就不需要改变。
    上面代码只是进行裁剪区域的获取,之前还需要你把图片加载进来才行,如果你要实现一个按钮的裁剪,就需要自己派生一个CButton类,而不能用原始的CButton进行处理。