【问题标题】:DrawFocusRect with given aspect ratio in Delphi在Delphi中具有给定纵横比的DrawFocusRect
【发布时间】:2011-10-31 05:19:48
【问题描述】:

我希望能够在图像上绘制一个 FocusRect,它可以保持图像的纵横比。我的问题是, FocusRect 仅取决于鼠标的 y 坐标。我只是不知道如何让矩形依赖于两个鼠标坐标...... 这是我的代码:

procedure TForm1.AuswahlRechteck; //Due to this procedure it doesn't matter in which corner the rectangle begins
begin                                                                           
  Image1.Canvas.DrawFocusRect(Rect(X0,Y0,MX,MY));
  Image1.Canvas.DrawFocusRect(Rect(X0,MY,MX,Y0));
  Image1.Canvas.DrawFocusRect(Rect(MX,MY,X0,Y0));
  Image1.Canvas.DrawFocusRect(Rect(MX,Y0,X0,MY));
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  X0:=X;
  MX:=X;
  Y0:=Y;
  MY:=Y;
  AuswahlRechteck;
  InMove:=true;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if InMove then
  begin
    AuswahlRechteck;
    MY:=Y;
    MX:=X;
    if (((MX < X0) AND (MY > Y0)) OR ((MX > X0) AND (MY < Y0))) then MX:=Round(X0-((MY-Y0)*Image1.Width/Image1.Height))
    else MX:=Round(X0+((MY-Y0)*Image1.Width/Image1.Height));    
    AuswahlRechteck;
  end;
end;

有人可以帮帮我吗?

亨利

【问题讨论】:

  • 我无法理解这个问题。如果你希望它依赖于 x 和 y,你如何保持方面?
  • 另外,MulDiv 比使用浮点数要好。

标签: delphi aspect-ratio timage mouse-coordinates


【解决方案1】:
  private
    FSelecting: Boolean;
    FSelRect: TRect;
    FSelX: Integer;
    FSelY: Integer;
  end;

uses
  Math;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FSelX := X;
  FSelY := Y;
  FSelecting := True;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Scale: Single;
  W: Integer;
  H: Integer;
begin
  if FSelecting then
  begin
    Image1.Canvas.DrawFocusRect(FSelRect);
    Scale := Image1.Width / Image1.Height;
    W := X - FSelX;
    H := Y - FSelY;
    if (W <> 0) and (H <> 0) then
      if Abs(W) / Abs(H) > Scale then
        H := Round(Abs(W) / Scale) * Sign(H)
      else
        W := Round(Abs(H) * Scale) * Sign(W);
    FSelRect := Bounds(
      Min(FSelX, FSelX + W), Min(FSelY, FSelY + H), Abs(W), Abs(H));
    Image1.Canvas.DrawFocusRect(FSelRect);
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FSelecting := False;
end;

【讨论】:

  • 感谢您的快速回复,但您的代码结果在我看来实际上与我的相同...我已经在 YouTube 上上传了一个视频,这可能会使问题更清楚:youtube.com/watch?v=XrVKFFVJ9YA我希望 FocusRect 越来越小,直到 MX 等于 X0 时它消失。我希望它在所有鼠标移动的视频的第一秒中显示,而不是在最后五秒中显示。
  • 我们的解决方案不一样。我的计算确保鼠标光标始终在 FocusRect 上,而不是你的。至于你的问题:尝试用&lt; Scale 替换&gt; Scale,但是鼠标光标永远不会接触到FocusRect。您的问题只是您的需求的一个症状,无法修复。
  • @henry 你想让焦点矩形依赖于 x 而不是 y?
  • @David Heffernan 不,我希望它依赖于 x AND y。
  • @NGLN: 将 "> Scale" 更改为 " X) AND (FSelY Y)) then FSelRect := Bounds(Min(FSelX, FSelX + W), Min(FSelY, FSelY + H) , 绝对值(W), 绝对值(H));"解决一个小问题。现在它工作得很好。非常感谢你们两位!
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 2018-11-10
  • 2018-08-21
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多