- •Часть 2 (продолжение): Прикладное программирование в Windows
- •Глава 8. Виртуальное окно: работа с текстом
- •8.1. Оконные координаты, цвета, отображение строк
- •Кодировка rgb-значений
- •Размеры системных метрик
- •8.2. Виртуальное окно
- •Способы заполнения прямоугольной области
- •8.3. Изменение шрифтов
- •Макроимена распространенных шрифтов
- •8.4. Создание собственных шрифтов
- •Глава 9. Программирование графики
- •9.1. Логическая система координат
- •Рекомендуемый самый яркий состав цветов
- •9.2. Пиксели, линии, дуги, прямоугольники, эллипсы и секторы
- •9.3. Работа с перьями и кистями
- •Типы линий, создаваемых пером
- •9.4. Технология виртуального окна
- •9.5. Режимы отображения и области вывода
- •Текущий режим отображения (mappind mode)
- •Глава 10. Работа с панелями инструментов
- •10.1. Общие элементы управления
- •Общие элементы управления
- •10.2. Подключение и инициализация общих элементов управления
- •10.3. Работа с панелью инструментов
- •Начальные состояния кнопок панели инструментов
- •Стиль кнопки определяется (значения поля fsStyle)
- •Сообщения к панели инструментов
- •10.4. Создание растрового изображения для панели инструментов
- •10.5. Включение подсказок
- •Глава 11. Спины, ползунки и индикаторы процессов
- •11.1. Работа со спином
- •Стили «up-down control»
- •Сообщения, которые можно посылать спину
- •11.2. Создание спина с «приятельским» окном
- •11.3. Работа с ползунком
- •Значения стилей для ползунка
- •Перечень сообщений, которые можно посылать ползунку
- •Перечень нотификационных сообщения ползунка
- •11.4. Индикатор процесса
- •Управляющие сообщения индикатору
- •Глава 12. Многозадачность: процессы и потоки
- •12.1. Создание нового процесса (отдельной задачи)
- •Разрешенные значения поля dwFlags
- •12.2. Многопотоковые программы
- •12.3. Работа с несколькими потоками
- •12.4. Синхронизация процессов и потоков: семафоры
- •12.5. Обработка событий
- •Глава 13. Приемы программного управления вычислительным процессом
- •13.1. Использование функций Проводника Explorer для работы в файловой системе
- •Управляющая информация Проводника
- •Режимы обработки файлов
- •13.2. Создание собственных динамических библиотек (dll-файлов)
- •13.3. Работа с буфером обмена Clipboard
- •Функции подсистемы Clipboard
- •Свойства выделяемого блока памяти
- •Форматы и типы данных
- •Литература
11.2. Создание спина с «приятельским» окном
Чаще всего спин используется с окном редактирования. В этом случае спин называется так и по-английски – 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.
