用了一下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 );
} 为啥不管用捏?我看那图片清清楚楚......
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 );
} 为啥不管用捏?我看那图片清清楚楚......
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 );
}
SetWindowLong( m_bmpStatic.GetSafeHwnd(), GWL_EXSTYLE,
GetWindowLong( m_bmpStatic.GetSafeHwnd(), GWL_EXSTYLE)|0x80000 );这个就是,只不过我没找到WS_EX_LAYERED的定义,直接把十六进制码写上去了。另:如果我设置的是当下Dialog的透明属性就可以。
[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个窗口叠加。
[in] 分层窗口的句柄。一个分层窗口是在由CreateWindowEx函数定义时指定WS_EX_LAYERED属性或在窗口创建后设置为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吧?
嗯嗯,谢谢,要处理的是对话框圆角的问题,叠加就不用了,直接过滤掉圆角外的颜色就可以了。
可是,现在有一个非常让我郁闷的问题,我们这边用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 );