№ | Сообщение | Действие |
UDM_GETBUDDY | Получение дескриптора приятельского окна. Дескриптор содержится в младшем слове возвращаемого значения. wParam должен быть равен 0. lParamдолжен быть равен 0 | |
UDM_GETPOS | Получение текущей позиции спина. Значение текущей позиции содержится в младшем слове возвращаемого значения. wParamдолжен быть равен 0. lParam должен быть равен 0 | |
UDM_GETRANGE | Получение диапазона прокрутки спина. Максимальное значение позиции содержится в младшем, а минимальное – в старшем слове возвращаемого значения. wParamдолжен быть равен 0. lParam должен быть равен 0 | |
UDM_SETBUDDY | Определение нового приятельского окна спина, возвращает дескриптор прежнего приятельского окна. wParamдолжен содержать дескриптор нового приятельского окна. lParam должен быть равен 0 | |
UDM_SETPOS | Установка текущей позиции спина. wParamдолжен быть равен 0. lParamдолжен содержать значение новой позиции | |
UDM_SETRANGE | Установка нового диапазона прокрутки спина. wParamдолжен быть равен 0. lParamдолжен содержать максимальное значение позиции в младшем слове, а минимальное в старшем |
Пример 11-1. Программа работы со спином
Приведенная ниже программа создает спин, используемый как отдельный элемент прокрутки. Спин создается в окне диалога. В данном примере он не имеет приятельского окна. Возможные значения позиций создаваемого спина находятся в диапазоне от 0 до 100, начальное значение позиции равно 50. При изменении текущей позиции спина значение его новой позиции отображается в рабочей области окна диалога.
// Демонстрация базовых функций спина
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include <Commctrl.h>
#include "Updown.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)
{
char str[80];
long udpos = 0;
HDC hdc;
static HWND udWnd;
switch(message)
{
case WM_INITDIALOG:
udWnd=CreateUpDownControl
(WS_CHILD|WS_BORDER|WS_VISIBLE,
10,10,50,50, hdwnd, ID_UPDOWN,
hInst, NULL, 100, 0, 50);
return 1;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hdwnd, 0);
return 1;
}
case WM_VSCROLL: // Обработка сообщения спина
if(udWnd == (HWND)lParam)
{
udpos = SendMessage(udWnd,UDM_GETPOS,0,0);
sprintf(str,"%d", LOWORD(udpos));
hdc = GetDC(hdwnd);
TextOut(hdc, 55, 30, " ", 6);
TextOut(hdc, 55, 30, str, strlen(str));
ReleaseDC(hdwnd,hdc);
return 1;
}
}
return 0;
}
Пример диалога со спином представлен на рис. 11.1.
Рис. 11.1. Пример окна диалога со спином
Для этой программы потребуется следующий файл ресурсов Spin.h:
#include <Windows.h>
#include "Updown.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, 142, 92
CAPTION "Демонстрация функций спина"
STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU
{
PUSHBUTTON "Сброс", IDCANCEL, 52, 65, 37, 14,
WS_CHILD|WS_VISIBLE|WS_TABSTOP
}
Понадобится также файл определений Updown.h:
#define IDM_DIALOG 100
#define IDM_HELP 101
#define ID_UPDOWN 102
В приведенной программе спин создается в окне диалога. Это происходит при инициализации диалога во время обработки сообщения WM_INITDIALOG:
udWnd=CreateUpDownControl
(WS_CHILD|WS_BORDER|WS_VISIBLE,
10,10,50,50, hdwnd, ID_UPDOWN,
hInst, NULL, 100, 0, 50);
return 1;
При вызове функции CreateUpDownControl()создается спин, имеющий координаты 10,10 в рабочей области диалога. Ширина и высота спина равны 50 пикселам. Поскольку спин порождается окном диалога, дескриптор диалога hdwndпередается в качестве дескриптора родительского окна. Идентификатор спина – ID_UPDOWN.В данном примере этот идентификатор не используется, однако он должен присутствовать, так как может потребоваться в других программах, hInst – дескриптор программы. Поскольку приятельское окно спина в данном случае отсутствует, соответствующий параметр равен NULL. Возможные значения позиций создаваемого спина находятся в диапазоне от 0 до 100, начальное значение позиции равно 50.
При воздействии на спин диалог получает сообщение WM_VSCROLL.Ниже приводится фрагмент программы, обрабатывающей это сообщение. Дескриптор спина передается в параметре сообщения lParam.Для того чтобы проверить, что сообщение пришло именно от спина, значение lParamсравнивается с дескриптором спина, полученным в результате выполнения функции CreateUpDownControl().Наша программа создает только один спин, реальные же приложения могут создавать несколько элементов управления, способных посылать сообщение WM_VSCROLL,так что обычно такая проверка бывает необходима.
case WM_VSCROLL: // Обработка сообщения спина
if(udWnd == (HWND)lParam)
{
udpos = SendMessage(udWnd,UDM_GETPOS,0,0);
sprintf(str,"%d", LOWORD(udpos));
hdc = GetDC(hdwnd);
TextOut(hdc, 55, 30, " ", 6);
TextOut(hdc, 55, 30, str, strlen(str));
ReleaseDC(hdwnd,hdc);
return 1;
}
Чтобы получить новое положение спина, ему передается сообщение UDM_GETPOS.С этой целью используется функция SendMessage().Значение новой позиции спина содержится в младшем слове возвращаемого значения. Значение текущего положения спина отображается в рабочей области окна диалога.