VC实现不规则窗口

在VC下创建不规则窗口非常简单,无非就是创建一个HRGN,然后再调用SetWindowRgn就行了,如我们要创建一个原形的窗口只需要如下代码:

CRgn rgn;

rgn.CreateEllipticRgn( 100,100, 200, 200 );

SetWindowRgn((HRGN)rgn, TRUE);

本文中的例子为一个透明位图不规则窗口,其主要函数如下:

void CExampleDlg::SetupRegion(CDC *pDC)
{
       CDC                     memDC;
       CBitmap                &cBitmap=m_bmpDraw;
       CBitmap*              pOldMemBmp = NULL;
       COLORREF          col,colMask;
       CRect                    cRect;
       int                        x, y;
       CRgn                    wndRgn, rgnTemp;
       GetWindowRect(&cRect);
       CPoint ptOrg=cRect.TopLeft();
       BITMAP bmInfo;
       cBitmap.GetObject(sizeof(bmInfo),&bmInfo);
       CRect rcNewWnd=CRect(ptOrg,CSize(bmInfo.bmWidth,bmInfo.bmHeight));
       memDC.CreateCompatibleDC(pDC);
       pOldMemBmp = memDC.SelectObject(&cBitmap);
       colMask=memDC.GetPixel(0,0);
       wndRgn.CreateRectRgn(0, 0, rcNewWnd.Width(), rcNewWnd.Height());
       for(x=0; x<=rcNewWnd.Width(); x++)
       {
              for(y=0; y<=rcNewWnd.Height(); y++)
              {
                     col = memDC.GetPixel(x, y);
                     if(col == colMask)
                     {
                            rgnTemp.CreateRectRgn(x, y, x+1, y+1);
                            wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
                            rgnTemp.DeleteObject();      
                     }
              }
       }
       memDC.SelectObject(pOldMemBmp);
       SetWindowRgn((HRGN)wndRgn, TRUE);
}

转载于:https://www.cnblogs.com/rogee/archive/2011/02/15/1954987.html

猜你喜欢

转载自blog.csdn.net/weixin_33984032/article/details/94681175