Управление полосой просмотра
Для установки ползунка в заданную позицию следует использовать функцию SetScrollPos:
SetScrollPos(HWND hwnd, int fnBar, int nPos, BOOL fRepaint);
Параметры hwnd и fnBar определяют, соответственно, идентификатор окна органа управления и тип полосы просмотра.
Параметр nPos определяет новое положение ползунка. Значение этого параметра должно находиться в пределах установленного диапазона.
Параметр fRepaint определяет, нужно ли перерисовывать полосу просмотра после установки новой позиции.
Для определения текущей позиции надо вызвать функцию GetScrollPos:
GetScrollPos(HWND hwnd, int fnBar);
Параметры этой функции определяют, соответственно, идентификатор окна или органа управления и тип полосы просмотра. Функция возвращает текущую позицию или 0.
Пример 2: Приложение SCROLL
Приложение SCROLL представляет собой простейший пример использования горизонтальной полосы просмотра для изменения горизонтального размера (ширины) статического органа управления (рис. 4).
Рис. 4. Главное окно приложения SCROLL
#define STRICT 1
#include <windows.h>
#include <stdio.h>
#include <string>
#include <tchar.h>
//using namespace std;
#define ID_SCROLL 1
using namespace std;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
TCHAR const szClassName[] = _T("ButtonAppClass");
// Заголовок окна
TCHAR const szWindowTitle[] = _T("Button Demo");
// Текущая позиция полосы просмотра
int nPosition;
// Идентификатор окна полосы просмотра
HWND hScroll;
// Идентификатор статического органа управления
HWND hStatic;
//================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
TCHAR szClassName[] = _T("KWndClass");
// Идентификаторы кнопок
WNDCLASS wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=wc.cbWndExtra=0;
wc.lpfnWndProc=WndProc;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName=(LPCTSTR)NULL;
wc.lpszClassName=szClassName;
if (!RegisterClass(&wc))
{
MessageBox(NULL,_T("Не могу зарегестрировать класс"),_T("Error"),MB_OK);
return 0;
}
hWnd=CreateWindow(szClassName,_T("Program No"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,
hInstance,NULL);
if (!hWnd)
{
MessageBox(NULL,_T("Не могу создать окно"),_T("Error"),MB_OK);
return 0;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
// Создаем полосу просмотра
hScroll = CreateWindow(_T("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE | SBS_HORZ,
20, 60,
200, 15,
hWnd,
(HMENU)ID_SCROLL,
hInstance, NULL);
// Устанавливаем текущую позицию
nPosition = 100;
// Устанавливаем минимальное и максимальное
// значения для полосы просмотра
SetScrollRange(hScroll, SB_CTL, 1, 200, TRUE);
// Устанавливаем ползунок в середину
// полосы просмотра
SetScrollPos(hScroll, SB_CTL, nPosition, TRUE);
// Создаем статический орган управления в виде
// черного прямоугольника. Длина этого прямоугольника
// будет определяться текущей позицией полосы просмотра
hStatic = CreateWindow(_T("static"), NULL,
WS_CHILD | WS_VISIBLE | SS_BLACKRECT,
20, 40, nPosition, 15,
hWnd, (HMENU) -1,hInstance, NULL);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//=================================================
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_HSCROLL:
{
// В зависимости от параметра сообщения изменяем текущую позицию
switch (wParam)
{
case SB_PAGEDOWN:
{
nPosition += 10;
break;
}
case SB_LINEDOWN:
{
nPosition += 1;
break;
}
case SB_PAGEUP:
{
nPosition -= 10;
break;
}
case SB_LINEUP:
{
nPosition -= 1;
break;
}
case SB_TOP:
{
nPosition = 0;
break;
}
case SB_BOTTOM:
{
nPosition = 200;
break;
}
case SB_THUMBPOSITION:
{
nPosition = LOWORD (lParam);
break;
}
case SB_THUMBTRACK:
{
nPosition = LOWORD (lParam);
break;
}
default:
break;
}
// Ограничиваем пределы изменения текущей
// позиции значениями от 1 до 200
if(nPosition > 200) nPosition = 200;
if(nPosition < 1) nPosition = 1;
// Устанавливаем ползунок полосы просмотра
// в соответствии с новым значением текущей позиции
SetScrollPos(hScroll, SB_CTL, nPosition, TRUE);
// Устанавливаем новый размер статического
// органа управления
MoveWindow(hStatic, 20, 40, nPosition, 15, TRUE);
return 0;
}
// Обеспечиваем управление полосой просмотра
// при помощи клавиатуры
case WM_KEYDOWN:
{
// В зависимости от кода клавиши функция окна
// посылает сама себе сообщения, которые
// обычно генерируются полосой просмотра
switch (wParam)
{
case VK_HOME:
{
SendMessage(hWnd, WM_HSCROLL, SB_TOP, 0L);
break;
}
case VK_END:
{
SendMessage(hWnd, WM_HSCROLL, SB_BOTTOM, 0L);
break;
}
case VK_LEFT:
{
SendMessage(hWnd, WM_HSCROLL, SB_LINEUP, 0L);
break;
}
case VK_RIGHT:
{
SendMessage(hWnd, WM_HSCROLL, SB_LINEDOWN, 0L);
break;
}
case VK_PRIOR:
{
SendMessage(hWnd, WM_HSCROLL, SB_PAGEUP, 0L);
break;
}
case VK_NEXT:
{
SendMessage(hWnd, WM_HSCROLL, SB_PAGEDOWN, 0L);
break;
}
}
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}