wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了mfc – Win32:UpdateLayeredWindow有时会失败(错误317)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我这里有一个奇怪的问题.我正在使用分层窗口显示半透明的启动画面(.png文件).它适用于某些机器但不适用于其他机器.在它不起作用的机器上,GetLastError返回317(这不是很有用).有谁之前经历过这个吗?这是我的相关功能. CreateAsPNG的传入参数是WS_VISIBLE | WS_POPUP(dwStylE),0(dwExStylE),以及父级隐藏工具窗口的句柄,因此不会创建任务栏
@H_262_14@
@H_262_14@
我这里有一个奇怪的问题.我正在使用分层窗口显示半透明的启动画面(.png文件).它适用于某些机器但不适用于其他机器.在它不起作用的机器上,GetLastError返回317(这不是很有用).有谁之前经历过这个吗?这是我的相关功能. CreateAsPNG的传入参数是WS_VISIBLE | WS_POPUP(dwStylE),0(dwExStylE),以及父级隐藏工具窗口的句柄,因此不会创建任务栏条目.我已经验证我可以将嵌入的PNG资源加载到C Image中,并且图像的大小是正确的.

在此先感谢您的帮助!

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线程上运行的.它总是适用于我的机器…

解决方法

我遇到了同样的问题,我也找不到任何信息.使用SetWindowAttributes方法可以工作,但我想使用SetLayeredWindow方式.我将要通过整个Windows API进行调试,以了解发生了什么,因为msdn提供了有关此错误消息的插孔信息.唯一的区别是我看到的使用此方法的OpenGL分层窗口演示示例使用CreateDIBSection而不是CreateCompatibleBitmap,它似乎可以在我的PC上运行.
@H_262_14@

大佬总结

以上是大佬教程为你收集整理的mfc – Win32:UpdateLayeredWindow有时会失败(错误317)全部内容,希望文章能够帮你解决mfc – Win32:UpdateLayeredWindow有时会失败(错误317)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:31732mfcwinwin32失败时会错误
猜你在找的wordpress相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap