UpdateLayeredWindow 调用失败,参数不正确
我创建了一个win32程序,生成一个窗口,并从资源文件中读取一张图片,将图片显示在窗口上,并设置背景为透明。代码如下
void ResgisterMyWnd() //注册窗口类
{
WNDCLASS WndClass;
WndClass.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInts;
WndClass.hIcon = NULL;
WndClass.hCursor = ::LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = szAppName;
if (!RegisterClass(&WndClass))
{
MessageBox(NULL,_T("register failed"),NULL,MB_OK);
return;
}
}
void CreateMyWnd()
{
g_hWnd = CreateWindow(
szAppName,
_T("我的窗口"),
WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_EX_LAYERED |WS_EX_TRANSPARENT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInts,
NULL);
ShowWindow(g_hWnd,SW_SHOW);
UpdateWindow(g_hWnd);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
void OnDraw(HWND hWnd,HDC hdc) // 接收wm_paint 调用的重绘函数
{
LoadMYImage(hWnd,hdc,_T("back.png"),_T("PNG"));
//MessageBox(NULL,_T("huihua"),NULL,MB_OK);
}
void LoadMYImage(HWND hwnd,HDC hdc,LPCTSTR lpName,LPCTSTR lpTyle)
{
HINSTANCE hIns = ::GetModuleHandleA(NULL);
HRSRC hRsrc = ::FindResource(hIns,lpName,lpTyle);
DWORD len = SizeofResource(hIns,hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hIns,hRsrc);
HGLOBAL hMem= GlobalAlloc(GMEM_FIXED,len);
BYTE* pmem = (BYTE*)GlobalLock(hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(hMem,FALSE,&pstm);
Image* img = Image::FromStream(pstm);
int iWidth = img->GetWidth();
int iHeight = img->GetHeight();
// HDC hDC=::GetDC(hwnd);
HDC hMemDC=::CreateCompatibleDC(hdc);
BITMAPINFO bitmapinfo;
bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfo.bmiHeader.biBitCount = 32;
bitmapinfo.bmiHeader.biHeight = iWidth;
bitmapinfo.bmiHeader.biWidth = iHeight;
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biCompression=BI_RGB;
bitmapinfo.bmiHeader.biXPelsPerMeter=0;
bitmapinfo.bmiHeader.biYPelsPerMeter=0;
bitmapinfo.bmiHeader.biClrUsed=0;
bitmapinfo.bmiHeader.biClrImportant=0;
bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8;
HBITMAP hBit =CreateDIBSection(hMemDC,&bitmapinfo,NULL,NULL, 0, 0);
int err = GetLastError();
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC,hBit);
//CClientDC dcclient(hwnd);
Graphics g(hMemDC); // 在内存dc绘图
g.DrawImage(img,0,0,iWidth,iHeight);
POINT DestPt;
DestPt.x = 0;
DestPt.y = 0;
SIZE psize;
psize.cx = iWidth;
psize.cy = iHeight;
POINT ptSrc;
RECT rc;
GetClientRect(hwnd,&rc);
ptSrc.x = rc.left;
ptSrc.y =rc.top;
BLENDFUNCTION blendFunc32bpp;
blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA;
blendFunc32bpp.BlendFlags = 0;
blendFunc32bpp.BlendOp = AC_SRC_OVER;
blendFunc32bpp.SourceConstantAlpha = 255;
::UpdateLayeredWindow(hwnd,hdc,&DestPt,&psize,hMemDC,&ptSrc,0,&blendFunc32bpp,ULW_ALPHA);
int err2 = GetLastError();
::SelectObject(hMemDC,hOldBitmap);
::DeleteObject(hBit);
::DeleteDC(hMemDC);
::ReleaseDC(hwnd,hdc);
}
若将Graphics g(hMemDC);改为Graphics g(hdc);可以在窗口上显示图片。但背景没有透明。
err2 返回87,参数不正确。求教各位该怎么做啊? 我只想在窗口显示一张图片,并且背景是透明的。
分数没多少了,回答有帮助者后面追加给分。