怎样实现窗体的部分透明? 用user32.dll 里的setlayer...... 函数可以使用整个窗体透明化,那部分透明怎么做?例如对话框中间的一个椭圆形、正方形,让它透明怎么实现?gz 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在Windows 2000和Windows XP中的User32.dll中有一个新的函数SetLayeredWindowAttributes,为了使用这个函数,需要在创建窗口或后来使用SetWindowLong函数时给程序窗口风格设置WS_EX_LAYERED (0x00080000)位(bit),这样程序就能够通过窗口句柄调用这个函数,设置整个窗口透明或窗口的某种指定的颜色透明。此函数需要下列参数。HWND hWnd: 窗口句柄 COLORREF col: 设置位透明的颜色 BYTE bAlpha: 如果为0,窗口完全透明,255为正常显示 DWORD dwFlags: 如果为1,仅仅颜色col被设置为透明,如果为2,整个窗口根据设置的bAlpha值被设置为透明 代码的使用 SetWindowRgn void 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);} 下载了7-zip软件源码,但是,我怎么才能编译出7-zip软件呢 API程序运行错误 请高手们帮忙~ VC++的EDIT问题 wwwllg,打开多文件的问题解决了,过来领分呀。 vc和cult3d的问题 关于一个封装程序的简单问题???????????????????? 怎么获得spin控件的点击上下箭头的事件 正则表达式 问题征解,高手请进. 你们认为中国的程序员有多少个是“猪“ 讨论下五子棋的子力问题吧 为什么左边工作区和下面的输出窗口,不能用鼠标拖拽边界实时改变大小?(急!急!急!)
COLORREF col: 设置位透明的颜色
BYTE bAlpha: 如果为0,窗口完全透明,255为正常显示
DWORD dwFlags: 如果为1,仅仅颜色col被设置为透明,如果为2,整个窗口根据设置的bAlpha值被设置为透明
代码的使用
SetWindowRgn
{
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);
}