UpdateLayeredWindow 调用失败,参数不正确

w_storm 2014-10-21 10:08:57
我创建了一个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,参数不正确。求教各位该怎么做啊? 我只想在窗口显示一张图片,并且背景是透明的。

分数没多少了,回答有帮助者后面追加给分。
...全文
448 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_storm 2014-10-22
  • 打赏
  • 举报
回复
问题已解决! 在创建窗口时 createwindow()时窗口样式设为 WS_OVERLAPPEDWINDOW,在响应WM_CREATE消息时可以设置拓展样式 DWORD dwStyle = GetWindowLong(hWnd,GWL_EXSTYLE); dwStyle |= WS_EX_LAYERED; SetWindowLong(hWnd,GWL_EXSTYLE,dwStyle); 这样问题就解决了。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧