想实现屏幕标记,一个透明窗口,一个悬浮窗口,但是全透明窗口上绘图需要钩子,而钩子又使得绘图时不能拖动悬浮框;想用半透明窗口,但是绘制的线条也是半透明的!现在用的是SetLayeredWindow函数实现,有没有做过类似的,纠结了好久了,跪求大神们帮忙呀!

解决方案 »

  1.   

    但它也有缺点,就是其不会响应WM_PAINT,所以用来绘图比较好,做界面就改用双层来做。
      

  2.   

    我想知道:用SetLayeredWindowAttributes能否实现,若用半透明如何实现,若全透明如何决解钩子引发的问题;用UpdateLayeredWindow又如何实现?
      

  3.   

    我就在透明窗体上面绘制过,也能做成悬浮框。
    透明窗体就用SetLayeredWindowAttributes,缺点是不能让其成为子窗体。否则,透明效果失效。你悬浮窗体用WM_LUBTTONDOWN的消息
    SendMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y ) );  
    来移动不就可以了。你悬浮窗体用非模态,create(资源编号,NULL);来实现。绘图为啥要用钩子?
      

  4.   

    哎,又一个中毒的兄弟
    慢慢挣扎,总有一天,你会从微软的套套爬出来的那时候,你一定会包涵沧桑而又满怀激动的对SetLayeredWindowAttributes说:呸!
      

  5.   

    区域是什么呢?最简单的无非就是个CRect
    而仿显存无非就是个CDC+CBitmap窗口就是一棵数,显示就是子子孙孙把他们自己的仿显存数据拷贝到父亲的仿显存
    到桌面这个老祖宗窗口后,一次性拷贝到真显存,如此而已有了这个理解,为啥就不能直接弄几个CDC+CBitmap来实现呢?
    CDC直接的透明不透明都是自己说了算而你直接用他定义好的窗口类,不就是多此一举吗?你以为他那个实现最后不是操作CDC+CBitmap吗?一样是的
    问题是当初封装的时候人家是考虑大众化,并不考虑你的特殊需求现在我问你,我在程序里定义10区域和10个CDC
    你说算不算10个窗口呢他的窗口可以移动,我的区域数据也可以改变,有啥不一样的
    10个窗口就是10层,先画那层,后画那层,都自己说了算
      

  6.   

    http://download.csdn.net/detail/gz_qmc/3495311这个范例是可以参考的,其中的有一块透明的(你也可以称为窗口)透明度可调,而上面的字是不透明的
      

  7.   

    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 绘制一个不透明分层窗口 
      

  8.   

    关键是我设置为半透明时,画出来的痕迹也是跟窗体的透明度一样是半透明的!我想要的是画出来的是不透明的,所以想知道你是怎么画的!http://o22azq.sn2.livefilestore.com/y1mCxX1PG-my972ejesnFfQLmh3stnpANwjScPVnIKc2MOOHDhM_wE4akL8zhvh_ca4QQCIjp6GqhQhmVlcle6Anl_vJuzjqHW2/Float.rar?download&psid=1
    这是程序连接地址,麻烦大家帮忙看看!
      

  9.   

    不好意思刚才那个下不下来!https://skydrive.live.com/redir?resid=C67C701F6ADE772B!964
      

  10.   


    我觉得,半透明应该是绘制png,png有半透明。如果你把那个BLENDFUNCTION的sourcealpha改成半透明125,那整个窗口都会半透明。
      

  11.   

    已经实现!三层窗口,一层全透明的用来显示,一层透明度为1的用来捕获鼠标事件,最上面一层是悬浮的工具条窗口,使用的都是SetLayeredWindowAttributes,捕获到的时间通过消息机制传递到全透明窗口,全透明窗口根据接收到的坐标数据绘制图形。
      

  12.   

    他连子窗体什么意思都不懂,就说能透明。记住他ID就可以了。
    他Create时候设置Parent指针为NULL,还说子窗体。