请问怎么用8位位图来做不规则窗口?我从网上找到了一个涵数只能用24位位图来做为什么?请个位大哥帮我看看?

lijie_168 2006-08-14 09:10:34
void CIrregularDlgDlg :: MakeWindowRgn ()
{

CRect rcWnd;
GetWindowRect (rcWnd);

CRgn rgn;
rgn.CreateRectRgn (rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom);

CRect rcClient;
GetClientRect (rcClient);
ClientToScreen (rcClient);

CRgn rgnClient;
rgnClient.CreateRectRgn (rcClient.left, rcClient.top, rcClient.right,
rcClient.bottom);

// Subtract rgnClient from rgn
rgn.CombineRgn (&rgn, &rgnClient, RGN_XOR);

// Get a DC for the bitmap
CDC dcImage;
dcImage.CreateCompatibleDC (NULL);
CBitmap *pOldBitmap = dcImage.SelectObject (m_pBitmap);

// Get the bitmap for width and height information
BITMAP bm;
m_pBitmap->GetBitmap (&bm);

// 获得窗口的宽度和高度
CRect rc;
GetClientRect (rc);

// 使用二者中的较小者作为窗口的宽度和高度
int width = min (bm.bmWidth, rc.Width());
int height = min (bm.bmHeight, rc.Height());

// 此处使用 RLE (run-length) ,这样运行起来会比较快
// 第一个不透明象素开始的地方是要显示的行的开始。
// 当遇到一个透明象素的时,就会创建一个行区域(line region)
// 然后row_start就成为下一个不透明的象素.
int row_start;

// 遍历所有的行
for (int y=0; y<height; y++)
{
// Start looking at the beginning
row_start = 0;

// 遍历所有的列
for (int x=0; x<width; x++)
{
// 判断该点象素是否是透明的
long k=dcImage.GetPixel(x, y);
if (dcImage.GetPixel(x, y) == m_clTransparent)
{
// 如果还没有发现一个不透明的象素,继续搜索。
if (row_start == x) row_start ++;
else
{
// 现在已经找到了一个不透明行的开始和结束位置
//把它加入到显示区域里。
CRgn rgnAdd;
rgnAdd.CreateRectRgn (rcClient.left+row_start,
rcClient.top+y, rcClient.left+x, rcClient.top+y+1);
rgn.CombineRgn (&rgn, &rgnAdd, RGN_OR);
row_start = x+1;
}
}
}

// 如果最后一个象素仍然是不透明的,还需要创建一个区域。
if (row_start != x)
{
CRgn rgnAdd;
rgnAdd.CreateRectRgn (rcClient.left+row_start, rcClient.top+y,
rcClient.left+x, rcClient.top+y+1);
rgn.CombineRgn (&rgn, &rgnAdd, RGN_OR);
}
}

SetWindowRgn (rgn, TRUE);

}
...全文
188 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
折腾_苏州 2006-08-14
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1345
http://www.vckbase.com/document/viewdoc/?id=759
有详细的说明以及示例工程,你自己去看看吧
livedeal 2006-08-14
  • 打赏
  • 举报
回复
void CTransparentWindowDlg::SetupRegion()
{
CDC* pDC;
CDC memDC;
CBitmap cBitmap;
CBitmap* pOldMemBmp = NULL;
COLORREF col;
CRect cRect;
int x, y;
CRgn wndRgn, rgnTemp;

pDC = GetDC();
GetWindowRect(&cRect);

//将模板位图选进设备场景中
cBitmap.LoadBitmap(IDB_MASK);
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&cBitmap);

//创建模板形状的不规则区域
wndRgn.CreateRectRgn(0, 0, cRect.Width(), cRect.Height());
for(x=0; x<=cRect.Width(); x++)
{
for(y=0; y<=cRect.Height(); y++)
{
//将位图中黑色小圆洞对应的区域抠掉
col = memDC.GetPixel(x, y);
if(col == 0)
{
rgnTemp.CreateRectRgn(x, y, x+1, y+1);
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
rgnTemp.DeleteObject();
}
}
}
if (pOldMemBmp) memDC.SelectObject(pOldMemBmp);

//将不规则区域分配给窗体,也就是创建不规则的窗体
SetWindowRgn((HRGN)wndRgn, TRUE);
ReleaseDC(pDC);
}

BOOL CTransparentWindowDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetWindowRect(&rect);

CDC memDC;
CBitmap cBitmap;
CBitmap* pOldMemBmp = NULL;

//将背景位图加到设备场景中
cBitmap.LoadBitmap(IDB_BACK);
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&cBitmap);

//将背景位图显示出来
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );

return TRUE;
// return CDialog::OnEraseBkgnd(pDC);
}


UINT CTransparentWindowDlg::OnNcHitTest(CPoint point)
{//窗口拖动
UINT nHitTest = CDialog::OnNcHitTest(point);

return (nHitTest == HTCLIENT)? HTCAPTION:nHitTest;
}

void CTransparentWindowDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);

//调整窗体大小,适应位图大小
CRect rc;
GetClientRect(&rc);
rc.right = rc.left + 320;
rc.bottom = rc.top + 150;
MoveWindow(&rc,TRUE);
}
lijie_168 2006-08-14
  • 打赏
  • 举报
回复
请问大哥怎么用啊?帮帮小弟
dick_song 2006-08-14
  • 打赏
  • 举报
回复
试一下这段代码:
void SetViewRgn(HWND hwnd, HINSTANCE hResModule, UINT nBkgroundBmp)
{
HDC memDC;
RECT cRect;
HBITMAP cBitmap;
HRGN wndRgn,rgnTemp;
COLORREF cl,TransColor;

GetWindowRect(hwnd,&cRect);
cBitmap = LoadBitmap(hResModule,MAKEINTRESOURCE(nBkgroundBmp));
memDC = CreateCompatibleDC(GetDC(hwnd));
SelectObject(memDC,cBitmap);
wndRgn = CreateRectRgn(0,0,cRect.right-cRect.left,cRect.bottom-cRect.top);
TransColor = GetPixel(memDC,0,0);//要透明的颜色,可以是一个固定值,现在是取图片第一个点的颜色。

rgnTemp = CreateRectRgn(0,0,1,1);
for (int x=0;x<=cRect.right-cRect.left;x++)
{
for(int y=0;y<=cRect.bottom-cRect.top;y++)
{
cl = GetPixel(memDC,x,y);
if (cl==TransColor)
{
SetRectRgn(rgnTemp,x,y,x+1,y+1);
CombineRgn(wndRgn,wndRgn,rgnTemp,RGN_XOR);
}
}
}
DeleteObject(rgnTemp);
SetWindowRgn(hwnd,wndRgn,TRUE);
}

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧