|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Example of Scrolling Text
The following example shows how to have your application scroll text in response to input from the horizontal and vertical scroll bars.
HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm; SCROLLINFO si; /* These variables are required to display text. */ static int xClient; /* width of client area */ static int yClient; /* height of client area */ static int xClientMax; /* maximum width of client area */ static int xChar; /* horizontal scrolling unit */ static int yChar; /* vertical scrolling unit */
static int xUpper; /* average width of uppercase letters */ static int xPos; /* current horizontal scrolling position */ static int yPos; /* current vertical scrolling position */ static int xMax; /* maximum horiz. scrolling position */ static int yMax; /* maximum vert. scrolling position */ int xInc; /* horizontal scrolling increment */ int yInc; /* vertical scrolling increment */
int i; /* loop counter */ int x, y; /* horiz. and vert. printing coords */ int FirstLine; /* first line in the invalidated area */ int LastLine; /* last line in the invalidated area */ /* Create an array of lines to display. */ #define LINES 27 static char *abc[] = { "anteater", "bear", "cougar", "dingo", "elephant", "frog", "gazelle", "hyena", "iguana", "jackal",
"kangaroo", "llama", "moose", "newt", "octopus", "penguin", "quail", "rat", "squid", "tortoise", "urus", "vole", "walrus", "xylophone", "yak", "zebra", "This line contains many words, but no character. Go figure." }; switch (uMsg) { case WM_CREATE : /* Get the handle of the client area's device context. */ hdc = GetDC (hwnd); /* Extract font dimensions from the text metrics. */ GetTextMetrics (hdc, &tm);
xChar = tm.tmAveCharWidth; xUpper = (tm.tmPitchAndFamily & 1 ? 3 : 2) * xChar/2; yChar = tm.tmHeight + tm.tmExternalLeading; /* Free the device context. */ ReleaseDC (hwnd, hdc); /* * Set an arbitrary maximum width for client area. * (xClientMax is the sum of the widths of 48 average * lowercase letters and 12 uppercase letters.) */ xClientMax = 48 * xChar + 12 * xUpper;
return 0; case WM_SIZE: /* Retrieve the dimensions of the client area. */ yClient = HIWORD (lParam); xClient = LOWORD (lParam); /* * Determine the maximum vertical scrolling position. * The two is added for extra space below the lines * of text. */ yMax = max (0, LINES + 2 - yClient/yChar); /* * Make sure the current vertical scrolling position
* does not exceed the maximum. */ yPos = min (yPos, yMax); /* * Adjust the vertical scrolling range and scroll box * position to reflect the new yMax and yPos values. */ si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = 0; si.nMax = yMax; si.nPage = yClient / yChar; si.nPos = yPos; SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
/* * Determine the maximum horizontal scrolling position. * The two is added for extra space to the right of the * lines of text. */ xMax = max (0, 2 + (xClientMax - xClient)/xChar); /* * Make sure the current horizontal scrolling position * does not exceed the maximum. */ xPos = min (xPos, xMax); /* * Adjust the horizontal scrolling range and scroll box
* position to reflect the new xMax and xPos values. */ si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = 0; si.nMax = xMax; si.nPage = xClient / xChar; si.nPos = xPos; SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); return 0; case WM_PAINT: /* Prepare the window for painting. */ hdc = BeginPaint(hwnd, &ps);
/* * Use the current vertical scrolling position and * coordinates of the invalid rectangle to determine * the range of new lines that should be drawn in the * client area. */ FirstLine = max (0, yPos + ps.rcPaint.top/yChar - 1); LastLine = min (LINES, yPos + ps.rcPaint.bottom/yChar); /* Display these lines. */ for (i = FirstLine;i < LastLine;i++) { x = xChar * (1 - xPos);
y = yChar * (1 - yPos + i); TextOut (hdc, x, y, abc[i], lstrlen(abc[i])); } /* Indicate that painting is finished. */ EndPaint(hwnd, &ps); break; case WM_HSCROLL: switch(LOWORD (wParam)) { /* User clicked shaft left of the scroll box. */ case SB_PAGEUP: xInc = -8; break; /* User clicked shaft right of the scroll box. */
case SB_PAGEDOWN: xInc = 8; break; /* User clicked the left arrow. */ case SB_LINEUP: xInc = -1; break; /* User clicked the right arrow. */ case SB_LINEDOWN: xInc = 1; break; /* User dragged the scroll box. */ case SB_THUMBTRACK: xInc = HIWORD(wParam) - xPos;
break; default: xInc = 0; } /* * If applying the horizontal scrolling increment does not * take the scrolling position out of the scrolling range, * increment the scrolling position, adjust the position * of the scroll box, and update the window. */ if (xInc = max (-xPos, min (xInc, xMax - xPos))) { xPos += xInc;
ScrollWindowEx (hwnd, -xChar * xInc, 0, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = xPos; SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); UpdateWindow (hwnd); } return 0; case WM_VSCROLL: switch(LOWORD (wParam)) { /* User clicked the shaft above the scroll box. */
case SB_PAGEUP: yInc = min(-1, -yClient / yChar); break; /* User clicked the shaft below the scroll box. */ case SB_PAGEDOWN: yInc = max(1, yClient / yChar); break; /* User clicked the top arrow. */ case SB_LINEUP: yInc = -1; break; /* User clicked the bottom arrow. */
case SB_LINEDOWN: yInc = 1; break; /* User dragged the scroll box. */ case SB_THUMBTRACK: yInc = HIWORD(wParam) - yPos; break; default: yInc = 0; } /* * If applying the vertical scrolling increment does not * take the scrolling position out of the scrolling range, * increment the scrolling position, adjust the position
* of the scroll box, and update the window. UpdateWindow * sends the WM_PAINT message. */ if (yInc = max(-yPos, min(yInc, yMax - yPos))) { yPos += yInc; ScrollWindow(hwnd, 0, -yChar * yInc, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = YPos;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE); UpdateWindow (hwnd); } return 0;
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Пример Прокрутки Текста
Следующий пример показывает как, чтобы иметь ваше приложение перемещать текст в ответ на вклад из горизонтального и вертикального перемещать бары.
hdc HDC; ps PAINTSTRUCT; tm TEXTMETRIC; si SCROLLINFO; /* Эти переменные требуется отображают text. */ статический int xClient; /* ширина области клиента */ статический int yClient; /* высота области клиента */ статический int xClientMax; /* максимальная ширина области клиента */ статический int xChar; /* горизонтальная прокрутка устройства */ статический int yChar; /* вертикальная прокрутка устройства */
статический int xUpper; /* средняя ширина писем верхнего регистра */ статический int xPos; /* текущая горизонтальная прокрутка позиции */ статический int yPos; /* текущая вертикальная прокрутка позиции */ статический int xMax; /* максимум horiz. перемещая позицию */ статический int yMax; /* максимум vert. перемещая позицию */ int xInc; /* горизонтальная прокрутка приращения */ int yInc; /* вертикальная прокрутка приращения */
int i; /* счетчик цикла */ int x, y; /* horiz. и vert. печатая coords */ int FirstLine; /* первая линия в аннулировать области */ int LastLine; /* последняя линия в аннулировать области */ /* Создайте массив линий в display. */ ЛИНИИ #define 27 статический символ *азбука[] = { "муравьед", "медведь", "пума", "dingo", "слон", "лягушка", "газель", "гиена", "игуана", "шакал",
"кенгуру", "лама", "лось", "тритон", "осьминог", "пингвин", "перепел", "крыса", "кальмар", "черепаха", "urus", "vole", "морж", "ксилофон", "як", "зебра", "Эта линия содержит много слова, но никакой символ. Пойдите фигурой." }; ключ (uMsg) { случай WM_CREATE : /* Получите ручку устройства области клиента context. */ hdc = GetDC (hwnd); /* Извлеките шрифтовые измерения из текста metrics. */ GetTextMetrics (hdc, &tm);
xChar = tm.tmAveCharWidth; xUpper = (tm.tmPitchAndFamily & 1? 3 : 2) * xChar/2; yChar = tm.tmHeight + tm.tmExternalLeading; /* Освободите устройство context. */ ReleaseDC (hwnd, hdc); /* * Установите произвольную максимальную ширину для области клиента. * (xClientMax - сумма ширины 48 средних чисел * письма верхнего регистра и 12 верхних регистров letters.) */ xClientMax = 48 * xChar + 12 * xUpper;
возврат 0; случай WM_SIZE: /* Извлеките измерения клиента area. */ yClient = HIWORD (lParam); xClient = LOWORD (lParam); /* * Определите максимальную вертикальную прокрутку позиции. * Два добавлены для дополнительного пространства ниже линий * текста. */ yMax = max (0, ЛИНИИ + 2 - yClient/yChar); /* * Убедитесь позицию вертикальная прокрутка течения
* не превышает максимум. */ yPos = min (yPos, yMax); /* * Отрегулируйте вертикальную прокрутку дипазона и перемещайте ящик * позиция, чтобы отражать новые yMax и величины yPos. */ si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = 0; si.nMax = yMax; si.nPage = yClient / yChar; si.nPos = yPos; SetScrollInfo(hwnd, SB_VERT, &si, ИСТИНА);
/* * Определите максимальную горизонтальную прокрутку позиции. * Два добавлены для дополнительного пространства вправо от the * строки текста. */ xMax = max (0, 2 + (xClientMax - xClient)/xChar); /* * Убедитесь позицию горизонтальная прокрутка течения * не превышает максимум. */ xPos = min (xPos, xMax); /* * Отрегулируйте горизонтальную прокрутку дипазона и перемещайте ящик
* позиция, чтобы отражать новые xMax и величины xPos. */ si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = 0; si.nMax = xMax; si.nPage = xClient / xChar; si.nPos = xPos; SetScrollInfo(hwnd, SB_HORZ, &si, ИСТИНА); возврат 0; случай WM_PAINT: /* Подготовьте окно к painting. */ hdc = BeginPaint(hwnd, &ps);
/* * Используйте текущую вертикальную прокрутку позиции и * координаты неправильного прямоугольника, чтобы определяться * дипазон новых линий, которые должны быть втянуты the * область клиента. */ FirstLine = max (0, yPos + ps.rcPaint.top/yChar - 1); LastLine = min (ЛИНИИ, yPos + ps.rcPaint.bottom/yChar); /* Отобразите этот lines. */ для (i = FirstLine;я < LastLine;я++) { x = xChar * (1 - xPos);
y = yChar * (1 - yPos + я); TextOut (hdc, x, y, АЗБУКА[i], lstrlen(азбука[i])); } /* Укажите, что живопись является finished. */ EndPaint(hwnd, &ps); прерывание; случай WM_HSCROLL: ключ(LOWORD (wParam)) { /* Потребитель щелкнувший вал слева от перемещает box. */ случай SB_PAGEUP: xInc = -8; прерывание; /* Потребитель щелкнувший право вала перемещать box. */
случай SB_PAGEDOWN: xInc = 8; прерывание; /* Потребитель щелкнувший левый arrow. */ случай SB_LINEUP: xInc = -1; прерывание; /* Потребитель щелкнувший право arrow. */ случай SB_LINEDOWN: xInc = 1; прерывание; /* Потребитель потащенный перемещать box. */ случай SB_THUMBTRACK: xInc = HIWORD(wParam) - xPos;
прерывание; невыполнение: xInc = 0; } /* * При применении горизонтальной прокрутки приращения нет * возьмите прокрутку позиции из прокрутки дипазона, * увеличьте прокрутку позиции, регулируйте позицию *, переместите ящик и корректируйте окно. */ если (xInc = max (-xPos, min (xInc, xMax - xPos))) { xPos += xInc;
ScrollWindowEx (hwnd, -xChar * xInc, 0, (CONST RECT *) НЕДЕЙСТВИТЕЛЬНЫЙ, (CONST RECT *) НЕДЕЙСТВИТЕЛЬНЫЙ, (HRGN) НЕДЕЙСТВИТЕЛЬНЫЙ, (LPRECT) НЕДЕЙСТВИТЕЛЬНЫЙ, SW_INVALIDATE); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = xPos; SetScrollInfo(hwnd, SB_HORZ, &si, ИСТИНА); UpdateWindow (hwnd); } возврат 0; случай WM_VSCROLL: ключ(LOWORD (wParam)) { /* Потребитель щелкнувший вал выше перемещать box. */
случай SB_PAGEUP: yInc = min(-1, -yClient / yChar); прерывание; /* Потребитель щелкнувший вал ниже перемещать box. */ случай SB_PAGEDOWN: yInc = max(1, yClient / yChar); прерывание; /* Потребитель щелкнувший верх arrow. */ случай SB_LINEUP: yInc = -1; прерывание; /* Потребитель щелкал нижнюю стрелу. */
случай SB_LINEDOWN: yInc = 1; прерывание; /* Потребитель потащенный перемещать box. */ случай SB_THUMBTRACK: yInc = HIWORD(wParam) - yPos; прерывание; невыполнение: yInc = 0; } /* * При применении вертикальной прокрутки приращения нет * возьмите прокрутку позиции из прокрутки дипазона, * увеличьте прокрутку позиции, регулируйте позицию
*, переместите ящик и корректируйте окно. UpdateWindow * посылает сообщение WM_PAINT. */ если (yInc = max(-yPos, min(yInc, yMax - yPos))) { yPos += yInc; ScrollWindow(hwnd, 0, -yChar * yInc, (CONST RECT *) НЕДЕЙСТВИТЕЛЬНЫЙ, (CONST RECT *) НЕДЕЙСТВИТЕЛЬНЫЙ, (HRGN) НЕДЕЙСТВИТЕЛЬНЫЙ, (LPRECT) НЕДЕЙСТВИТЕЛЬНЫЙ, SW_INVALIDATE); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = YPos;
SetScrollInfo(hwnd, SB_VERT, &si, ИСТИНА); UpdateWindow (hwnd); } возврат 0;
|
|
|
|
| |