Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Положение курсора на форме. Без onFormMouseMove 
V
    Опции темы
JAnty
  Дата 10.4.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Как узнать положение курсора мыши на форме без onFormMouseMove, т.к. он срабатывает только при наведении на форму, а ведь на форме ещё и кнопки есть!???
Код

TPoint mp;
GetCursorPos(&mp); 

Это неподходит по неким причинам.
 smile 

Буду очень благодарен!!!


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
SenkraD
Дата 10.4.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



А можеш сказать почему 2 предыдущих не подходят?

Я знаю ещё два способа, но они почти тоже что событие: подмена оконной процедуры или отлов сообщения.


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ama_kid
Дата 10.4.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



третий способ - установка глобального низкоуровнего хука. Даю пример на дельфи:
Код
unit Unit1;

interface

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

const
   WH_MOUSE_LL = 14;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
{Structure used by WH_MOUSE_LL }
  tagMSLLHOOKSTRUCT = packed record
    pt : TPoint;
    mouseData : DWord;
    flags : DWord;
    time : DWord;
    dwExtraInfo : PDWord;
  end;
  tMSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT;
  PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;
var
  Form1: TForm1;
  OldHook:HHook;

implementation

{$R *.dfm}
function LowLevelMouseProc(nCode:integer;wP: WPARAM ; lP:LPARAM):LRESULT; stdcall;
var
 MS:PMSLLHOOKSTRUCT;
begin
 if nCode<0 then
  begin
   Result:=CallNextHookEx(OldHook,nCode,wP,lP);
   exit;
  end;
  if wP = WM_MOUSEMOVE then
   begin
    MS:=PMSLLHOOKSTRUCT(lP);
    Form1.Caption := 'X='+IntToStr(MS^.pt.X)+';Y='+IntToStr(MS^.pt.Y);
   end;
 Result:=CallNextHookEx(OldHook,nCode,wP,lP);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 OldHook:=SetWindowsHookEx(WH_MOUSE_LL,@LowLevelMouseProc, HInstance, 0);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 UnhookWindowsHookEx(OldHook);
end;

end.



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
JAnty
  Дата 10.4.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Цитата(SenkraD @  10.4.2007,  18:24 Найти цитируемый пост)
А можеш сказать почему 2 предыдущих не подходят?

Ну первый понятно почему, не будет работать при наведении мышки на кнопку например, а второй...
Дело в том, что у всех окон разные по размеру рамки и темболее у разних ОС.
Дапустим пример: мне надо, чтоб за мышкой чотко ездил Image1, но этого не будет по первому способу т.к. мышь при движении будет на самом Image1 и не будет выполнятся onFormMouseMove.
Вот еслиб в таймере его вызывать как нибудь постоянно.

Добавлено @ 18:43
ama_kid Непонятно. smile 

Это сообщение отредактировал(а) JAnty - 10.4.2007, 18:44


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
Partizan
Дата 10.4.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 67



Цитата(JAnty @ 10.4.2007,  18:41)
у разних ОС.

ммм...интересно...о каких разных ос может идти речь если пиложение пишется на билдере....


з.ы. что касается решения проблемы, то функцией GetCursorPos тут вполне можно обойтись....


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
JAnty
  Дата 10.4.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Цитата(Partizan @  10.4.2007,  18:52 Найти цитируемый пост)
ммм...интересно...о каких разных ос может идти речь если пиложение пишется на билдере....


Чтоб пользоваться GetCursorPos(&mp); надо чотко знать толщену рамки и заголовка окна, а у диалоговых окнах они отличны от обычных, а бывает и без Caption'а окна, а у Высты толщена рамок разная да и разные версии Висты есть! Неужели не ясно. Сначало думал узнавать Винду на которой запускаеться прога, но потом понял, что это не выход!
 smile  smile  smile

Добавлено через 5 минут и 2 секунды
Код

  static TPoint mp;
  GetCursorPos(&mp);
  mp.x=mp.x - FrmDoska->Left-8;
  mp.y=mp.y - FrmDoska->Top-28;

Это только для Висты c ВиндовАэро.
Тем самым я узнаю положения курсора рабочей области формы учитывая что Caption=28 пикселей а рамка = 8.
Запустил на ХР... не корректность. smile

Добавлено через 12 минут и 10 секунд
Правельней сказать: 
Как узнать положение курсора на рабочей области окна?


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
codelord
Дата 10.4.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Надеюсь я правильно проникся твоей проблемой, в общем вот что мне пришло на ум
кидаем на форму ApplicationEvents из вкладки Additional, у него в событии OnMessage пишем следующее
"чудо", по хорошему в коде ниже надо цифры заменить псевдонимами из winuser.h иначе можно обмануться...

Код

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
  if( !(Msg.message>=160 && Msg.message<=165) )
  Form1->Caption="Мы на рабочей области окна, координаты: " +  AnsiString(Msg.pt.x)+" : "
 + AnsiString(Msg.pt.y);

}


Это сообщение отредактировал(а) codelord - 10.4.2007, 20:41


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
JAnty
  Дата 10.4.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



codelord это то оно так, но в Msg.pt.x хранится тоже самое что и в mp.x от GetCursorPos(&mp);
Тоесть x всегда разное при одном и томже положении курсора на форме, но при разном положении самой формы. Надо чтоб координады были равны 0 когда курсор находится в верхней левой части рабочей области окна, а этого не происходит. smile 


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
codelord
Дата 10.4.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



вот держи надеюсь то что надо, что не думал что так запарюсь с этими координатами, все по пунктам выше, потом это
Код

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
if( !(Msg.message>=160 && Msg.message<=165) ) {
tagPOINT point;
point.x=Msg.pt.x;
point.y=Msg.pt.y;
MapWindowPoints(NULL,Handle, &point, 1);
  Form1->Caption="Мы на рабочей области окна, координаты: " +  AnsiString(point.x)+" : "
 + AnsiString(point.y);   }
}

в хедере
Код

#include <windows.h>
#include <winuser.h>
#include <wingdi.h>



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
JAnty
  Дата 11.4.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Да, то что надо. smile  smile 


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1154 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.