- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我这里有一个奇怪的问题。我正在使用分层窗口显示半透明的启动屏幕(.png 文件)。它适用于某些机器,但不适用于其他机器。在它不起作用的机器上,GetLastError 返回 317(这不是很有帮助)。有谁之前经历过这个吗?这是我的相关功能。 CreateAsPNG 的传入参数是 WS_VISIBLE|WS_POPUP (dwStyle)、0 (dwExStyle) 和父隐藏工具窗口的句柄,因此不会创建任务栏条目。我已经验证我可以将嵌入的 PNG 资源加载到 CImage 中,并且图像的大小是正确的。
预先感谢您的帮助!
BOOL MySplashWnd::CreateAsPNG( DWORD dwStyle, DWORD dwExStyle, const CString& sTitle, HWND hWndParent )
{
ATL::CImage img;
CreateStreamOnResource( m_nBitmapID, img );
m_nWndWidth = img.GetWidth();
m_nWndHeight = img.GetHeight();
int nTop = 0;
int nLeft = 0;
GetTopLeft( nTop, nLeft );
dwExStyle |= WS_EX_LAYERED;
// Create the Splash Window
BOOL bRetVal = CWnd::CreateEx( dwExStyle, AfxRegisterWndClass( CS_CLASSDC ), sTitle,
dwStyle, nLeft, nTop, m_nWndWidth, m_nWndHeight, hWndParent, NULL );
//Couldn't create the window for some unknown reason...
X_ASSERT( bRetVal != FALSE );
if ( bRetVal )
{
HDC hScreenDC = ::GetDC( m_hWnd );
HDC hDC = ::CreateCompatibleDC( hScreenDC );
HBITMAP hBmp = ::CreateCompatibleBitmap( hScreenDC, m_nWndWidth, m_nWndHeight );
HBITMAP hBmpOld = ( HBITMAP ) ::SelectObject( hDC, hBmp );
img.Draw( hDC, 0, 0, m_nWndWidth, m_nWndHeight, 0, 0, m_nWndWidth, m_nWndHeight );
BLENDFUNCTION blend = { 0 };
blend.BlendOp = AC_SRC_OVER;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = AC_SRC_ALPHA;
POINT ptPos = { nLeft, nTop };
SIZE sizeWnd = { m_nWndWidth, m_nWndHeight };
POINT ptSource = { 0, 0 };
if ( ::UpdateLayeredWindow( m_hWnd, hScreenDC, &ptPos, &sizeWnd, hDC, &ptSource, 0, &blend, ULW_ALPHA ) )
{
}
else
{
// The last error value is 317 on some Win7 machines.
TRACE( _T( "*** Last error: %d\n" ), ::GetLastError() );
}
::SelectObject( hDC, hBmpOld );
::DeleteObject( hBmp );
::DeleteDC( hDC );
::ReleaseDC( NULL, hScreenDC );
}
return bRetVal;
}
void MySplashWnd::CreateStreamOnResource( UINT nIDRes, ATL::CImage& img )
{
HINSTANCE hInstance = ::GetMUIResourceInstance();
if ( hInstance == NULL )
{
return;
}
HRSRC hResource = ::FindResource( hInstance, MAKEINTRESOURCE( nIDRes ), "PNG" );
if ( hResource == NULL )
{
return;
}
DWORD dwResourceSize = ::SizeofResource( hInstance, hResource );
if ( dwResourceSize == 0 )
{
return;
}
HGLOBAL hImage = ::LoadResource( hInstance, hResource );
if ( hImage == NULL )
{
return;
}
LPVOID pvImageResourceData = ::LockResource( hImage );
if ( pvImageResourceData == nullptr )
{
return;
}
HGLOBAL hImageData = ::GlobalAlloc( GMEM_MOVEABLE, dwResourceSize );
if ( hImageData == NULL )
{
return;
}
LPVOID pvImageBuffer = ::GlobalLock( hImageData );
if ( pvImageBuffer != nullptr )
{
::CopyMemory( pvImageBuffer, pvImageResourceData, dwResourceSize );
::GlobalUnlock( hImageData );
IStream* pStream = nullptr;
if ( SUCCEEDED( ::CreateStreamOnHGlobal( hImageData, TRUE, &pStream ) ) )
{
img.Load( pStream );
pStream->Release();
}
::GlobalUnlock( hImageData );
}
::GlobalFree( hImageData );
} // CTTSplashWnd::CreateStreamOnResource
更新:我发现即使在同一台计算机上,有时 UpdateLayeredWindow 会成功,有时会失败(但如果失败,则始终带有代码 317)。另一条信息是该启动画面正在单独的 UI 线程上运行。但它总是可以在我的机器上运行...
最佳答案
我也遇到了同样的问题,但找不到任何相关信息。使用 SetWindowAttributes 方法可以,但我想使用 SetLayeredWindow 方法。我现在要通过整个 Windows API 进行调试,以找出发生了什么,因为 msdn 提供了有关此错误消息的 jack 信息。唯一的区别是我看到的 OpenGL 分层窗口演示示例使用此方法,使用 CreateDIBSection 而不是 CreateCompatibleBitmap,后者似乎可以在我的 PC 上运行。
关于mfc - Win32 : UpdateLayeredWindow failing sometimes (error 317),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23686668/
我正在使用 UpdateLayeredWindow 创建一个分层窗口,并且我已经为子控件实现了绘图逻辑。我的问题是每次 uI 发生变化时,整个框架都需要重新绘制。我想知道是否有一种方法可以只重绘窗口的
我正在使用 UpdateLayeredWindow 来显示应用程序窗口。我已经创建了自己的自定义按钮,并且想创建自己的静态文本。问题是,当我尝试在 hdc 上绘制文本时,DrawText 或 Text
我正在使用分层窗口,它们似乎会造成相当大的性能损失(我的一个核心已完全使用)。有什么方法可以调整分层窗口的性能吗? Direct2D 是可行的替代方案吗? (我的分层窗口需要有每个像素的 alpha)
我在我的 MFC 应用程序中设置了一个分层窗口。我已经设置了我自己的 CDialog 派生,以允许我自定义窗口呈现方式的各个部分。一切正常,直到我开始担心最小化和最大化。 如果您单击最小化或最大化,则
我的程序中有一个分层窗口,它(在视觉上)似乎工作正常,但 UpdateLayeredWindow 的返回代码应该是成功时的非零值。在我的例子中,它是 0,GetLastError 返回 87,这是一个
我这里有一个奇怪的问题。我正在使用分层窗口显示半透明的启动屏幕(.png 文件)。它适用于某些机器,但不适用于其他机器。在它不起作用的机器上,GetLastError 返回 317(这不是很有帮助)。
我在客户区有一个透明背景的应用程序,它被绘制成黑色,因为窗口没有分层。在每个 WM_PAINT 消息中,我对内存 DC 执行 BitBlt,之后我将内存 DC 与 UpdateLayeredWindo
我是一名优秀的程序员,十分优秀!