半透明窗体上鼠标绘制不透明的图形

terrycanny 2012-11-22 12:56:28
想实现屏幕标记,一个透明窗口,一个悬浮窗口,但是全透明窗口上绘图需要钩子,而钩子又使得绘图时不能拖动悬浮框;想用半透明窗口,但是绘制的线条也是半透明的!现在用的是SetLayeredWindow函数实现,有没有做过类似的,纠结了好久了,跪求大神们帮忙呀!
...全文
314 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
terrycanny 2012-11-30
  • 打赏
  • 举报
回复
已经实现!三层窗口,一层全透明的用来显示,一层透明度为1的用来捕获鼠标事件,最上面一层是悬浮的工具条窗口,使用的都是SetLayeredWindowAttributes,捕获到的时间通过消息机制传递到全透明窗口,全透明窗口根据接收到的坐标数据绘制图形。
terrycanny 2012-11-30
  • 打赏
  • 举报
回复
引用 4 楼 tiger9991 的回复:
我就在透明窗体上面绘制过,也能做成悬浮框。 透明窗体就用SetLayeredWindowAttributes,缺点是不能让其成为子窗体。否则,透明效果失效。 你悬浮窗体用WM_LUBTTONDOWN的消息 SendMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y ) ); ……
已经验证子窗口和父窗口都可以透明!
傻X 2012-11-30
  • 打赏
  • 举报
回复
他连子窗体什么意思都不懂,就说能透明。记住他ID就可以了。 他Create时候设置Parent指针为NULL,还说子窗体。
sumos 2012-11-30
  • 打赏
  • 举报
回复
引用 22 楼 terrycanny 的回复:
已经实现!三层窗口,一层全透明的用来显示,一层透明度为1的用来捕获鼠标事件,最上面一层是悬浮的工具条窗口,使用的都是SetLayeredWindowAttributes,捕获到的时间通过消息机制传递到全透明窗口,全透明窗口根据接收到的坐标数据绘制图形。
你好意思不给分。???
sumos 2012-11-28
  • 打赏
  • 举报
回复
引用 17 楼 terrycanny 的回复:
关键是我设置为半透明时,画出来的痕迹也是跟窗体的透明度一样是半透明的!我想要的是画出来的是不透明的,所以想知道你是怎么画的!http://o22azq.sn2.livefilestore.com/y1mCxX1PG-my972ejesnFfQLmh3stnpANwjScPVnIKc2MOOHDhM_wE4akL8zhvh_ca4QQCIjp6GqhQhmVlcle6Anl……
我觉得,半透明应该是绘制png,png有半透明。如果你把那个BLENDFUNCTION的sourcealpha改成半透明125,那整个窗口都会半透明。
足球中国 2012-11-28
  • 打赏
  • 举报
回复
此贴可以加精。。。。
terrycanny 2012-11-28
  • 打赏
  • 举报
回复
terrycanny 2012-11-28
  • 打赏
  • 举报
回复
关键是我设置为半透明时,画出来的痕迹也是跟窗体的透明度一样是半透明的!我想要的是画出来的是不透明的,所以想知道你是怎么画的!http://o22azq.sn2.livefilestore.com/y1mCxX1PG-my972ejesnFfQLmh3stnpANwjScPVnIKc2MOOHDhM_wE4akL8zhvh_ca4QQCIjp6GqhQhmVlcle6Anl_vJuzjqHW2/Float.rar?download&psid=1 这是程序连接地址,麻烦大家帮忙看看!
若风09 2012-11-27
  • 打赏
  • 举报
回复
大神
Yun__ 2012-11-27
  • 打赏
  • 举报
回复
SetLayeredWindowAttributes调的是窗口全局的透明度 UpdateLayeredWindow是绘制拥有透明风格的窗口 可以透明一部分 也可以透明全部 函数原型: UpdateLayeredWindow   The UpdateLayeredWindow function updates the position, size, shape, content, and translucency of a layered window   该UpdateLayeredWindow函数更新一个分层的窗口的位置,大小,形状,内容和半透明度;   BOOL UpdateLayeredWindow(   HWND hwnd,   HDC hdcDst,   POINT *pptDst,   SIZE *psize,   HDC hdcSrc,   POINT *pptSrc,   COLORREF crKey,   BLENDFUNCTION *pblend,   DWORD dwFlags   );   hwnd 一个分层的窗口句柄;一个分层的窗口当用CreateWindowEx   函数创建窗口时指定WS_EX_LAYERED;   hdcDst 屏幕的设备上下文(DC)句柄;如果指定为空,那么将会在函数调用时自己获得。   它用于当窗口内容更新时,与调色板颜色去匹配;如果hdcDst指定为Null,将使用默认调色板;   如果hdcSrc 为NULL, hdcDst 必须 NULL;   pptDst 一个POINT结构的指针(指定新的分层窗口的屏幕位置);如果位置没有改变,pptDst可以为NULL;\   psize 一个尺寸结构的指针(指定分层窗口新的大小);如果不改变窗口大小,psize可以为NULL;如果hdcSrc为NULL,psize必须为NULL;   hdcSrc 定义了的分层窗口绘图表面的DC句柄;这个句柄可以通过CreateCompatibleDC函数获得;如果窗口的可视范围和形状不发生变化,hdcSrc可以为NULL。   pptSrc 一个POINT结构的指针(指定了分层窗口在设备上下文的位置);如果hdcSrc为NULL,pptSrc应该是NULL;   crKey 指向一个COLORREF值(当合成分层窗口时使用指定颜色键值)。要生成COLORREF,使用RGB宏;   pblend 指向一个BLENDFUNCTION结构(当合成分层窗口时使用指定透明度值)。   dwFlags 这个参数可以是以下值之一:   ULW_ALPHA 使用pblend为混合功能,如果显示模式为256色或更少,这个值和ULW_OPAQUE效果相同;   ULW_COLORKEY 使用crKey值为颜色的透明度   ULW_OPAQUE 绘制一个不透明分层窗口   如果hdcSrc为NULL,dwFlags应为零   返回值:   如果函数成功,返回值为非零;如果函数失败,返回值为零。为了获得更多的错误信息,调用GetLastError 这个函数与SetLayeredWindowAttributes函数冲突 这个函数ULW_ALPHA是使用pblend的效果, ULW_COLORKEY依赖crKey的效果透明 ULW_OPAQUE 绘制一个不透明分层窗口
terrycanny 2012-11-27
  • 打赏
  • 举报
回复
引用 13 楼 tiger9991 的回复:
全透明的窗体捕获不到鼠标事件!所以用钩子啊!你不用钩子,你是怎么实现鼠标在透明窗体上移动绘制图型的呢? 除非你绘制的图形也是全透明的,我没招以外,我绘制的图形用控件,凭啥接收不到消息呢? 而且干嘛全透明,5-10的透明度(0-255)也能点到窗体的。
恩,就是想知道透明度为5-10时能点击到窗口,但是绘制的图形的透明度也只有5-10,看不见,所以你是怎么在半透明上绘制不透明的图形的呢?
傻X 2012-11-27
  • 打赏
  • 举报
回复
全透明的窗体捕获不到鼠标事件!所以用钩子啊!你不用钩子,你是怎么实现鼠标在透明窗体上移动绘制图型的呢? 除非你绘制的图形也是全透明的,我没招以外,我绘制的图形用控件,凭啥接收不到消息呢? 而且干嘛全透明,5-10的透明度(0-255)也能点到窗体的。
terrycanny 2012-11-26
  • 打赏
  • 举报
回复
我想知道:用SetLayeredWindowAttributes能否实现,若用半透明如何实现,若全透明如何决解钩子引发的问题;用UpdateLayeredWindow又如何实现?
gz_qmc 2012-11-26
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/gz_qmc/3495311 这个范例是可以参考的,其中的有一块透明的(你也可以称为窗口) 透明度可调,而上面的字是不透明的
lang14 2012-11-26
  • 打赏
  • 举报
回复
用GDI直接画就行了
terrycanny 2012-11-26
  • 打赏
  • 举报
回复
引用 9 楼 gz_qmc 的回复:
区域是什么呢?最简单的无非就是个CRect 而仿显存无非就是个CDC+CBitmap 窗口就是一棵数,显示就是子子孙孙把他们自己的仿显存数据拷贝到父亲的仿显存 到桌面这个老祖宗窗口后,一次性拷贝到真显存,如此而已 有了这个理解,为啥就不能直接弄几个CDC+CBitmap来实现呢? CDC直接的透明不透明都是自己说了算 而你直接用他定义好的窗口类,不……
解释的通俗易懂,但是对于我这新手来说还是值得研究研究的了!能给个简单实例让我看看吗?这周预研就得结束,如果有在原来的基础上(即对钩子)的比较好的解决方法,或者其他直接的有简单实例的就更好了!
gz_qmc 2012-11-26
  • 打赏
  • 举报
回复
区域是什么呢?最简单的无非就是个CRect 而仿显存无非就是个CDC+CBitmap 窗口就是一棵数,显示就是子子孙孙把他们自己的仿显存数据拷贝到父亲的仿显存 到桌面这个老祖宗窗口后,一次性拷贝到真显存,如此而已 有了这个理解,为啥就不能直接弄几个CDC+CBitmap来实现呢? CDC直接的透明不透明都是自己说了算 而你直接用他定义好的窗口类,不就是多此一举吗? 你以为他那个实现最后不是操作CDC+CBitmap吗?一样是的 问题是当初封装的时候人家是考虑大众化,并不考虑你的特殊需求 现在我问你,我在程序里定义10区域和10个CDC 你说算不算10个窗口呢 他的窗口可以移动,我的区域数据也可以改变,有啥不一样的 10个窗口就是10层,先画那层,后画那层,都自己说了算
gz_qmc 2012-11-26
  • 打赏
  • 举报
回复
世界上本没有窗口,忽悠的人多了,也就有了窗口 窗口只是个表现形式,和你的功能是没有关系的 就和你打手式和别人交谈一样,手式只是个补充 而实际的内容你用嘴都讲完了, 现在来看看窗口是什么? 一个区域的数据结构+一个仿显存的内存块 既然如此,我为啥要用已经封装了的窗口类呢?
terrycanny 2012-11-26
  • 打赏
  • 举报
回复
引用 6 楼 gz_qmc 的回复:
哎,又一个中毒的兄弟 慢慢挣扎,总有一天,你会从微软的套套爬出来的 那时候,你一定会包涵沧桑而又满怀激动的对SetLayeredWindowAttributes说: 呸!
呵呵,看着兄弟中毒,你忍心不管么?给个可信的方案啥!
gz_qmc 2012-11-26
  • 打赏
  • 举报
回复
哎,又一个中毒的兄弟 慢慢挣扎,总有一天,你会从微软的套套爬出来的 那时候,你一定会包涵沧桑而又满怀激动的对SetLayeredWindowAttributes说: 呸!
加载更多回复(4)
  单元七 图形图像处理1[学习目标] 熟悉VB.NET绘制图形的有关概念、常用的类、对象、属性和方法等基础知识,熟悉开发绘制图形、浏览图像、图形动画程序的流程、方法、和技巧。7.1 图形绘制

15,979

社区成员

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

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