透明窗体参见:
https://msdn.microsoft.com/en-us/library/ms997507.aspx
CreateWindowEx是需要设置属性
WS_EX_LAYERED | WS_EX_TRANSPARENT
这两个属性很重要.
绘制操作可以参照此函数做:
OnPaint函数中响应:
void GIFStatic::DrawPNG(HWND hWnd, HDC hdc, int width, int height)
{
TCHAR *pngFile = L"C:\\Users\\dyh\\Desktop\\文档\\ico.ooopic.com.png";
/********************************************
* step 1.
* Using Gdiplus to load the image
********************************************/
RECT wndRect;
::GetWindowRect(hWnd, &wndRect);
SIZE wndSize = { wndRect.right - wndRect.left, wndRect.bottom - wndRect.top };
if (hdc == NULL) hdc = ::GetWindowDC(hWnd);
HDC memDC = ::CreateCompatibleDC(hdc);
HBITMAP memBitmap = ::CreateCompatibleBitmap(hdc, wndSize.cx, wndSize.cy);
::SelectObject(memDC, memBitmap);
Gdiplus::Image image(pngFile);
Gdiplus::Graphics graphics(memDC);
graphics.DrawImage(&image, 0, 0, wndSize.cx, wndSize.cy);
// get screen dc
HDC screenDC = hdc;
POINT ptSrc = { 0, 0 };
/*********************************************
* step 3.
* Use UpdateLayeredWindow to Draw the Window
*
*********************************************/
BLENDFUNCTION blendFunction;
blendFunction.AlphaFormat = AC_SRC_ALPHA;
blendFunction.BlendFlags = 0;
blendFunction.BlendOp = AC_SRC_OVER;
blendFunction.SourceConstantAlpha = 255;
UpdateLayeredWindow(hWnd, screenDC, &ptSrc, &wndSize, memDC, &ptSrc, 0, &blendFunction, 2);
::DeleteDC(screenDC);
::DeleteDC(memDC);
::DeleteObject(memBitmap);
}
完成此函数后需要使用MoveWindow函数将窗体移动回去.
否则窗体会移动至左上角落.
代码目录请见下面:
http://download.youkuaiyun.com/detail/ab7936573/9496109