|
Вопрос # 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;
- begin
- GetCursorPos(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
Комментарий к оценке: Спасибо! Только условие нужно поменять на обратное, иначе скроллинг работает, когда курсор находится вне компонента ;-)
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|