圆形按钮

Sample Image

介绍

我想要一个看起来和普通按钮一模一样的按钮,但是我想要它们是圆形的。这个类可以像任何其他所有者绘制控件一样使用——只需包含头文件,并将按钮控件声明为CRoundButton而不是CButton

首先,我确定按钮是圆的(而不是椭圆),并存储中心和半径的按钮。接下来我只是让按钮所有者画和画的像其他所有者drwn按钮,而是能够使用像Draw3dRect好例程,我不得不自己动手丰衣足食圆绘图程序会吸引每个像素使用正确的颜色取决于圆上的点我画画。

我将不包括在这个页面的全部源代码-它可以在这里下载。所有者绘制部分是简单的,并遵循任何其他所有者绘制按钮的线。画圆程序是一个标准的算法,只有在计算像素颜色时做了修改。给定两种颜色crBright和crDark,以及相对于x轴的角度,像素的颜色可以使用以下方法计算。

COLORREF GetColour(double dAngle, COLORREF crBright, COLORREF crDark)
{
#define Rad2Deg            180.0/3.1415 
#define LIGHT_SOURCE_ANGLE  -2.356    // -2.356 radians = -135 degrees, 
                                      // i.e. From the top left of the screen

    ASSERT(dAngle > -3.1416 && dAngle < 3.1416);
    double dAngleDifference = LIGHT_SOURCE_ANGLE - dAngle;

    if (dAngleDifference < -3.1415) 
        dAngleDifference = 6.293 + dAngleDifference;
    else if (dAngleDifference > 3.1415) 
        dAngleDifference = 6.293 - dAngleDifference;

    double Weight = 0.5*(cos(dAngleDifference)+1.0);

    BYTE Red   = (BYTE) (Weight*GetRValue(crBright) + 
                        (1.0-Weight)*GetRValue(crDark));
    BYTE Green = (BYTE) (Weight*GetGValue(crBright) + 
                        (1.0-Weight)*GetGValue(crDark));
    BYTE Blue  = (BYTE) (Weight*GetBValue(crBright) + 
                        (1.0-Weight)*GetBValue(crDark));

    return RGB(Red, Green, Blue);
}

这是基于光源和点之间夹角的余弦在两种颜色之间的简单线性插值。角度从+ve x轴开始测量(即(1,0)= 0度,(0,1)= 90度),但是记住:正的y点向下!

更新

Tom Kalmijn好心地增加了一些程序,对按钮图像进行后期处理,以平滑锯齿状的边缘。他的方法使用最近邻算法来插值缺失的像素。它不是特别快,但确实增加了平滑。

本文转载于:http://www.diyabc.com/frontweb/news14640.html

原文地址:https://www.cnblogs.com/Dincat/p/13488393.html