|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Example of Scrolling a Bitmap
The following example enables the user to capture the screen content into a bitmap and scroll the bitmap in the client area.
HDC hdc; PAINTSTRUCT ps; SCROLLINFO si; /* These variables are required by BitBlt. */ static HDC hdcWin; /* window DC */ static HDC hdcScreen; /* DC for entire screen */ static HDC hdcScreenCompat; /* memory DC for screen */ static HBITMAP hbmpCompat; /* bitmap handle for old DC */ static BITMAP bmp; /* bitmap data structure */ static BOOL fBlt; /* TRUE if BitBlt occurred */
static BOOL fScroll; /* TRUE if scrolling occurred */ static BOOL fSize; /* TRUE if fBlt & WM_SIZE */ /* These variables are required for horizontal scrolling. */ static int xMinScroll; /* minimum horizontal scroll value */ static int xCurrentScroll; /* current horizontal scroll value */ static int xMaxScroll; /* maximum horizontal scroll value */ /* These variables are required for vertical scrolling. */
static int yMinScroll; /* minimum vertical scroll value */ static int yCurrentScroll; /* current vertical scroll value */ static int yMaxScroll; /* maximum vertical scroll value */ switch (uMsg) { case WM_CREATE: /* * Create a normal DC and a memory DC for the entire * screen. The normal DC provides a snapshot of the * screen contents. The memory DC keeps a copy of this * snapshot in the associated bitmap.
*/ hdcScreen = CreateDC("DISPLAY", (LPCSTR) NULL, (LPCSTR) NULL, (CONST DEVMODE *) NULL); hdcScreenCompat = CreateCompatibleDC(hdcScreen); /* * Retrieve the metrics for the bitmap associated with the * regular device context. */ bmp.bmBitsPixel = (BYTE) GetDeviceCaps(hdcScreen, BITSPIXEL); bmp.bmPlanes = (BYTE) GetDeviceCaps(hdcScreen, PLANES);
bmp.bmWidth = GetDeviceCaps(hdcScreen, HORZRES); bmp.bmHeight = GetDeviceCaps(hdcScreen, VERTRES); /* The width must be byte-aligned. */ bmp.bmWidthBytes = ((bmp.bmWidth + 15) &~15)/8; /* Create a bitmap for the compatible DC. */ hbmpCompat = CreateBitmap(bmp.bmWidth, bmp.bmHeight, bmp.bmPlanes, bmp.bmBitsPixel, (CONST VOID *) NULL); /* Select the bitmap for the compatible DC. */
SelectObject(hdcScreenCompat, hbmpCompat); /* Initialize the flags. */ fBlt = FALSE; fScroll = FALSE; fSize = FALSE; /* Initialize the horizontal scrolling variables. */ xMinScroll = 0; xCurrentScroll = 0; xMaxScroll = 0; /* Initialize the vertical scrolling variables. */ yMinScroll = 0; yCurrentScroll = 0; yMaxScroll = 0;
break; case WM_SIZE: { int xNewSize; int yNewSize; xNewSize = LOWORD(lParam); yNewSize = HIWORD(lParam); if (fBlt) fSize = TRUE; /* * The horizontal scrolling range is defined by * (bitmap_width) - (client_width). The current horizontal * scroll value remains within the horizontal scrolling range. */ 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); /* * The vertical scrolling range is defined by * (bitmap_height) - (client_height). The current vertical
* scroll value remains within the vertical scrolling range. */ 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 the window has been resized and the user has * captured the screen, use the following call to * BitBlt to paint the window's client area. */ if (fSize) { BitBlt(ps.hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcScreenCompat,
xCurrentScroll, yCurrentScroll, SRCCOPY); fSize = FALSE; } /* * If scrolling has occurred, use the following call to * BitBlt to paint the invalid rectangle. * * The coordinates of this rectangle are specified in the * RECT structure to which prect points. * * Note that it is necessary to increment the seventh * argument (prect->left) by xCurrentScroll and the
* eighth argument (prect->top) by yCurrentScroll in * order to map the correct pixels from the source bitmap. */ 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; /* xDelta = new_pos - current_pos */ int xNewPos; /* new position */ int yDelta = 0; switch (LOWORD(wParam)) { /* User clicked the shaft left of the scroll box. */ case SB_PAGEUP: xNewPos = xCurrentScroll - 50;
break; /* User clicked the shaft right of the scroll box. */ case SB_PAGEDOWN: xNewPos = xCurrentScroll + 50; break; /* User clicked the left arrow. */ case SB_LINEUP: xNewPos = xCurrentScroll - 5; break; /* User clicked the right arrow. */ case SB_LINEDOWN: xNewPos = xCurrentScroll + 5;
break; /* User dragged the scroll box. */ case SB_THUMBPOSITION: xNewPos = HIWORD(wParam); break; default: xNewPos = xCurrentScroll; } /* New position must be between 0 and the screen width. */ xNewPos = max(0, xNewPos); xNewPos = min(xMaxScroll, xNewPos); /* If the current position does not change, do not scroll.*/
if (xNewPos == xCurrentScroll) break; /* Set the scroll flag to TRUE. */ fScroll = TRUE; /* Determine the amount scrolled (in pixels). */ xDelta = xNewPos - xCurrentScroll; /* Reset the current scroll position. */ xCurrentScroll = xNewPos; /* * Scroll the window. (The system repaints most of the * client area when ScrollWindowEx is called; however, it is
* necessary to call UpdateWindow in order to repaint the * rectangle of pixels that were invalidated.) */ ScrollWindowEx(hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE); UpdateWindow(hwnd); /* Reset the scroll bar. */ 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; /* yDelta = new_pos - current_pos */ int yNewPos; /* new position */ switch (LOWORD(wParam)) { /* User clicked the shaft above the scroll box. */ case SB_PAGEUP: yNewPos = yCurrentScroll - 50; break; /* User clicked the shaft below the scroll box. */
case SB_PAGEDOWN: yNewPos = yCurrentScroll + 50; break; /* User clicked the top arrow. */ case SB_LINEUP: yNewPos = yCurrentScroll - 5; break; /* User clicked the bottom arrow. */ case SB_LINEDOWN: yNewPos = yCurrentScroll + 5; break; /* User dragged the scroll box. */
case SB_THUMBPOSITION: yNewPos = HIWORD(wParam); break; default: yNewPos = yCurrentScroll; } /* New position must be between 0 and the screen height. */ yNewPos = max(0, yNewPos); yNewPos = min(yMaxScroll, yNewPos); /* If the current position does not change, do not scroll.*/ if (yNewPos == yCurrentScroll) break;
/* Set the scroll flag to TRUE. */ fScroll = TRUE; /* Determine the amount scrolled (in pixels). */ yDelta = yNewPos - yCurrentScroll; /* Reset the current scroll position. */ yCurrentScroll = yNewPos; /* * Scroll the window. (The system repaints most of the * client area when ScrollWindowEx is called; however, it is * necessary to call UpdateWindow in order to repaint the
* rectangle of pixels that were invalidated.) */ ScrollWindowEx(hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE); UpdateWindow(hwnd); /* Reset the scroll bar. */ si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = yCurrentScroll; SetScrollInfo(hwnd, SB_VERT, &si, TRUE); } break;
case WM_COMMAND: /* uMsg: command from app. menu */ switch(wParam) { case IDM_STC: /* * Copy the contents of the current screen * into the compatible DC. */ BitBlt(hdcScreenCompat, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcScreen, 0, 0, SRCCOPY); /* * Copy the compatible DC to the client area.
*/ 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;
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Пример Прокрутки Побитового отображения
Следующий пример позволяет потребителя, чтобы захватывать экранное содержимое в побитовое отображение и перемещать побитовое отображение в область клиента.
hdc HDC; ps PAINTSTRUCT; si SCROLLINFO; /* Эти переменные потребовались BitBlt. */ статический HDC hdcWin; /* окно DC */ статический HDC hdcScreen; /* DC ДЛЯ целого экрана */ статический HDC hdcScreenCompat; /* память DC для экрана */ статический HBITMAP hbmpCompat; /* ручка побитового отображения для старого DC */ статическое ПОБИТОВОЕ отображение bmp; /* структура данных побитового отображения */ статический BOOL fBlt; /* ИСТИНА если BitBlt происходил бы */
статический BOOL fScroll; /* ИСТИНА при прокрутке происходила */ статический BOOL fSize; /* ИСТИНА если fBlt & WM_SIZE */ /* Эти переменные необходимы для горизонтального scrolling. */ статический int xMinScroll; /* минимальный горизонтальный перемещать величину */ статический int xCurrentScroll; /* текущий горизонтальный перемещать величину */ статический int xMaxScroll; /* максимальный горизонтальный перемещать величину */ /* Эти переменные необходимы для вертикального scrolling. */
статический int yMinScroll; /* минимальный вертикальный перемещать величину */ статический int yCurrentScroll; /* текущий вертикальный перемещать величину */ статический int yMaxScroll; /* максимальный вертикальный перемещать величину */ ключ (uMsg) { случай WM_CREATE: /* * Создайте нормальную DC и память DC для целого * экран. Нормальный DC обеспечивает кадр the * экранное содержание. Память DC держит копию этого * кадр в связанном побитовом отображении.
*/ hdcScreen = CreateDC("DISPLAY", (LPCSTR) НЕДЕЙСТВИТЕЛЬНЫЙ, (LPCSTR) НЕДЕЙСТВИТЕЛЬНЫЙ, (CONST DEVMODE *) НЕДЕЙСТВИТЕЛЬНЫЙ); hdcScreenCompat = CreateCompatibleDC(hdcScreen); /* * Извлеките метрику для побитового отображения связанного the * регулярный контекст устройства. */ bmp.bmBitsPixel = (БАЙТ) GetDeviceCaps(hdcScreen, BITSPIXEL); bmp.bmPlanes = (БАЙТ) GetDeviceCaps(hdcScreen, ПЛАНЫ);
bmp.bmWidth = GetDeviceCaps(hdcScreen, HORZRES); bmp.bmHeight = GetDeviceCaps(hdcScreen, VERTRES); /* Ширина должна быть byte-aligned. */ bmp.bmWidthBytes = ((bmp.bmWidth + 15) &~15)/8; /* Создайте побитовое отображение для совместимого DC. */ hbmpCompat = CreateBitmap(bmp.bmWidth, bmp.bmHeight, bmp.bmPlanes, bmp.bmBitsPixel, (ПУСТОТА CONST *) НЕДЕЙСТВИТЕЛЬНЫЙ); /* Выберитесь побитовое отображение для совместимого DC. */
SelectObject(hdcScreenCompat, hbmpCompat); /* Инициализируйте flags. */ fBlt = ЛОЖЬ; fScroll = ЛОЖЬ; fSize = ЛОЖЬ; /* Инициализируйте горизонтальную прокрутку variables. */ xMinScroll = 0; xCurrentScroll = 0; xMaxScroll = 0; /* Инициализируйте вертикальную прокрутку variables. */ yMinScroll = 0; yCurrentScroll = 0; yMaxScroll = 0;
прерывание; случай WM_SIZE: { int xNewSize; int yNewSize; xNewSize = LOWORD(lParam); yNewSize = HIWORD(lParam); если (fBlt) fSize = ИСТИНА; /* * Горизонтальная прокрутка дипазона определена * (bitmap_width) - (client_width). Течение горизонтальное * переместите остатки величины в пределах горизонтальной прокрутки дипазона. */ 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, ИСТИНА); /* * Вертикальная прокрутка дипазона определена * (bitmap_height) - (client_height). Течение вертикальное
* переместите остатки величины в пределах вертикальной прокрутки дипазона. */ 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, ИСТИНА);
} прерывание; случай WM_PAINT: { PRECT prect; hdc = BeginPaint(hwnd, &ps); /* * Если окно поменено размеры и пользователь имеет * захваченный экран, использует следующее вызова, чтобы * BitBlt, ЧТОБЫ закрашивать область клиента окна. */ если (fSize) { BitBlt(ps.hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcScreenCompat,
xCurrentScroll, yCurrentScroll, SRCCOPY); fSize = ЛОЖЬ; } /* * Если прокрутка произошла бы, используйте следующее вызова, чтобы * BitBlt, ЧТОБЫ закрашивать неправильный прямоугольник. * * Координаты этого прямоугольника определены в the * СТРУКТУРА RECT на которую prect точки. * * Отметьте, что необходимо должно увеличивать седьмой * аргумент (prect->left) xCurrentScroll и .Jчемjтем
* восьмой аргумент (prect->top) yCurrentScroll в * порядок, чтобы отображать правильные пиксели из исходного побитового отображения. */ если (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 = ЛОЖЬ; } EndPaint(hwnd, &ps); } прерывание; случай WM_HSCROLL: { int xDelta; /* xDelta = new_pos - current_pos */ int xNewPos; /* новая позиция */ int yDelta = 0; ключ (LOWORD(wParam)) { /* Пользователь щелкнувший вал слева от перемещает box. */ случай SB_PAGEUP: xNewPos = xCurrentScroll - 50;
прерывание; /* Пользователь щелкнувший право вала перемещать box. */ случай SB_PAGEDOWN: xNewPos = xCurrentScroll + 50; прерывание; /* Пользователь щелкнувший левый arrow. */ случай SB_LINEUP: xNewPos = xCurrentScroll - 5; прерывание; /* Пользователь щелкнувший право arrow. */ случай SB_LINEDOWN: xNewPos = xCurrentScroll + 5;
прерывание; /* Пользователь потащенный перемещать box. */ случай SB_THUMBPOSITION: xNewPos = HIWORD(wParam); прерывание; умолчание: xNewPos = xCurrentScroll; } /* Новая позиция должна быть между 0 и экраном width. */ xNewPos = max(0, xNewPos); xNewPos = min(xMaxScroll, xNewPos); /* Если текущая позиция не изменяется, не сделайте scroll.*/
если прерывание (xNewPos == xCurrentScroll); /* Установите перемещать флаг на TRUE. */ fScroll = ИСТИНА; /* Определите прокрученную сумму (на пикселях). */ xDelta = xNewPos - xCurrentScroll; /* Восстановите течение перемещать position. */ xCurrentScroll = xNewPos; /* * Переместите окно. ( Система перекрашивает наиболее the * область клиента когда ScrollWindowEx назван; тем не менее, это
* необходимый называть UpdateWindow для того, чтобы перекрашивать the * прямоугольник пикселей, которые были invalidated.) */ ScrollWindowEx(hwnd, -xDelta, -yDelta, (CONST RECT *) НЕДЕЙСТВИТЕЛЬНЫЙ, (CONST RECT *) НЕДЕЙСТВИТЕЛЬНЫЙ, (HRGN) НЕДЕЙСТВИТЕЛЬНЫЙ, (LPRECT) НЕДЕЙСТВИТЕЛЬНЫЙ, SW_INVALIDATE); UpdateWindow(hwnd); /* Восстановите перемещать bar. */ si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = xCurrentScroll;
SetScrollInfo(hwnd, SB_HORZ, &si, ИСТИНА); } прерывание; случай WM_VSCROLL: { int xDelta = 0; int yDelta; /* yDelta = new_pos - current_pos */ int yNewPos; /* новая позиция */ ключ (LOWORD(wParam)) { /* Пользователь щелкнувший вал выше перемещать box. */ случай SB_PAGEUP: yNewPos = yCurrentScroll - 50; прерывание; /* Пользователь щелкнувший вал ниже перемещать box. */
случай SB_PAGEDOWN: yNewPos = yCurrentScroll + 50; прерывание; /* Пользователь щелкнувший верх arrow. */ случай SB_LINEUP: yNewPos = yCurrentScroll - 5; прерывание; /* Пользователь щелкнувший низ arrow. */ случай SB_LINEDOWN: yNewPos = yCurrentScroll + 5; прерывание; /* Пользователь потащенный перемещать box. */
случай SB_THUMBPOSITION: yNewPos = HIWORD(wParam); прерывание; умолчание: yNewPos = yCurrentScroll; } /* Новая позиция должна быть между 0 и экраном height. */ yNewPos = max(0, yNewPos); yNewPos = min(yMaxScroll, yNewPos); /* Если текущая позиция не изменяется, не сделайте scroll.*/ если прерывание (yNewPos == yCurrentScroll);
/* Установите перемещать флаг на TRUE. */ fScroll = ИСТИНА; /* Определите прокрученную сумму (на пикселях */ yDelta = yNewPos - yCurrentScroll; /* Восстановите течение перемещать position. */ yCurrentScroll = yNewPos; /* * Переместите окно. ( Система перекрашивает наиболее the * область клиента когда ScrollWindowEx назван; тем не менее, это * необходимый называть UpdateWindow для того, чтобы перекрашивать the
* прямоугольник пикселей, которые были invalidated.) */ ScrollWindowEx(hwnd, -xDelta, -yDelta, (CONST RECT *) НЕДЕЙСТВИТЕЛЬНЫЙ, (CONST RECT *) НЕДЕЙСТВИТЕЛЬНЫЙ, (HRGN) НЕДЕЙСТВИТЕЛЬНЫЙ, (LPRECT) НЕДЕЙСТВИТЕЛЬНЫЙ, SW_INVALIDATE); UpdateWindow(hwnd); /* Восстановите перемещать bar. */ si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = yCurrentScroll; SetScrollInfo(hwnd, SB_VERT, &si, ИСТИНА); } прерывание;
случай WM_COMMAND: /* uMsg: команда из app. меню */ ключ(wParam) { случай IDM_STC: /* * Скопируйте содержание текущего экрана * в совместимый DC. */ BitBlt(hdcScreenCompat, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcScreen, 0, 0, SRCCOPY); /* * Скопируйте совместимый DC в область клиента.
*/ hdcWin = GetDC(hwnd); BitBlt(hdcWin, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcScreenCompat, 0, 0, SRCCOPY); ReleaseDC(hwnd, hdcWin); fBlt = ИСТИНА; прерывание; умолчание: возврат (DefWindowProc(hwnd, uMsg, wParam, lParam)); } прерывание;
|
|
|
|
| |