№ | Сообщение | Действие |
PBM_SETPOS | Устанавливает значение текущей позиции индикатора. wParamсодержит значение новой позиции. lParamдолжен быть равен 0 | |
РВМ SETRANGE | Устанавливает диапазон значений индикатора. Возвращаются значения пределов прежнего диапазона: значение нижней границы содержится в младшем слове, а верхней – в старшем. wParam должен быть равен 0. lParamсодержит значения нового диапазона. Значение верхней границы содержится в старшем слове, а нижней – в младшем | |
РВМ_SETSTEP | Устанавливает значение шага индикатора. wParamсодержит значение нового шага. lParamдолжен быть равен 0 | |
РВМ STEPIT | Увеличивает значение позиции индикатора на заданный шаг. wParamдолжен быть равен 0. lParamдолжен быть равен 0 |
По умолчанию индикатор имеет диапазон значений от 0 до 100. Но можно установить любой другой диапазон в промежутке от 0 до 65535. Обычно состояние индикатора изменяется после посылки ему сообщения PBM_STEPIT,которое приводит к увеличению позиции индикатора на величину его инкремента, называемую шагом. По умолчанию шаг индикатора равен 10, но Вы можете установить его по своему усмотрению. По мере увеличения значения позиции индикатора заполняется все большая часть элемента. Поскольку индикатор используется для отображения степени завершенности какого-либо процесса, полностью заполненный индикатор соответствует стопроцентному завершению процесса.
Пример 11-4. Программа с индикатором
Приведенный ниже небольшой пример иллюстрирует использование индикатора. В этой программе создается диалог, содержащий индикатор и кнопку Шаг процесса. Индикатор имеет диапазон значений от 0 до 50 и шаг, равный 5. При каждом нажатии кнопки Шаг процесса позиция индикатора увеличивается на заданный шаг. При полном заполнении индикатора диалог автоматически закрывается.
// Демонстрация индикатора процесса
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include <Commctrl.h>
#include "Prog.h"
#define Max 50
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM);
char szWinName[] = "МоеОкно"; // Имя класса окна
HINSTANCE hInst;
int WINAPI WinMain (HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASS wcl;
HACCEL hAccel;
// Определить класс окна
wcl.hInstance=hThisInst; // Дескриптор приложения
wcl.lpszClassName=szWinName; // Имя класса окна
wcl.lpfnWndProc=WindowFunc; // Функция окна
wcl.style=0; // Стиль по умолчанию
wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION); // Иконка
wcl.hCursor=LoadCursor(NULL,IDC_ARROW); // Курсор
wcl.lpszMenuName="MYMENU"; // Меню
wcl.cbClsExtra=0; // Без дополнительной
wcl.cbWndExtra=0; // информации
// Определить заполнение окна белым цветом
wcl.hbrBackground=
(HBRUSH)GetStockObject(WHITE_BRUSH);
if(!RegisterClass(&wcl)) // Зарегистр. класс окна
return 0;
// Создать окно
hwnd=CreateWindow(szWinName, // Имя класса
"Демонстрация индикатора", // Заголовок
WS_OVERLAPPEDWINDOW,// Стиль окна
CW_USEDEFAULT, // Х-координата
CW_USEDEFAULT, // Y-координата
CW_USEDEFAULT, // Ширина окна
CW_USEDEFAULT, // Высота окна
HWND_DESKTOP, // Нет родит. окна
NULL, // Нет меню
hThisInst, // Дескрип. приложения
NULL); // Без дополит. аргументов
hInst=hThisInst; // Сохранить дескриптор приложения
// Загрузить акселераторы
hAccel=LoadAccelerators(hThisInst,"MYMENU");
InitCommonControls(); // Общие элементы управления
ShowWindow(hwnd,nWinMode); // Показать окно и
UpdateWindow(hwnd); // перерисовать содержимое
// Запустить цикл обработки сообщений
while(GetMessage (&msg,NULL,0,0))
if(!TranslateAccelerator(hwnd,hAccel,&msg))
{
TranslateMessage(&msg); // Использ.клавиатуры
DispatchMessage (&msg); // Возврат к Windows
}
return msg. wParam;
}
// Следующая функция вызывается операционной системой
// Windows и получает в качестве параметров сообщения
// из очереди сообщений данного приложения
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_DIALOG:
DialogBox(hInst,"MYDB",hwnd,
DialogFunc);
break;
case IDM_HELP:
MessageBox(hwnd,"Помощь","Помощь",
MB_OK);
break;
}
break;
case WM_DESTROY: // Завершение программы
PostQuitMessage(0);
break;
default:
// Все сообщения, не обрабатываемые в данной
// функции, направляются на обработку по
// умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
}
return 0;
}
//
// Простая функция диалога
//
BOOL CALLBACK DialogFunc(HWND hdwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
static HWND hProgWnd;
static long pos = 0;
switch(message)
{
case WM_INITDIALOG:
pos=0;
hProgWnd=CreateWindowEx
(0, // Без дополнительного стиля
PROGRESS_CLASS,
"Progress Bar", // Не используется
WS_CHILD|WS_BORDER|WS_VISIBLE,
10,70,110,20, hdwnd, NULL, hInst,
NULL);
// Установить диапазон и шаг
SendMessage(hProgWnd, PBM_SETRANGE, 0,
(LPARAM)MAKELONG(0, 50));
SendMessage(hProgWnd, PBM_SETPOS, (WPARAM)5,
0);
return 1;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hdwnd, 0);
return 1;
case ID_PROG:
SendMessage(hProgWnd, PBM_STEPIT, 0,
0);
pos += 5; // Размер шага = 5
if(pos == 50)
EndDialog(hdwnd, 0);
return 1;
}
}
return 0;
}
Файл ресурсов Progress.rc для этой программы имеет следующий вид:
#include <Windows.h>
#include "Prog.h"
MYMENU MENU
{
MENUITEM "Диалог", IDM_DIALOG
MENUITEM "Помощь", IDM_HELP
}
MYMENU ACCELERATORS
{
VK_F2, IDM_DIALOG, VIRTKEY
VK_F1, IDM_HELP, VIRTKEY
}
MYDB DIALOG 18, 18, 150, 93
CAPTION "Демонстрация индикатора процесса"
STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU
{
DEFPUSHBUTTON "Шаг процесса", ID_PROG,
62, 35, 53, 14,
WS_CHILD|WS_VISIBLE|WS_TABSTOP
PUSHBUTTON "Сброс", IDCANCEL,
52, 65, 37, 14,
WS_CHILD|WS_VISIBLE|WS_TABSTOP
LTEXT "Индикатор", ID_STATIC,
10, 22, 120, 10
}
Пример диалога, создаваемого этой программой, представлен на рисунке 11.4.
Рис. 11.4. Демонстрация индикатора процесса
Для работы программы необходимо использовать следующий файл определений Prog.h:
#define IDM_DIALOG 100
#define IDM_HELP 101
#define ID_PROG 102
#define ID_STATIC 103
Используя в своих программах индикаторы, помните, что их основное назначение – информировать пользователя о нормальном выполнении программы. Поэтому обновлять индикатор (увеличивать его позицию) следует довольно часто. Наблюдая обновление индикатора, пользователь убеждается в том, что программа продолжает выполняться. Если же обновлять позицию индикатора с большими промежутками времени, то не исключено, что нетерпеливый пользователь может аварийно завершить ее, полагая, что программа зависла.
Отметим, что кроме рассмотренного довольно простого индикатора существуют и другие виды индикаторов. Например, в системе имитационного моделирования Pilgrim, работающей под управлением Windows XP, для индикации процесса выполнения модели могут одновременно использоваться три и более типов индикаторов, как это показано на рис. 11.5.
Рис. 11.5. Одновременное использование индикаторов трех типов:
кругового, прямоугольного и автоматически масштабируемого графика
Более сложные элементы управления. Мы не рассмотрели некоторые редко используемые общие элементы управления, которые иногда применяются для системных программ: линейка состояния (status bar), закладки (tab control)и окно просмотра деревьев (tree view control). Принципы их применения в прикладных программах – те же самые, которые мы рассматривали. Поэтому Вы, будучи ужẻ подготовлены для самостоятельной работы в среде Visual C++, вполне можете разобраться с этими элементами.