彩色圆形按钮我已经作出来了,但因为我是用VC的画圆函数画的,边缘非常粗糙,请问各位大虾如何是好

解决方案 »

  1.   

    我觉得最好是用图像处理工具做成图片然后bitblt过去
      

  2.   

    我一般都用PhotoShop制作,然后保存为gif、jpg、bmp格式,再到vc中使用。
      

  3.   

    呵呵,用图象处理后如果背景色变化了的话可能一下子就看出来了,应该还是用算法比较通用一些,如果不将就,干脆固定背景色然后BitBlt
      

  4.   

    不光是GIF,连JPG/BMP都可以做透明背景色处理啊...只要你画点时判断一下
      

  5.   

    这个问题我也遇到过,我想那些诸如:
    m_rgn.DeleteObject(); 
    SetWindowRgn(NULL, FALSE);
    m_rgn.CreateEllipticRgnIndirect(rect);
    SetWindowRgn(m_rgn, TRUE);
    之类,和DrawItem()之类都不用我说了吧。
    在绘制圆形的时候确实发现了Vc下面的Ellipse好像象素比较粗糙,常用的方法是:
    1,加粗画线的线宽,这样会使效果看上去强些
    2,根据计算机图形学自己编写一个椭圆的生成算法,并把椭圆的平滑算法加进去(这个比较麻烦)
    3,不知道你是否还记得Vc中的贝赛尔曲线函数pDC->PolyBezierTo,呵呵用一个圆形方程式取得圆的边界上的点,然后利用贝赛尔曲线来画圆,因为贝赛尔曲线本身就有了平滑处理,因此这样绘制出来的圆形还不错。
      

  6.   

    下面是我自己根据计算机图形学编的一个椭圆生成算法,是个全局函数,楼主可以将其改为成员函数即可。首先绘制第一象限的椭圆,椭圆的绘制分成两个部分,因此用了两个循环;还有画完第一象限后,利用对称坐标变换即可绘制出整个椭圆了。这是个很“笨”的方法,建议楼主考虑方法三。
    void DrawEllipse(CDC* pDC, CPoint p, LONG lHorizontalRadius,LONG lVerticalRadius, COLORREF crColour, BOOL bDashed)
    {
    const int nDashLength = 1;
    LONG lXoffset, lYoffset;
    int nDash = 0;
    BOOL bDashOn = TRUE; //Check to see that the coordinates are valid
    ASSERT( (p.x + lHorizontalRadius <= LONG_MAX) && (p.y + lVerticalRadius <= LONG_MAX) );
    ASSERT( (p.x - lHorizontalRadius >= LONG_MIN) && (p.y - lVerticalRadius >= LONG_MIN) ); long d1,d2; 
    long t1,t2,t3,t4,t5,t6,t7,t8,t9; 
    lXoffset = lHorizontalRadius; 
    lYoffset= 0; 
    t1 = lHorizontalRadius*lHorizontalRadius; t2 = 4*t1; t3 = 2*t2;
    t4 = lVerticalRadius*lVerticalRadius; 
    t5 = 4*t4; 
    t6 = 2*t5; 
    t7 = lHorizontalRadius*t5; t8 = 2*t7; 
    t9 = 0; d1 = t2 - t7 + t4; 
    d2 = t1 - t8 + t5;

    while (d2 < 0) 
    {/* region 1 of ellipse*/
    if (bDashOn) {
    pDC->SetPixelV(p.x + lXoffset, p.y + lYoffset, crColour);
    pDC->SetPixelV(p.x + lXoffset, p.y - lYoffset, crColour);
    pDC->SetPixelV(p.x - lXoffset, p.y + lYoffset, crColour);
    pDC->SetPixelV(p.x - lXoffset, p.y - lYoffset, crColour);
    } //Advance the error term and the constant X axis step

     lYoffset++; 
     t9 = t9 + t3; 
     if (d1 < 0) { d1 = d1 + t9 + t2; d2 = d2 + t9; }
     else 
     { lXoffset --; t8 = t8 - t6; d1 = d1 - t8 + t9 + t2; d2 = d2 - t8 + t9 + t5; 
     } 


    if (bDashed && (++nDash == nDashLength)) {
    nDash = 0;
    bDashOn = !bDashOn;
    } } 
    do
    {
    if (bDashOn) 
    {
    pDC->SetPixelV(p.x + lXoffset, p.y + lYoffset, crColour);
    pDC->SetPixelV(p.x + lXoffset, p.y - lYoffset, crColour);
    pDC->SetPixelV(p.x - lXoffset, p.y + lYoffset, crColour);
    pDC->SetPixelV(p.x - lXoffset, p.y - lYoffset, crColour);
    } lXoffset--;
    t8 = t8 - t6; 
    if (d2 < 0) 

    lYoffset ++; t9 = t9 + t3; d2 = d2 - t8 + t5 + t9; 
    }
    else 
    d2 = d2 - t8 + t5; 

    if (bDashed && (++nDash == nDashLength)) {
    nDash = 0;
    bDashOn = !bDashOn;
    } } while (lXoffset>=0); //Continue until halfwaX point}
      

  7.   

    我也建议用位图资源实现。
    其实背景的改变不是问题,可以自绘背景,背景颜色统一由程序控制就可以了!记得VC知识库(http://www.vckbase.com/)上有一个仿XP的界面代码,值得借鉴。