Автор работы: Пользователь скрыл имя, 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
#include <stdio.h>
#include <windows.h>
LONG WinProcMain(HWND, UINT, WPARAM, LPARAM);
BOOL RegWinClass(WNDPROC, LPCTSTR, UINT);
HWND hWnd;
static HWND hwndPopup;
MSG msg;
HINSTANCE hInst;
POINT LeftCorner;
RECT rect;
char ClassNameMain[]="MainWindow";
//===========================
HDC hdc;
PAINTSTRUCT ps;
HPEN pen;
HFONT font;
//----------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
hInst = hInstance;
if (!RegWinClass((WNDPROC)
return false;
hWnd=CreateWindow(
if (!hWnd) return false;
while (GetMessage(&msg, NULL, 0, 0))
DispatchMessage(&msg);
return int(msg.wParam);
}
//----------------------------
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:
hwndPopup=0;
break;
case WM_PAINT:
/* Сообщение WM_PAINT отправляется тогда, когда система или другое приложение делают запрос, чтобы окрасить часть окна приложения. */
GetClientRect(hWnd,& rect);
hdc = BeginPaint(hWnd, &ps);
/* готовим окно к окрашиванию и заполняем структуру PAINTSTRUCT информацией об окрашивании */
pen=CreatePen(PS_SOLID, 1 ,RGB(255,0,0)); /*создаем перо для рисования*/
SelectObject(hdc, pen);
MoveToEx(hdc, 0,rect.bottom/2, NULL); /*Рисуем линию заданным пером*/
LineTo(hdc,rect.right,rect.
DeleteObject(pen); /*Освобождаем ресурсы*/
font=CreateFont(20,10,0,0,FW_
/* создаем логический шрифт с заданными характеристиками. Логический шрифт может впоследствии быть выбран как шрифт для любого устройства. */
SelectObject(hdc, font);
SetTextColor(hdc,RGB(255,0,
TextOut(hdc,rect.right-200,
/* записываем строку символов в заданном месте, используя текущий выбранный шрифт, цвет фона и цвет текста. */
DeleteObject(font);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return LONG(DefWindowProc( hWnd, msg, wParam, lParam));
}
return 0;
}
Рис. 3.3.1- Вывод графического примитива на форму
К лабораторной работе №4 добавить вызовы блоков диалога: одного пользовательского и двух стандартных. Блоки диалога должны вызываться по нажатию на клавиши. Элементы управление на пользовательском блоке диалога можно создавать как программно, так и с помощью редактора ресурсов. Обрабатываемые клавиши и действия блоков диалога определить по варианту.
Обработка клавиш:
switch (msg)
{
case WM_KEYDOWN:
switch(LOWORD(wParam))
{
case VK_F1: break;
…
case VK_F9: break;
case VK_UP: break;
case VK_DOWN: break;
case VK_LEFT: break;
case VK_RIGHT: break;
case VK_INSERT: break;
case VK_DELETE: break;
}
break;
}
Варианты заданий.
№ |
Пользовательский блок диалога 1) вызывается по клавише ...; 2) выполняет действия … |
Первый стандартный блок диалога 1) вызывается по клавише …; 2) выполняет действия … |
Второй стандартный блок диалога 1) вызывается по клавише …; 2) выполняет действия … |
5 |
1) F3; 2) вводит координаты первой |
1) F4; 2) стандартный блок диалога выбора цвета вводит цвет пера линии |
1) F5; 2) стандартный блок диалога выбора шрифта вводит шрифт для надписи. |
LRESULT DialProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND hBut[6], hStatic;
static HWND Edit;
static char buf[512];
RECT rect;
switch(msg)
{
case WM_INITDIALOG:
/* Сообщение WM_INITDIALOG отправляется процедуре диалогового окна непосредственно перед показом на экране диалогового окна. Процедуры диалогового окна обычно используют это сообщение, чтобы инициализировать органы управления и выполнить какие-либо другие задачи инициализации, которые влияют на внешний вид блока диалога.*/
hStatic=CreateWindow("static",
/*Создание
статических полей для
Edit=CreateWindowEx(WS_EX_
/*Создание текстового полей для вывода данных*/
sprintf(buf, "P[0](x;y) = P[0](%02d;%02d)",p[0].x,p[0].
SetDlgItemText(hDlg,EditID,
/* Функция SetDlgItemText устанавливает заголовок или текст органа управления в диалоговом окне*/
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hDlg,IDOK);
break;
case IDCANCEL:
EndDialog(hDlg,IDCANCEL);
break;
}
return 0;
}
return 0;
}
Вызов.
/*Если нажата клавиша «F3» , то вызываем диалоговое окно*/
case VK_F3: //Координаты первой точки
if (DialogBox(NULL,(LPSTR)IDD_
{
InvalidateRect(hWnd,NULL,TRUE)
/*Если
нажата кнопка «ОК» , то вызываем
перерисовку формы. Функция
}
break;
/*---------------Диалоговое
char str[256];
static CHOOSEFONT cfont; /* Структура CHOOSEFONT содержит информацию, которую использует функция ChooseFont, чтобы инициализировать диалоговое окно Шрифт (Font). После того, как пользователь закроет диалоговое окно, система возвращает информацию о выборе пользователя в этой структуре */
static LOGFONT lf; /* формируем структуру с информацией о шрифте LOGFONT, которая будет хранить информацию, пробуя её сформировать и работать с тем, что получится в результате. */
static COLORREF colfont;
HFONT font;
/*----------------------------
/*---------------Диалоговое окно для цвета---------------------*/
static COLORREF colorPen;
static CHOOSECOLOR cc = {0}; /* Структура CHOOSECOLOR содержит информацию, которую использует функция ChooseColor, чтобы инициализировать диалоговое окно Цвет (Color). После того, как пользователь закроет диалоговое окно, в этой структуре система возвращает информацию о выборе пользователя. */
cc.lStructSize = sizeof(cc);
COLORREF cust_colors[16] = { 0 };
cc.lpCustColors = cust_colors;
/*----------------------------
switch(msg)
{
case WM_CREATE:
penstyle=PS_DASHDOT;
ZeroMemory(&lf,sizeof(lf));
lf.lfHeight=30;
lf.lfItalic=1;
lf.lfWeight=FW_BOLD;
strcpy(lf.lfFaceName,"Arial");
colfont=RGB(255,0,0);
cfont.lStructSize=sizeof(
cfont.Flags=CF_SCREENFONTS|CF_
cfont.lpLogFont=&lf;
cfont.rgbColors=colfont;
break;
Вызов.
case WM_KEYDOWN:
switch(LOWORD(wParam))
{
case VK_F4: //Выбор цвета
if (ChooseColor(&cc))
{
colorPen=cc.rgbResult;
InvalidateRect(hWnd,NULL,TRUE)
} break;
case VK_F5: //Выбор шрифта
if (ChooseFont(&cfont))
{
lf=*cfont.lpLogFont;
colfont=cfont.rgbColors;
InvalidateRect(hWnd,NULL,TRUE)
} break;
Рис.4.4.1 – Вывод диалогового окна по кнопке F3
Рис.4.4.2 – Вывод диалогового окна по кнопке F4
Рис.4.4.3
– Результат использования
Рис.4.4.4 – Вывод диалогового окна по кнопке F5
Рис.4.4.5 – Установка параметров диалогового окна по кнопке F5
Рис.4.4.6
– Результат использования
Создать в приложении вторичный поток, входная функция которого рисует эллипс. Координаты центра, длины полуосей и дескриптор окна передать входной функции вторичного потока в качестве параметра.
#include <windows.h>
#include <string.h>
#include <stdio.h>
/* Установка значений
#define ButtonID 2109
#define EditID1 21100
#define EditID2 21110
#define EditID3 21120
#define EditID4 21130
typedef struct /*Структура для хранения полученных данных*/
{
HWND hwnd;
int centerX, centerY; //точка центра эллипса
int dx, dy; //длина полуосей
}
datas;
HWND butClick;
HWND Edit1,Edit2,Edit3,Edit4;
HWND hStatic1,hStatic2,hStatic3,
HWND Edit1,Edit2,Edit3,Edit4 /*Объявление переменных для текстовых полей*/
HWND hStatic1,hStatic2,hStatic3,
LONG MyWinP(HWND, UINT,WPARAM,LPARAM);
DWORD WINAPI Thread2(LPVOID params);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
char ProgName[]="DoubleThread";
char Title[]="TitleProgram";
RECT value;
HWND hWnd; MSG msg;
WNDCLASS w;
w.lpszClassName=ProgName;
w.hInstance=hInstance;
w.lpfnWndProc=(WNDPROC)MyWinP;
w.hCursor=LoadCursor(NULL, IDC_ARROW);
w.hIcon=LoadIcon(NULL, IDI_APPLICATION);
w.lpszMenuName=NULL;
w.hbrBackground=(HBRUSH)(
w.style=CS_HREDRAW | CS_VREDRAW;
w.cbClsExtra=0;
w.cbWndExtra=0;
if(!RegisterClass(&w)) return false;
hWnd=CreateWindow(ProgName,
GetClientRect(hWnd,&value);
/*---------------Кнопка
установки параметров----------
butClick=CreateWindow("button"
/*--------------------Поля
для ввода параметров--------------------
Edit1=CreateWindowEx(WS_EX_
Edit2=CreateWindowEx(WS_EX_
Edit3=CreateWindowEx(WS_EX_
Edit4=CreateWindowEx(WS_EX_
/*----------------Подсказки
для ввода-------------------------
hStatic1=CreateWindow("static"
hStatic2=CreateWindow("static"
hStatic3=CreateWindow("static"
hStatic4=CreateWindow("static"
/*--------------Начальные
данные для эллипса------------
SetDlgItemText(hWnd,EditID1,"
SetDlgItemText(hWnd,EditID2,"
SetDlgItemText(hWnd,EditID3,"
SetDlgItemText(hWnd,EditID4,"
if (!hWnd) return false;
ShowWindow(hWnd, nCmdShow);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LONG MyWinP(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
datas d;
DWORD id;
static HANDLE hThr;
char buf[256];
switch(msg)
{
case WM_CREATE:
hThr=0;
break;
case WM_PAINT:
/*Получаем и устанавливаем
hdc = BeginPaint(hWnd, &ps);
d.hwnd=hWnd;
GetDlgItemText(hWnd,EditID1,
d.dy=atof(buf);
GetDlgItemText(hWnd,EditID2,
d.dx=atof(buf);
GetDlgItemText(hWnd,EditID3,
d.centerY=atof(buf);
GetDlgItemText(hWnd,EditID4,
d.centerX=atof(buf);
if (hThr!=0) CloseHandle(hThr);
hThr=CreateThread(NULL,0,(
EndPaint(hWnd, &ps);
/*Функция CreateThread создает поток, который выполняется в пределах виртуального адресного пространства вызывающего процесса.*/
break;
case WM_COMMAND:
/* Сообщение WM_COMMAND отправляется тогда, когда пользователь выбирает командный пункт из меню, когда орган управления отправляет уведомительное сообщение своему родительскому окну, или когда транслируется нажатие клавиши - ускорителя */
if(LOWORD(wParam)==ButtonID)
{
SendMessage(hWnd,WM_PAINT,
}
break;
case WM_DESTROY:
CloseHandle(hThr); /* Функция CloseHandle закрывает дескриптор открытого объекта. */
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
DWORD WINAPI Thread2(LPVOID params) /*Функция для выполнения во вторичном потоке*/
{
datas
*dt=(datas*)params; /*
Информация о работе Изменения свойств и уничтожения перекрывающихся и всплывающих окон