大佬教程收集整理的这篇文章主要介绍了mfc – Win32:UpdateLayeredWindow有时会失败(错误317),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在此先感谢您的帮助!
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_nWndHeight ); HBITMAP hBmpOld = ( HBITMAP ) ::SELEctObject( hDC,hBmp ); img.Draw( hDC,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,&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线程上运行的.它总是适用于我的机器…
以上是大佬教程为你收集整理的mfc – Win32:UpdateLayeredWindow有时会失败(错误317)全部内容,希望文章能够帮你解决mfc – Win32:UpdateLayeredWindow有时会失败(错误317)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。