Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 166

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Есть TImage, на Canvas которого рисуется некоторое изображение. Требуется с помощью колеса мыши изменять масштаб изображения, когда курсор находится над компонентом. Проблема в том, что у TImage нет события типа OnMouseWheel. Подскажите, пожалуйста, как сделать.

Sunshine Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Sunshine (статус: Посетитель)
Вопрос отправлен: 6 декабря 2008, 16:54
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Nasgool

Здравствуйте, Sunshine!
Все просто! Обрабатывайте события MouseWheelUp и MouseWheelDown на форму с проверкой положения мыши (переменные X и Y в обработчиках), что бы мышь находилась над рисунком.

Ответ отправил: Nasgool (статус: 2-ой класс)
Время отправки: 6 декабря 2008, 17:26
Оценка за ответ: 4

Комментарий к оценке: Да, выход действительно простой. Однако когда курсор находится над другими компонентами, эти события формы не всегда срабатывают - видимо, они подавляются.

Ответ #2. Отвечает эксперт: Градов Ю.М.

Здравствуйте, Sunshine!
{....}

public
procedure AppMessage(var Msg: TMsg; var Handled: Boolean);

{....}



procedure Image1.AppMessage(var Msg: TMsg; var Handled: Boolean);
var
i: SmallInt;
begin
if Msg.message = WM_MOUSEWHEEL then
begin
Msg.message := WM_KEYDOWN;
Msg.lParam := 0;
i := HiWord(Msg.wParam);
if i > 0 then
Msg.wParam := VK_UP
else
Msg.wParam := VK_DOWN;

Handled := False;
end;
end;



// Und im Projekt Source:
// And in the project source:

{....}

Application.OnMessage := Image1.AppMessage;

{....}

Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 6 декабря 2008, 21:12
Оценка за ответ: 4

Ответ #3. Отвечает эксперт: Anderson N.N

Здравствуйте, Sunshine!
Слушай вот ответ других быстрых путей нет,
т.к у TImage нету дескриптора Handle:hwnd;
Да и еще обязательно поставь свойство
формы

form1.KeyPreview:=true;

Приложение:
  1. procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  2. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  3.  
  4. var rect:TRect;
  5. pt:TPoint;
  6. begin
  7. GetCursorPos(pt);
  8. rect:= Image1.BoundsRect;
  9. if (((pt.X<rect.Left)or(pt.X>rect.Right))and((pt.Y<rect.Top) or (pt.Y>rect.Bottom)))
  10.  
  11. end;


Ответ отправил: Anderson N.N (статус: 2-ой класс)
Время отправки: 6 декабря 2008, 21:27
Оценка за ответ: 5

Комментарий к оценке: Спасибо! Только условие нужно поменять на обратное, иначе скроллинг работает, когда курсор находится вне компонента ;-)

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.02 сек.