Do you have any sample code using UpdateLayeredWindow, blendfuntions, etc.?
First, I create a 32bpp bitmap. Of course, you can load/create it however you want, and you'll probably have error checking.
BYTE * ptr;
HBITMAP bitmap;
BITMAPINFOHEADER bmih;
bmih.biSize = sizeof(bmih);
bmih.biWidth = m_sSize.cx;
bmih.biHeight = m_sSize.cy;
bmih.biPlanes = 1;
bmih.biBitCount = 32;
bmih.biCompression = BI_RGB;
bmih.biSizeImage = 0;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;
bitmap = CreateDIBSection(0, (const BITMAPINFO *) &bmih, DIB_RGB_COLORS, (VOID **) &ptr, 0, 0);
Now, here comes the fun part:
POINT ptSrc = {0, 0};
BLENDFUNCTION blend = {AC_SRC_OVER, 0, alpha, AC_SRC_ALPHA};
HDC dDC = GetDC(NULL);
HDC hDC = CreateCompatibleDC(dDC);
HBITMAP pOldBmp = (HBITMAP) SelectObject(hDC, bitmap);
UpdateLayeredWindow(m_hWnd, dDC, &m_pPos, &m_sSize, hDC, &ptSrc, 0, &blend, ULW_ALPHA);
SelectObject(hDC, pOldBmp);
DeleteDC(hDC);
ReleaseDC(NULL, dDC);
This code is copied from foo_osd.
Since I don't feel like retyping exactly what MSDN explains about that function, I'll give you this link.
You must pre-scale the color values according to their alpha levels... for each pixel:
(red/green/blue) = (red/green/blue) * alpha / 255
Have fun with that stuff, and remember that you can't use SetLayeredWindowAttributes if you're using UpdateLayeredWindow. Best to keep the same bitmap resident and pass it to all calls where you need to change the blend function.