克服TImage Control限制

时间:2011-12-28 09:58:07

标签: delphi timage delphi-4

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

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

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

有两种方法可以解决此问题,

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

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

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

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

    请为此问题提供更好的解决方案

2 个答案:

答案 0 :(得分: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为T32记录提供了两个Int32,但这不是您的控件使用的功能,因此您不会从中受益。

答案 1 :(得分:1)

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

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

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

无论您是否喜欢,可以自己编写,也可以使用image viewer for delphi。在链接页面上,Ahmoy Law的Delphi v.1.00.00的Image Visualizer对我来说很好看。