Как определить конец правого перетаскивания TControl? - PullRequest
2 голосов
/ 24 июня 2010

edit: VCL не имеет проблем с перетаскиванием вправо, и пример программы ниже работает отлично.Утилита жестов мыши вызывает проблему.(Возможно, он перехватывает и перехватывает событие WM_RBUTTONUP ...)

Я хочу обнаружить end перетаскивания правой кнопкой мыши по элементу управления.

Для перетаскивания влевоЯ могу использовать событие MouseUp, но оно не возникает после перетаскивания вправо.

В тестовой программе ниже (поместите памятку справа от формы и перетащите форму), я хочу сбросить курсор мышипосле перетаскивания вправо.

Как этого добиться?(WM_RBUTTONUP не приходит.)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift:
        TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift:
        TShiftState; X, Y: Integer);
    procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function ShiftStateToStr(Shift: TShiftState): string;
begin
  if ssShift in Shift then
    Result := Result + 'S-';
  if ssCtrl in Shift then
    Result := Result + 'C-';
  if ssAlt in Shift then
    Result := Result + 'A-';
  if ssDouble in Shift then
    Result := Result + 'D-';
  if ssLeft in Shift then
    Result := Result + 'L';
  if ssRight in Shift then
    Result := Result + 'R';
  if ssMiddle in Shift then
    Result := Result + 'M';
end;

function MouseButtonToStr(Btn: TMouseButton): string;
begin
  if Btn = mbLeft then
    Result := 'Left'
  else if Btn = mbRight then
    Result := 'Right'
  else if Btn = mbMiddle then
    Result := 'Middle';
end;


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
begin
  SetCapture(Handle);
  Memo1.Lines.Add(Format('Down(Btn=%s, Shift=[%s])', [MouseButtonToStr(Button), ShiftStateToStr(Shift)]));

  if Button = mbLeft then
    Screen.Cursor := crDrag
  else if Button = mbRight then
    Screen.Cursor := crSize;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y:
    Integer);
begin
  Memo1.Lines.Add(Format('Move(Shift=[%s])', [ShiftStateToStr(Shift)]));
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Memo1.Lines.Add(Format('Up(Btn=%s, Shift=[%s])', [MouseButtonToStr(Button), ShiftStateToStr(Shift)]));

  Screen.Cursor := crDefault;
end;

procedure TForm1.WMRButtonUp(var Message: TWMRButtonUp);
begin
  Memo1.Lines.Add('WMRbuttonUp');
  inherited;
end;

end.

Ответы [ 2 ]

1 голос
/ 24 июня 2010

Я попробовал вашу тестовую программу с D2007.Все работает как ожидалось.FormMouseUp и WMRButtonUp запускаются, когда я отпускаю правую кнопку мыши.

Можете ли вы проверить это на другом компьютере?Я полагаю, вы установили что-то «плохое» в Delphi или у вас есть какая-то зацепка в вашей системе.Но ваш источник верен и должен работать.

0 голосов
/ 24 июня 2010

Ваша проблема в том, что вам нужно обнаруживать события мыши напрямую, не используя интерпретацию Delphi.

...