- •Московская финансово-промышленная академия
- •Содержание
- •Глава 1. Модель программирования приложений
- •1.1. Потребительские свойства Windows
- •1.2. Процессы в Windows и потоковая многозадачность
- •1.3. Динамические библиотеки
- •1.4. Программное обеспечение для создания Win-приложений
- •Спецификация префиксов венгерской нотации
- •Глава 2. Обзор возможностей программирования
- •2.1. Общий взгляд на программирование в Windows
- •2.2. Взаимодействие Windows с программой
- •2.3. Win32 api: прикладной интерфейс для Windows
- •2.4. Компоненты окна
- •2.5. Основы приложений Windows
- •2.6. Каркас приложения Windows
- •2.7. Определение класса окна
- •Значения параметра lpszName
- •Наиболее употребляемые макросы для встроенных курсоров
- •Типы системных кистей
- •2.8. Создание окна
- •Наиболее распространенные стили
- •Параметры способа отображения nHow
- •2.9. Цикл обработки сообщений
- •2.10. Оконная функция
- •Типы префиксов
- •Глава 3. Обработка сообщений Windows
- •3.1. Что такое сообщения?
- •3.2. Обработка нажатая клавиш
- •Битовая карта lParam
- •3.3. Обработка сообщений wm_paint
- •3.4. Обработка сообщений «мыши»
- •3.5. Генерация сообщения wm_paint
- •3.6. Генерация сообщений таймера
- •Глава 4. Ресурсы и меню
- •4.1. Окна сообщений MessageBox
- •Значения функции MessageBox
- •Значения wMbType
- •4.2. Представляем меню
- •4.3. Использование ресурсов
- •Параметры menu
- •Параметры элементов меню
- •4.4. Включение меню в программу. Обработка команд
- •4.5. Включение акселераторов сменю
- •4.6. Загрузка таблицы акселераторов
- •Глава 5. Создание диалогов
- •5.1. Взаимодействие Win-диалогов с пользователем
- •5.2. Модальные диалоги: обработка сообщений
- •5.3. Активизация и создание простейшего диалога
- •5.4. Определение ресурсов диалога
- •Стили диалога
- •5.5. Оконная функция диалога
- •5.6. Основы работы со списками
- •Типы сообщений
- •5.7. Инициализация списка и выбор элементов
- •5.8. Окно ввода
- •5.9. Использование немодального диалога
- •Глава 6. Графические образы, иконки и курсоры
- •6.1. Иконка и курсор
- •6.2. Определение малой иконки
- •6.3. Работа с растровыми изображениями
- •Значения параметра dwRaster
- •6.4. Работа с несколькими растровыми изображениями
- •Глава 7. Более подробно об элементах управления
- •7.1. Работа с контрольными переключателями
- •7.2. Статические элементы
- •7.3. Работа с селекторными кнопками
- •7.4. Линейки прокрутки
Стили диалога
№ |
Стиль |
Эффект |
1 |
DS_MODALFRAME |
Создание модального диалога |
2 |
WS_BORDER |
Создание окна с рамкой |
3 |
WS_CAPTION |
Создание окна с заголовком |
4 |
WS_CHILD |
Создание дочернего окна |
5 |
WS_MAXIMIZEBOX |
Окно с кнопкой полноэкранного представления |
6 |
WS_MINIMIZEBOX |
Создание окна с кнопкой минимизации |
7 |
WS_SYSMENU |
Создание окна с системным меню |
8 |
WS_TABSTOP |
Возможность циклического выбора элемента нажатием клавиши табуляции |
9 |
WS_VISIBLE |
Отображение окна при активизации |
10 |
WS_POPUP |
Создание всплывающего окна |
В диалоге MYDB определены три кнопки. Первая из них является выбранной по умолчанию, т.е. она автоматически выделяется при открытии диалога. Общий вид определения кнопки в диалоге:
PUSHBUTTON "строка", ID, X, Y, Width, Height[, стиль]
Здесь строка – это текст на кнопке, ID – идентификатор кнопки. Это значение передается в Вашу программу при нажатии данной кнопки. Значение X и Y определяют координаты верхнего левого угла, a Width и Height – размеры кнопки соответственно по горизонтали и вертикали. Стиль определяет тип кнопки. Если необходимо определить кнопку как активную по умолчанию, следует использовать оператор DEFPUSHBUTTON. Он имеет те же параметры, что и оператор PUSHBUTTON.
В нашем примере используется также файл описаний Mydialog.h. Введите его:
#define IDM_DIALOG1 100
#define IDM_DIALOG2 101
#define IDM_HELP 102
#define IDD_RED 103
#define IDD_GREEN 104
5.5. Оконная функция диалога
О всех событиях, происходящих в диалоге, передаются сообщения в функцию, связанную с этим диалогом (а не в функцию главного окна). Приведенная ниже функция диалога обрабатывает сообщения, связанные с диалогом MYDB:
// Простая функция диалога
BOOL CALLBACK DialogFunc (HWND hdwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hdwnd,0);
return 1;
case IDD_RED:
MessageBox(hdwnd,
"Выбран Красный",
"Красный",МВ_ОК);
return 1;
case IDD_GREEN:
MessageBox(hdwnd,
"Выбран Зеленый",
"Зеленый",МВ_ОК);
return 1;
}
}
return 0;
}
Каждый раз при воздействии на элемент управления диалога в функцию DialogFunc() поступает сообщение WM_COMMAND, в котором LOWORD(wParam) содержит идентификатор этого элемента управления.
Функция DialogFunc() обрабатывает три командных сообщения, которые могут генерироваться в нашем диалоге. При нажатии кнопки Сброс сообщение содержит идентификатор IDCANCEL, и диалог завершится посредством вызова функции API EndDialog(). Идентификатор IDCANCEL является стандартным идентификатором, определенным в Windows.h.
Функция EndDialog() имеет следующий прототип:
BOOL EndDialog(HWND hwnd, int nStatus);
Параметр hwnd является дескриптором окна диалога, a nStatus содержит значение, возвращаемое функцией DialogBox(). Это значение может игнорироваться, если программа его не использует. Функция EndDialog() возвращает ненулевое значение при успешном завершении и нулевое в противном случае. Обычно эта функция завершается успешно.
Нажатие двух других кнопок вызывает появление окна сообщения, подтверждающего нажатие соответствующей кнопки.
Пример 5-1. Ниже приводится полный текст программы с описанием диалога. В начале выполнения профаммы открывается окно, содержащее меню. При выборе команды Диалог 1 открывается диалог. После этого нажатие кнопок в диалоге вызывает соответствующую реакцию. Это отражено на рис. 5.1.
// Демонстрация модального диалога
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include "Mydialog.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");
// Показать окно и перерисовать содержимое:
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_DIALOG1:
DialogBox(hInst,"MYDB",hwnd,
DialogFunc);
break;
case IDM_DIALOG2:
MessageBox(hwnd,
"Этого диалога пока нет","",
MB_OK);
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)
{
switch(message)
{
case WM_COMMAND: // Обр-ка командных сообщений
switch(LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hdwnd,0);
return 1;
case IDD_RED:
MessageBox(hdwnd,
"Выбран Красный",
"Красный", MB_OK);
return 1;
case IDD_GREEN:
MessageBox(hdwnd,
"Выбран Зеленый",
"Зеленый", MB_OK);
return 1;
}
}
return 0;
}
Рис. 5.1. Результаты работы программы с диалогом
Обратите внимание на внешнюю переменную hInst. Эта переменная содержит дескриптор текущего экземпляра приложения. Ее существование обусловлено тем, что при создании диалога требуется дескриптор приложения.
Поскольку диалог создается не в WinMain(), а в WindowFunc(), необходима копия дескриптора приложения, доступная извне WinMain().