InvalidRect就可以清除上一次画的东西啊合理设置WS_CLIPSIBLINGS和WS_CLIPCHILDREN
      WS_CLIPCHILDREN:主要运用与设置主窗口风格,当主窗口发生绘制事件的时候,其子窗口不需要绘制,如果该子窗口控件需要绘制,需要手动刷新,值得注意的是手动刷新的子控件会发生闪烁
      WS_CLIPSIBLINGS:主要运用与同级重叠窗口(即:同属一父窗口的子窗口控件),具有该属性的窗口控件在绘制的时候,不绘制同级窗口的重叠部分。以第一个效果图片为例,“播放设置”设置该属性,在绘制的时候,不绘制同级对话框窗口区域部分。
      在MFC中,弹出式窗口都会默认拥有WS_CLIPSIBLINGS,并且该属性无法移除。可同通过SetWindowLong来设置这两个属性

解决方案 »

  1.   

    效果很好,。真不错!!有些占CPU 26%
      

  2.   

    InvalidRect不是清除原来画的东西,而是在无效的区域用背景刷从新刷一遍也就是覆盖那个区域。你有可能没有碰到过那样的特殊情况,也许你没仔细看我的描述,唯一能解决完全“清除”的办法就是GetParent()->InvalidRect(按钮在父窗口的区域); 但是这种办法不好,假如按钮并不在父窗口所在的区域那就不成功了!从这里说明你没认真看题,我说得很清楚,所谓的按钮并不是真正的CButton控件,而是在主窗口通过区域模拟的!
      

  3.   


    我做DirectUI的,我理解你说的,但是还是没有明白你遇到了什么问题
    你要是性能问题,恐怕很难解决,因为这个是Layered Window的问题。
    你可以试一试在Win7上面,自绘,用Win7SDK加上这个非客户区边缘试一试。你的图片是怎么做出来的?另外,Win7那个有毛玻璃的效果了。不是简单的透明,据说要进行高斯变换。
      

  4.   

    所以我觉得要换个思路,用两个窗口,底层窗口用UpdateLayeredWindow来绘制窗口背景皮肤达到半透明的效果,而控件都放在一个弹出对话框上,这样背景与控件分开绘制,只有改变窗口大小的时候才用到UpdateLayeredWindow,性能问题应该会改善。但是这样一来问题又出现了,也是我开始说的问题InvalidateRect不能清楚掉上一次画的东西,为了便于大家理解我的问题,我写了个小程序,并且截了图
    http://download.csdn.net/detail/zh359780498/3940630
    [/Quote]我那个图片就是两张处理好了的半透明PNG图片,至于毛边效果也是在PS里面画好了的
      

  5.   


    还是换VS吧, VC6 太古老了
      

  6.   

    我用VS2008,之前搞过阴影效果,大家得出来的结论就是不用Layered Windows,没法做阴影了。当然了Win7的DWM机制,也提供了但是你XP没法用。
      

  7.   


    关于边缘底色的我有个办法解决,因为是圆形,先创建一个跟按钮一样大小的圆形区域,在这个区域内的保持原色,区域外的用窗口透明色。
    前断时间做一个界面的代码:
    CRgn rgn;
    rgn.CreateEllipticRgn(0, 0, m_iWidth, m_iHeight);
    for(int i = 0; i < m_iWidth; ++i)
    for(int j = 0; j < m_iHeight; ++j)
    {
    if(!rgn.PtInRegion(i, j))
    MemDC.SetPixel(i, j, RGB(COLOR_KEY_TRANSPARENT_R, COLOR_KEY_TRANSPARENT_G, COLOR_KEY_TRANSPARENT_B));
    }
      

  8.   

    因为我是逐像素的,就不要直接写CPaintDC了,要缓冲下再贴上去。
      

  9.   

    xiaofengeee你所说达到的效果有几种方法都能办到,而你选择了一种既没有效率又麻烦的办法
      

  10.   

    #13楼 那个"关闭窗口"按钮只是系统的按钮,没有自绘吧,很简单啊,WM_CTLCOLORBTN返回空刷就行了
      

  11.   


    1. SetWindowRgn
    2. 先PS好按钮图像, TransparentBlt贴图
    3. 通过掩码图片,用BitBlt进行位操作贴图
      

  12.   

    我提一下思路:
    第一种办法是重载CStatic,在他的OnPaint()函数内绘制按钮。
    绘制之前,创建一个缓冲区dcBuf,GetDC获取主窗口的CDC,将主窗口的画面拷贝到dcBuf保存。
    然后将dcBuf当成背景使用Alpha混合绘制到CPaintDC,接着再绘制自己想要的东西,让人产生一种透明的假象,看能不能达到楼主想要的结果。第二种办法是将按钮绘制到透明窗口,我贴一下以前实现透明窗口的核心代码
    void CTransparentWindow::Transparent(){ SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE)^0x80000); HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));  if (hInst) {             typedef BOOL (WINAPI *MYFUNC)(HWND, COLORREF, BYTE, DWORD); MYFUNC func = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); if(func != NULL) func(GetSafeHwnd(), RGB(255,255,255), m_bDiaphaneity, 2); FreeLibrary(hInst);  }}
      

  13.   

    我也是这样的,就是按钮不是button,直接通过CRgn来判断的,
    地址:http://d.1tpan.com/tp0612602224
      

  14.   

    可以上层窗口透明(用关键色),按钮自绘不透明啊,上层窗口属性为Popup,不能为Child。
      

  15.   

    用我的办法,半透明的背景+不透明的主体,这种效果不难实现啊,不明白楼主想干什么?
    还有用gdi+,使用到Alpha通道的颜色,也能达到半透明的效果
      

  16.   

    没看懂LZ到底要用控件还是不用控件?以前也写过这样的UI,写着玩的.
    效率没你说的那么糟糕啊,绘图线程每30MS全局更新一次图像.800*600的窗体I5-460的CPU占用也就0~2%之间.另外:
    http://download.csdn.net/download/zh359780498/3938368
    这个资源我这边下载不动,LZ可不可以换个网盘或者发我邮箱[email protected].谢谢.
      

  17.   

    这个由于无法使用显卡加速,所以全部消耗在CPU计算中,目前还没有什么好办法(除了一些支持GDI+加速的显卡).
      

  18.   

    建议采用 多缓冲, 双缓冲效率一般能满足,如果不行就 部分 自绘控件 用 三缓冲,用内存来换cpu
      

  19.   

    在群里听了高人解释,占CPU主要是因为用的是GDI+绘图导致的!要改善只能用GDI绘制来绘制带透明通道的图片,然后整个更新到窗口
      

  20.   

    没用控件,是模拟绘图有可能与你的网络有关吧,CSDN资源下载我好像还没碰到速度慢的
      

  21.   


    你的创意不错,我有空学习学习,暂时就看过你的加密方法。
    我的没用Button控件。