| 
| 
 | Вопрос # 2 166/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Есть TImage, на Canvas которого рисуется некоторое изображение. Требуется с помощью колеса мыши изменять масштаб изображения, когда курсор находится над компонентом. Проблема в том, что у TImage нет события типа OnMouseWheel. Подскажите, пожалуйста, как сделать.
 
|  |   Вопрос задал: 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;
 Приложение:Переключить в обычный режим procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); var rect:TRect;       pt:TPoint;beginGetCursorPos(pt);rect:= Image1.BoundsRect;if (((pt.X<rect.Left)or(pt.X>rect.Right))and((pt.Y<rect.Top) or (pt.Y>rect.Bottom))) end;
|  | Ответ отправил: Anderson N.N (статус: 2-ой класс)Время отправки: 6 декабря 2008, 21:27
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо! Только условие нужно поменять на обратное, иначе скроллинг работает, когда курсор находится вне компонента ;-) |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |