请问怎么用8位位图来做不规则窗口?我从网上找到了一个涵数只能用24位位图来做为什么?请个位大哥帮我看看?
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);
}