-1

我在 Delphi 4 的 TScrollBox 控件中使用 TImage 控件。这里我通过相应地增加高度来填充 TImage 控件中的数据。

我的功能基于 mousedown 事件,在该事件中我使用 X、Y 参数进行一些验证并突出显示该记录。

现在这里的问题是 X,Y 是整数类型参数,它们返回的值在 -32768 到 32767 之间。当我的记录超过 32767 高度时,我会遇到问题。Mousedown 事件返回 Y 值,因为负数会导致我的功能出现问题。

有两种可能的方法来解决这个问题,

  1. 解决此问题的任何解决方法。

  2. 使用 Delphi 4 的另一个内置组件作为替代。

如下所述,我知道一种肮脏的方法(可能这也不正确,但现在可以使用),但我正在寻找更好的解决方案。

if Y < 0 then 
begin
      Y := Y + 65536;
end
else
begin
     if ScrollBox1.VertScrollBar.Position > 32767 then
        Y := Y + 65536;
end;

请建议一个更好的解决方案来解决这个问题

4

2 回答 2

1

还有第三种方法可以解决。停止使用滚动框,并使用自己的滚动条句柄编写您自己的控件,它可以在您指定的 X、Y 坐标处呈现图像的一部分。实际上,您可以通过向您编写的任何简单的基于 TControl 的组件添加滚动条来做到这一点;如果您坚持在 Delphi 中使用内置控件,您实际上会做一些有点可笑的事情。编写自己的控件可以在几行代码中完成,如果您不希望使用第三方控件,这是正确的答案。

第二种选择,实际上是 99% 的 Delphi 开发人员会选择的解决方案,是切换到已经具有此功能的第三方图像查看器控件。显然,重新发明轮子是没有意义的。您的问题似乎规定您不能添加第三方控件。

从性能的角度来看,滚动框 + TImage 是一个糟糕的解决方案,尤其是当您必须将巨大的图像完全加载到 GDI 内存中以包含图片时。我很惊讶 32K 像素高 x 1000+像素高的图像甚至可以加载到内存中而没有严重问题。您当前的想法不仅受到 Scrollbox 的限制(回答此问题的其他人很好地解释了),而且受到 GDI 的图像处理能力的限制,这些能力(对于非常大的图像)并不完全理想。

不管你喜不喜欢,要么自己写,要么使用delphi 的图像查看器。在链接页面上,Ahmoy Law 的 Delphi v.1.00.00 Image Visualizer 对我来说看起来不错。

于 2011-12-28T18:22:35.513 回答
1

鼠标坐标通常来源于 WMMouseMove 消息,该消息的记录定义如下:

type TLMMouse = record
  Msg: Cardinal;
  Keys: PtrInt;
  case Integer of
    0: (XPos: SmallInt;
        YPos: SmallInt;);
    1: (Pos: TSmallPoint;);
    2: (Dummy: LPARAM;
        Result: LRESULT;);
end;

因为鼠标消息将坐标打包成 2 个小整数,所以无法解决您的问题。

请注意,GetCursorPos 给出了一个带有两个 Int32 的 TPoint 记录,但这不是您的控件使用的函数,因此您不会从中受益。

于 2011-12-28T12:29:02.817 回答