对话框设置成全透明了,怎么捕获透明部分的鼠标消息?

jinling4388 2012-06-07 03:45:40
部分代码如下:
	CPaintDC dc(this); // device context for painting

BLENDFUNCTION blend;
blend.BlendOp = 0;
blend.BlendFlags = 0;
blend.AlphaFormat = 1;
blend.SourceConstantAlpha = 255;//原对话框设置为全透明

CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc);
//窗体样式设为层级窗体
DWORD dwExStyle = GetWindowLong(m_hWnd,GWL_EXSTYLE);
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^WS_EX_LAYERED);

HDC m_hdcMemory;
//绘制内存位图
……

CImage ImgSrc;
ImgSrc.Load(m_strImage);
ImgSrc.Draw(m_hdcMemory,0,30);//将图片画到内存DC上

//使用UpdateLayerWindow进行窗口透明处理
SIZE sizeWindow = {rc.Width(),rc.Height()};
POINT ptWinPos = {rc.left, rc.top};
POINT ptSrc = {0, 0};

UpdateLayeredWindow(CDC::FromHandle(hdcTemp),&ptWinPos,&sizeWindow,
CDC::FromHandle(m_hdcMemory), &ptSrc, RGB(255,0,255), &blend, ULW_COLORKEY);


在透明区域点击鼠标左键,鼠标穿透到下层界面,无法响应本界面的鼠标点击事件。可是我想响应本界面的鼠标点击消息,我该怎么做?
...全文
394 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinling4388 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 12 楼 的回复:

引用 11 楼 的回复:

blend.SourceConstantAlpha=1为近似全透明!


谢谢,虽然不是很明白!

UpdateLayeredWindow(CDC::FromHandle(hdcTemp),&ptWinPos,&sizeWindow,
CDC::FromHandle(m_hdcMe……
[/Quote]
好详细,太谢谢了
zgklem 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:

blend.SourceConstantAlpha=1为近似全透明!


谢谢,虽然不是很明白!
[/Quote]
UpdateLayeredWindow(CDC::FromHandle(hdcTemp),&ptWinPos,&sizeWindow,
CDC::FromHandle(m_hdcMemory), &ptSrc, RGB(255,0,255), &blend, ULW_COLORKEY);最后一个参数ULW_COLORKEY改为ULW_ALPHA,这样UpdateLayeredWindow函数就会采用blend的值而忽略RGB(255,0,255),
UpdateLayeredWindow函数的透明方式分为两种,一种是颜色透明,设置一个透明色即上述函数中的RGB(255,0,255),此时最后一个参数要设置成ULW_COLORKEY,这样窗口上任何像素的颜色值只要等于“透明颜色”就会被“全透明”,鼠标可以穿透(也就是在这个像素的位置不再响应鼠标消息);



第二种是设置整体透明度,也就是采用上述函数中的blend参数,此时最后一个参数必须设为ULW_ALPHA,这样调整blend.SourceConstantAlpha的值就会更改整个窗体的透明度,
(1)0为全透明(也就是说窗体上的任何位置都不响应鼠标消息);
(2)只要不为0则窗体上的任意位置都会响应鼠标消息,不过此时会有一个例外:如果你使用png此类拥有alpha通道的图片,那么窗体的透明度就由图片的透明度与blend.SourceConstantAlpha值共同来决定,如果blend.SourceConstantAlpha==255,则完全由图片来决定窗体的透明度,图片透明的地方窗体也透明,也就是说可以由图片来决定窗体的形状!
向立天 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:

blend.SourceConstantAlpha=1为近似全透明!


谢谢,虽然不是很明白!
[/Quote]
他的意思是说透明度设成1这样人眼基本识别不出来
不过系统不会认为是全透明
还是会有消息的
jinling4388 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

blend.SourceConstantAlpha=1为近似全透明!
[/Quote]

谢谢,虽然不是很明白!
zgklem 2012-06-19
  • 打赏
  • 举报
回复
blend.SourceConstantAlpha=1为近似全透明!
zgklem 2012-06-19
  • 打赏
  • 举报
回复
ULW_COLORKEY会导致blend无效!你的透明是根据颜色值来的!窗口上与“透明颜色”同色的地方都会透明,这种透明没办法捕捉到鼠标点击消息!如果你想使用blend,则应将ULW_COLORKEY
改为ULW_ALPHA,这样就可以设置窗体的整体透明度!也就是将blend.SourceConstantAlpha设为0-255中的任意值!
jinling4388 2012-06-18
  • 打赏
  • 举报
回复
blend.AlphaFormat = 1;不是全透明设置为1吗?
jinling4388 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

不要把对话框设置为全透明,全透明设置为0,不透明设置为255,你可以设置为1,此时从视觉效果上看与设置为全透明0效果是一样的,此时因为不是全透明,所以对话框可以捕捉到鼠标消息。
[/Quote]

这个怎么实现?
BLENDFUNCTION blend;
blend.BlendOp = 0;
blend.BlendFlags = 0;
blend.AlphaFormat = 1;
blend.SourceConstantAlpha = 255;//原对话框设置为全透明
要改吗?
vc_ai_hao_zhe 2012-06-11
  • 打赏
  • 举报
回复
“当鼠标移动到透明对话框上时,把对话框底下的图片截过来贴上去,实现假的透明,这时候鼠标消息就可以捕获了”这种方法可行,我试过,效果不是很好。
vc_ai_hao_zhe 2012-06-11
  • 打赏
  • 举报
回复
不要把对话框设置为全透明,全透明设置为0,不透明设置为255,你可以设置为1,此时从视觉效果上看与设置为全透明0效果是一样的,此时因为不是全透明,所以对话框可以捕捉到鼠标消息。
jinling4388 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

可以这样不:
当鼠标移动到透明对话框上时,把对话框底下的图片截过来贴上去,实现假的透明,这时候鼠标消息就可以捕获了。
[/Quote]

可是我的对话框可以拖动,拖动过程中也时时截取背景呀?
cbzjzsb123 2012-06-08
  • 打赏
  • 举报
回复
可以这样不:
当鼠标移动到透明对话框上时,把对话框底下的图片截过来贴上去,实现假的透明,这时候鼠标消息就可以捕获了。
疯狂-的-蜗牛 2012-06-07
  • 打赏
  • 举报
回复
可以这样不:
当鼠标移动到透明对话框上时,把对话框底下的图片截过来贴上去,实现假的透明,这时候鼠标消息就可以捕获了。
healer_kx 2012-06-07
  • 打赏
  • 举报
回复
透明度别完全设为0啊。。。

15,979

社区成员

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

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