65.9K
CodeProject 正在变化。 阅读更多。
Home

根据指定背景色确定理想文本颜色(适用于 VBScript)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.59/5 (9投票s)

2007年5月7日

CPOL

2分钟阅读

viewsIcon

29181

我关于同一个主题的 C# 文章的 VBScript 版本。

引言

这是一段为所有开发网页的人准备的小代码片段,但却不得不忍受 VBScript 的折磨。这篇文章实际上是我之前写的一篇 C# 文章的“私生子”。 为什么要写一篇新文章? 当然是为了让它出现在 VBScript 类别下。

在我继续之前,让我承认我鄙视与 VB 相关的一切,因为我从事 C++ 编程 17 年了,而 C++ 程序员几乎被要求不喜欢与 VB 相关的一切。 到现在,你可能在想我为什么还要提交这篇文章。 好吧,是因为我被分配了修改一个使用 VBScript 的网站的任务,但我没有被授权将其更改为更现代化的东西。 简而言之,我正在用 VBScript 编码,但我并不喜欢它。

如果你需要 C# 版本,请点击这里。

代码片段

虽然我们有最初的 C# 代码作为指导,但我想要使用 VBscript 实现一个优雅的解决方案的愿望却因意识到 VBScript 几乎没有可编程性而受挫。(当然,我知道我只是在发挥我尖刻的天性,表达一些人认为是对任何以“VB”开头的词都应有的鄙视。)

无论如何,这种方法应该被认为只是一个起点,因为我没有花两个星期的时间来设计万无一失的验证机制。 换句话说,如代码所示,你应该确保使用正确格式的参数调用代码。

使用代码

由于 VBScript 提供的可编程性与一个两片吐司烤面包机相当,因此你无法享受到整洁的字符串或数值转换函数带来的便利,这些函数在真正的语言中使生活变得如此美好。 我想这是因为 VBscript 是一种主要无类型的语言,其中的值可以根据需要自行转换为任何类型。 我觉得这种特性特别令人不安——我喜欢生活中的秩序和定义(记住,我是一名 C++ 程序员)。

我们的解决方案包含两个函数

'-------------------------------------------------------------------------
' Extracts the color value from the string that represents the background 
' color. It's assumed that the color will ALWAYS be in the standard hex 
' notation of #RRGGBB.  jms - 07May2007 
'-------------------------------------------------------------------------
function GetColorValue(sColor, nShade)
    Dim nVal: nVal = 0
    select case nShade
        case 0 nVal = CLng("&H" & (Mid(sColor, 2, 2)))  ' red
        case 1 nVal = CLng("&H" & (Mid(sColor, 4, 2)))  ' green
        case 2 nVal = CLng("&H" & (Mid(sColor, 6, 2)))  ' blue
        case else nVal = 255
    end select
    GetColorValue = nVal
end function

GetColorValue 函数从背景颜色字符串中提取指定的颜色组件,并将其整数值返回给调用函数。 我们这样做是因为我们选择将背景颜色存储在数据库中作为字符串。 你的使用情况可能会因你传递颜色值的方式而异。

'-------------------------------------------------------------------------------
' Determines the best choice of text color based on the background color. The   
' two possible resulting values are black text or white text.  jms - 07MAY2007  
'-------------------------------------------------------------------------------
function BestFontColor(sBkColor)
    if InStr(1,sBkColor, "#") <> 1  OR Len(sBkColor) < 7 then
        BestFontColor = "#000000"
        exit function
    end if
    Dim nRed:   nRed   = GetColorValue(sBkColor, 0)
    Dim nGreen: nGreen = GetColorValue(sBkColor, 1)
    Dim nBlue:  nBlue  = GetColorValue(sBkColor, 2)
    
    Dim nThreshold: nThreshold = 105
    Dim bgDelta: bgDelta = int( (nRed * 0.299) + 
                                (nGreen * 0.587) + 
                                (nBlue * 0.114))
    if 255 - bgDelta < nThreshold then
        BestFontColor = "#000000"
    else
        BestFontColor = "#FFFFFF"
    end if
end function
BestFontColor 函数是你实际从自己的代码中调用的代码。 简单地传入背景颜色将返回黑色或白色。 如果你看过我关于此主题的 C# 文章,你可能会认出我用来确定最佳字体颜色的公式。

免责声明

这篇文章很短,因为描述的方法本身并没有任何复杂之处。 也没有可下载的代码,因为——好吧——这就是所有的代码。 希望它能为你节省一些时间……

© . All rights reserved.