Управление полосой просмотра

Для установки ползунка в заданную позицию следует использовать функцию 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);

 

}