![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Array |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 2.8.2004 Репутация: нет Всего: нет |
Приветствую всех на форуме.
Необходимо сделать приложение в котором будет реализован скроллинг мышью. Подробнее вопрос в следующем: В ScrollBox помещен компонент Image, который содержит изображение Bitmap. Размер картинки большой, т.е. в окно ScrollBox она не влазит (Image.AutoSize:=true). Естественно, автоматически появляются линейки скроллинга,но они не удобны в этом приложении, поэтому необходим скроллинг мышью, то есть при нажатии левой кнопки мыши над изображением оно должно перетягиваться. Насколько я понимаю, требуется написать обработчик события <On Mouse Down>. Но я в Delphi пока новичок и пока не могу разоб-раться, что в нем надо задавать. Может быть Мастера Delphi помогут? С уважением |
|||
|
||||
| Chyslyvchyk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 446 Регистрация: 9.5.2004 Репутация: 1 Всего: 5 |
Что-то я не совсем понимаю... Нужно, чтобы работал скроллинг мышью? Дык он и так работает в ScrollBox..... -------------------- Простота - сестра таланта! |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Chyslyvchyk: человек не совсем правильно выразился... ему нужен что-то вроде drag-and-drop 8). Т.е. нажимаешь мышку - появилась на курсоре "рука", ты тягаешь в стороны мышу, и вместе с ней перетаскиваешь изображение (т.к. оно в экран не влазит). Как сделать - пока не могу думать (это обработка onMouseDown+OnMouseMove+OnMouseUp+пара переменных-триггеров), т.к. ужасно хочу спать, а ещё на работу завтра...
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| Burich-Caeser |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 28.7.2004 Репутация: нет Всего: 1 |
Создашь глобальную булеву переменную click.
В обработчике нажатия( не по всей форме, а только по имэйджу) присваиваешь ей истину + записываешь куда-нить текущие координаты. в обработчике отпуска click := False; В OnMove проверяешь, click на равенство false если так, нифика не делаешь, иначе смотришь, как изменились координаты и прокручиваешь картинку в ту сторону. Надеюсь помог. Если что, потом могу написать исходник. Удачи. З.Ы. Ты тоже недавно на форуме? Классное место, я больше нигде и не бываю... И тебе советую остаться=)) Это сообщение отредактировал(а) Burich-Caeser - 3.8.2004, 01:32 --------------------
Ты брошен вниз силой судьбы,Ты унижен и раздавлен,Время забыть то, кем ты был,Но помнить, кем ты стал... |
|||
|
||||
| Array |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 2.8.2004 Репутация: нет Всего: нет |
Illusion Dolphin
Да, все правильно. Именно это и требуется. Burich-Caeser
А как сделать покрутку? Все остальное понятно. З.Ы. Я просматриваю форум несколько месяцев. Думаю, это лучший форум по программированию |
|||
|
||||
| Alkash |
|
|||
|
коллекционер жизни ![]() ![]() Профиль Группа: Участник Сообщений: 516 Регистрация: 5.7.2004 Где: / Репутация: нет Всего: нет |
То бишь смещаешь координаты просмотра относительно картинки.
-------------------- Подпись >> /dev/null |
|||
|
||||
| Burich-Caeser |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 28.7.2004 Репутация: нет Всего: 1 |
if I=0 then
FON.Picture.Bitmap.Canvas.CopyRect(Rect(0,0,W,H), FON.Picture.Bitmap.Canvas,Rect(0,0,W,H)); I:=I+1; FON.Picture.Bitmap.Canvas.CopyMode:=cmSrcCopy; FON.Picture.Bitmap.Canvas.CopyRect(Rect(0,0,A-I,B), FON.Picture.Bitmap.Canvas,Rect(I,0,A,B)); FON.Picture.Bitmap.Canvas.CopyRect(Rect(A-I,0,A,B), FON.Picture.Bitmap.Canvas,Rect(0,0,I,B)); if I=A then I:=0; end; Что-то в этом роде... Если, не прокатит, скажешь, я постараюсь кинуть нормальный пример на мыло... Извиняй, сейчас голова туго варит, психую из-за приема на работу.... Хочу работать программером=) Написал пробную прогу для них, жду решения... Фу, выговорился Простите за оффтоп Чуть не забыл: W - width твоего имэйджа, то-есть не всей картинки, а рисуемого участка; H - height...; A - ширина всей картинки; B - высота всей картинки; --------------------
Ты брошен вниз силой судьбы,Ты унижен и раздавлен,Время забыть то, кем ты был,Но помнить, кем ты стал... |
|||
|
||||
| Dynamic |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 372 Регистрация: 5.7.2004 Где: Салехард Репутация: 12 Всего: 15 |
-------------------- Было бы о чем молчать, а уж что сказать – всегда найдется... |
|||
|
||||
| Array |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 2.8.2004 Репутация: нет Всего: нет |
Dynamic
ОГРОМНОЕ СПАСИБО!!! То, что надо. Все работает прекрасно. Очень выручил. Жму руку! Burich-Caeser Покрутка через <canvas> выглядит немного странно. Я такое довести до рабочего состояния не смог. По моему, способ Dynemic' а намного "естественней". Главное --- работает. НО все равно СПАСИБО! |
|||
|
||||
| Burich-Caeser |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 28.7.2004 Репутация: нет Всего: 1 |
=)) Пожалуйста... Вообщето мой код просто копирует из картинки то, что должно быть видно в этот момент.
--------------------
Ты брошен вниз силой судьбы,Ты унижен и раздавлен,Время забыть то, кем ты был,Но помнить, кем ты стал... |
|||
|
||||
| Burich-Caeser |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 28.7.2004 Репутация: нет Всего: 1 |
Если еще надо и хочется потелепаться, то пример через WinApi:
HDC hdc; PAINTSTRUCT ps; SCROLLINFO si; /* Переменные для BitBlt. */ static HDC hdcWin; /* DC окна */ static HDC hdcScreen; static HDC hdcScreenCompat; static HBITMAP hbmpCompat; /* handle на bitmap для старого DC */ static BITMAP bmp; /* bitmap data structure */ static BOOL fBlt; /* TRUE если BitBlt используется */ static BOOL fScroll; /* TRUE если scrolling используется */ static BOOL fSize; /* TRUE если fBlt & WM_SIZE =)логическая оп. */ /* Для горизонтального scrolling. */ static int xMinScroll; /* минимальная величина горизонтальной прокрутки */ static int xCurrentScroll; /* текущая... */ static int xMaxScroll; /* максимальная... */ /* Для вертикального scrolling. */ static int yMinScroll; /* ... вертикальной... */ static int yCurrentScroll; /* ... */ static int yMaxScroll; /* ... */ switch (uMsg) { case WM_CREATE: hdcScreen = CreateDC("DISPLAY", (LPCSTR) NULL, (LPCSTR) NULL, (CONST DEVMODE *) NULL); hdcScreenCompat = CreateCompatibleDC(hdcScreen); bmp.bmBitsPixel = (BYTE) GetDeviceCaps(hdcScreen, BITSPIXEL); bmp.bmPlanes = (BYTE) GetDeviceCaps(hdcScreen, PLANES); bmp.bmWidth = GetDeviceCaps(hdcScreen, HORZRES); bmp.bmHeight = GetDeviceCaps(hdcScreen, VERTRES); bmp.bmWidthBytes = ((bmp.bmWidth + 15) &~15)/8; hbmpCompat = CreateBitmap(bmp.bmWidth, bmp.bmHeight, bmp.bmPlanes, bmp.bmBitsPixel, (CONST VOID *) NULL); SelectObject(hdcScreenCompat, hbmpCompat); fBlt = FALSE; fScroll = FALSE; fSize = FALSE; xMinScroll = 0; xCurrentScroll = 0; xMaxScroll = 0; yMinScroll = 0; yCurrentScroll = 0; yMaxScroll = 0; break; case WM_SIZE: { int xNewSize; int yNewSize; xNewSize = LOWORD(lParam); yNewSize = HIWORD(lParam); if (fBlt) fSize = TRUE; xMaxScroll = max(bmp.bmWidth-xNewSize, 0); xCurrentScroll = min(xCurrentScroll, xMaxScroll); si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = xMinScroll; si.nMax = xMaxScroll; si.nPage = xNewSize; si.nPos = xCurrentScroll; SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); yMaxScroll = max(bmp.bmHeight - yNewSize, 0); yCurrentScroll = min(yCurrentScroll, yMaxScroll); si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = yMinScroll; si.nMax = yMaxScroll; si.nPage = yNewSize; si.nPos = yCurrentScroll; SetScrollInfo(hwnd, SB_VERT, &si, TRUE); } break; case WM_PAINT: { PRECT prect; hdc = BeginPaint(hwnd, &ps); if (fSize) { BitBlt(ps.hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcScreenCompat, xCurrentScroll, yCurrentScroll, SRCCOPY); fSize = FALSE; } if (fScroll) { prect = &ps.rcPaint; BitBlt(ps.hdc, prect->left, prect->top, (prect->right - prect->left), (prect->bottom - prect->top), hdcScreenCompat, prect->left + xCurrentScroll, prect->top + yCurrentScroll, SRCCOPY); fScroll = FALSE; } EndPaint(hwnd, &ps); } break; case WM_HSCROLL: { int xDelta; int xNewPos; int yDelta = 0; switch (LOWORD(wParam)) { case SB_PAGEUP: xNewPos = xCurrentScroll - 50; break; case SB_PAGEDOWN: xNewPos = xCurrentScroll + 50; break; case SB_LINEUP: xNewPos = xCurrentScroll - 5; break; case SB_LINEDOWN: xNewPos = xCurrentScroll + 5; break; case SB_THUMBPOSITION: xNewPos = HIWORD(wParam); break; default: xNewPos = xCurrentScroll; } xNewPos = max(0, xNewPos); xNewPos = min(xMaxScroll, xNewPos); if (xNewPos == xCurrentScroll) break; fScroll = TRUE; xDelta = xNewPos - xCurrentScroll; xCurrentScroll = xNewPos; ScrollWindowEx(hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE); UpdateWindow(hwnd); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = xCurrentScroll; SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); } break; case WM_VSCROLL: { int xDelta = 0; int yDelta; int yNewPos; switch (LOWORD(wParam)) { case SB_PAGEUP: yNewPos = yCurrentScroll - 50; break; case SB_PAGEDOWN: yNewPos = yCurrentScroll + 50; break; case SB_LINEUP: yNewPos = yCurrentScroll - 5; break; case SB_LINEDOWN: yNewPos = yCurrentScroll + 5; break; case SB_THUMBPOSITION: yNewPos = HIWORD(wParam); break; default: yNewPos = yCurrentScroll; } yNewPos = max(0, yNewPos); yNewPos = min(yMaxScroll, yNewPos); if (yNewPos == yCurrentScroll) break; fScroll = TRUE; yDelta = yNewPos - yCurrentScroll; yCurrentScroll = yNewPos; ScrollWindowEx(hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE); UpdateWindow(hwnd); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = yCurrentScroll; SetScrollInfo(hwnd, SB_VERT, &si, TRUE); } break; case WM_COMMAND: switch(wParam) { case IDM_STC: BitBlt(hdcScreenCompat, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcScreen, 0, 0, SRCCOPY); hdcWin = GetDC(hwnd); BitBlt(hdcWin, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcScreenCompat, 0, 0, SRCCOPY); ReleaseDC(hwnd, hdcWin); fBlt = TRUE; break; default: return (DefWindowProc(hwnd, uMsg, wParam, lParam)); } break; Если вопрос исчерпан, закрой, пожалуйста тему... --------------------
Ты брошен вниз силой судьбы,Ты унижен и раздавлен,Время забыть то, кем ты был,Но помнить, кем ты стал... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |