Создание спина с «приятельским» окном




Чаще всего спин используется с окном редактирования. В этом случае спин называется так и по-английски – spin, тогда как для отдельно используемого спина применяется термин up-down control. Поскольку спины с окнами редакти­рования встречаются очень часто, Windows обеспечивает специальную поддер­жку таких элементов. Так как спин с окном редактирования почти полностью автоматизирован, Ваша программа может не содержать практически никаких операций по управлению им.

Для создания спина с окном редактирования достаточно просто определить такое окно как приятельское для спина. После этого текущее положение спина будет автоматически отображаться в окне редактирования. Более того, при изменении (с помощью мыши или клавиатуры) содержимого окна редактирования будет автома­тически изменяться и текущее положение спина.

Пример 11-2. Использование спина с окном редактирования

 

Процедура создания спина с окном редактирования довольно простая и состоит из двух этапов.

Этап 1. Вначале в файл ресурсов программы необходимо добавить окно редактирования.

Этап 2. Далее дескриптор этого окна нужно передать в качестве дескриптора приятельского окна спина при создании последнего.

Файл ресурсов 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

EDITTEXT ID_EB1, 10, 10, 20, 12,

ES_LEFT|WS_CHILD|WS_VISIBLE|WS_BORDER

}

 

Заметьте, что в определение диалога включено окно редактирования EDITTEXT с идентификатором ID_EB1. Поэтому изменяется и файл определений Updown.h добавлением еще одной константы:

 

#define IDM_DIALOG 100

#define IDM_HELP 101

#define ID_UPDOWN 102

#define ID_EB1 103

 

Текст программы приведен ниже:

 

// Демонстрация спина с "приятельским окном"

#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)

{

static HWND hEboxWnd;

static HWND udWnd;

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, 100, 0, 50);

return 1;

case WM_COMMAND:

switch(LOWORD(wParam))

{

case IDCANCEL:

EndDialog(hdwnd, 0);

return 1;

}

}

return 0;

}

 

Чтобы понять, как создается спин с окном редактирования, посмотрите на фрагмент программы, обрабатывающей сообщение WM_INITDIALOG:

 

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, 100, 0, 50);

return 1;

 

Поскольку диалог определен в файле ресурсов, для получения дескриптора окна редактирования программа должна использовать функцию GetDlgItem():

 

HWND GetDlgltem (HWND hDialog, int ID);

 


Функция GetDlgItem() возвращает дескриптор элемента управления (в нашем случае – hEboxWnd). Дескриптор окна диалога передается в параметре hDialog,а идентификатор элемента управления задается параметром ID. При возникновении ошибки эта функция возвращает NULL.

После получения дескриптора окна редактирования hEboxWnd он используется в качестве дескриптора приятельского окна в функции CreateUpDownControl(), создающую спин. Заметим, что в предыдущем примере 11-1 вместо него использовалось значение NULL. Таким образом, спин и окно редактирования автоматически связываются и работают совместно.

 

Рис. 11.2. Спин с окном редактирования

 

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

 

Работа с ползунком

 

Один из самых интересных с точки зрения внешнего вида общих элементов управления – это ползунок (trackbar, иногда используется также термин slider control). Он имеет вид ползункового регулятора, используемого в различной электронной аппаратуре, в частности в стереосистемах. Ползунок состоит из указателя, движуще­гося вдоль шкалы. И хотя он выглядит иначе, чем линейка прокрутки, программа управляет им точно так же.

Применение ползунков очень эффективно в тех случаях, когда программа моде­лирует реальное физическое устройство. Например, если программа управляет графическим эквалайзером, ползунки идеально подходят для представления процесса регулировки частоты.

Для создания ползунка используется функция CreateWindow() либо CreateWindowEx().Функция CreateWindowEx()отличается тем, что позволяет задать дополни­тельные значения стиля для создаваемого окна. В приведенном в этой главе примере программы создания ползунка дополнительные стили окна не требуются, но они могут оказаться необходимыми в реальных приложениях. Имя класса ползунка определяется макросом TRACKBAR_CLASS.

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

 

Таблица 11.3



Поделиться:




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

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


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