Перечень нотификационных сообщения ползунка




 

Сообщение Действие
  ТВ_ВОТТОМ Нажата клавиша [End]; ползунок устанавливается в положение, соответствующее минимальному значению
  TB_ENDTRACK Завершено перемещение ползунка
  TB_LINEDOWN Нажата клавиша [стрелка вправо] или [стрелка вниз]
  ТВ LINEUP Нажата клавиша [стрелка влево] или [стрелка вверх]
  TB_PAGEUP Нажата клавиша [Page Up] или выполнен щелчок мышью перед ползунком
  TB_PAGEDOWN Нажата клавиша [Page Down] или выполнен щелчок мышью за ползунком
  TB_THUMBPOSITION Ползунок перемещен при помощи мыши
  TB_THUMBTRACK Ползунок перемещен при помощи мыши
  ТВ_TOP Нажата клавиша [Ноmе]; ползунок устанавливается в по­ложение, соответствующее максимальному значению

 

Пример 11.3. Программа со спином и ползунком

 

Приведенная ниже программа добавляет возможность использования ползунка в предыдущий пример программы, работающей со спином. Запустив на выполнение программу, Вы увидите, что при перемещении ползунка значение текущей позиции спина будет изменяться и наоборот. Таким образом, иллюстрируется как обработка сообщений ползунка, так и программное управление им.

 

// Ползунок и спин с "приятельским окном"

#include <Windows.h>

#include <String.h>

#include <Stdio.h>

#include <Commctrl.h>

#include "Track.h"

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 long udpos=0;

static long trackpos=0;

static HWND hEboxWnd;

static HWND udWnd;

static HWND hTrackWnd;

int low=0;

int high=10;

switch(message)

{

case WM_INITDIALOG:

hEboxWnd=GetDlgItem(hdwnd,ID_EB1);

udWnd=CreateUpDownControl

(WS_CHILD|WS_BORDER|WS_VISIBLE|

UDS_SETBUDDYINT|UDS_ALIGNRIGHT,

55,10,40,50, hdwnd, ID_UPDOWN,

hInst, hEboxWnd, 10, 0, 5);

// Создать ползунок

hTrackWnd=CreateWindow

(TRACKBAR_CLASS,

"Trackbar", // Не используется

WS_CHILD|WS_VISIBLE|WS_TABSTOP|

TBS_AUTOTICKS|WS_BORDER,

10,70,200,30, hdwnd, NULL, hInst,

NULL);

SendMessage(hTrackWnd, TBM_SETRANGE,

(WPARAM)1,

(LPARAM)MAKELONG(low, high));

SendMessage(hTrackWnd, TBM_SETPOS,

(WPARAM)1,(LPARAM)(high/2));

return 1;

case WM_VSCROLL: // Обработка сообщения спина

if(udWnd == (HWND)lParam)

{

trackpos=GetDlgItemInt(hdwnd, ID_EB1,

NULL, 1);

SendMessage(hTrackWnd, TBM_SETPOS,

(WPARAM)1, (LPARAM)trackpos);

}

return 1;

case WM_HSCROLL: // Обработка сообщения ползунка

if(hTrackWnd!= (HWND)lParam)

break; // Это не ползунок

switch(LOWORD(wParam))

{

case TB_TOP: //

case TB_BOTTOM: // В этом

case TB_LINEDOWN: // примере

case TB_LINEUP: // все

case TB_THUMBPOSITION: // сообщения

case TB_THUMBTRACK: // обрабатываются

case TB_PAGEUP: // одинаково

case TB_PAGEDOWN: //

trackpos=SendMessage

(hTrackWnd, TBM_GETPOS,

0, 0);

SetDlgItemInt(hdwnd, ID_EB1,

trackpos, 1);

return 1;

}

break;

case WM_COMMAND:

switch(LOWORD(wParam))

{

case IDCANCEL:

EndDialog(hdwnd, 0);

return 1;

}

}

return 0;

}

 

Для этой программы файл ресурсов Spin.rc имеет такой же вид, как и в предыдущем примере:

 

#include <Windows.h>

#include "Track.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, 152, 92

CAPTION "Ползунок и спин с ""приятельским"" окном"

STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU

{

PUSHBUTTON "Сброс", IDCANCEL, 52, 65, 37, 14,

WS_CHILD|WS_VISIBLE|WS_TABSTOP

EDITTEXT ID_EB1, 10, 10, 20, 12,

ES_LEFT|WS_CHILD|WS_VISIBLE|WS_BORDER

}

 

Файл определений Track.h также похож на файл Updown.h из предыдущего примера:

 

#define IDM_DIALOG 100

#define IDM_HELP 101

#define ID_UPDOWN 102

#define ID_EB1 103

 

Рис. 11.3. Демонстрация работы ползунка

 

Пример диалогового окна, создаваемого этой программой, представлен на рис. 11.3.

Ползунок и спин создаются в программе при инициализации диалога. После создания ползунка диапазон значений его позиций устанавливается в пределах от 0 до 10, а значение начального положения – равным 5. Такие же величины задаются для диапазона значений и начального положения спина. Заметьте, что диапазон значений ползунка устанавливается с помощью макроопределения MAKELONG(). Этот макрос, формирующий длинное целое значение из двух коротких целых, имеет прототип:

 

DWORD MAKELONG(WORD low, WORD high);

 


Младшее слово формируемого длинного целого задается параметром low,a старшее – параметром high.Макрос MAKELONG()очень полезен при формирова­нии длинных целых значений.

При изменении состояния спина программа получает сообщение WM_VSCROLL, после обработки которого устанавливается соответствующее состояние ползунка:

 

case WM_VSCROLL: // Обработка сообщения спина

if(udWnd == (HWND)lParam)

{

trackpos=GetDlgItemInt(hdwnd, ID_EB1,

NULL, 1);

SendMessage(hTrackWnd, TBM_SETPOS,

(WPARAM)1, (LPARAM)trackpos);

}

 

В приведенном операторе case мы получаем новое значение из окна редактиро­вания при помощи функции GetDlgItemInt(). Эта функция аналогична функции GetDlgItemText(),упоминающейся в главе 5, с тем отличием, что вместо строки текста в окне редактирования, она возвращает целое число, полученное в результате преобразования этой строки. Например, если окно редактирования содержит строку "102", функция GetDlgItemInt()возвращает значение 102. Очевидно, что эта функция применима только к окнам редактирования, содержащим цифры. Прототип ее имеет следующий вид:

 

UINT GetDlgItemInt(HWND hDialog, int ID,

BOOL *error, BOOL signed);

 

Дескриптор окна диалога, содержащего окно редактирования, задается параметром hDialog. Идентификатор окна редактирования определяется параметром ID. Если окно редактирования не содержит строку цифр, функция возвратит 0. Для данной функции нуль тоже является допустимым значением. Поэтому успешность завершения функции устанавливается переменной, указатель на которую передается в параметре error. Если функция завершилась успешно, значение этой переменной не равно нулю. При возник­новении ошибки оно устанавливается равным нулю. Если возникают сомнения отно­сительно ошибок, можно задать значение NULL для этого параметра. Если значение параметра signedне равно нулю, возвращается значение со знаком; в противном случае функция GetDlgItemInt()возвращает целое значение без знака.

После того как из окна редактирования получено установленное в нем значение, оно передается ползунку при помощи функции SendMessage().Таким образом, если изменить положение спина, ползунок автоматически переместится, отображая новое значение.

При перемещении ползунка программа получает сообщение WM_HSCROLL,которое обрабатывается следующим образом:

 

case WM_HSCROLL: // Обработка сообщения ползунка

if(hTrackWnd!= (HWND)lParam)

break; // Это не ползунок

switch(LOWORD(wParam))

{

case TB_TOP: //

case TB_BOTTOM: // В этом

case TB_LINEDOWN: // примере

case TB_LINEUP: // все

case TB_THUMBPOSITION: // сообщения

case TB_THUMBTRACK: // обрабатываются

case TB_PAGEUP: // одинаково

case TB_PAGEDOWN: //

trackpos=SendMessage

(hTrackWnd, TBM_GETPOS,

0, 0);

SetDlgItemInt(hdwnd, ID_EB1,

trackpos, 1);

return 1;

}

break;

 

Когда пользователь перемещает ползунок, его позиция автоматически обнов­ляется; в этом отношении в Вашей программе не нужно предусматривать никаких операций. После перемещения ползунка программа получает значение его новой позиции, а затем использует это значение для обновления значения позиции спина. Значение в окне редактирования, связанном со спином, устанавливается при помощи функции SetDlgItemInt(),которая выполняет действие, обратное действию функции GetDlgItemInt().Функция имеет следующий прототип:

 

BOOL SetDlgltemlnt(HWND hDialog, int ID, UINT value, BOOL signed);

 

Дескриптор окна диалога, содержащего элемент управления, передается в параметре hDialog. Идентификатор элемента управления определяется параметром ID. Значение, которое необходимо установить, задается параметром value. Если значение параметра signed не равно нулю, разрешается установка отрицательных значений, в противном случае подразумевается, что value – неотрицательное число. Функция возвращает ненулевое значение при успешном завершении и нуль при возникновении ошибки.

В приведенном примере ползунок может быть перемещен как при помощи мыши, так и посредством клавиатуры. Именно поддержка клавиатуры является причиной того, что в процессе обработки сообщения ползунка используется так много TB-кодов. Можно попробовать убрать некоторые из них и посмотреть, что получится.

Связь ползунка и спина в этом примере обусловлена исключительно демонстра­ционными целями и не является обязательной. Вы можете использовать ползунки отдельно, по своему усмотрению.

Индикатор процесса

Индикатор (progress bar) является одним из простейших общих элементов управ­ления. Вы, вероятно, уже видели такие индикаторы в действии. Это небольшие окна, которые отображают степень завершенности некоторого процесса. Их часто исполь­зуют, например, в инсталляционных программах, а также в программах сортировки и копирования, перемещения или передачи информации.

Индикаторы создаются при помощи функции CreateWindow()или CreateWindowЕх(),где в качестве имени класса окна задается макрос PROGRESS_CLASS.

Посыпка сообщений индикатору. Программа может передавать индикатору управляющие сообщения с помощью уже известной функции SendMessage(). Сам индикатор сообщений не генерирует. Как правило, такие сообщения передаются для установки диапазона и текущих значений индикатора. Управляющие сообщения индикатору приведены в таблице на следую­щей странице.

 

Таблица 11.6



Поделиться:




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

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


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