今天做创建不规则窗口的时候开始几个窗口都正常显示.但是在就有个窗口在显示的时候只显示白色..不能把图片显示出来..只有个框架...我汗...大家看下我的代码...我在网上找的..BOOL GETPATH::OnInitDialog()
{
CDialog::OnInitDialog();
CClientDC dc(this);
/*将窗体大小调整到位图大小一样*/
m_b.LoadBitmap(IDB_BITMAP3);
BITMAP bm;
m_b.GetBitmap(&bm);
CRect rtWindow;
GetWindowRect(&rtWindow);
rtWindow.right = rtWindow.left+bm.bmWidth;
rtWindow.bottom =rtWindow.top +bm.bmHeight;
MoveWindow(&rtWindow);
SetR(&dc,m_b,RGB(255,255,255)); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void GETPATH::SetR(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();
}
只能显示一个轮阔...我汗...大家帮忙看下是什么问题....麻烦大家了..谢谢...
{
CDialog::OnInitDialog();
CClientDC dc(this);
/*将窗体大小调整到位图大小一样*/
m_b.LoadBitmap(IDB_BITMAP3);
BITMAP bm;
m_b.GetBitmap(&bm);
CRect rtWindow;
GetWindowRect(&rtWindow);
rtWindow.right = rtWindow.left+bm.bmWidth;
rtWindow.bottom =rtWindow.top +bm.bmHeight;
MoveWindow(&rtWindow);
SetR(&dc,m_b,RGB(255,255,255)); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void GETPATH::SetR(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();
}
只能显示一个轮阔...我汗...大家帮忙看下是什么问题....麻烦大家了..谢谢...
因此设置区域跟绘制需要用2个rgn