您的位置:首页 > 其它

vc里实现不规则窗体

2014-03-12 17:13 405 查看
首先建立一个MFC工程Test

2.准备两张位图,一张显示位图,另一个张是掩摸遮盖图片

3。在类中添加一个CBitmap m_bmp;的成员变量

4.添加一成员函数,它的的功能就是设置不规则窗体

void CTest1::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)

{

CDC memDC;

CBitmap *pOldMemBmp=NULL;

BITMAP bit;

CRect rect;

GetWindowRect(rect);

CRgn wndRgn;

//创建与传入DC兼容的临时DC

memDC.CreateCompatibleDC(pDC);

//取得位图参数,这里要用到位图的长和宽

cBitmap.GetBitmap (&bit);

//将位图选入临时DC

pOldMemBmp=memDC.SelectObject(&cBitmap);

//创建总的窗体区域,初始region为0

wndRgn.CreateRectRgn(0,0,rect.Width(),rect.Height());

for(int y=0;y<rect.Height()+1;y++)

{

CRgn rgnTemp; //保存临时region

int iX = 0;

do

{

//等于透明色时,消除后透明色找到下一个非透明色的点.

if (memDC.GetPixel(iX, y) == TransColor)

{

rgnTemp.CreateRectRgn(iX,y,iX+1,y+1);

//合并到主"region".

wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);

//删除临时"region",否则下次创建时和出错

rgnTemp.DeleteObject();

}

iX++;

}while(iX <rect.Width()+1);

iX = 0;

}

if(pOldMemBmp)

memDC.SelectObject(pOldMemBmp);

SetWindowRgn(wndRgn,TRUE);

SetForegroundWindow();

}

5。在初始化函数中调用上面的函数

BOOL CTestDlg::OnInitDialog()

{

CClientDC dc(this);

SetupRegion(&dc,m_bmp,RGB(255,255,255));

return TRUE;

}

6。在OnPaint()函数中显示设备位图

void CTestDlg::OnPaint()

{

CRect rtWindow;

GetWindowRect(&rtWindow);

CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

CDC picDC;

picDC.CreateCompatibleDC (&dc);//创建图形设备

CBitmap *pOldBmp;

pOldBmp = picDC.SelectObject (&m_bmp);//选择图形设备

BITMAP bm;

m_bmp.GetBitmap(&bm);//获得位图

dc.BitBlt (-3,-3,rtWindow.Width(),rtWindow.Height(),&picDC,0,0,SRCCOPY);//显示图象

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: