Mercurial > mplayer.hg
changeset 34133:568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
So far, the Win32 GUI only supports transparency in non-decorated
windows. Now there is equal support of skin transparency for both
GUIs, because skins are universal for both of them.
author | ib |
---|---|
date | Thu, 20 Oct 2011 12:48:35 +0000 |
parents | 085b62ad0cf9 |
children | 1c4302df9dcf |
files | gui/win32/gui.c |
diffstat | 1 files changed, 31 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/gui/win32/gui.c Thu Oct 20 12:24:00 2011 +0000 +++ b/gui/win32/gui.c Thu Oct 20 12:48:35 2011 +0000 @@ -1240,16 +1240,23 @@ static void maketransparent(HWND hwnd, COLORREF crTransparent) { HDC mdc = GetDC(hwnd); - RECT rd; + RECT wrd, crd; HRGN crRgnres, crRgn, crRgnTmp; int iX = 0, iY = 0, iLeftX = 0; + int border, title; int width, height; - GetWindowRect(hwnd, &rd); - width = rd.right - rd.left; - height = rd.bottom - rd.top; + + GetWindowRect(hwnd, &wrd); + GetClientRect(hwnd, &crd); - /* create an empty region */ - crRgn = CreateRectRgn(0, 0, 0, 0); + border = (wrd.right - wrd.left - crd.right) / 2; + title = (wrd.bottom - wrd.top - crd.bottom) - border; + + width = crd.right - crd.left; + height = crd.bottom - crd.top; + + /* create the title bar region */ + crRgn = CreateRectRgn(0, 0, width + border + border, title); /* Create a region from a bitmap with transparency colour of Purple */ for (iY = -1; iY < height; iY++) @@ -1262,11 +1269,11 @@ /* remember this pixel */ iLeftX = iX; - /* now find first non transparent pixel */ + /* now find last non transparent pixel */ while (iX <= width && GetPixel(mdc,iX, iY) != crTransparent) ++iX; /* create a temp region on this info */ - crRgnTmp = CreateRectRgn(iLeftX, iY, iX, iY+1); + crRgnTmp = CreateRectRgn(iLeftX + border, iY + title, iX + border, iY + title + 1); /* combine into main region */ crRgnres = crRgn; @@ -1278,6 +1285,22 @@ } while (iX < width); iX = 0; } + + /* left border region */ + crRgnTmp = CreateRectRgn(0, title, border, title + height); + CombineRgn(crRgn, crRgn, crRgnTmp, RGN_OR); + DeleteObject(crRgnTmp); + + /* right border region */ + crRgnTmp = CreateRectRgn(width + border, title, width + border + border, title + height); + CombineRgn(crRgn, crRgn, crRgnTmp, RGN_OR); + DeleteObject(crRgnTmp); + + /* bottom region */ + crRgnTmp = CreateRectRgn(0, title + height, width + border + border, title + height + border); + CombineRgn(crRgn, crRgn, crRgnTmp, RGN_OR); + DeleteObject(crRgnTmp); + SetWindowRgn(hwnd, crRgn, TRUE); DeleteObject(crRgn); ReleaseDC(hwnd,mdc);