0

TSpeedButton在表单上有两个按钮。当一个按钮被启用时,另一个被禁用,反之亦然。我想用自定义颜色绘制按钮以反映它们是启用还是禁用。

我编写了一个名为SetButtonsColors. 此过程设置(一次一个按钮)、变量ButtonFillColorButtonStrokeColor自定义颜色,相应地设置按钮状态,并立即命令重新绘制按钮。

ButtonPaint处理程序上,我分别设置Canvas.Fill.ColorandCanvas.Stroke.ColorButtonFillColorButtonStrokeColor填充和绘制aRect.

令我失望的是,按钮总是涂有为最后一个按钮设置的颜色。我想,这是因为Windows异步绘制按钮,因此使用了Canvas.Fill.Colorand的最后一个设置Canvas.Stroke.Color

如果这是真的,我如何Windows在命令重新绘制按钮后立即强制绘制按钮?

遵循SetButtonsColorsand的代码ButtonPaint

procedure tForm1.SetButtonsColors;
begin
  if Button1.Enabled then begin
     ButtonFillColor   := tAlphaColorRec.White;
     ButtonStrokeColor := tAlphaColorRec.Black;
     Button1.Repaint;
     ButtonFillColor   := tAlphaColorRec.Black;
     ButtonStrokeColor := tAlphaColorRec.White;
     Button1.Repaint;
  end;
  else begin
         ButtonFillColor   := tAlphaColorRec.Black;
         ButtonStrokeColor := tAlphaColorRec.White;
         Button1.Repaint;
         ButtonFillColor   := tAlphaColorRec.White;
         ButtonStrokeColor := tAlphaColorRec.Black;
         Button2.Repaint;
       end;
end;

procedure tForm1.ButtonPaint (Sender: tObject; Canvas: tCanvas; const aRect: tRectF);
begin
  Canvas.BeginScene;
  Canvas.Fill  .Color := lvButtonFillColor;
  Canvas.Stroke.Color := lvButtonStrokeColor;
  Canvas.FillRect (aRect, 0, 0,  []       , 1, CornerTypeBevel);
  Canvas.DrawRect (aRect, 0, 0, AllCorners, 1, CornerTypeBevel);
  Canvas.EndScene;
end;

谢谢。

4

0 回答 0