Сообщения, которые можно посылать спину




 

Сообщение Действие
  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().Значение новой позиции спина содержится в младшем слове возвращаемого значения. Значение текущего положения спина отображается в рабочей области окна диалога.

 



Поделиться:




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

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


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