Автор работы: Пользователь скрыл имя, 08 Апреля 2013 в 18:44, лабораторная работа
1. Ознакомиться со спецификациями функций WinAPI по управлению окнами и их стилями.
2. Ознакомиться с описанием функций WinAPI, предназначенных для обмена сообщениями.
3. Получить индивидуальный вариант задания у преподавателя.
4. Разработать программу (Windows Application) в соответствии с полученным заданием, в которой должны использоваться главные и дочерние окна, различные элементы управления и стили.
Федеральное государственное автономное
образовательное учреждение
высшего профессионального образования
«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Институт космических и информационных технологий
институт
Кафедра Информатики
кафедра
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №4
тема
Использование механизма обмена сообщениями для
управления окнами в ОС Windows
Вариант № 16
Преподаватель
Студент КИ10-03 ________________ 20.03.2013 Шелепов Д.А
номер группы номер зачетной книжки подпись, дата инициалы, фамилия
Красноярск 2013
Цель работы
1. Ознакомиться со
2. Ознакомиться с описанием функций WinAPI, предназначенных для обмена сообщениями.
3. Получить индивидуальный
вариант задания у
4. Разработать программу (Windows Application) в соответствии с полученным заданием, в которой должны использоваться главные и дочерние окна, различные элементы управления и стили.
5. Написать отчет и
представить его к защите
Постановка задачи
Разработать программу, которая
демонстрирует эффект «прилипания
окна к курсору» при его попадании и
последующем двойном щелчке кнопки мыши
по какой-либо из полос прокрутки. «Отлипание
окна от курсора» производится повторным
двойным щелчком кнопки мыши по полосе
прокрутки.
Текст главной оконной процедуры
#include <windows.h>
// Прототип для главной оконной процедуры
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
// Имя класса окна делается глобальной переменной
char g_szClassName[] = "WindowApplication";
HINSTANCE Instance;
int WINAPI WinMain(HINSTANCE ThisInstance
, HINSTANCE PreviousInstance
, LPSTR lpszArgument
, int CommandShow
)
{
HWND FirstWindow; // Дескриптор окна Использование
механизма обмена сообщениями для управления
окнами в ОС Windows
HWND hWnd_button;
MSG Messages; // Здесь сохраняются все сообщения в приложении
WNDCLASS WindowClass; // Структура данных для пользовательского класса окна
Instance = ThisInstance;
WindowClass.hInstance = ThisInstance;
WindowClass.lpszClassName = g_szClassName;
// указатель на главную оконную процедуру
WindowClass.lpfnWndProc = WindowProcedure;
WindowClass.lpszMenuName = NULL; // Нет системного меню
// использование иконки по умолчанию
WindowClass.hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
WindowClass.hCursor = ::LoadCursor(NULL, IDC_ARROW); // курсор мыши - стрелка
// перерисовка всего окна при изменении высоты и ширины окна,
// а также перехват двойного клика
WindowClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
// нет дополнительных байтов для класса окна
WindowClass.cbClsExtra = 0;
// нет дополнительных байтов для экземпляра окна
WindowClass.cbWndExtra = 0;
// для фона используется цвет по умолчанию
WindowClass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
// зарегистрировать класс окна, а в случае ошибки завершить программу
if (0 == ::RegisterClass(&WindowClass))
return EXIT_FAILURE;
// создание окна
FirstWindow = ::CreateWindow(g_szClassName
// Вывести (показать) окно на экран
::ShowWindow(FirstWindow, CommandShow);
::UpdateWindow(FirstWindow);
// Цикл обработки сообщений
while (::GetMessage(&Messages, NULL, 0, 0))
{
// трансляция сообщений виртуальных клавиш в символьные сообщения
::TranslateMessage(&Messages);
// отправка сообщений в оконную процедуру
::DispatchMessage(&Messages);
}
// Возвратить значение 0 из функции WinMain, которое она получит
// транзитивно от PostQuitMessage()
return Messages.wParam;
}
LRESULT CALLBACK WindowProcedure(HWND hWindow
{
static int xBegin=0,yBegin=0;
static bool flag=false;
switch (uMessage) // Обработка сообщений
{
case WM_COMMAND: // закрытие окна при нажатии на кнопку
::DestroyWindow(hWindow);
return 0;
case WM_MOUSEMOVE:
POINT pos;
GetCursorPos(&pos);
if((flag == true) && (yBegin < pos.y) && (xBegin == pos.x))
{
MoveWindow(hWindow, 0, 0, 150, 150, true);
flag=false;
}
else if((xBegin == pos.x) && (yBegin > pos.y))
{
flag= true;
} else {
MoveWindow(hWindow, pos.x - 75, pos.y - 75, 150, 150, true);
xBegin = pos.x;
yBegin = pos.y;
}
break;
case WM_CLOSE: // закрытие окна
::DestroyWindow(hWindow);
return 0;
case WM_DESTROY: // удаление окна
::PostQuitMessage(0); // отправка сообщения WM_QUIT в очередь сообщений
break;
default: // Для сообщений, с которыми мы не хотим связываться
return DefWindowProc(hWindow
}
return 0;
}
Описание использованных в программе функций Win API
CreateWindow - функция создания окна
#include <windows.h>
// FUNCTION: HWND CreateWindow(LPCTSTR, LPCTSTR, DWORD, LPARAM, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID )
// PARAMETERS: [in] lpClassName - указатель на зарегистрированное имя класса
// [in] lpWindowName - указатель на имя окна
// [in] dwStyle – стиль окна
// [in] x – горизонтальная позиция окна
// [in] y – вертикальная позиция окна
// [in] nWidth – ширина окна
// [in] nHeight – высота окна
// [in] hWndParent – дескриптор родительского или окна-владельца
// [in] hMenu – дескриптор меню или идентификатор дочернего окна
// [in] hInstance – дескриптор экземпляра программы
// [in] lpParam – указатель на данные создания окна
// RETURN VALUE: указатель на хэндл созданного окна - в случае успеха
// NULL - в случае неудачи
// COMMENTS: Для получения
дополнительной информации об
ошибке нужно вызвать
HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle , int x, int y, int nWidth, int nHeight , HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID lpParam);
ShowWindow - функция установки режима отображения окна
#include <windows.h>
// FUNCTION: BOOL ShowWindow(HWND, int)
// PARAMETERS: [in] hWindow – указатель на окно
// [in] nCmdShow – режим отображения
// RETURN VALUE: ненулевое значение - если окно было видимым
// 0 - если окно было скрыто
// COMMENTS: Значение параметра nCmdShow, равное SW_HIDE указывает на скрытие окна,
// SW_SHOW — на активизацию окна, SW_MINIMIZE – на минимизацию окна,
// SW_MAXIMIZE – на развертывание окна, SW_RESTORE – на показ окна с его
// оригинальными параметрами BOOL ShowWindow(HWND hWindow, int nCmdShow);
UpdateWindow - функция обновления содержимого окна
#include <windows.h>
// FUNCTION: BOOL UpdateWindow(HWND)
// PARAMETERS: [in] hWindow – указатель на окно
// RETURN VALUE: ненулевое значение - в случае успеха
// 0 - в случае неудачи
// COMMENTS: Для получения кода ошибки нужно вызвать GetLastError
BOOL UpdateWindow(HWND Wnd);
DestroyWindow - функция уничтожения окна
#include <windows.h>
// FUNCTION: BOOL DestroyWindow(HWND)
// PARAMETERS: [in] hWindow – хэндл уничтожаемого окна
// RETURN VALUE: ненулевое значение - в случае успеха
// 0 - в случае неудачи
// COMMENTS: Для получения кода ошибки нужно вызвать GetLastError
// Текущий поток не может уничтожить окно, созданное другим потоком BOOL DestroyWindow(HWND hWnd);
PostQuitMessage - функция асинхронной отправки потоку сообщения о завершении приложения
// FUNCTION: VOID PostQuitMessage(int)
// PARAMETERS: [in] nExitCode - код завершения приложения
// RETURN VALUE: функция не возвращает значения
// COMMENTS: Значение параметра nExitCode используется как wParameter
// сообщения WM_QUIT
// Обычно используется
для ответа на сообщение WM_
Примеры использования описанных функций Win API
#include <windows.h>
. . .
// создание окна
FirstWindow = ::CreateWindow(g_szClassName
// Вывести (показать) окно на экран
::ShowWindow(FirstWindow, CommandShow);
::UpdateWindow(FirstWindow);
. . .
case WM_COMMAND: // закрытие окна при нажатии на кнопку
::DestroyWindow(hWindow);
return 0;
case WM_MOUSEMOVE:
POINT pos;
GetCursorPos(&pos);
if((flag == true) && (yBegin < pos.y) && (xBegin == pos.x))
{
MoveWindow(hWindow, 0, 0, 150, 150, true);
flag=false;
}
else if((xBegin == pos.x) && (yBegin > pos.y))
{
flag= true;
} else {
MoveWindow(hWindow, pos.x - 75, pos.y - 75, 150, 150, true);
xBegin = pos.x;
yBegin = pos.y;
}
break;
case WM_CLOSE: // закрытие окна
::DestroyWindow(hWindow);
return 0;
case WM_DESTROY: // удаление окна
::PostQuitMessage(0); // отправка сообщения WM_QUIT в очередь сообщений
break;
. . .
Пример работы программы в виде перехвата содержимого экрана
Рисунок 1 – Пример работы программы
Информация о работе Использование механизма обмена сообщениями для управления окнами в ОС Windows