|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.02.2013, 19:21 | #1 |
Форумчанин
Регистрация: 30.12.2010
Сообщений: 280
|
При скроллинге разрывается изображение
Здравствуйте
Нашел в интерете код для скроллинга Окно прокручивается нормально Но возникают проблемы с изображением находящимся в моем окне Если при прокрутке скроллинга изображение зайдет за видимую часть окна, то при обратной прокрутке та часть изображения которая находилась за окном разрывается Подскажите пожалуйста в чем моя ошибка |
01.02.2013, 19:22 | #2 |
Форумчанин
Регистрация: 30.12.2010
Сообщений: 280
|
SCROLLINFO hScroll = {0};
SCROLLINFO vScroll ={0}; RECT RC; LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; RECT rt; int i; static int x, y; static POINT pts[3]; static HDC memDC; static HBITMAP hPicture; static BITMAP bm; int p = 3000; switch (message) /* handle the messages */ { case WM_CREATE: SetClassLong(hwnd, GCL_HBRBACKGROUND, (LONG) CreateSolidBrush(RGB(0,0,0)) ); hPicture = (HBITMAP)LoadImage(hInst, "Ginkgo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); InvalidateRect(hwnd, NULL, TRUE); break; case WM_SIZE: GetClientRect(hwnd, &RC); hScroll.cbSize = sizeof(SCROLLINFO); hScroll.fMask = SIF_RANGE; hScroll.nMin = 0; hScroll.nMax = p - RC.right; SetScrollInfo(hwnd, SB_HORZ, &hScroll, TRUE); vScroll.cbSize = sizeof(SCROLLINFO); vScroll.fMask = SIF_RANGE; vScroll.nMax =p - RC.bottom; vScroll.nMin = 0; SetScrollInfo(hwnd, SB_VERT, &vScroll, TRUE); InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); break; case WM_PAINT: hScroll.cbSize = sizeof(SCROLLINFO); hScroll.fMask = SIF_POS; GetScrollInfo(hwnd, SB_HORZ, &hScroll); vScroll.cbSize =sizeof(SCROLLINFO); vScroll.fMask = SIF_POS; GetScrollInfo(hwnd, SB_VERT, &vScroll); GetClientRect(hwnd, &RC); x = 0; y = 20; hdc = BeginPaint(hwnd, &ps); for(i = 0; i < 30; i++) { GetObject(hPicture, sizeof(bm), &bm); GetClientRect(hwnd, &rt); pts[0].x = x; pts[0].y = y; x += 20; y -= 20; pts[1].x = x; pts[1].y = y; y += 40; pts[2].y = y; pts[2].x = x; memDC = CreateCompatibleDC(hdc); SelectObject(memDC, hPicture); PlgBlt(hdc, pts, memDC, 0, 0, bm.bmWidth, bm.bmHeight, 0, 0, 0); DeleteDC(memDC); } EndPaint(hwnd, &ps); break; |
01.02.2013, 19:26 | #3 |
Форумчанин
Регистрация: 30.12.2010
Сообщений: 280
|
case WM_HSCROLL:
{ int HSp,HSp1; SCROLLINFO hScroll; hScroll.cbSize = sizeof(SCROLLINFO); hScroll.fMask = SIF_POS| SIF_RANGE | SIF_TRACKPOS; GetScrollInfo(hwnd, SB_HORZ, &hScroll); RECT RC; GetClientRect(hwnd, &RC); switch (LOWORD(wParam)) { case SB_LINERIGHT: case SB_PAGERIGHT: { HSp1 =(LOWORD(wParam) == SB_LINERIGHT) ? 10 : RC.right; HSp = hScroll.nMax - hScroll.nPos; if(HSp>HSp1) HSp=HSp1; hScroll.nPos = hScroll.nPos + HSp; break; } case SB_LINELEFT: case SB_PAGELEFT: { HSp1 =(LOWORD(wParam) == SB_LINELEFT) ? 10 : RC.right; HSp = hScroll.nPos - hScroll.nMin; if(HSp>HSp1) HSp=HSp1; HSp = -HSp; hScroll.nPos = hScroll.nPos + HSp; break; } case SB_THUMBTRACK: { HSp = hScroll.nTrackPos-hScroll.nPos; hScroll.nPos=hScroll.nTrackPos; break; } } hScroll.cbSize=sizeof(SCROLLINFO); hScroll.fMask = SIF_POS; ScrollWindowEx(hwnd, -HSp, 0, NULL, NULL, NULL, NULL, SW_ERASE); if(HSp > 0) RC.left = RC.right - HSp; else RC.right = RC.left - HSp; SetScrollInfo(hwnd,SB_HORZ, &hScroll, TRUE); InvalidateRect(hwnd, &RC, TRUE); UpdateWindow(hwnd); return 0; } case WM_VSCROLL: { SCROLLINFO vScroll; vScroll.cbSize = sizeof(SCROLLINFO); vScroll.fMask = SIF_POS | SIF_RANGE | SIF_TRACKPOS; GetScrollInfo(hwnd, SB_VERT, &vScroll); RECT RC; GetClientRect(hwnd, &RC); int VSp,VSp1; switch (LOWORD(wParam)) { case SB_LINEDOWN: case SB_PAGEDOWN: { VSp1= (LOWORD(wParam) == SB_LINEDOWN)? 10 : RC.bottom; VSp = vScroll.nMax - vScroll.nPos; if(VSp>VSp1)VSp=VSp1; vScroll.nPos = vScroll.nPos + VSp; break; } case SB_LINEUP: case SB_PAGEUP: { VSp1= (LOWORD(wParam) == SB_LINEUP)? 10 : RC.bottom; VSp = vScroll.nPos - vScroll.nMin; if(VSp>VSp1) VSp = VSp1; VSp=-VSp; vScroll.nPos = vScroll.nPos +VSp; break; } case SB_THUMBTRACK: { VSp =vScroll.nTrackPos - vScroll.nPos; vScroll.nPos = vScroll.nTrackPos; break; } default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } vScroll.cbSize = sizeof(SCROLLINFO); vScroll.fMask = SIF_POS; ScrollWindowEx(hwnd, 0, -VSp, NULL, NULL, NULL, NULL, SW_ERASE); if (VSp>0) RC.top = RC.bottom - VSp; else RC.bottom = RC.top -VSp; SetScrollInfo(hwnd, SB_VERT, &vScroll, TRUE); InvalidateRect(hwnd, &RC, TRUE); UpdateWindow(hwnd); return 0; } case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } |
03.02.2013, 04:50 | #4 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Да много ошибок. Разрывается изображение потому, что нет инвалидации нужной области. Но и сам подход к скроллингу какой-то кривой. Загрузив картинку, надо бы сразу ставить максимумы скроллов и больше их не менять. И при ресайзе окна менять только размер nPage.
И при WM_VSCROLL/WM_HSCROLL какие-то ненужные сложности. Вот как бы я написал: Код:
Последний раз редактировалось EUGY; 03.02.2013 в 05:56. Причина: чуток поправил |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Плавное движение липкого блока при скроллинге | xDyPx | JavaScript, Ajax | 9 | 23.01.2013 09:13 |
Почему при инверсии изображения, оно (изображение) исчезает? | Blame | Мультимедиа в Delphi | 1 | 02.10.2012 21:11 |
показать изображение при UserForm1.Show 0 | Blame | Microsoft Office Excel | 5 | 17.02.2012 01:15 |
Обрезать изображение при экране 800х600 | Kapitann | HTML и CSS | 0 | 14.09.2010 01:01 |