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

Автор работы: Пользователь скрыл имя, 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 Мб (Скачать документ)

 

 

 

 

 

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

 

#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";

//===========================Pen=====================

HDC hdc;

PAINTSTRUCT ps;

HPEN pen;

HFONT font;

//-------------------------------вход в  программу----------------------------------

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

{

hInst = hInstance;

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

return false;

hWnd=CreateWindow(ClassNameMain, "Лабораторная № 3", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

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

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.bottom/2);

DeleteObject(pen);  /*Освобождаем ресурсы*/

font=CreateFont(20,10,0,0,FW_BOLD,1,1,0,RUSSIAN_CHARSET,OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH|FF_ROMAN, NULL);

/*  создаем логический шрифт с заданными характеристиками. Логический шрифт может впоследствии быть выбран как шрифт для любого устройства. */

 

SelectObject(hdc, font);

SetTextColor(hdc,RGB(255,0,255));

TextOut(hdc,rect.right-200,rect.bottom-100,"Hello! World!!!",15);

/* записываем строку символов в заданном месте, используя текущий выбранный шрифт, цвет фона и цвет текста. */

DeleteObject(font);

EndPaint(hWnd,&ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

 

 

 

 

 

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

 

 

Рис. 3.3.1- Вывод графического примитива на форму

 

  1. Блоки диалога

 

    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) стандартный  блок диалога выбора шрифта  вводит шрифт для надписи.


 

 

 

 

    1. Пользовательский блок диалога

 

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","Первая точка линии.", WS_TABSTOP|WS_CHILD|WS_VISIBLE,10,10,145,20,hDlg,0,NULL,NULL);

 

/*Создание  статических полей для подсказок*/

Edit=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",NULL,ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE,10, 100,170,20,hDlg,(HMENU) EditID,NULL,NULL);

 

/*Создание  текстового полей для вывода  данных*/

 

sprintf(buf, "P[0](x;y) = P[0](%02d;%02d)",p[0].x,p[0].y); /*Форматируем строку для вывода*/

SetDlgItemText(hDlg,EditID,buf);

 

/* Функция 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_DIALOG1,hWnd,(DLGPROC)DialProc)==IDOK)

{

InvalidateRect(hWnd,NULL,TRUE);

/*Если  нажата кнопка «ОК» , то вызываем  перерисовку формы. Функция InvalidateRect добавляет прямоугольник к обновляемому  региону заданного окна. Обновляемый  регион представляет часть рабочей  области окна, которая должна  быть перерисована. */

}

break;

 

 

    1. Стандартные блоки диалога

 

/*---------------Диалоговое окно  для шрифта---------------------*/

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);

cfont.Flags=CF_SCREENFONTS|CF_EFFECTS|CF_INITTOLOGFONTSTRUCT;

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;

 

 

 

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

 

Рис.4.4.1 – Вывод диалогового окна по кнопке F3

Рис.4.4.2 – Вывод диалогового окна по кнопке F4

 

Рис.4.4.3 – Результат использования диалогового  окна по кнопке F4

 

Рис.4.4.4 – Вывод диалогового окна по кнопке F5

Рис.4.4.5 – Установка параметров диалогового  окна по кнопке F5

 

Рис.4.4.6 – Результат использования диалогового  окна по кнопке F5

 

  1. Вторичный поток

 

    1. Условие

 

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

 

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

 

#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,hStatic4; HWND butClick;  /*Объявление переменной для кнопки*/

HWND Edit1,Edit2,Edit3,Edit4  /*Объявление переменных для текстовых полей*/

HWND hStatic1,hStatic2,hStatic3,hStatic4;  /*Объявление переменных для статических полей*/

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)(COLOR_WINDOW+1);

w.style=CS_HREDRAW | CS_VREDRAW;

w.cbClsExtra=0;

w.cbWndExtra=0;

if(!RegisterClass(&w)) return false;

hWnd=CreateWindow(ProgName,Title, WS_OVERLAPPEDWINDOW,0,0,CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

GetClientRect(hWnd,&value);

/*---------------Кнопка  установки параметров------------------------*/

butClick=CreateWindow("button", "Set", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,value.right-100,value.bottom-50, 80, 20, hWnd, (HMENU)ButtonID, hInstance, NULL);

/*--------------------Поля для ввода параметров---------------------*/

Edit1=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",NULL,ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE,value.right-160,value.bottom-80,60,20,hWnd,(HMENU) EditID1,NULL,NULL);

Edit2=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",NULL,ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE,value.right-160,value.bottom-110,60,20,hWnd,(HMENU) EditID2,NULL,NULL);

Edit3=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",NULL,ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE,value.right-160,value.bottom-140,60,20,hWnd,(HMENU) EditID3,NULL,NULL);

Edit4=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",NULL,ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE,value.right-160,value.bottom-170,60,20,hWnd,(HMENU) EditID4,NULL,NULL);

/*----------------Подсказки для ввода-------------------------------*/

hStatic1=CreateWindow("static","Координата Х:", WS_TABSTOP|WS_CHILD|WS_VISIBLE,value.right-310,value.bottom-170,145,20,hWnd,0,NULL,NULL);

hStatic2=CreateWindow("static","Координата Y:", WS_TABSTOP|WS_CHILD|WS_VISIBLE,value.right-310,value.bottom-140,145,20,hWnd,0,NULL,NULL);

hStatic3=CreateWindow("static","Длина полуоси dx:", WS_TABSTOP|WS_CHILD|WS_VISIBLE,value.right-310,value.bottom-110,145,20,hWnd,0,NULL,NULL);

hStatic4=CreateWindow("static","Длина полуоси dy:", WS_TABSTOP|WS_CHILD|WS_VISIBLE,value.right-310,value.bottom-80,145,20,hWnd,0,NULL,NULL);

/*--------------Начальные  данные для эллипса------------------------*/

SetDlgItemText(hWnd,EditID1,"50");//значение dy

SetDlgItemText(hWnd,EditID2,"100");//значение dx

SetDlgItemText(hWnd,EditID3,"300");//значение Y

SetDlgItemText(hWnd,EditID4,"300"); //значение Х

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,buf,5);

d.dy=atof(buf);

GetDlgItemText(hWnd,EditID2,buf,5);

d.dx=atof(buf);

GetDlgItemText(hWnd,EditID3,buf,5);

d.centerY=atof(buf);

GetDlgItemText(hWnd,EditID4,buf,5);

d.centerX=atof(buf);

if (hThr!=0) CloseHandle(hThr);

hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread2,(LPVOID)&d,0,&id);

EndPaint(hWnd, &ps);

/*Функция  CreateThread создает поток, который выполняется в пределах виртуального адресного пространства вызывающего процесса.*/

 

break;

case WM_COMMAND:

/* Сообщение WM_COMMAND отправляется тогда, когда пользователь выбирает командный пункт из меню, когда орган управления отправляет уведомительное сообщение своему родительскому окну, или когда транслируется нажатие клавиши - ускорителя */

 

if(LOWORD(wParam)==ButtonID)

{

SendMessage(hWnd,WM_PAINT,NULL,NULL); /*Посылаем сообщение для рисования*/

}

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; /*Устанавливаем принятые параметры для рисования*/

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