用了一下SetLayeredWindowAttributes来进行眼色过滤,可是弄了半天没弄好。我定义一个窗口CBmpStatic,继承自CStatic,它只负责显示一张图片,图片里只有纯红(255,0,0)和纯蓝(0,0,255)两种颜色。然后在我建立的Dialog中加一个CBmpStatic类的成员,在OnInitDialog函数里主要代码如下: m_bmpStatic.Create( NULL, WS_CHILD|WS_VISIBLE|SS_BITMAP, CRect(20, 20, 120, 90), this, 111 );
SetWindowLong( m_bmpStatic.GetSafeHwnd(), GWL_EXSTYLE, 
GetWindowLong( m_bmpStatic.GetSafeHwnd(), GWL_EXSTYLE)|0x80000 ); 
HMODULE hModule = LoadLibrary( "User32.DLL" ); 
if( hInst ) 

typedef BOOL (WINAPI *MYFUNC)( HWND, COLORREF, BYTE, DWORD ); 
MYFUNC fun = NULL; 
//取得SetLayeredWindowAttributes函数指针 
fun=(MYFUNC)GetProcAddress( hInst, "SetLayeredWindowAttributes" ); 
if(fun)
                          fun( m_bmpStatic.GetSafeHwnd(),RGB(255, 0, 0), 0, 1 ); 
FreeLibrary( hInst ); 
} 为啥不管用捏?我看那图片清清楚楚......

解决方案 »

  1.   

     HMODULE hModule = LoadLibrary( "User32.DLL" ); 
        if( hModule ) //应该是hModule ,而不是hInst 
        { 
            typedef BOOL (WINAPI *MYFUNC)( HWND, COLORREF, BYTE, DWORD ); 
            MYFUNC fun = NULL; 
            //取得SetLayeredWindowAttributes函数指针 
            fun=(MYFUNC)GetProcAddress( Module , "SetLayeredWindowAttributes" ); //应该是hModule 而不是hInst 
            if(fun)
                              fun( m_bmpStatic.GetSafeHwnd(),RGB(255, 0, 0), 0, 1 ); 
            FreeLibrary( hInst ); 
        } 
      

  2.   

    还要将图象窗口设置扩展属性 WS_EX_LAYERED
      

  3.   


        SetWindowLong( m_bmpStatic.GetSafeHwnd(), GWL_EXSTYLE, 
            GetWindowLong( m_bmpStatic.GetSafeHwnd(), GWL_EXSTYLE)|0x80000 );这个就是,只不过我没找到WS_EX_LAYERED的定义,直接把十六进制码写上去了。另:如果我设置的是当下Dialog的透明属性就可以。
      

  4.   

    给你一点参考吧,这个API是比较怪
      

  5.   

    对控件没效果的,MSDN上说的很清楚hwnd
    [in] Handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created.
    你可以把需要透过的空间在一个窗口上创建,然后把这个窗口设置透过,然后再把2个窗口叠加。
      

  6.   

    这个,我很愿意相信而且试验结果确实像是控件无效,可是,能详细说明一下,哪里说的控件无效的?hwnd
    [in] 分层窗口的句柄。一个分层窗口是在由CreateWindowEx函数定义时指定WS_EX_LAYERED属性或在窗口创建后设置为WS_EX_LAYERED属性。不知道我翻译的有没有哪里不对。我没看出来控件不可用啊?
      

  7.   

    WS_EX_LAYERED
    Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC. 贴错地方了,不好意思。这里说不能用于childwindow,控件肯定是childwindow吧?
      

  8.   

    哦,了解!如果放弃使用SetLayeredWindowAttributes,有没有其他的办法把某些颜色过滤掉呢?静候佳音
      

  9.   


    嗯嗯,谢谢,要处理的是对话框圆角的问题,叠加就不用了,直接过滤掉圆角外的颜色就可以了。
    可是,现在有一个非常让我郁闷的问题,我们这边用SetLayeredWindowAttributes做的透明处理到了java那边出问题。有没有别的什么办法能处理颜色透明过滤?我刚看了一下TransparentBlt,试了半天没成功,郁闷。
    下面是一个窗口的OnEraseBkgnd函数
    CBitmap bmpMyBmp;
    bmpMyBmp.LoadBitmap( IDB_STATICBMP ); BITMAP bmp;
    bmpMyBmp.GetBitmap( &bmp ); CDC dcCompatible;
    dcCompatible.CreateCompatibleDC( pDC );
    dcCompatible.SelectObject( &bmpMyBmp ); CRect rect;
    GetClientRect( &rect );
    pDC->StretchBlt( 0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); typedef BOOL (WINAPI * TRANSPORTBLT)( HDC, INT, INT, INT, INT, HDC, INT, INT, INT, INT, COLORREF );
    RECT rc;
    BITMAP bmTime;
    HBITMAP hOld, hNewBitmap;
    HDC  hTimeDC;
    BOOL bRet;
    COLORREF color = RGB(255,0,0);
    HWND hWnd = this->GetSafeHwnd();
    HBITMAP hBmp = (HBITMAP)bmpMyBmp.GetSafeHandle();
    HDC hdc = pDC->GetSafeHdc(); HMODULE hModule = LoadLibrary( "Msimg32.dll" );
    TRANSPORTBLT TransparentBlt = (TRANSPORTBLT)GetProcAddress( hModule, "TransparentBlt" );

    GetWindowRect( &rc );
    GetObject( hBmp, sizeof(bmTime), &bmTime );
    hTimeDC = CreateCompatibleDC( hdc );
    hNewBitmap = CreateCompatibleBitmap( hdc, bmTime.bmWidth, bmTime.bmHeight );
    hOld = (HBITMAP)SelectObject( hTimeDC, hNewBitmap );
    bRet = TransparentBlt( hTimeDC, 0, 0, bmTime.bmWidth, bmTime.bmHeight, (HDC)hBmp, 0, 0, bmTime.bmWidth, bmTime.bmHeight, color );
    DeleteDC( hTimeDC );
    DeleteObject( hNewBitmap );