半透明窗体上鼠标绘制不透明的图形 想实现屏幕标记,一个透明窗口,一个悬浮窗口,但是全透明窗口上绘图需要钩子,而钩子又使得绘图时不能拖动悬浮框;想用半透明窗口,但是绘制的线条也是半透明的!现在用的是SetLayeredWindow函数实现,有没有做过类似的,纠结了好久了,跪求大神们帮忙呀! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 但它也有缺点,就是其不会响应WM_PAINT,所以用来绘图比较好,做界面就改用双层来做。 我想知道:用SetLayeredWindowAttributes能否实现,若用半透明如何实现,若全透明如何决解钩子引发的问题;用UpdateLayeredWindow又如何实现? 我就在透明窗体上面绘制过,也能做成悬浮框。透明窗体就用SetLayeredWindowAttributes,缺点是不能让其成为子窗体。否则,透明效果失效。你悬浮窗体用WM_LUBTTONDOWN的消息SendMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y ) ); 来移动不就可以了。你悬浮窗体用非模态,create(资源编号,NULL);来实现。绘图为啥要用钩子? 哎,又一个中毒的兄弟慢慢挣扎,总有一天,你会从微软的套套爬出来的那时候,你一定会包涵沧桑而又满怀激动的对SetLayeredWindowAttributes说:呸! 区域是什么呢?最简单的无非就是个CRect而仿显存无非就是个CDC+CBitmap窗口就是一棵数,显示就是子子孙孙把他们自己的仿显存数据拷贝到父亲的仿显存到桌面这个老祖宗窗口后,一次性拷贝到真显存,如此而已有了这个理解,为啥就不能直接弄几个CDC+CBitmap来实现呢?CDC直接的透明不透明都是自己说了算而你直接用他定义好的窗口类,不就是多此一举吗?你以为他那个实现最后不是操作CDC+CBitmap吗?一样是的问题是当初封装的时候人家是考虑大众化,并不考虑你的特殊需求现在我问你,我在程序里定义10区域和10个CDC你说算不算10个窗口呢他的窗口可以移动,我的区域数据也可以改变,有啥不一样的10个窗口就是10层,先画那层,后画那层,都自己说了算 http://download.csdn.net/detail/gz_qmc/3495311这个范例是可以参考的,其中的有一块透明的(你也可以称为窗口)透明度可调,而上面的字是不透明的 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 绘制一个不透明分层窗口 关键是我设置为半透明时,画出来的痕迹也是跟窗体的透明度一样是半透明的!我想要的是画出来的是不透明的,所以想知道你是怎么画的!http://o22azq.sn2.livefilestore.com/y1mCxX1PG-my972ejesnFfQLmh3stnpANwjScPVnIKc2MOOHDhM_wE4akL8zhvh_ca4QQCIjp6GqhQhmVlcle6Anl_vJuzjqHW2/Float.rar?download&psid=1这是程序连接地址,麻烦大家帮忙看看! 不好意思刚才那个下不下来!https://skydrive.live.com/redir?resid=C67C701F6ADE772B!964 我觉得,半透明应该是绘制png,png有半透明。如果你把那个BLENDFUNCTION的sourcealpha改成半透明125,那整个窗口都会半透明。 已经实现!三层窗口,一层全透明的用来显示,一层透明度为1的用来捕获鼠标事件,最上面一层是悬浮的工具条窗口,使用的都是SetLayeredWindowAttributes,捕获到的时间通过消息机制传递到全透明窗口,全透明窗口根据接收到的坐标数据绘制图形。 他连子窗体什么意思都不懂,就说能透明。记住他ID就可以了。他Create时候设置Parent指针为NULL,还说子窗体。 找不到WTS APIS枚举进程用户名的具体资料 如何设置窗口背景颜色 如果碰上这样的同事怎么说服? 执行WinExec()的问题 关于XML的校验问题 请问那里有VC cookie编程的资料?谢谢! 100分 求WINDOWS程序设计 第五版 的书例程 请教一个链接错误的问题 【求助】图像不规则划分 关于两个可执行文件捆绑的问题 千分答谢! 【分享】汉诺塔小游戏-可点击移动及自动游戏 求俩个方法//thanks
透明窗体就用SetLayeredWindowAttributes,缺点是不能让其成为子窗体。否则,透明效果失效。你悬浮窗体用WM_LUBTTONDOWN的消息
SendMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y ) );
来移动不就可以了。你悬浮窗体用非模态,create(资源编号,NULL);来实现。绘图为啥要用钩子?
慢慢挣扎,总有一天,你会从微软的套套爬出来的那时候,你一定会包涵沧桑而又满怀激动的对SetLayeredWindowAttributes说:呸!
而仿显存无非就是个CDC+CBitmap窗口就是一棵数,显示就是子子孙孙把他们自己的仿显存数据拷贝到父亲的仿显存
到桌面这个老祖宗窗口后,一次性拷贝到真显存,如此而已有了这个理解,为啥就不能直接弄几个CDC+CBitmap来实现呢?
CDC直接的透明不透明都是自己说了算而你直接用他定义好的窗口类,不就是多此一举吗?你以为他那个实现最后不是操作CDC+CBitmap吗?一样是的
问题是当初封装的时候人家是考虑大众化,并不考虑你的特殊需求现在我问你,我在程序里定义10区域和10个CDC
你说算不算10个窗口呢他的窗口可以移动,我的区域数据也可以改变,有啥不一样的
10个窗口就是10层,先画那层,后画那层,都自己说了算
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 绘制一个不透明分层窗口
这是程序连接地址,麻烦大家帮忙看看!
我觉得,半透明应该是绘制png,png有半透明。如果你把那个BLENDFUNCTION的sourcealpha改成半透明125,那整个窗口都会半透明。
他Create时候设置Parent指针为NULL,还说子窗体。