Использование механизма обмена сообщениями для управления окнами в ОС Windows

Автор работы: Пользователь скрыл имя, 08 Апреля 2013 в 18:44, лабораторная работа

Краткое описание

1. Ознакомиться со спецификациями функций WinAPI по управлению окнами и их стилями.
2. Ознакомиться с описанием функций WinAPI, предназначенных для обмена сообщениями.
3. Получить индивидуальный вариант задания у преподавателя.
4. Разработать программу (Windows Application) в соответствии с полученным заданием, в которой должны использоваться главные и дочерние окна, различные элементы управления и стили.

Прикрепленные файлы: 1 файл

Otchet4.docx

— 282.15 Кб (Скачать документ)

 

Федеральное государственное  автономное

образовательное учреждение

высшего профессионального  образования

«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ  УНИВЕРСИТЕТ»

 

Институт  космических и информационных технологий

институт

Кафедра Информатики

кафедра

 

 

 

 

 

 

 

ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №4

 

тема

Использование механизма обмена сообщениями для

управления  окнами в ОС Windows

Вариант №  16

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Преподаватель                         __________                           Кузнецов А.С.

                                                                              подпись, дата                                             инициалы, фамилия

 

Студент     КИ10-03       ________________   20.03.2013    Шелепов Д.А

                           номер группы            номер зачетной книжки         подпись, дата          инициалы, фамилия

 

 

 

Красноярск 2013 

Цель работы

1. Ознакомиться со спецификациями  функций WinAPI по управлению окнами и их стилями.

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                                                    2

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              // Имя класса

                                 , "Лаб4вар16"   // заголовок окна

                                 , WS_VSCROLL | WS_OVERLAPPEDWINDOW | WS_HSCROLL

                                 , 0//CW_USEDEFAULT            // ОС решает за нас,

                                 , 0//CW_USEDEFAULT            // куда разместить окно

                                 , 150                      // ширина окна

                                 , 150                      // высота окна

                                 , HWND_DESKTOP  // это окно - потомок рабочего стола

                                 , NULL          // меню не выводится

                                 , ThisInstance  // дескриптор экземпляра программы

                                 , NULL          // без данных для создания окна

                                );

 

// Вывести (показать) окно на экран

    ::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

                                 , UINT uMessage

                                 , WPARAM wFirstParameter

                                 , LPARAM lSecondParameter

                                )

{

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

                                   , uMessage

                                   , wFirstParameter

                                   , lSecondParameter

                                  );

    }

    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: Для получения  дополнительной информации об  ошибке нужно вызвать GetLastError

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_DESTROYVOID PostQuitMessage(int);

 

Примеры использования  описанных функций Win API

 

#include <windows.h>

. . .

// создание окна

    FirstWindow = ::CreateWindow(g_szClassName              // Имя класса

                                 , "Лаб4вар16"   // заголовок окна

                                 , WS_VSCROLL | WS_OVERLAPPEDWINDOW | WS_HSCROLL     

                                 , 0//CW_USEDEFAULT            // ОС решает за нас,

                                 , 0//CW_USEDEFAULT            // куда разместить окно

                                 , 150                      // ширина окна

                                 , 150                      // высота окна

                                 , HWND_DESKTOP  // это окно - потомок рабочего стола

                                 , NULL          // меню не выводится

                                 , ThisInstance  // дескриптор экземпляра программы

                                 , NULL          // без данных для создания окна

                                );

 

// Вывести (показать) окно на экран

    ::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