您的位置:首页 > 编程语言 > C语言/C++

不规则对话框的实现 C++

2009-03-31 18:28 381 查看
///////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 在 OnInitDialog() 时初始化相关数据 HDC hdcs; HBITMAP pBitmap; CBitmap m_bmp;

pBitmap = (HBITMAP)LoadImage(NULL,"图片.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hdcs = CreateCompatibleDC(NULL);

m_bmp.Attach( pBitmap );

BITMAP bm;
m_bmp.GetBitmap(&bm);

CRect rtWindow;
GetWindowRect(&rtWindow);
rtWindow.right = rtWindow.left+bm.bmWidth;
rtWindow.bottom =rtWindow.top +bm.bmHeight;
MoveWindow(&rtWindow);

CClientDC dc(this);
SetupRegion(&dc,m_bmp,RGB(191,194,114) );

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 最后在 OnPaint 的else 里面

CClientDC dc(this);

CDC picDC;
picDC.CreateCompatibleDC (&dc);

CBitmap *pOldBmp;
pOldBmp = picDC.SelectObject (&m_bmp);

BITMAP bm;
m_bmp.GetBitmap(&bm);

dc.BitBlt (0,0,bm.bmWidth ,bm.bmHeight,&picDC,0,0,SRCCOPY);
dc.SelectObject(pOldBmp);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 下面是主代码

void CtextDemoDlg::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
CDC memDC;
//创建与传入DC兼容的临时DC
memDC.CreateCompatibleDC(pDC);

CBitmap *pOldMemBmp=NULL;
//将位图选入临时DC
pOldMemBmp=memDC.SelectObject(&cBitmap);

CRgn wndRgn;
//创建总的窗体区域,初始region为0
wndRgn.CreateRectRgn(0,0,0,0);

BITMAP bit;
cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽

int y;
for(y=0;y<=bit.bmHeight ;y++)
{
CRgn rgnTemp; //保存临时region

int iX = 0;
do
{
//跳过透明色找到下一个非透明色的点.
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
iX++;

//记住这个起始点
int iLeftX = iX;

//寻找下个透明色的点
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
++iX;

//创建一个包含起点与重点间高为1像素的临时“region”
rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);

//合并到主"region".
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);

//删除临时"region",否则下次创建时和出错
rgnTemp.DeleteObject();
}while(iX <bit.bmWidth );
iX = 0;
}

if(pOldMemBmp)
memDC.SelectObject(pOldMemBmp);

CWnd * pWnd = pDC->GetWindow();
pWnd->SetWindowRgn(wndRgn,TRUE);
pWnd->SetForegroundWindow();

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