Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2015, 08:58   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию SetCapture и выход курсора за пределы окна

Здравствуйте.
В главном окне есть child-окно класса Static с переопределенной оконной функцией.
Код:
    WM_LBUTTONDOWN:
    begin
       flag := true;
       SetCapture(wnd);
     end;

    WM_LBUTTONUP:
    begin
       flag := false;
       ReleaseCapture(wnd);
    end;

    WM_MOUSEMOVE:
    if flag then
    begin
      x := loword(Lpar);
      if Lpar<=0 then
      y := 0 else
      y := HiWord(Lpar);
      settext(form1,IntToStr(x)+','+ IntToStr(y)+','+ inttostr(Lpar));
    end;
Если курсор мыши выходит за левую или за верхнюю границу окна (или находится в неклиентской области), то x и y зашкаливают и дальнейшие вычисления становятся неправильными.
С этим можно что-то сделать?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.04.2015, 09:31   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
С этим можно что-то сделать?
Рассматривать x и y как *знаковые* переменные (и конвертировать их как таковые из lparam).
После этого проверять входят ли координаты в окно:
if ((x >= 0) && (x <= width)) ну и аналагично для y.

А зачем это нужно?
waleri вне форума Ответить с цитированием
Старый 19.04.2015, 10:25   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Рассматривать x и y как *знаковые* переменные (и конвертировать их как таковые из lparam).
Объясните
Цитата:
Сообщение от waleri Посмотреть сообщение
А зачем это нужно?
Например: нужно рисовать прямоугольник. Если курсор выходит за пределы окна, то событие WM_MOUSEMOVE перестаёт приходить. А попасть на первый пиксель, соответствующий точке 0 на клиентской области без выхода за пределы - очень сложно. Это пиксельхантинг.
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.04.2015, 12:13   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Объясните
Разницу между int и unsigned int знаете?
А как преоразуется unsigned short в int?
Какой у вас тип x и что возвращает loword?

И еще, у вас есть
if Lpar<=0 then
y := 0 else

Но почему-то для x такого нет - почему?

Ответьте себе на эти вопросы и сможете решить проблему.
waleri вне форума Ответить с цитированием
Старый 25.04.2015, 10:51   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Разницу между int и unsigned int знаете?
Знаю,но при чем тут это? Это же Delphi, а не С. В делфи нет типов unsigned, а целочисленные типы конвертируются друг в друга простым присваиванием.
Цитата:
Сообщение от waleri Посмотреть сообщение
Какой у вас тип x и что возвращает loword?
У меня х : integer, а loword возвращает значение типа word. Это диапазон 0..65535, что входит в integer.
Цитата:
Сообщение от waleri Посмотреть сообщение
И еще, у вас есть
if Lpar<=0 then
y := 0 else

Но почему-то для x такого нет - почему?
Потому что при выходе курсора мыши за левую границу окна, значение lpar всегда положительное и в этой проверке нет смысла.
Цитата:
Сообщение от waleri Посмотреть сообщение
if ((x >= 0) && (x <= width)) ну и аналагично для y.
Если делать так, то как я узнаю, с какой стороны за пределами окна находится курсор? GetCursorPos? Больше никак?

Последний раз редактировалось BLACK_RAIN; 25.04.2015 в 11:08.
BLACK_RAIN вне форума Ответить с цитированием
Старый 25.04.2015, 11:42   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В делфи нет типов unsigned
Вообще-то есть.
Cardinal к примеру.
Цитата:
а loword возвращает значение типа word.
А разве оно применимо к знаковым?
Всмысле при отрицательном же будет белиберда.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.04.2015, 12:10   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Вообще-то есть.
Cardinal к примеру.
ах да, точно. Они же просто названы по-другому.
Цитата:
Сообщение от waleri Посмотреть сообщение
Рассматривать x и y как *знаковые* переменные (и конвертировать их как таковые из lparam).
Теперь до меня дошло, что такое знаковая переменная - которая может принимать отрицательные значения.
А как их доставать из lparam, если не loword/hiword?
BLACK_RAIN вне форума Ответить с цитированием
Старый 25.04.2015, 13:33   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да так и доставай. LParam - и будет тебе integer.
Или тебе smallint нужен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.04.2015, 13:57   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да так и доставай.
Как "так"? Вот так?
Код:
x,y : integer;

      x := loword(Lpar);
      y := HiWord(Lpar);
Но так ведь не достаётся.
BLACK_RAIN вне форума Ответить с цитированием
Старый 25.04.2015, 14:04   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Так объявите x и y типом smallint
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход за пределы массива NFXrus Помощь студентам 10 09.12.2011 23:13
выход за пределы массива(с++) Lazy maximka Помощь студентам 2 13.11.2011 16:11
C++ выход за пределы строки (char) Alex11223 Помощь студентам 4 20.04.2011 20:27
C++ - выход за пределы массива kefir Помощь студентам 5 12.06.2010 14:09
Как определить выход курсора за пределы объекта Image Дамир Общие вопросы Delphi 7 29.03.2009 21:59