Управляющие сообщения индикатору




 

Сообщение Действие
  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++, вполне можете разобраться с этими элементами.

 




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: