delphi - 如何操纵颜色来产生实时发光效果?

标签 delphi math colors delphi-7

我正在尝试制作一个按钮,当鼠标指向它时该按钮会发光。后台必须有一个计时器来控制这些颜色的平滑淡入和淡出。它不会从一种颜色跳到下一种颜色,而是逐渐淡入下一种颜色。

现在我的问题是,当它淡出回常规颜色时,它不会锁定其最终颜色。事实上,它不断地从亮处跳到暗处。

这是我的一个自定义按钮,我不会发布其代码,但可以将此代码放置到具有鼠标进入/退出事件和颜色属性的任何内容上。

它通过设置变量FMenuDestColor来工作。 ExtractColor 根据颜色获取 RGB 值。计时器比较当前颜色和目标颜色之间的每个 RGB channel 。然后计时器修改当前颜色以淡入下一个。这些计算是在名为 CalcColorFade 的函数中完成的 - 每个 channel 运行 3 次。

procedure ExtractColor(const Color: TColor; var R, G, B: Byte);
begin
  R:= GetRValue(Color);
  G:= GetGValue(Color);
  B:= GetBValue(Color);
end;

function CalcColorFade(const C1, C2: Byte): Byte;
const
  RGB_MULT = 1.2;
  RGB_SENS = 5;
begin
  if C1 <> C2 then begin    
    if (C1 >= C2 - RGB_SENS) and (C1 <= C2 + RGB_SENS) then
      Result:= C2
    else
      if C1 > C2 then
        Result:= EnsureRange(Trunc(C1 / RGB_MULT), 0, 255)
      else
        Result:= EnsureRange(Trunc(C1 * RGB_MULT), 0, 255);
  end else begin
    Result:= C2;
  end;
end;

procedure TfrmMain.tmrMenuGlowTimer(Sender: TObject);
var
  R1, G1, B1: Byte;
  R2, G2, B2: Byte;
  R3, G3, B3: Byte;
begin
  if MenuButton.Color <> FMenuDestColor then begin
    ExtractColor(MenuButton.Color, R1, G1, B1);
    ExtractColor(FMenuDestColor, R2, G2, B2);
    R3:= CalcColorFade(R1, R2);
    G3:= CalcColorFade(G1, G2);
    B3:= CalcColorFade(B1, B2);
    MenuButton.Color:= RGB(R3, G3, B3);
  end;
end;

procedure TfrmMain.MenuButtonMouseEnter(Sender: TObject);
begin
  FMenuDestColor:= clBlue;
end;

procedure TfrmMain.MenuButtonMouseLeave(Sender: TObject);
begin
  FMenuDestColor:= clNavy;
end;

将鼠标悬停在其上,它将淡出为下一种颜色。但是把鼠标从它身上拿开,它就不会以原来的颜色锁定到位——它会在明暗之间来回晃动。

我假设必须有一种更简洁的方法来完成我正在做的事情,并且我也愿意接受这些建议。

定时器的间隔为70,常量为1.2,改为1.1后,就可以正常工作了。因此,将其更改为 1.2 会搞砸这一点。

最佳答案

为什么不直接切换到 HSB/HSV 模式?

然后您可以设置色调 (0-359),并控制饱和度、亮度和 alpha。

后三个中的每一个都为您提供滚动发光效果的选项。

关于delphi - 如何操纵颜色来产生实时发光效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662893/

相关文章:

delphi - 使用OmniXML和Delphi,如何通过元素的属性定位元素并更改节点中的另一个元素?

德尔福2007 : IDE Model View: Generate Documentation missing?

delphi - 当我事先不知道我将拥有多少项目时,应该如何为项目列表分配空间?

java - Math.pow 奇怪的结果

c++ - 计算高度图的法线

javascript - ~~ 和 Math.floor() 的区别

php - Dreamweaver 中 css 内的颜色代码 php

objective-c - 检测 NSColorPanel 中的颜色变化

python - matplotlib 茎图中的彩色标签文本

Delphi 7 .dof 和 .cfg 的 : should I track them under version control?