FreePascal的:我怎么改变鼠标悬停在TPaint物体的颜色(FreePascal: how

2019-10-20 05:02发布

我的自定义菜单是很好的磨磨蹭蹭,当鼠标在链接矩形的范围内可以检测并响应鼠标松开事件。 我现在想它做的是更改链接矩形的颜色,当用户将鼠标悬停其边界内的鼠标。 我之前,但手动,而不是已经设置颜色属性,这样动态。

基本上,没有任何反应。 调试表明,鼠标位置程序可以正常使用,但矩形保持相同的颜色。

我创建ButtonStates的简单数组并设置了颜色:

type
   T_ButtonState = (bttn_off);
private
{ Private declarations }
bttnStatus : TOC_ButtonState; 

const stateColor : array[T_ButtonState, false..true] of TColor = ((clDkGray, clGray));

而我现在试图操纵T_ButtonState的价值,所以我可以在我的油漆常规设置颜色:

// User actions
procedure T_MenuPanel.MouseMove(Shift:TShiftState; X,Y:Integer);
var
  loop : integer;
begin
 for loop := 0 to High(MenuRects) do
   begin
     if PtInRect(MenuRects[loop], Point(X, Y)) then
       bttnStatus := bttn_off;
   end;
inherited;
end;

这是我的绘图程序:

for count := 0 to fLinesText.Count - 1 do
   begin
     // Define y2
     y2 := TextHeight(fLinesText.strings[count])*2;

     // Draw the rectangle
     itemR := Rect(x1, y1, x2, y2*(count+1));
     Pen.color := clGray;

     Brush.color := stateColor[bttn_off][bttnStatus = bttn_off]; // Nothing Happens!!!

     Rectangle(itemR);

     // Push rectangle info to array
     MenuRects[count] := itemR;

     // Draw the text
     TextRect(itemR, x1+5,  y1+5, fLinesText.strings[count]);

     // inc y1 for positioning the next box
     y1 := y1+y2;
   end;         

Answer 1:

你检测该鼠标在移动时,你占的检测当你画。 然而,在移动鼠标并不一定让你控制重绘自己,所以运动是不是在你的控制明显。 当你检测鼠标移动,信号控制,它需要通过调用其重绘Invalidate方法。

procedure T_MenuPanel.MouseMove(Shift:TShiftState; X,Y:Integer);
var
  loop: integer;
begin
  for loop := 0 to High(MenuRects) do begin
     if PtInRect(MenuRects[loop], Point(X, Y)) then begin
       bttnStatus := bttn_off;
       // Ssgnal that we need repainting
       Invalidate;
     end;
  end;
  inherited;
end;

当OS未来有机会,它会问你的控制重绘自己。 这通常是足够的,但如果你想在视觉更新是即时的,你可以调用Refresh代替Invalidate



文章来源: FreePascal: how do I change the colour of a TPaint object on Mouseover