要求:绘制一矩形,并实现下图效果。用gdi或者gdi+都行,不能用directx或者opengl.

解决方案 »

  1.   

    立体感的button,这个应该是让美工做好贴图,程序员加载的。
      

  2.   

    贴图,自己写一个继承CButton的类来自绘按钮
      

  3.   

    有一个开源的CButton类,你网上找一下,能实现比这更酷的效果。如果自己找不到的话,再联系。
      

  4.   

    代码LZ自己写,很好实现
    GDI+很方便,
    GDI+中的定义
        Color(IN BYTE a,//透明度 0- 255 0表示空 255最重 
              IN BYTE r,//红
              IN BYTE g,//绿
              IN BYTE b)//兰黑色的RGB值(0,0,0)                
    阴影效果(黑色+透明度):
    Color(0,0,0,0): 等于没画,底色完全
    Color(100,0,0,0): 可以看到底色上有一层模糊层
    Color(255,0,0,0): 看不到底色了,就是黑色//实现
    //得到DC
    //得到底色//原来的颜色,绿,白,黑
    //在DC上画底色
    //得到阴影宽度nWidth;和要画的2条边,比如画(下和右)2个边
    //准备画1条边
    //根据nWidth,45度角得到连续的nWidth条线坐标,透明度各不相同,自己实践
    //画线
    Pen myPen(Color(???,0,0,0), 1/*线宽*/);//透明度自己实践,每条都不一样,淅变的
    gdiObj.DrawLine(&myPen, x1, y1, x2, y2);
      

  5.   

    首先,继承一个自CButton,重载ondraw函数,然后一般按钮都有个背景色,就利用这个来生成按钮所需要的另外两个颜色。把背景色的rgb值都乘一个亮度值,亮度值大于1,表示加亮,小于1表示变暗,但要注意不要让新生成的值超出0~255的范围,小于0的就等于0,大于255的就等于255
    COLORREF lighten(float f,COLORREF ref){
       int a = ref&0xff000000;
       int r = (ref&0xff0000)>>16;
       int g = (ref&0xff00)>>8;
       int b = (ref&0xff);
       int r = (int)(r*f);
       int g = (int)(g*f);
       int b = (int)(b*f);
       if(r>255)r=255;
       if(g>255)g=255;
       if(b>255)b=255;
       if(r<0)r=0;
       if(g<0)g=0;
       if(b<0)b=0;
       return a|(r<<16)|(g<<8)|b;
    }
    这样生成两个颜色
    COLORREF dark = lighten(0.5f,bgColor);
    COLORREF light = lighten(1.5f,bgColor);
    然后开始画按钮,架设斜边都是5,长宽w,h,用light生成一个solid CPen(在这里要判断如果按钮是按下状态要选择dark),宽度为1开始画画顶部线
    int rx=0,lx=w;
    for(int i = 0;i<5;i++){
    MoveTo(rx,i);
    LineTo(lx,i);
    rx++;lx--;
    }
    画左边线
    int ty=0,by=h;
    for(int i = 0;i<5;i++){
    MoveTo(i,ty);
    LineTo(i,by);
    ty++;by--;
    }
    另两边如法炮制!再加上按钮文字,大功告成!
    ps.不建议直接输出按钮文字,处理文字部分直接拷贝mfc的源代码。
      

  6.   

    ms用Draw3DRect()来画好过画线..1:设置好左&上/右&下的颜色后.Draw3DRect(),
    2:设置渐变色.
    3:然后DeflateRect( 1, 1 ).
    循环,回到第1步,直到画完
      

  7.   

    试了一下上面的方法:CRect rc( 100, 100, 100 + 125, 100 + 74 );
    COLORREF crTopLeft = RGB( 0xFF, 0xFF, 0xFF );
    WORD r, g, b;
    r = g = b = 196;
    COLORREF crBottomRight = RGB( r, g, b );
    pDC->Rectangle( &rc );
    rc.DeflateRect( 1, 1 );for( int i = 0; i < 20; ++ i ){
        pDC->Draw3dRect( &rc, crTopLeft, crBottomRight );
        rc.DeflateRect( 1, 1 );
        r += 8; g += 8; b += 8;
        if( r > 255 )
            break;
        crBottomRight = RGB( r, g, b );
    }效果:
      

  8.   

    查看CBitmapButton::DrawItem函数,学习下怎么实现自绘制的按钮,然后自己实现一个可以贴图的按钮,图片上可以写文字,CDC::TextOut或者CDC::DrawText实现写文字,至于图片素材,由美术感强的人来完成。