Автор работы: Пользователь скрыл имя, 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
{
hInst = hInstance;
if (!RegWinClass((WNDPROC)
return false;
/*Для
создания окна вызывается
hWnd=CreateWindow(
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)(
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)
/*перебираем значения
{
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.3.1 – Начальное положение окон
Рис. 1.3.2 – Положение окон после первого клика мыши
Рис. 1.3.3 – Положение окон после второго клика мыши
Рис. 1.3.4 – Положение окон после третьего клика мыши
Написать программу на Win32 API, в которой должны быть выполнены следующие действия: программно создать строку состояния и вертикальную полосу прокрутки; для полосы прокрутки задать параметры и обработать сообщения; текущее положение ползунка полосы прокрутки должно выводиться в строку состояния.
#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_
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_
/*При создании
окна указываем свойство WS_
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]=
pParts[2]=cx-150; pParts[3]=
SendMessage(hStatus, SB_SETPARTS, 4, (LPARAM)pParts);
return 0;
case WM_CREATE:
hStatus=CreateStatusWindow(WS_
/*Создаем строку состояния*/
SendMessage(hStatus, SB_SETTEXT, 0, (LONG)"Положение ScrollBar:");
SetTimer(hWnd, 1, 1000, NULL);
/*Устанавливаем таймер для
minX=0;
maxX=100;
pageX=10;
curX=30;
/*Указываем параметры полосы прокрутки*/
SetScrollRange(hMainWnd,SB_
SetScrollPos(hMainWnd,SB_VERT,
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; }
Рис. 2.3.1 – Перемещение повзунка ScrollBar в позицию 58
Рис. 2.3.2 – Перемещение повзунка ScrollBar в позицию 58
Нарисовать
графический примитив произвольного
размера с помощью
Варианты заданий.
№ |
Объект для рисования |
Положение в клиентской области окна |
Положение строки |
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 |
Полилиния (из шести отрезков) |
Центр |
Правый нижний угол |
Информация о работе Изменения свойств и уничтожения перекрывающихся и всплывающих окон