delphi的坐标变换(ClientToScreen等函数的应用)  
官方Delphi 学习QQ群: 682628230(三千人)
频道

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.


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.042041063308716 seconds