我的dialog是个变形的dialog。贴了个颜色渐变的蓝色图,显示形状为一个圆。我的button是自己派生的button子类。在DrawItem里可以画出要的圆来。但是圆以外的颜色没有透明。结果看起来还是个正方形。怎么才可以将自绘的button周围的颜色变成透明的阿。因为dialog的底图是渐变的。所以不可能将button的圆形外的地方用某种单色填充,只能将其透明化。麻烦帮帮忙。最好有关键地方的源码。

解决方案 »

  1.   

    如下,在你的按钮初始化的时候调用SetWindowRgn设置其区域,
    static CRgn rgn;
    rgn.CreateEllipticRgn( 0 , 0 , 50 , 50 ); // 设置一个圆形区域,具体大小请自己计算
    SetWindowRgn( (HRGN)rgn , TRUE );这样,该圆形区域以外就不属于该按钮,也就自然透明了
      

  2.   

    在哪初始化阿,我在drawitem和onpaint、button中都试过了,全部会报错,在drawitem中看到效果了,可是我的button是用来移的,一动就报错了。
      

  3.   

    这我也不清楚了,SetWindowRgn按说应该不会有这方面的问题。
    试着先确定小点产生的原因吧,是因为按钮窗口的刷新产生的还是其他控件刷新引起的问题
      

  4.   

    是botton周围的那个pen的问题,老有遗留。有办法将pen去掉么。我用PS_NULL参数试过了,会留白边。拖动botton时一样会留下白点。而且CreateEllipticRgn的范围还必须比我的button范围大才行(及画的button为(0,0,20,20),createellipticrgn(0,0,21,21)才行),要不button边上老闪动。
      

  5.   

    "botton周围的那个pen",我不太明白啊?看来是没法继续帮你了
      

  6.   

    阿,我把代码贴出来得了void CButtonMove::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    { CRgn rgn;
    rgn.CreateEllipticRgn( 0 , 0 , 21 , 21 );
    SetWindowRgn( (HRGN)rgn , TRUE );

    //使用刷子画图时的情况
    CDC *pDC =CDC::FromHandle(lpDrawItemStruct->hDC);
             CRect rtControl(lpDrawItemStruct->rcItem);
    CPen pen(PS_SOLID,1,RGB(255,0,0)),*old_pen;
    CBrush *old_brush;
    CString  strText; rtControl.EqualRect(rtControl);
    // Resource handle to bitmap.
    HRSRC hRes;    
    // Global handles to bitmap resource.
    HGLOBAL hData, hLockedData;   
    CBrush brush; // Find the resource handle.
    hRes = ::FindResource(AfxGetResourceHandle(),
    MAKEINTRESOURCE(IDB_POINTBMP), RT_BITMAP);
    if (hRes != NULL)
    {
       // Lock and Load (or Load and Lock).
       if (((hData = ::LoadResource(AfxGetResourceHandle(),
       hRes)) != NULL) && 
      ((hLockedData = (HGLOBAL)::LockResource(hData)) != NULL))
       {
      // Initialize the brush.
      brush.CreateDIBPatternBrush(hLockedData,
      DIB_RGB_COLORS);    }
    }
    old_brush=pDC->SelectObject(&brush);
    old_pen  =pDC->SelectObject(&pen);
    pDC->Ellipse(rtControl);
    //字体背景是否为透明
    pDC->SetBkMode(TRANSPARENT);
    GetWindowText(strText);
    pDC->DrawText(strText,rtControl,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    }就是pen上面有部分的点会残留。帮帮忙啊
      

  7.   

    有没有办法把那些残留的点刷掉。在我移动button的过程中。在mousemove时候的问题,还是drawitem时候出的问题阿。我都不知道这个问题怎么查。以前很少做关于界面方面的东西。所以对刷新问题不是很明白。