LAB1 (Методические указания к лабораторным работам)
Описание файла
Файл "LAB1" внутри архива находится в папке "Методические указания к лабораторным работам". Документ из архива "Методические указания к лабораторным работам", который расположен в категории "". Всё это находится в предмете "программирование в среде windows" из 4 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "программирование в среде windows" в общих файлах.
Онлайн просмотр документа "LAB1"
Текст из документа "LAB1"
Лабораторная работа 1
Создание окна в Windows
Структура программы в Windows:
При создании окна в Windows должны быть проведены следующие работы:
В программе С.
1.0 Написать WinMain
int PASCAL
WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
// Тело функции
}
1.1 Зарегистрировать класс окна
WNDCLASS wc; // структура для регистрации класса окна
wc.style = 0; // Стиль окна
wc.lpfnWndProc = (WNDPROC) WndProc; // Указатель на функцию окна
wc.cbClsExtra = 0; // Размер дополнительной области данных
wc.cbWndExtra = 0; // Размер дополнительной области данных
wc.hInstance = hInstance; // Идентификатор приложения
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // Цвет фона окна
wc.lpszMenuName = (LPSTR)NULL; // Идентификатор меню
wc.lpszClassName = (LPSTR)szClassName;
aWndClass = RegisterClass(&wc); // Регистрация класса
-
Создать окно.
hwnd = CreateWindow(
szClassName, // имя класса окна
szWindowTitle, // заголовок окна
WS_OVERLAPPEDWINDOW, // стиль окна
CW_USEDEFAULT, // задаем размеры и расположение
CW_USEDEFAULT, // окна, принятые по умолчанию
CW_USEDEFAULT,
CW_USEDEFAULT,
0, // идентификатор родительского окна
0, // идентификатор меню
hInstance, // идентификатор приложения
NULL); // указатель на дополнительные
// параметры
Стиль класса окна задается в виде отдельных битов, для которых в файле windows.h определены символические константы с префиксом CS_:
Стиль | Описание |
CS_BYTEALIGNCLIENT | Внутренняя область окна (client area) должна быть выравнена по границе байта видеопамяти. Иногда используется для ускорения процесса вывода изображения |
CS_BYTEALIGNWINDOW | Все окно (не только внутренняя область окна) должно быть выравнено по границе байта видеопамяти |
CS_CLASSDC | Необходимо создать единый контекст отображения, который будет использоваться всеми окнами, создаваемыми на базе данного класса |
CS_DBLCLKS | Функция окна будет получать сообщения при двойном щелчке клавишей мыши (double click) |
CS_GLOBALCLASS | Данный класс является глобальным и доступным другим приложениям. Другие приложения могут создавать окна на базе этого класса |
CS_HREDRAW | Внутренняя область окна должна быть перерисована при изменении ширины окна |
CS_NOCLOSE | В системном меню окна необходимо запретить выбор функции закрытия окна (строка Close будет отображаться серым цветом, и ее нельзя выбрать) |
CS_OWNDC | Для каждого окна, определяемого на базе данного класса, будет создаваться отдельный контекст отображения |
CS_PARENTDC | Окно будет пользоваться родительским контекстом отображения, а не своим собственным. Родительский контекст - это контекст окна, создавшего другое окно (см. дальше) |
CS_SAVEBITS | Для данного окна Windows должна сохранять изображение в виде битового образа (bitmap). Если такое окно будет перекрыто другим окном, то после уничтожения перекрывшего окна изображение первого окна будет восстановлено Windows на основании сохраненного ранее образа |
CS_VREDRAW | Внутренняя область окна должна быть перерисована при изменении высоты окна |
-
Организовать цикл сообщений.
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
где:
typedef struct tagMSG { /* msg */
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
BOOL GetMessage(lpmsg, hwnd, uMsgFilterMin, uMsgFilterMax)
MSG FAR* lpmsg;
HWND hwnd;
UINT uMsgFilterMin;
UINT uMsgFilterMax;
BOOL TranslateMessage(lpmsg)
const MSG FAR* lpmsg; /* адрес MSG */
LONG DispatchMessage(lpmsg)
const MSG FAR* lpmsg; /* адрес MSG */
-
Произвести визуализацию окна.
ShowWindow(hWndMain,iCmdShow);
UpdateWindow(hWnd);
1.5 Написать обработчик.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch (iMessage)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
………………………………..
default:
return DefWindowProc(hWnd, iMessage, wParam, lParam);
}
return 0;
}
Сообщения.
Большинство сообщений создают драйверы устройств ввода/вывода, таких, как клавиатура, мышь или таймер. Драйверы создают сообщения при поступлении аппаратных прерываний. Например, когда вы нажимаете и затем отпускаете клавишу, драйвер обрабатывает прерывания от клавиатуры и создает несколько сообщений. Аналогично сообщения создаются при перемещении мыши или в том случае, когда вы нажимаете кнопки на корпусе мыши. Можно сказать, что драйверы устройств ввода/вывода транслируют аппаратные прерывания в сообщения. В операционной системе Windows обычные приложения никогда не обращаются напрямую к аппаратуре и не работают с системными областями памяти, такими, как таблицы дескрипторов прерываний или видеопамять. Все это делают драйверы и виртуальные драйверы. Поэтому ограничения, накладываемые на обычные приложения Windows, никак не сказываются на функциональных возможностях самого приложения.
Прежде всего, сообщения попадают в системную очередь сообщений Windows. Системная очередь сообщений одна. Далее из нее сообщения распределяются в очереди сообщений приложений. Для каждого приложения создается своя очередь сообщений.
Очередь сообщения приложений может пополняться не только из системной очереди. Любое приложение может послать сообщение любому другому сообщению, в том числе и само себе.
Основная работа, которую должно выполнять приложение, заключается в обслуживании собственной очереди сообщений. Обычно приложение в цикле опрашивает свою очередь сообщений. Обнаружив сообщение, приложение с помощью специальной функции из программного интерфейса Windows распределяет его нужной функции окна, которая и выполняет обработку сообщения.
Сообщение, в основном, состоит из полей wParam и lParam. В сообщении, формируемом при нажатии любой кнопки мыши, младшее слово lParam содержит X – координату курсора, а старшее – Y – координату. Семь младших бит поля wParam содержит состояние кнопок мыши и клавиш Shift и Ctrl. Если кнопка или клавиша нажата, то соответствующий бит находится в состоянии 1.
Курсор | Идентификатор | Применение |
| IDC_ARROW | Стандартный курсор в виде стрелки |
| IDC_IBEAM | Текстовый курсор |
| IDC_WAIT | Курсор в виде песочных часов. Используется при выполнении длительных операций |
| IDC_CROSS | Курсор в виде перекрестия |
| IDC_UPARROW | Курсор в виде вертикальной стрелки |
| IDC_SIZE | Индикация изменения размера |
| IDC_ICON | Пустая пиктограмма |
| IDC_SIZENWSE | Индикация изменения размера |
| IDC_SIZENESW | Индикация изменения размера |
| IDC_SIZEWE | Индикация изменения размера |
| IDC_SIZENS | Индикация изменения размера |
Контрольное задание
Сформировать окно в WINDOWS.
Дополнить программу обработкой сообщения о нажатии правой или левой клавиши мыши. При этом выдавать сообщение о нажатии клавиши.
Вывод информации может быть осуществлён с помощью функции
int WINAPI MessageBox(HWND hwndParent, LPCSTR lpszText,
LPCSTR lpszTitle, UINT fuStyle);
Напомним, что эта функция создает на экране диалоговую панель с текстом, заданным параметром lpszText и заголовком, заданным параметром lpszTitle. Если заголовок указан как NULL, используется заголовок по умолчанию - строка "Error".
Параметр hwndParent указывает идентификатор родительского окна, создающего диалоговую панель. Этот параметр можно указывать как NULL, в этом случае у диалоговой панели не будет родительского окна. Вы можете вызвать функцию MessageBox из функции диалога, в этом случае первый параметр должен содержать идентификатор окна диалоговой панели.
Последний параметр fuStyle определяет стиль и внешний вид диалоговой панели. Вы можете использовать одну из следующих констант, определяющих количество кнопок, расположенных на диалоговой панели и надписи на этих кнопках.
Константа | Описание |
MB_ABOTRETRYIGNORE | Диалоговая панель содержит три кнопки с надписями "Abort", "Retry", "Ignore" |
MB_OK | Диалоговая панель содержит одну кнопку "OK" |
MB_OKCANCEL | Две кнопки с надписями "OK", "Cancel" |
MB_RETRYCANCEL | Две кнопки с надписями "Retry", "Cancel" |
MB_YESNO | Две кнопки с надписями "Yes", "No" |
MB_YESNOCANCEL | Три кнопки с надписями "Yes", "No", "Cancel" |
К этим константам при помощи логической операции ИЛИ можно добавлять другие константы.
В опросы.
-
Рассказать обо всех событиях, происходящих после нажатия
-
Как запретить или разрешить создание копий приложения?
-
Кто и когда вызывает WndProc ?
-
Изменить цвет фона, форму курсора.
-
Изменить начальное положение окна, его размеры.
NN | Исходное положение окна | Размер | Цвет фона | Курсор | щелчок мыши (левая) | щелчок мыши (правая) |
1 | В центре | 10*10 см | черный |
| Сообщение о нажатии | Нет реакции |
2 | В левом верхнем углу | 20*20 см | белый |
| Закрыть окно | Нет реакции |
3 | В правом верхнем углу | min | красный |
| Нет реакции | Сообщение о нажатии |
4 | Во весь экран | - | синий |
| Сообщение о нажатии | Нет реакции |
5 | пиктограмма | - | зеленый |
| Закрыть окно | Нет реакции |
6 | В центре | 10*10 см | черный |
| Нет реакции | Закрыть окно |
7 | В левом нижнем углу | 20*20 см | белый |
| Сообщение о нажатии | Нет реакции |
8 | В правом нижнем углу | 10*10 см | красный |
| Закрыть окно | Нет реакции |
9 | Во весь экран | - | синий |
| Нет реакции | Закрыть окно |
10 | пиктограмма | - | зеленый |
| Сообщение о нажатии | Нет реакции |
11 | В центре | 20*20 см | черный |
| Закрыть окно | Нет реакции |
12 | В левом верхнем углу | 10*10 см | белый |
| Нет реакции | Сообщение о нажатии |
13 | В правом верхнем углу | 20*20 см | красный |
| Сообщение о нажатии | Нет реакции |
14 | Во весь экран | - | синий |
| Закрыть окно | Нет реакции |
15 | пиктограмма | - | зеленый |
| Нет реакции | Закрыть окно |
16 | В центре | 10*10 см | черный |
| Сообщение о нажатии | Нет реакции |
17 | В левом нижнем углу | 20*20 см | белый |
| Закрыть окно | Нет реакции |
18 | В правом нижнем углу | 10*10 см | красный |
| Нет реакции | Сообщение о нажатии |
19 | Во весь экран | - | синий |
| Сообщение о нажатии | Нет реакции |
20 | пиктограмма | - | зеленый |
| Закрыть окно | Нет реакции |
21 | В центре | 10*10 см | черный |
| Нет реакции | Закрыть окно |
22 | В левом верхнем углу | 20*20 см | белый |
| Сообщение о нажатии | Нет реакции |
23 | В правом нижнем углу | 10*10 см | красный |
| Закрыть окно | Нет реакции |
24 | Во весь экран | min | синий |
| Нет реакции | Сообщение о нажатии |
25 | пиктограмма | зеленый |
| Сообщение о нажатии | Нет реакции | |
26 | В центре | 10*10 см | черный |
| Закрыть окно | Нет реакции |
27 | В левом верхнем углу | 20*20 см | белый |
| Нет реакции | Закрыть окно |
28 | В правом верхнем углу | min | красный |
| Сообщение о нажатии | Нет реакции |
Литература.
Фролов А.В., Фролов Г.В. Программирование для Windows NT.- М.:ДИАЛОГ МИФИ, 1996.
Верма Р.Д. Справочник по функциям WIN32 API.- М.:Горячая линия - Телеком, 2005.- 551 с. : ил.