zoukankan      html  css  js  c++  java
  • delphi的坐标变换(ClientToScreen等函数的应用)

     注意一点的是,由于函数名 ClientToScreen,被控件的方法与API函数同名使用,所以造成在调用时delphi优先调用控件的ClientToScreen方法。如果只想调用API函数,那么可以用 windows.ClientToScreen。  源代码如下:

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Edit1: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Edit2: TEdit;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure FormClick(Sender: TObject);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
      p rivate
        { P rivate declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    {$APPTYPE CONSOLE}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      point1:TPoint;
    
    begin
      point1:=Point(Button1.Top,Button1.Left);
      point1:=ClientToScreen(point1);
      Edit1.Text:='X:'+IntToStr(point1.x)+' '+
        'Y:'+IntToStr(point1.y);
      Edit2.Text:='X:'+IntToStr(Button1.Top)+' '+
        'Y:'+IntToStr(Button1.Left);
    
    
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
      point1:TPoint;
      point2:TPoint;
    begin
      point1.x:= Button2.Top;
      point1.y:= Button2.Left;
      point2:=Button2.ClientToScreen(point1);
      Edit1.Text:='X:'+IntToStr(point2.x)+' '+
        'Y:'+IntToStr(point2.y);
      Edit2.Text:='X:'+IntToStr(Button2.Top)+' '+
        'Y:'+IntToStr(Button2.Left);
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    var
      hwnd1,hwnd2:THandle;
      p1:TPoint;
    begin
      hwnd1:=FindWindow(nil,PChar('计算器'));
      if hwnd1=0 then WinExec('calc',SW_SHOW);
      while True do
      begin
         hwnd1:=FindWindow(nil,PChar('计算器'));
         if hwnd1<>0 then Break;
         Application.ProcessMessages;
      end;
      hwnd2:=FindWindowEx(hwnd1,0,nil,PChar('十六进制'));
      if hwnd2=0 then
      begin
        ShowMessage('先切换到科学计算器!');
        Exit;
      end;
    
      p1:=Point(0,0); { TODO -o猪悟能 : 注意point必须先初始化再使用 }
      Windows.ClientToScreen(hwnd2,p1);
      { TODO -o猪悟能 : 计算器窗口置前,点击十六进制单选钮 }
      SetForegroundWindow(hwnd2);
      mouse_event(MOUSEEVENTF_LEFTDOWN,
        p1.X,p1.Y,0,0);
    
      //Writeln(p1.x);
      //Writeln(p1.y);
    
    end;
    
    procedure TForm1.FormClick(Sender: TObject);
    var
      p1:TPoint;
    begin
      GetCursorPos(p1);
      Label5.Caption:='鼠标相对于屏幕位置 X:'+IntToStr(p1.x)+
        ' y:'+IntToStr(p1.y);
      
    end;
    
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y:
        Integer);
    var
      p1:TPoint;
    begin
      p1:=Point(x,y);
      Label3.Caption:= 'X:'+IntToStr(x)+' '+
        'Y:'+IntToStr(y);
      p1:=ClientToScreen(p1);
      Label4.Caption:= 'X:'+IntToStr(p1.x)+' '+
        'Y:'+IntToStr(p1.y);
    end;
    
    end.
  • 相关阅读:
    bean的注入方式
    Spring中的IOC
    BeanFactory和ApplicationContext的区别
    mysql出现锁表 com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
    centos防火墙
    sql中union和union all的区别
    Sql语句中IN和exists的区别及应用
    ROLLUP,CUBE,GROUPPING详解
    通过WinRM在本机执行云服务器脚本,更新git代码
    Sqlserver2012评估期已过问题解决
  • 原文地址:https://www.cnblogs.com/railgunman/p/12693571.html
Copyright © 2011-2022 走看看