SetLayeredWindowAttributes的问题

The_facE 2009-06-05 03:05:10
用了一下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 );
}



为啥不管用捏?我看那图片清清楚楚......
...全文
326 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
The_facE 2009-06-08
  • 打赏
  • 举报
回复
自己搞定了,结贴。

感谢各位帮助!!!
The_facE 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 greatws 的回复:]
你可以把需要透过的控件在一个窗口上创建,然后把这个窗口设置透过,然后再把2个窗口叠加。
[/Quote]

嗯嗯,谢谢,要处理的是对话框圆角的问题,叠加就不用了,直接过滤掉圆角外的颜色就可以了。
可是,现在有一个非常让我郁闷的问题,我们这边用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 );


greatws 2009-06-08
  • 打赏
  • 举报
回复
你可以把需要透过的控件在一个窗口上创建,然后把这个窗口设置透过,然后再把2个窗口叠加。
The_facE 2009-06-08
  • 打赏
  • 举报
回复
哦,了解!

如果放弃使用SetLayeredWindowAttributes,有没有其他的办法把某些颜色过滤掉呢?

静候佳音
greatws 2009-06-05
  • 打赏
  • 举报
回复
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吧?
The_facE 2009-06-05
  • 打赏
  • 举报
回复
这个,我很愿意相信而且试验结果确实像是控件无效,可是,能详细说明一下,哪里说的控件无效的?

hwnd
[in] 分层窗口的句柄。一个分层窗口是在由CreateWindowEx函数定义时指定WS_EX_LAYERED属性或在窗口创建后设置为WS_EX_LAYERED属性。

不知道我翻译的有没有哪里不对。我没看出来控件不可用啊?
greatws 2009-06-05
  • 打赏
  • 举报
回复
对控件没效果的,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个窗口叠加。
hendriclee 2009-06-05
  • 打赏
  • 举报
回复
给你一点参考吧,这个API是比较怪
The_facE 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qimiao77 的回复:]
还要将图象窗口设置扩展属性 WS_EX_LAYERED
[/Quote]

SetWindowLong( m_bmpStatic.GetSafeHwnd(), GWL_EXSTYLE,
GetWindowLong( m_bmpStatic.GetSafeHwnd(), GWL_EXSTYLE)|0x80000 );

这个就是,只不过我没找到WS_EX_LAYERED的定义,直接把十六进制码写上去了。

另:如果我设置的是当下Dialog的透明属性就可以。
The_facE 2009-06-05
  • 打赏
  • 举报
回复
对,那个不是关键问题,这是我来回改代码的时候写错了。
贪玩的老鼠 2009-06-05
  • 打赏
  • 举报
回复
还要将图象窗口设置扩展属性 WS_EX_LAYERED
贪玩的老鼠 2009-06-05
  • 打赏
  • 举报
回复
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 );
}

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧