Изменения свойств и уничтожения перекрывающихся и всплывающих окон

Автор работы: Пользователь скрыл имя, 18 Ноября 2012 в 22:18, курсовая работа

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

Целью данной работы является: изучение способов создания, изменения свойств и уничтожения перекрывающихся и всплывающих окон, создания элементов управления на пользовательском блоке диалога с помощью редактора ресурсов, а также программно; применение в приложении вторичных потоков, входная функция которых позволяет реализовать прорисовку графических примитивов; научиться передавать параметры во вторичный поток.

Содержание

ВВЕДЕНИЕ 4
1 Работа с окнами 9
1.1 Условие 9
1.2 Описание программного кода 9
1.3 Пример работы программы 13
2 Работа со стандартными элементами управления 15
2.1 Условие 15
2.2 Описание программного кода 15
2.3 Пример работы программы 19
3 Интерфейс графических устройств 20
3.1 Условие 20
3.2 Описание программного кода 21
3.3 Пример работы программы 23
4 Блоки диалога 24
4.1 Условие 24
4.2 Пользовательский блок диалога 25
4.3 Стандартные блоки диалога 26
4.4 Пример работы программы 27
5 Вторичный поток 31
5.1 Условие 31
5.2 Описание программного кода 31
5.3 Пример работы программы 34
ВЫВОД 36
Список ИСПользуемой литературы 37
Приложение А. Исходный код к заданию №1 38
Приложение Б. Исходный код к заданию №2 40
Приложение В. Исходный код к заданию №3 43
Приложение Г. Исходный код к заданию №4 45
Приложение Д. Исходный код к заданию №5 48

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

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА (Автосохраненный).docx

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

 

{

hInst = hInstance;

    if (!RegWinClass((WNDPROC)WinProcMain, ClassNameMain, COLOR_WINDOW))

return false;

 

/*Для  создания окна вызывается функция   CreateWindow. Если окно не создано, приложение завершает свою работу.*/

 

hWnd=CreateWindow(ClassNameMain, "Заголовок", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

if (!hWnd) return false;

GetWindowRect(hWnd,&rect);

hwndPopup=CreateWindow( ClassNameMain, 0, WS_POPUPWINDOW | WS_VISIBLE, rect.left, rect.top ,rect.right/5, rect.bottom/5, hWnd, NULL, hInst, NULL);

if (!hwndPopup) return false;

while (GetMessage(&msg, NULL, 0, 0))

DispatchMessage(&msg);

return int(msg.wParam);

}

//---------------------------------регистрация  классов-----------------------------

/* Для регистрации класса окон  удобно использовать функцию следующего типа:

BOOL RegWinClass(WNDPROC proc, LPCTSTR lpszClassName, UINT hrBackGround)

{}

Формальными параметрами этой функции являются указатели на функцию окна и строку  с именем класса. Имя, список формальных параметров  и тип возврата функции  могут быть любыми другими. Главное, чтобы приложению после регистрации  были доступны имя зарезервированного класса, а операционной системе –  функции окна этого класса. Поясним  некоторые операторы этой функции.

Не используются дополнительные данные: w.cbClsExtra=0;  w.cbWndExtra=0

Поле  hInstance содержит дескриптор текущего приложения w.hInstance=hInst

Функция RegisterClass регистрирует класс в операционной системе её аргументом является адрес подготовленной структуры w. При успешной регистрации класса она возвращает ненулевое значение, иначе – 0.*/

 

BOOL RegWinClass(WNDPROC proc, LPCTSTR lpszClassName, UINT hrBackGround)

{

WNDCLASS w;

w.lpszClassName=lpszClassName;

w.hInstance=hInst;

w.lpfnWndProc=proc;

w.hCursor=LoadCursor(NULL, IDC_ARROW);

w.hIcon=LoadIcon(NULL, lpszClassName);

w.lpszMenuName=NULL;

w.hbrBackground=(HBRUSH)(hrBackGround+1);

w.style=CS_HREDRAW | CS_VREDRAW;

w.cbClsExtra=0;

w.cbWndExtra=0;

return (RegisterClass(&w)!=0);

}

 

//-------------------------------------обработка  сообщений-----------------------------

LONG  WinProcMain(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

static int corner=0;

switch(msg)

{

case WM_CREATE:

 

/*Сообщение  WM_CREATE посылается тогда, когда программа запрашивает, вызовом какой функции CreateWindowEx или CreateWindow должно быть создано окно. Оконная процедура нового окна принимает это сообщение после того, как окно создано, но до того, как окно становится видимым. Сообщение посылается перед возвращением значения функцией CreateWindowEx или CreateWindow.*/

 

hwndPopup=0;

break;

case WM_LBUTTONDOWN:

 

/*Сообщение  WM_LBUTTONDOWN посылается когда пользователь  нажимает левую кнопку мыши  пока курсор находится в клиентской  области окна. Если мышь не  захвачена, сообщение посылается  окну под курсором. Иначе, сообщение  посылается окну, которое захватило  мышь.*/

 

if (hWnd!=hwndPopup)  /* блокируем возможность использования данного сообщения к подчиненному окну*/

{

GetWindowRect(hWnd,&rect); /*получаем размеры главного окна и записываем в структуру rect*/

 

switch(corner)

/*перебираем значения логической  переменной corner, отвечающей за местоположение подчиненного окна */

{

case 0:

LeftCorner.x=rect.right; /* устанавливаем координату «х» левого верхнего угла подчиненного окна*/

LeftCorner.y=rect.top; /* устанавливаем координату «х» левого верхнего угла подчиненного окна*/

corner++; /* увеличиваем значение логической переменной на 1*/    break;

case 1:

LeftCorner.x=rect.right;

LeftCorner.y=rect.bottom;

corner++;

break;

case 2:

LeftCorner.x=rect.left;

LeftCorner.y=rect.bottom;

corner++;

break;

case 3:

LeftCorner.x=rect.left;

LeftCorner.y=rect.top;

corner=0; /* обнуляем значение логической переменной для установки подчиненного окна в начальное положение*/

break;

}

MoveWindow(hwndPopup, LeftCorner.x, LeftCorner.y, rect.right/4, rect.bottom/4, TRUE);

 

/*Функция  MoveWindow изменяет позицию и габариты  определяемого окна. Для окна  верхнего уровня, позиция и габариты - относительно левого верхнего  угла экрана. Для дочернего окна, они - относительно левого верхнего  угла рабочей области родительского  окна. В качестве параметров передаем  идентификатор окна и полученные  ранее координаты нового расположения*/ }

}

break;

case WM_DESTROY:

PostQuitMessage(0);

 

/* Это сообщение посылается когда необходимо уничтожить окно. После удалении его с экрана. Посылается сообщение сначала главному окну, а потом дочерним окнам. После принятия этого сообщения необходимо вызывать функцию PostQuitMessage(). Сообщение о разрушении окна поступит именно оконной процедуре, а не в стандартной очереди сообщения.

*/  break;

default:

return LONG(DefWindowProc( hWnd, msg, wParam, lParam));

/*Обеспечивает стандартную обработку  сообщений для сообщений, которые  явно не обрабатываются прикладной  задачей.*/  }

return 0;

}

 

    1. Пример работы программы

 

 

Рис. 1.3.1 – Начальное положение  окон

 

 

Рис. 1.3.2 – Положение окон после  первого клика мыши

 

 

 

Рис. 1.3.3 – Положение окон после  второго клика мыши

 

 

Рис. 1.3.4 – Положение окон после  третьего клика мыши

 

  1. Работа со стандартными элементами управления

 

    1. Условие

 

Написать  программу на Win32 API, в которой  должны быть выполнены следующие  действия: программно создать строку состояния и вертикальную полосу прокрутки; для полосы прокрутки задать параметры и обработать сообщения; текущее положение ползунка полосы прокрутки должно выводиться в строку состояния.

    1. Описание программного кода

 

#include <windows.h>

#include <commctrl.h>

#include <tchar.h>

#include<stdio.h>

#pragma comment(lib, "comctl32.lib")

#define ID_STATUS 1

#define IDC_VERT -1

#define MAX_RANGE 50

 

 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HWND hMainWnd;

HWND hWndVertScroll;

char szClassName[] = "MyClass";

MSG msg;

WNDCLASSEX wc;

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

// Заполняем  структуру класса окна

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = 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)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = szClassName;

wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

 

// Регистрируем  класс окна

if (!RegisterClassEx(&wc))

{

MessageBox(NULL, "Cannot register class", "Error", MB_OK);

return 0;

}

 

// Создаем основное окно  приложения

hMainWnd = CreateWindow(szClassName, "Лабораторная № 2", WS_OVERLAPPEDWINDOW|WS_VSCROLL,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,(HWND)NULL, (HMENU)NULL,(HINSTANCE)hInstance, NULL);

/*При создании  окна указываем свойство WS_VSCROLL для добавления на форму вертикальной полосы прокрутки*/

 

if (!hMainWnd)

{

MessageBox(NULL, "Cannot create main window", "Error", MB_OK);

return 0;

}

ShowWindow(hMainWnd, nCmdShow);

 

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

 

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

HDC hDC;

PAINTSTRUCT ps;

RECT rect;

static short cx;

static int pParts[4];

static HWND hStatus; /*Дескриптор для строки состояния*/

SYSTEMTIME st; /*Структура для хранения даннях о системном времени*/

int day, month, year, sec, min, hour; /*Вспомогательные переменные*/

char Buf[256];

char pos[256];

static int maxX;

static int curX,pageX;

static int minX;

 

switch (msg)

{

case WM_PAINT:

hDC = BeginPaint(hWnd, &ps);

GetClientRect(hWnd, &rect);

DrawText(hDC, "В  элементе 'StatusBar' будет отображаться  положение элемента 'ScrollBar', дата  и время.", -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER );

EndPaint(hWnd, &ps);

return 0;

case WM_SIZE:

MoveWindow(hStatus, 0,0,0,0, TRUE);

/*Делаем так,чтобы строка состояния  изменяла свои размеры при  изменении размеров главного  окна*/

cx=LOWORD(lParam);

/*Разбиваем строку на составные  части*/

pParts[0]=cx-500;   pParts[1]=cx-300;

pParts[2]=cx-150;   pParts[3]=cx;

SendMessage(hStatus, SB_SETPARTS, 4, (LPARAM)pParts);

return 0;

case WM_CREATE:

hStatus=CreateStatusWindow(WS_CHILD|WS_VISIBLE, "Положение ScrollBar:", hWnd, ID_STATUS);

/*Создаем строку состояния*/

SendMessage(hStatus, SB_SETTEXT, 0, (LONG)"Положение ScrollBar:");

SetTimer(hWnd, 1, 1000, NULL);

/*Устанавливаем таймер для вивода  текущего времени в строку  состояния*/

minX=0;

maxX=100;

pageX=10;

curX=30;

/*Указываем параметры полосы  прокрутки*/

SetScrollRange(hMainWnd,SB_VERT,minX,maxX,TRUE);

SetScrollPos(hMainWnd,SB_VERT,curX,TRUE);

return 0;

/*==Управление ScrollBar=======================*/

case WM_VSCROLL:

/* WM_VSCROLL сообщение отправляется в окно, когда событие scroll происходит в стандартные вертикальной прокрутки окна. Это сообщение также отправляется владельцу вертикальной полосы прокрутки при возникновении события прокрутки в элементе управления. */

switch(LOWORD(wParam))

{

case SB_LINEUP:

/* Пользователь сделал щелчок мышью по верхней кнопке горизонтальной полосы просмотра. Значение позиции полосы просмотра уменьшается на единицу */

curX--;

break;

case SB_LINEDOWN:

/* Аналогично предыдущему, но щелчок сделан по нижней кнопке полосы просмотра. Значение позиции полосы просмотра увеличивается на единицу */

curX++;

break;

case SB_THUMBPOSITION:    /* Прокрутка к абсолютной позиции */

case SB_THUMBTRACK: /* Перетаскивают бегунок к определенной позиции */

curX=HIWORD(wParam);

break;

}

  if (curX>=maxX)

{/* EnableScrollBar Определяет, допускаются ли стрелки полосы прокрутки или заблокированы и которые стрелки допускаются или заблокированы. */

EnableScrollBar(hMainWnd, SB_VERT, ESB_ENABLE_BOTH);

curX=maxX;

EnableScrollBar(hMainWnd, SB_VERT, ESB_DISABLE_DOWN);

/*Устанавливаем движок полосы  прокрутки в самую нижнюю позицию  и делаем недоступной кнопку  прокрутки вниз*/

 

}

  else  if (curX<=minX)

{

EnableScrollBar(hMainWnd, SB_VERT, ESB_ENABLE_BOTH);

curX=minX;

EnableScrollBar(hMainWnd, SB_VERT, ESB_DISABLE_UP);

/*Устанавливаем движок полосы  прокрутки в самуюверхнюю позицию  и делаем недоступной кнопку  прокрутки вверх*/

}

  else EnableScrollBar(hMainWnd, SB_VERT, ESB_ENABLE_BOTH);

/*Если движок находится в  пределах диапазона прокрутки   делаем доступными кнопки прокрутки  вверх и вниз*/

 

SetScrollPos(hMainWnd, SB_VERT, curX, TRUE); /* Определяем новую позицию бегунка. */

sprintf(pos,"%d",curX);

SendMessage(hStatus, SB_SETTEXT, 1, (LONG)pos);

break;

return 0;

/*=========Время для StatusBar===========================*/

case WM_TIMER:

GetLocalTime(&st);

day=st.wDay;

month=st.wMonth;

year=st.wYear;

hour=st.wHour;

min=st.wMinute;

sec=st.wSecond;

sprintf(Buf, "%02d.%02d.%02d", day, month, year);

SendMessage(hStatus, SB_SETTEXT, 2, (LONG)Buf);

sprintf(Buf, "%02d:%02d:%02d", hour, min, sec);

SendMessage(hStatus, SB_SETTEXT, 3, (LONG)Buf);

return 0;

 

case WM_CLOSE:

DestroyWindow(hWnd);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

KillTimer(hWnd,1); /*Уничтожаем созданный таймер*/

return 0;

default:

return DefWindowProc(hWnd, msg, wParam, lParam);

}

return 0; }

 

 

    1. Пример работы программы

 

 

Рис. 2.3.1 – Перемещение повзунка ScrollBar в позицию 58


 

Рис. 2.3.2 – Перемещение повзунка ScrollBar в позицию 58

  1. Интерфейс графических устройств

 

    1. Условие

 

Нарисовать  графический примитив произвольного  размера с помощью определённого  ранее пера (и если необходимо кисти). Вид графического примитива и  его расположение выбрать в соответствии с вариантом. Определить шрифт и  с его помощью вывести произвольную строку в соответствующую варианту часть клиентской области окна.

 

Варианты  заданий.

 

Объект для рисования 

Положение в клиентской области окна

Положение строки

1

Прямоугольник

Левый верхний угол

Центр

2

битовый массив

Правый верхний угол

Левый нижний угол

3

Прямоугольник с закруглёнными  углами (RoundRect)

Правый нижний угол

Левый верхний угол

4

Полилиния (из шести отрезков)

Левый нижний угол

Правый верхний угол

5

Горизонтальная линия

Центр

Правый нижний угол

6

Сектор эллипса (Pie)

Левый верхний угол

Центр

7

битовый массив

Правый верхний угол

Левый нижний угол

8

Вертикальная линия

Правый нижний угол

Левый верхний угол

9

Прямоугольник

Левый нижний угол

Правый верхний угол

10

Сектор эллипса (Pie)

Центр

Правый нижний угол

11

Хорда (Chord)

Левый верхний угол

Центр

12

Горизонтальная линия

Правый верхний угол

Левый нижний угол

13

битовый массив

Правый нижний угол

Левый верхний угол

14

Хорда (Chord)

Левый нижний угол

Правый верхний угол

15

Полилиния (из шести отрезков)

Центр

Правый нижний угол

16

Пятиугольник (Polygon)

Левый верхний угол

Центр

17

Вертикальная линия

Правый верхний угол

Левый нижний угол

18

битовый массив

Правый нижний угол

Левый верхний угол

19

Прямоугольник

Левый нижний угол

Правый верхний угол

20

Пятиугольник (Polygon)

Центр

Правый нижний угол

21

Эллипс

Левый верхний угол

Центр

22

битовый массив

Правый верхний угол

Левый нижний угол

23

Эллипс

Правый нижний угол

Левый верхний угол

24

Вертикальная линия

Левый нижний угол

Правый верхний угол

25

Полилиния (из шести отрезков)

Центр

Правый нижний угол

Информация о работе Изменения свойств и уничтожения перекрывающихся и всплывающих окон