• 图标的颜色


    介绍 在浏览MSDN Library DVD(2001年10月)时,我在“创建Windows XP图标”中发现了上面的图片,并写了这个演示来演示如何使用颜色。 背景 首先,我要向那些屏幕分辨率较低的人道歉,这个对话框有800像素宽。我想展示彩虹的颜色;根据它们的RGB值进行排序并不能达到这个目的,所以我使用HLS代替。对话框允许任何一种排序。 使用的代码 库显示了一个功能:Hide复制Code

    VOID ColorRGBToHLS(
        COLORREF clrRGB,
        WORD *pwHue,
        WORD *pwLuminance,
        WORD *pwSaturation
    );

    用shlwpi .h定义的,但是我在他们说的地方找不到。我在MSDN的在线帮助文章ID: 29240中找到了它,用于将RGB转换为HLS。隐藏,收缩,复制Code

    #define  HLSMAX   RANGE /* H,L, and S vary over 0-HLSMAX */
    #define  RGBMAX   255   /* R,G, and B vary over 0-RGBMAX */
                             /* HLSMAX BEST IF DIVISIBLE BY 6 */
                             /* RGBMAX, HLSMAX must each fit in a byte. */
    
     /* Hue is undefined if Saturation is 0 (grey-scale) */
     /* This value determines where the Hue scrollbar is */
     /* initially set for achromatic colors */
     #define UNDEFINED (HLSMAX*2/3)
    
     void  RGBtoHLS(lRGBColor)
    
     DWORD lRGBColor;
     {
        WORD R,G,B;          /* input RGB values */
        BYTE cMax,cMin;      /* max and min RGB values */
     WORD  Rdelta,Gdelta,Bdelta; /* intermediate value: % of spread from max
    
     */
        /* get R, G, and B out of DWORD */
        R = GetRValue(lRGBColor);
        G = GetGValue(lRGBColor);
        B = GetBValue(lRGBColor);
    
        /* calculate lightness */
        cMax = max( max(R,G), B);
        cMin = min( min(R,G), B);
        L = ( ((cMax+cMin)*HLSMAX) + RGBMAX )/(2*RGBMAX);
    
        if (cMax == cMin) {           /* r=g=b --> achromatic case */
           S = 0;                     /* saturation */
           H = UNDEFINED;             /* hue */
        }
        else {                        /* chromatic case */
           /* saturation */
           if (L <= (HLSMAX/2))
              S = ( ((cMax-cMin)*HLSMAX) + ((cMax+cMin)/2) ) / (cMax+cMin);
           else
              S = ( ((cMax-cMin)*HLSMAX) + ((2*RGBMAX-cMax-cMin)/2) )
                 / (2*RGBMAX-cMax-cMin);
    
           /* hue */
        Rdelta = ( ((cMax-R)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
        Gdelta = ( ((cMax-G)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
        Bdelta = ( ((cMax-B)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
    
           if (R == cMax)
              H = Bdelta - Gdelta;
           else if (G == cMax)
              H = (HLSMAX/3) + Rdelta - Bdelta;
           else /* B == cMax */
              H = ((2*HLSMAX)/3) + Gdelta - Rdelta;
    
           if (H < 0)
              H += HLSMAX;
           if (H > HLSMAX)
              H -= HLSMAX;
        }
     }
    

    如您所见,这段代码是UNIX C(1978)的老版本,但是很容易更新它。有关详细信息,请参阅iconcolorsdlv .cpp。 下面是排序例程代码:收缩,复制Code

    void CIconColorsDlg::SortColors()
    {
        COLORREF clTemp;
        DWORD dwColor1, dwColor2;
        for (int j = 0; j < 32; j++)
        {
            for (int i = 0; i < 31; i++)
            {
                if (!bRGB)
                {
                    RGBtoHLS(m_nColor[i + 1]);
                    dwColor1 = wHue;
                    dwColor1 = dwColor1 << 8;
                    dwColor1 += wLum;
                    dwColor1 = dwColor1 << 8;
                    dwColor1 += wSat;
                    dwColor1 = dwColor1 & 0x00FFFFFF;
                    
                    RGBtoHLS(m_nColor[i]);
                    dwColor2 = wHue;
                    dwColor2 = dwColor2 << 8;
                    dwColor2 += wLum;
                    dwColor2 = dwColor2 << 8;
                    dwColor2 += wSat;
                    dwColor2 = dwColor2 & 0x00FFFFFF;
                
                    if (dwColor1 < dwColor2)
                    {
                        clTemp = m_nColor[i];
                        m_nColor[i] = m_nColor[i + 1];
                        m_nColor[i + 1] = clTemp;
                    }
                }
                else if (m_nColor[i + 1] < m_nColor[i])
                {
                    clTemp = m_nColor[i];
                    m_nColor[i] = m_nColor[i + 1];
                    m_nColor[i + 1] = clTemp;
                }
            }
        }
    }

    然后,为了查看每种颜色的细节,我使用了一个向左移动的功能:Hide。复制Code

    void CIconColorsDlg::OnTimer(UINT nIDEvent) 
    {
        // TODO: Add your message handler code here and/or call default
        COLORREF clTemp;
        clTemp = m_nColor[0];
        for(int i = 1; i < 32; i++)
        {
            m_nColor[i-1] = m_nColor[i];
        }
        m_nColor[31] = clTemp;
    
        DrawColors();
    
        CDialog::OnTimer(nIDEvent);
    }

    的兴趣点 RGB宏使用COLORREF变量来保存值。它被保存为0x00bbggrr,其中bb是蓝色字节,gg是绿色字节,rr是红色字节。排序可以把颜色分组,但不是我想要的。您将注意到粉红色的RGB(255、204、255)不合适,因为看到RGBtoHLS()中的变量时,wHue = 65520(-16)、Bdelta = 0和Gdelta = 16。也许我会改天解决这个问题。 历史 2005年4月11日-版本1.0。 本文转载于:http://www.diyabc.com/frontweb/news10975.html

  • 相关阅读:
    [Swift]todoList压栈
    Backtrack下的dns爆破工具的目录
    Linux如何设置dns
    预防黑客入侵 防黑必学的cmd命令vs网络安全
    SSL协议详解
    CDN(内容分发网络)技术原理
    社工数据搜索引擎搭建
    实战 SSH 端口转发
    Sublime Text编辑器如何隐藏顶部的菜单栏
    Sublime Text 2 -Sidebar 背景色调整为黑色
  • 原文地址:https://www.cnblogs.com/Dincat/p/13473298.html
Copyright © 2020-2023  润新知