zoukankan      html  css  js  c++  java
  • 基于图像漫游:在有限区域内显示大图像

    在开发多媒体应用中,经常会遇到需要在有限区域内显示大图像
    的情况,有不少文章对此提出过解决方法,如通过调用Windows的API函
    数,直接读写内存等。这些方法有某些优点,但实现起来较为复杂,且
    易出错。笔者在实践中通过仔细摸索,利用Delphi的强大的面向对象
    可视化开发环境开发了一种交互式图像漫游方法。
    Delphi中,鼠标的消息响应是通过元件的OnMouseDown、OnMouseU
    p和OnMouseMove事件实现的,通过对此三个事件编程,可控制图像在有
    限区域内移动。考虑到所移动的图像的边界应总在该区域外,因此图
    像的左上角坐标应小于该区域对应坐标,图像右下角坐标应大于该区
    域对应坐标(除非图像大小比该区域小)。图1
    具体方法是:
    1、新建一工程Project1,在Form1中依次放入Panel1、Panel2和I
    mage1元件,注意Pa nel2和Image1分别在Panel1和Panel2上,再将一La
    bel1元件加入Panel2中,调整Panel1尺寸为适当大小,并修改各元件属
    性为:
    元件
    属性名
    属性值
    Panel1
    BevelInner:
    bvRaised
    BevelOuter: bvNone
    BorderStyle: bsSingle
    Panel2
    Align:
    alClient
    Image1
    AutoSize:
    True
    Picture:
    "Apple.bmp"
    Label1
    Align:
    alClient
    Transparent : True
    注意:此处Label1的作用不是显示字符,而是利用它响应鼠标消息
    ,如果不用Label1而直接利用Image1的鼠标事件响应,则会由于其OnMo
    useDown事件的激活与Image1的自身坐标移动事件冲突而使图像发生
    闪烁甚至不能移动。
    2、在implementation后加入变量声明:
    origin:Tpoint;
    image_left:integer;
    image_top:integer;
    visa1:Tpoint; (鼠标当前位置相对图像右下角的坐标)
    visa2:Tpoint; (鼠标当前位置相对图像左上角的坐标)
    canmove:boolean;
    编写Label1鼠标响应事件:
    procedure TForm1.Label1MouseDown(Sender: TObject; Button
    : TMouseButton;S hift: TShiftState; X, Y: Integer);
    begin
    if Button=mbLeft then
    begin
    origin.x:=X;
    origin.y:=Y;
    image_left:=image1.left;
    image_top:=image1.top;
    visa1.x:=X-(image1.width-panel2.width+image1.left);
    visa1.y:=Y-(image1.height-panel2.height+image1.top);
    visa2.x:=X-image1.left;
    visa2.y:=Y-image1.top;
    canmove:=true;
    end;
    end;
    procedure TForm1.Label1MouseMove(Sender: TObject; Shift:
    TShiftState; X, Y: Integer);
    begin
    if canmove then
    begin
    if X< visa1.x then X:=visa1.x;
    if X>visa2.x then X:=visa2.x;
    if Y< visa1.y then Y:=visa1.y;
    if Y>visa2.y then Y:=visa2.y;
    image1.left:=image_left+(X-origin.x);
    image1.top:=image_top+(Y-origin.y);
    end;
    end;
    procedure TForm1.Label1MouseUp(Sender: TObject; Button: 
    TMouseButton;Shi ft: TShiftState; X, Y: Integer);
    begin
    canmove:=false;
    end;

  • 相关阅读:
    Codeforces Beta Round #92 (Div. 2 Only) B. Permutations 模拟
    POJ 3281 Dining 最大流 Dinic算法
    POJ 2441 Arrange the BUlls 状压DP
    URAL 1152 Faise Mirrors 状压DP 简单题
    URAL 1039 Anniversary Party 树形DP 水题
    URAL 1018 Binary Apple Tree 树形DP 好题 经典
    pytorch中的forward前向传播机制
    .data()与.detach()的区别
    Argparse模块
    pytorch代码调试工具
  • 原文地址:https://www.cnblogs.com/yzryc/p/6373604.html
Copyright © 2011-2022 走看看