На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

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));
}
прерывание;



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz