C++ Windows API:UpdateLayeredWindow返回值
我的程序中有一个分层窗口,看起来(视觉上)工作正常,但是C++ Windows API:UpdateLayeredWindow返回值,c++,winapi,error-handling,splash-screen,layered-windows,C++,Winapi,Error Handling,Splash Screen,Layered Windows,我的程序中有一个分层窗口,看起来(视觉上)工作正常,但是UpdateLayeredWindow的返回代码在成功时应该是非零值。在我的例子中,它是0,GetLastError返回87,这是一个不正确的参数。有人能告诉我我的设置有什么问题吗?这是完整的功能,窗口样式是WS_EX_LAYERED | WS_EX_top和WS_POPUP bool SplashScreen(HWND hwnd, HINSTANCE m_hinstance) { HBITMAP hBitmap = (HBITMA
UpdateLayeredWindow
的返回代码在成功时应该是非零值。在我的例子中,它是0,GetLastError
返回87,这是一个不正确的参数。有人能告诉我我的设置有什么问题吗?这是完整的功能,窗口样式是WS_EX_LAYERED | WS_EX_top
和WS_POPUP
bool SplashScreen(HWND hwnd, HINSTANCE m_hinstance)
{
HBITMAP hBitmap = (HBITMAP)LoadImage(m_hinstance, "splash.bmp", IMAGE_BITMAP, 640, 640, LR_LOADFROMFILE);
PAINTSTRUCT ps;
HDC hdc;
BITMAP bitmap;
HDC hdcMem;
HGDIOBJ oldBitmap;
int result=0;
if(!SetLayeredWindowAttributes(hwnd, 0, (255 * 100) / 100, LWA_ALPHA))
{
char msg[255];
sprintf(msg,"Error SetLayeredWindowAttributes: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
return false;
}
hdc = BeginPaint(hwnd, &ps);
if(!hdc)
{
char msg[255];
sprintf(msg,"Error BeginPaint: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
return false;
}
hdcMem = CreateCompatibleDC(hdc);
if(!hdcMem)
{
char msg[255];
sprintf(msg,"Error CreateCompatibleDC: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
return false;
}
oldBitmap = SelectObject(hdcMem, hBitmap);
GetObject(hBitmap, sizeof(bitmap), &bitmap);
result=BitBlt(hdc, 0, 0, 640, 640, hdcMem, 0, 0, SRCCOPY);
if(result==0)
{
char msg[255];
sprintf(msg,"Error BitBlt: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
return false;
}
BLENDFUNCTION blend = { 0 };
blend.BlendOp = AC_SRC_OVER;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = AC_SRC_ALPHA;
result=UpdateLayeredWindow(hwnd,GetDC(NULL),NULL,NULL,hdcMem,NULL, RGB(0,0,0),&blend, ULW_ALPHA);// Returns non-zero on success(!), in reality works when 0 is returned.
if(result==0)
{
char msg[255];
sprintf(msg,"Error UpdateLayeredWindow: %d",GetLastError());// Error UpdateLayeredWindow: 87
MessageBox(hwnd,msg,"System",MB_OK);
return false;
}
result=SetLayeredWindowAttributes(hwnd, RGB(255,255,255), 0, ULW_COLORKEY);
if(result==0)
{
char msg[255];
sprintf(msg,"Error SetLayeredWindowAttributes: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
return false;
}
result=EndPaint(hwnd, &ps);
if(result==0)
{
char msg[255];
sprintf(msg,"Error EndPaint: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
return false;
}
SelectObject(hdcMem, oldBitmap);
DeleteDC(hdc);
DeleteObject(hdcMem);
return true;
}
您正在同一个HWND上调用
SetLayeredWindowAttributes()
和UpdateLayeredWindow()
。这是行不通的,文件对此非常清楚:
请注意,一旦为分层窗口调用了SetLayeredWindowAttributes,后续的UpdateLayeredWindow调用将失败,直到清除并再次设置分层样式位
不要同时使用SetLayeredWindowAttributes()
和UpdateLayeredWindow()
。它们是非常不同的方法。将SetLayeredWindowAttributes()
与传统的WM_PAINT
绘图一起使用,或将UpdateLayeredWindow()
与内存位图一起使用。不要两者都用。根据您所展示的内容,您应该单独使用UpdateLayeredWindow()
。它将设置位图作为窗口内容,同时设置窗口的透明度/alpha
并且不要在WM_PAINT
处理程序之外使用Begin/EndPaint()