• 学习 Message(2): 发送 WM_MOUSEMOVE 消息


    本例效果图:



    代码文件:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    {鼠标在 Panel1 中移动时, 我做了如下处理:}
    {1、显示鼠标在 Panel1 中的坐标}
    {2、显示是否同时按住了 Shift、Ctrl、Alt}
    procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      List: TStringList;
    begin
      List := TStringList.Create;
      if ssShift in Shift then List.Add('Shift');
      if ssCtrl  in Shift then List.Add('Ctrl');
      if ssAlt   in Shift then List.Add('Alt');
    
      if List.Count > 0 then
        Panel1.Caption := Format('%s: %d, %d', [List.CommaText, X, Y])
      else
        Panel1.Caption := Format('%d, %d', [X, Y]);
    
      List.Free;
    end;
    
    {向 Panel1 发送 WM_MOUSEMOVE 消息}
    {第一个消息参数是 0, 表示没有按任何辅助键}
    {第二个消息参数是 0, 相当于把鼠标移动到(0,0)坐标}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Panel1.Perform(WM_MOUSEMOVE, 0, 0);
    end;
    
    {向 Panel1 发送 WM_MOUSEMOVE 消息}
    {第二个消息参数在 WM_MOUSEMOVE 消息中表示鼠标坐标位置; 参数是32位整数, 低16位是X, 高16位是Y}
    {这里给的坐标是控件的中心点}
    procedure TForm1.Button2Click(Sender: TObject);
    var
      x,y,LParam: Integer;
    begin
      x := Panel1.ClientWidth div 2;
      y := Panel1.ClientHeight div 2;
      LParam := y shl 16 or x;
      Panel1.Perform(WM_MOUSEMOVE, 0, LParam);
    end;
    
    {向 Panel1 发送 WM_MOUSEMOVE 消息}
    {消息的第一个参数是表示正在按下哪个辅助键和鼠标的状态}
    {这里发送的消息是: 按着 Shift 键, 鼠标移动到 (20,10) 处}
    procedure TForm1.Button3Click(Sender: TObject);
    const
      x = 20;
      y = 10;
    begin
      Panel1.Perform(WM_MOUSEMOVE, MK_SHIFT, y shl 16 or x);
    end;
    
    end.
    
    窗体文件:
    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 198
      ClientWidth = 255
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Panel1: TPanel
        Left = 8
        Top = 8
        Width = 237
        Height = 121
        Caption = 'Panel1'
        TabOrder = 0
        OnMouseMove = Panel1MouseMove
      end
      object Button1: TButton
        Left = 8
        Top = 152
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 1
        OnClick = Button1Click
      end
      object Button2: TButton
        Left = 89
        Top = 152
        Width = 75
        Height = 25
        Caption = 'Button2'
        TabOrder = 2
        OnClick = Button2Click
      end
      object Button3: TButton
        Left = 170
        Top = 152
        Width = 75
        Height = 25
        Caption = 'Button3'
        TabOrder = 3
        OnClick = Button3Click
      end
    end
    
  • 相关阅读:
    近期安卓与IOS招聘面试有感
    java线程池技术(二): 核心ThreadPoolExecutor介绍
    java线程池技术(一):ThreadFactory与BlockingQueue
    Java设计模式之策略模式与状态模式
    java线程间通信:一个小Demo完全搞懂
    Android M 新的运行时权限开发者需要知道的一切
    Java多线程同步问题:一个小Demo完全搞懂
    java多线程之守护线程以及Join方法
    安卓电量优化之JobScheduler使用介绍
    安卓电量优化之WakeLock锁机制全面解析
  • 原文地址:https://www.cnblogs.com/del/p/1319043.html
Copyright © 2020-2023  润新知