sách gpt4 ăn đã đi

c++ - Windows API : UpdateLayeredWindow return values

In lại 作者:搜寻专家 更新时间:2023-10-31 00:14:48 30 4
mua khóa gpt4 giày nike

我的程序中有一个分层窗口,它(在视觉上)似乎工作正常,但 UpdateLayeredWindow 的返回代码应该是成功时的非零值。在我的例子中,它是 0,GetLastError 返回 87,这是一个不正确的参数。有人可以告诉我我的设置是否有问题吗?这是完整的功能,窗口样式为WS_EX_LAYERED|WS_EX_TOPMOSTWS_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);
trả về false;
}

hdc = BeginPaint(hwnd, &ps);
if(!hdc)
{
char msg[255];
sprintf(msg,"Error BeginPaint: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
trả về false;
}

hdcMem = CreateCompatibleDC(hdc);
if(!hdcMem)
{
char msg[255];
sprintf(msg,"Error CreateCompatibleDC: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
trả về 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);
trả về 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);
trả về 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);
trả về false;
}

result=EndPaint(hwnd, &ps);
if(result==0)
{
char msg[255];
sprintf(msg,"Error EndPaint: %d",GetLastError());
MessageBox(hwnd,msg,"System",MB_OK);
trả về false;
}

SelectObject(hdcMem, oldBitmap);
DeleteDC(hdc);
DeleteObject(hdcMem);
trả về giá trị đúng;
}

câu trả lời hay nhất

您正在同一 HWND 上调用 SetLayeredWindowAttributes()UpdateLayeredWindow()。那是行不通的,文档对此非常清楚:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633540(v=vs.85).aspx

Note that once SetLayeredWindowAttributes has been called for a layered window, subsequent UpdateLayeredWindow calls will fail until the layering style bit is cleared and set again.

不要同时使用 SetLayeredWindowAttributes()UpdateLayeredWindow()。它们是非常不同的方法。要么将 SetLayeredWindowAttributes() 用于传统的 WM_PAINT 绘图,要么将 UpdateLayeredWindow() 用于内存位图。不要同时使用两者。根据您所展示的内容,您应该单独使用 UpdateLayeredWindow()。它会设置一个位图作为窗口内容,同时设置窗口的透明度/alpha。

并且不要在 WM_PAINT 处理程序之外使用 Begin/EndPaint()

关于c++ - Windows API : UpdateLayeredWindow return values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21654547/

30 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress