怎样设置窗口全透明,而鼠标不穿透?

善良超锅锅 2014-04-21 09:13:44
我在做一个二维图形绘图程序。是一个单文档程序。

但是我需要一个视图A来显示已经画好的图形。还需要另外一个全透明视图B来和用户交换(比如显示拖动和绘图过程的动作)。
而且要让用户感觉就像在A上直接绘图。A是单文档的视图,B是我自己创建的一个窗口,全透明。覆盖在A视图上,大小和A一样。
你可能会问为什么我要把绘图的显示和交互分开呢。因为这样比较好实现绘图过程中的一些操作。

之前我把B窗口设置为全透明,但是这样B就鼠标穿透了。响应不了鼠标消息,也就无法和用户交互了。怎样才能把B窗口设为全透明而又能响应鼠标消息呢?

我只想让A用来显示,而B用来交互。可惜B鼠标穿透了。把A覆盖到B的前面来就好了。可惜做不到。

所以还是想一想:怎样才能把B窗口设为全透明而又能响应鼠标消息呢?
...全文
1085 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
善良超锅锅 2014-04-22
  • 打赏
  • 举报
回复
引用 19 楼 gfm688 的回复:
B不穿透必须满足以下条件: 1. B的透明度不为0 2. B不能有WS_EX_TRANSPARENT 3. B的WM_NCHITTEST消息不应返回HTTRANSPARENT (需要返回HTCLIENT)
谢谢!你说的才是我想要的。
gfm688 2014-04-22
  • 打赏
  • 举报
回复
B不穿透必须满足以下条件: 1. B的透明度不为0 2. B不能有WS_EX_TRANSPARENT 3. B的WM_NCHITTEST消息不应返回HTTRANSPARENT (需要返回HTCLIENT)
善良超锅锅 2014-04-22
  • 打赏
  • 举报
回复
引用 16 楼 worldy 的回复:
真是奇葩的设计,显示和操作分开实在想不出方便控制在哪,本质讲操作操作最终是依赖于你的数据逻辑和数据,和显示出来的东西是一点都没有关系,另外使用透明窗口实际是一个很浪费运行效率的处理
好像是我理解错了。看来我对窗口绘图机制没理解。 请教一下:如果我要在窗口绘图,是不是在dc上调用的每一个绘图操作都会激发OnDraw函数的调用呢? 其实我是想问,窗口上图形一个像素的改变都要通过ondraw吗?可以越过OnDraw吗? 比如我在一个按钮单击事件中graphics.DrawEllipse(&pen,0,0,200,200)会激发OnDraw吗?
善良超锅锅 2014-04-22
  • 打赏
  • 举报
回复
引用 15 楼 gfm688 的回复:
[quote=引用 14 楼 gfm688 的回复:] [quote=引用 13 楼 shimachao 的回复:] 不行 这样后B还是鼠标穿透,只是A再也响应不了客户区鼠标消息了
你不是说只想让A用来显示吗? A还要响应鼠标消息?
引用 楼主 shimachao 的回复:
我只想让A用来显示,而B用来交互。可惜B鼠标穿透了。把A覆盖到B的前面来就好了。可惜做不到。
[/quote] 要是B不穿透,B在A前面,A根本就不能响应鼠标消息[/quote] 就是让A不用响应消息,只管显示
worldy 2014-04-22
  • 打赏
  • 举报
回复
真是奇葩的设计,显示和操作分开实在想不出方便控制在哪,本质讲操作操作最终是依赖于你的数据逻辑和数据,和显示出来的东西是一点都没有关系,另外使用透明窗口实际是一个很浪费运行效率的处理
gfm688 2014-04-22
  • 打赏
  • 举报
回复
引用 14 楼 gfm688 的回复:
[quote=引用 13 楼 shimachao 的回复:] 不行 这样后B还是鼠标穿透,只是A再也响应不了客户区鼠标消息了
你不是说只想让A用来显示吗? A还要响应鼠标消息?
引用 楼主 shimachao 的回复:
我只想让A用来显示,而B用来交互。可惜B鼠标穿透了。把A覆盖到B的前面来就好了。可惜做不到。
[/quote] 要是B不穿透,B在A前面,A根本就不能响应鼠标消息
gfm688 2014-04-22
  • 打赏
  • 举报
回复
引用 13 楼 shimachao 的回复:
不行 这样后B还是鼠标穿透,只是A再也响应不了客户区鼠标消息了
你不是说只想让A用来显示吗? A还要响应鼠标消息?
引用 楼主 shimachao 的回复:
我只想让A用来显示,而B用来交互。可惜B鼠标穿透了。把A覆盖到B的前面来就好了。可惜做不到。
worldy 2014-04-22
  • 打赏
  • 举报
回复
引用 18 楼 shimachao 的回复:
[quote=引用 16 楼 worldy 的回复:] 真是奇葩的设计,显示和操作分开实在想不出方便控制在哪,本质讲操作操作最终是依赖于你的数据逻辑和数据,和显示出来的东西是一点都没有关系,另外使用透明窗口实际是一个很浪费运行效率的处理
好像是我理解错了。看来我对窗口绘图机制没理解。 请教一下:如果我要在窗口绘图,是不是在dc上调用的每一个绘图操作都会激发OnDraw函数的调用呢? 其实我是想问,窗口上图形一个像素的改变都要通过ondraw吗?可以越过OnDraw吗? 比如我在一个按钮单击事件中graphics.DrawEllipse(&pen,0,0,200,200)会激发OnDraw吗?[/quote] 错了,应该反过来说。 OnDraw是系统通知你需要进行绘图了,此时你可以在OnDraw函数里调用graphics.DrawEllipse(&pen,0,0,200,200)等绘图函数将你期望的图形绘制到窗口上,所有的Window绘图都必须通过DC进行
  • 打赏
  • 举报
回复
穿透与否和系统彩色位深有关系,但也不至于100的时候还穿透 实在不行就去掉透明度,通过截图贴图到窗体的方式来实现伪透明,去掉窗体的边框和标题栏,可以以假乱真
善良超锅锅 2014-04-21
  • 打赏
  • 举报
回复
引用 1 楼 my3439955 的回复:
透明度提高到鼠标不穿透但又看上去是透明的程度即可,不要全透明
提升到多少呢? 我提升到了100都还是穿透。
void CInteractDlg::PreInitDialog()
{
	//把窗口设置为透明并鼠标穿透
	::SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,
		::GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000L);
	this->SetLayeredWindowAttributes(0,100,LWA_ALPHA);
	CDialogEx::PreInitDialog();
}
善良超锅锅 2014-04-21
  • 打赏
  • 举报
回复
引用 6 楼 allenhiman 的回复:
你不说你都设置为全透明了吗 只要是popup类型的窗口 都可以设置透明度
我把透明度设置为10了,鼠标还是穿透了。取消不了鼠标穿透啊 我在PreInitDialog()设置透明度的代码如下 ::SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE, ::GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x80000L); this->SetLayeredWindowAttributes(0,10,LWA_ALPHA);
allenhiman 2014-04-21
  • 打赏
  • 举报
回复
你不说你都设置为全透明了吗 只要是popup类型的窗口 都可以设置透明度
善良超锅锅 2014-04-21
  • 打赏
  • 举报
回复
引用 4 楼 allenhiman 的回复:
透明度为1 肉眼是看不出来的
视图可以设置透明度吗
善良超锅锅 2014-04-21
  • 打赏
  • 举报
回复
引用 12 楼 WUYUAN2011WOAINI 的回复:
[quote=引用 11 楼 shimachao 的回复:] [quote=引用 10 楼 WUYUAN2011WOAINI 的回复:] 直接在内存DC上画好 在拷贝到设备DC上 你的设计思想有问题
我知道可以。但是我要实现交互绘图过程中的动画效果,显示和交互分开比较好[/quote]

响应窗口A的WM_NCHITTEST消息,直接返回HTTRANSPARENT 
试试行不行
[/quote]不行 这样后B还是鼠标穿透,只是A再也响应不了客户区鼠标消息了
allenhiman 2014-04-21
  • 打赏
  • 举报
回复
透明度为1 肉眼是看不出来的
善良超锅锅 2014-04-21
  • 打赏
  • 举报
回复
引用 2 楼 shimachao 的回复:
[quote=引用 1 楼 my3439955 的回复:] 透明度提高到鼠标不穿透但又看上去是透明的程度即可,不要全透明
这么妥协了,会不会造成效果看起来不会呢?[/quote] 这样看起来效果不好吧。 有更好的办法吗?
善良超锅锅 2014-04-21
  • 打赏
  • 举报
回复
引用 1 楼 my3439955 的回复:
透明度提高到鼠标不穿透但又看上去是透明的程度即可,不要全透明
这么妥协了,会不会造成效果看起来不会呢?
  • 打赏
  • 举报
回复
透明度提高到鼠标不穿透但又看上去是透明的程度即可,不要全透明
kuankuan_qiao 2014-04-21
  • 打赏
  • 举报
回复
引用 11 楼 shimachao 的回复:
[quote=引用 10 楼 WUYUAN2011WOAINI 的回复:] 直接在内存DC上画好 在拷贝到设备DC上 你的设计思想有问题
我知道可以。但是我要实现交互绘图过程中的动画效果,显示和交互分开比较好[/quote]

响应窗口A的WM_NCHITTEST消息,直接返回HTTRANSPARENT 
试试行不行
善良超锅锅 2014-04-21
  • 打赏
  • 举报
回复
引用 10 楼 WUYUAN2011WOAINI 的回复:
直接在内存DC上画好 在拷贝到设备DC上 你的设计思想有问题
我知道可以。但是我要实现交互绘图过程中的动画效果,显示和交互分开比较好
加载更多回复(1)

15,981

社区成员

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

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