16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
1

OnMouseMove

18.03.2013, 18:14. Показов 6196. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
такой вопрос событие OnMouseMove возникает в момент движения мышки, x и y которые передаются в параметрах запоминают координаты где была мышка до перемещения? или где стала находится после?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2013, 18:14
Ответы с готовыми решениями:

OnMouseMove
Ребят, как на действие OnMouseMove запретить передвижение допустим кнопки за форму?

StringGrid и OnMouseMove
Добрый день всем. Вопрос такой - каким образом можно в событии OnMouseMove компонента StringGrid...

Событие onMouseMove
Как сделать событие onMouseMove для динамических обьектов

Tchart и событие OnMouseMove
имеется график Tchart, постороенный по точкам взятым из Stringgrid. Необходимо чтобы при наведении...

17
1852 / 1174 / 190
Регистрация: 27.03.2009
Сообщений: 4,514
18.03.2013, 18:16 2
на тек момент
0
16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
18.03.2013, 18:32  [ТС] 3
Цитата Сообщение от unick12345 Посмотреть сообщение
на тек момент
т.е. после перемещения или до? конкретно сложно было ответить?

Добавлено через 5 минут
п.с. просто мне очень нужно что то типа OnMouseLeave только срабатывающее при покидании заданной области (Rect)
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
18.03.2013, 18:43 4
Можно PtInRect использовать с флагом.
0
16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
18.03.2013, 19:11  [ТС] 5
Цитата Сообщение от gorfil Посмотреть сообщение
Можно PtInRect использовать с флагом.
так я его и использую... надо типа при покидании Rect запомнить его и что нибудь с ним сделать (ТЕМНУЮ ! ), а потом и еще что то с Rect куда попал... я просто не пойму по какому событию это дело юзать

Добавлено через 16 минут
сейчас сделал так: создал 2 глобальные переменные для x и y соответственно, и проверяю PtInRect,
должно получаться так чтобы при движении мыши тот квадратик где мышь была закрашивался одним цветом, а куда перевелась другим, а вместо этого я получаю змейку какую то... т.е. за мышью остается постепенно исчезающий след - цвет меняется, но почему так долго?
да и еще к тому же все что было на канве стирается (ну может это недоделки процедуры, пока не уверен)

Добавлено через 8 минут
да также еще есть вариант что я как то не так юзаю GetKeyState, мне нужно чтобы то что я описывал выше происходило только при зажатой левой клавише мыши, поэтому я пишу if GetKeyState(vk_LButton)>0 .... правильно? а то в факах с гугла не понятно что значит старший\младший байт
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
18.03.2013, 19:16 6
Вот небольшой набросок:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Rect: TRect;
begin
  if not (ssLeft in Shift) then Exit;
 
  Rect := Bounds(200, 200, 200, 200);
 
  if PtInRect(Rect, Point(X,Y)) and not InRect then
  begin
    InRect := True;
    Canvas.Brush.Color := clRed;
    Canvas.FillRect(Rect);
  end;
 
  if not PtInRect(Rect, Point(X,Y)) and InRect then
  begin
    InRect := False;
    Canvas.Brush.Color := clGreen;
    Canvas.FillRect(Rect);
  end;
 
  Caption := IntToStr(X) + ' = ' + IntToStr(Y);
  if InRect then
    Caption := Caption + ' In'
  else
    Caption := Caption + ' Out';
end;
0
16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
18.03.2013, 19:23  [ТС] 7
gorfil, даже если опустить что вы забыли объявить переменную InRect, не понятно что вы хотели сказать этим: "and not InRect" и "and InRect ",
ни я ни компилятор этого не поняли

п.с. могу проект скинуть если надо
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
18.03.2013, 19:27 8
InRect - глобальная переменная типа boolean
Delphi
1
2
3
4
5
var
  Form1: TForm1;
  InRect: boolean;
 
implementation
0
16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
18.03.2013, 19:43  [ТС] 9
заработало, прикольно, но пока очень сильно помогло только "if not (ssLeft in Shift) then Exit;", а то GetKeyState какая то багнутая
почитайте, все таки хочется более применимо к моему случаю

Добавлено через 5 минут
п.с. чтобы вам долго не мучиться в поисках аналога скажу что делаю сапера попробуйте открыть его,
нажать на поле и переводить мышку -> клетка будет выглядеть нажатой пока мышка на нее давит, когда мышка ушла клетка отжалась,
этого я и добиваюсь
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
18.03.2013, 19:46 10
Мой код отслеживает вход в заданную область и выход из нее при нажатой левой кнопке мыши. А тебе что надо?
0
16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
18.03.2013, 19:47  [ТС] 11
Цитата Сообщение от gorfil Посмотреть сообщение
Мой код отслеживает вход в заданную область и выход из нее при нажатой левой кнопке мыши. А тебе что надо?
10 символов

Цитата Сообщение от GetMeHelp Посмотреть сообщение
п.с. чтобы вам долго не мучиться в поисках аналога скажу что делаю сапера попробуйте открыть его,
нажать на поле и переводить мышку -> клетка будет выглядеть нажатой пока мышка на нее давит, когда мышка ушла клетка отжалась,
этого я и добиваюсь
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
18.03.2013, 21:24 12
Надо было сразу писАть, что области - это компоненты (кнопки), а не пустая форма с мнимыми квадратами.
У большенства компонентов есть события MouseEnter и MouseLeave. И у кнопко в том числе.
Вот набросал пример, который работает с нажатием правой кнопки мыши, т.к. нажатая левая блокирует некоторые события (как с этим бороться - не знаю).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;
 
type
  TBitBtn = class(Buttons.TBitBtn)
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
  private
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  end;
 
type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    BitBtn6: TBitBtn;
    BitBtn7: TBitBtn;
    BitBtn8: TBitBtn;
    BitBtn9: TBitBtn;
    BitBtn10: TBitBtn;
    BitBtn11: TBitBtn;
    BitBtn12: TBitBtn;
    BitBtn13: TBitBtn;
    BitBtn14: TBitBtn;
    BitBtn15: TBitBtn;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  isRButton: boolean;
 
implementation
 
{$R *.dfm}
 
procedure TBitBtn.CMMouseEnter(var Msg: TMessage);
begin
  if isRButton then
    Perform( BM_SETSTATE, 1, 0 ); //âèçóàëèçàöèÿ íàæàòèÿ êíîïêè
end;
 
procedure TBitBtn.CMMouseLeave(var Msg: TMessage);
begin
  Perform( BM_SETSTATE, 0, 0 );
end;
 
procedure TBitBtn.MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer);
begin
  inherited;
  if Button = mbRight then
  begin
    isRButton := True;
    Perform( BM_SETSTATE, 1, 0 );
  end;
end;
 
procedure TBitBtn.MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer);
begin
  inherited;
  if Button = mbRight then
  begin
    isRButton := False;
    Perform( BM_SETSTATE, 0, 0 );
  end;
end;
 
end.
Вложения
Тип файла: rar Buttons.rar (1.4 Кб, 5 просмотров)
0
16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
18.03.2013, 21:29  [ТС] 13
я говорил что области это кнопки? первая мысля моя была да кнопки (когда хотел сделать сапера), но так и не смог придумать как через кнопки реализовать, поэтому все сделал на канве, т.е. квадраты у меня это чисто на канве нарисованы, отлавливаю PtInRect и т.д. трудоемкий метод, зато работает
Вложения
Тип файла: rar сапер.rar (196.8 Кб, 5 просмотров)
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
18.03.2013, 21:35 14
Змейки какие-то получаются, когда мышкой по полю водишь...
С кнопками-то оно все гораздо проще.
0
16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
18.03.2013, 21:36  [ТС] 15
о змейках речь, как их убрать?
с кнопками не проще... с кнопками хуже смотрится... пробовал вначале...
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
18.03.2013, 21:51 16
В БитБатоны можно любые картинки грузить, хоть белые квадраты, хоть что угодно.
А в твоем нынешнем варианте мне так просто не разобраться.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32581 / 21052 / 8131
Регистрация: 22.10.2011
Сообщений: 36,325
Записей в блоге: 8
19.03.2013, 00:33 17
GetMeHelp, берем твой вариант, делаем так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TMainForm.TableMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var i, j: integer;
begin
  Smile.Glyph:= BL[1];
  for i:= 1 to 9 do
    for j:= 1 to 9 do
      if PtInRect(RA[i,j], Point(x, y)) then
      begin
        DrawInCell(Empty, i, j);
        ACol := i; ARow := j;
      end;
end;
 
procedure TMainForm.TableMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Var i, j: integer;
begin
  // if GetKeyState(vk_LButton)>0 then
  if ssLeft In Shift then
  begin
    // DrawInCell(Fill, ACol, ARow);
    // ACol:= x; ARow:= y;
    for i:= 1 to 9 do
      for j:= 1 to 9 do
        if PtInRect(RA[i,j], Point(x, y)) then
        begin
          if (ACol <> i) or (ARow <> j) then
          begin
            DrawInCell(Fill, ACol, ARow);
            ACol := i; ARow := j;
            DrawInCell(Empty, i, j);
          end;
        end;
  end;
end;
, и смотрим, что получится... Можешь при отжатии мыши закрасить текущую клетку Fill-ом.
1
16 / 16 / 3
Регистрация: 01.03.2013
Сообщений: 130
19.03.2013, 21:54  [ТС] 18
UI, спасибо огромное

никто не подскажет как состряпать функцию проверяющую что находится в клетке? для конкретно этого примера,
т.е. там могут находится только: закрашенная клетка, пустая клетка, клетка с цифрой (ее надо вернуть), клетка с бомбой или флагом
(тут вероятно надо сравнить Rect с BitMap из ресурса, не знаю как)

что то вроде Function InCell(Col, Row: integer): string; //стринг потому что через мой тип TDrawMode нельзя вернуть цифры

Добавлено через 14 часов 16 минут
актуально ! про функцию... не знаю как реализовать хоть убей, задайте хоть куда рыть
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2013, 21:54
Помогаю со студенческими работами здесь

Альтернатива события OnMouseMove
Подскажите пожалуйста, если ли в Дельфи событие, которое похоже на OnMouseMove? Дело в том, что при...

Изменение цвета shape onMouseMove
В общем нужно сделать так. На форме есть прозрачный shape и при наведении на него мыши он...

OnMouseMove и OnMouseLeave компонента label
Здравствуйте многоуважаемые форумчане, помогите пожалуйста разобраться с событиями OnMouseMove и...

onMouseMove событие в заданных координатах формы
Подскажите как правильно сделать, что бы при onMouseMove в заданных координатах формы(только к...

ONMouseMove не вызывается при зажатой левой кнопке мыши
При Зажатой левой КМ не вызывается событие оnmouseMove проект ниже

Прекращать работу процедуры OnMouseMove, если мышь неподвижна
Проблема следующая: в OnMouseMove написал код для определения координаты X, чтобы мышь двигалась...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru