Файл: Методические указания по выполнению лабораторных работ Практикум Рекомендовано методической комиссией факультета вмк для студентов ннгу, обучающихся по специальности.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 72

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ
Нижегородский государственный университет им. Н.И. Лобачевского

Е.А.Кумагина
Программирование под Windows
Методические указания по выполнению лабораторных работ
Практикум

Рекомендовано методической комиссией факультета ВМК
для студентов ННГУ, обучающихся по специальности
080801 «Прикладная информатика»


Нижний Новгород

2011

Кумагина Е.А. Программирование под Windows. Методические указания по проведению лабораторных работ. Практикум. – Нижний Новгород: Нижегородский госуниверситет, 2011. – 33 с.


Рецензент: к.ф.-м.н., ст.преподаватель К.АБаркалов


В методических указаниях приводятся примеры простейших Windows-приложений, написанных с использованием библиотеки функций Win32API. Для каждого приложения приводится код с комментариями и задания для самостоятельной работы.

Задания практикума предназначены для студентов факультета ВМК специальности «Прикладная информатика», изучающих курс «Программирование под Windows».

© Нижегородский государственный

университет им. Н.И. Лобачевского, 2011

©Кумагина Е.А.

Оглавление


Оглавление 3

1. 1. Контрольные вопросы 4

2. Примеры приложений 5

2.1 Работа с мышью и областями 5

2.2 Работа с кнопками и цветом 8

2.3 Работа со списками 12

2.4 Управление дочерним окном 16

2.5 Работа с таймером 23

2.6 Работа с элементом редактирования 26

2.7 Чтение из файла 29

Список литературы 32



1.1. Контрольные вопросы


  1. Из каких двух функций состоит простейшее Windows- приложение?

  2. Что такое сообщение?

  3. Формат сообщения, параметры сообщения.

  4. Какие есть функции для отправки сообщений? Чем они отличаются?

  5. Источники сообщений.

  6. Какая информация передается в сообщении WM_COMMAND?

  7. Из каких двух функций состоит минимальный цикл обработки сообщений?

  8. Как создать окно?

  9. Какие типы окон существуют?

  10. Чем тип окна отличается от класса окна?

  11. Как дочерние окна взаимодействуют с родительским окном?

  12. Как удалить окно с экрана?

  13. Как удалить окно из памяти?

  14. Какие органы управления Вы знаете?

  15. Что такое идентификатор органа управления?

  16. Где идентификатор органа управления связывается с самим элементом управления?

  17. В каком сообщении используется идентификатор органа управления?

  18. Как ОС Windows информирует приложение о изменении содержимого его окон?

  19. Понятие контекста устройства, как его получить?

  20. Как место получения контекста влияет на характер отображения информации в окне?




2.Примеры приложений

2.1 Работа с мышью и областями


При запуске приложения в окне рисуется прямоугольник. С помощью мыши возможно перемещение и изменение размеров этого прямоугольника. Перемещение возможно при нажатой левой клавиши мыши в левом верхнем углу прямоугольника. Изменение размера – при нажатой левой кнопки мыши в правом нижнем углу прямоугольника.



Рис.1 Исходный вид окна в л/р №1

Порядок работы

Сначала с помощью мастера приложений создать приложение Win32.

Затем заменить текст функции окна.

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

{

HDC hdc; // индекс контекста устройства

PAINTSTRUCT ps; // структура для рисования

HBRUSH hbrush, hbrush2;//кисти
static int x1=20,y1=20;// координаты левого верхнего угла прямоугольника

static int x2=130,y2=130;// координаты правого нижнего угла прямоугольника

static int x,y;// текущие координаты курсора

static HRGN l,r;//области, помечающие углы прямоугольника

static BOOL InReg_l=0,InReg_r=0;//флаги, показывающие за какой угол двигают прямоугольник

//создадим кисти для окрашивания областей

hbrush=CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));

hbrush2=CreateSolidBrush(RGB(0,0,255));

//определим текущую координату курсора(передается в lParam)

x=LOWORD(lParam);

y=HIWORD(lParam);

//анализируем сообщение, пришедшее в переменной msg

switch (msg)

{//нажата левая кнопка мыши

case WM_LBUTTONDOWN:

{ InReg_l=0;InReg_r=0;

//если курсор в левом кружке, то устанавливаем флаг InReg_l=1

if(PtInRegion(l,x,y)) InReg_l=1;

//если курсор в правом кружке, то устанавливаем флаг InReg_r=1

else if(PtInRegion(r,x,y)) InReg_r=1;

//иначе ни в какой кружок не попали

else MessageBoxA(NULL,"Не попали ни в одну область", "Сообщение", MB_OK);

return 0;

}

//отжата левая кнопка мыши

case WM_LBUTTONUP:

{ // сбрасываем флаги

InReg_l=0;

InReg_r=0;

return 0;

}
//мышь перемещается

case WM_MOUSEMOVE:

{ // если в левом кружке,то изменяем координаты обоих углов

if(InReg_l)

{x2=x2+(x-x1);

y2=y2+(y-y1);

x1=x;

y1=y;

//требуем перерисовки окна

InvalidateRect(hwnd,NULL,TRUE);

UpdateWindow(hwnd);

}

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

if(InReg_r)

{ x2=x;

y2=y;

//требуем перерисовки окна

InvalidateRect(hwnd,NULL,TRUE);

UpdateWindow(hwnd);

}

return 0;

}
case WM_PAINT:

hdc=BeginPaint(hwnd,&ps);

Rectangle(hdc,x1,y1,x2,y2); // рисуем прямоугольник

// создаем круглые области в углах



l=CreateEllipticRgn(x1-8,y1+8,x1+8,y1-8);

r=CreateEllipticRgn(x2-8,y2+8,x2+8,y2-8);

// для наглядности закрашиваем их и рисуем им границы

// FillRgn(hdc,l,hbrush);FillRgn(hdc,r,hbrush);

// FrameRgn(hdc,r,hbrush2,1,1);FrameRgn(hdc,l,hbrush2,1,1);

EndPaint(hwnd,&ps);

return 0;

case WM_DESTROY:

{ PostQuitMessage(0);

return 0;

}

}

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

}

Задание

  1. Возвращать прямоугольник в исходное состояние по нажатию правой кнопки мыши.

  2. Перемещать прямоугольник при зажатой правой клавиши мыши внутри прямоугольника.

2.2Работа с кнопками и цветом


Приложение позволяет изменять цвет прямоугольника, увеличивая или уменьшая составляющие цвета.



Рис.2 Исходный вид окна в л/р №2

Порядок работы

1. Сначала создадим простейшее приложение.

2. Добавим определения констант-идентификаторов для кнопок:

#define ID_Red1 1

#define ID_Red2 2

#define ID_Green1 3

#define ID_Green2 4

#define ID_Blue1 5

#define ID_Blue2 6
3. Создадим главное окно и кнопки:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd, hRed1, hRed2, hGreen1,hGreen2,hBlue1,hBlue2 ;

hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной //переменной

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

200, 200, 500, 320, NULL, NULL, hInstance, NULL);

hRed1 = CreateWindow("button", "красный +", WS_CHILD | WS_VISIBLE ,

20, 20, 180, 30, hWnd, (HMENU) ID_Red1, hInstance, NULL);

hRed2 = CreateWindow("button", "красный -", WS_CHILD | WS_VISIBLE ,

20, 60, 180, 30, hWnd, (HMENU) ID_Red2, hInstance, NULL);

hGreen1 = CreateWindow("button", "зеленый +", WS_CHILD | WS_VISIBLE ,

20, 100, 180, 30, hWnd, (HMENU) ID_Green1, hInstance, NULL);

hGreen2 = CreateWindow("button", "зеленый -", WS_CHILD | WS_VISIBLE ,

20, 140, 180, 30, hWnd, (HMENU) ID_Green2, hInstance, NULL);

hBlue1 = CreateWindow("button", "синий +", WS_CHILD | WS_VISIBLE ,

20, 180, 180, 30, hWnd, (HMENU) ID_Blue1, hInstance, NULL);

hBlue2= CreateWindow("button", "синий -", WS_CHILD | WS_VISIBLE ,

20, 220, 180, 30, hWnd, (HMENU) ID_Blue2, hInstance, NULL);
if (!hWnd)

{

return FALSE;

}
ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);
return TRUE;

}

4.Изменим функцию окна:

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

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

static short Red=255,Green=255,Blue=255;// составляющие цвета

static COLORREF mycolor=RGB(Red,Green,Blue);//текущий цвет

HBRUSH hBr;//кисть

RECT Rect;//прямоугольник для окрашивания

Rect.left=250;

Rect.top=60;

Rect.right=440;

Rect.bottom=205;
switch (message)

{

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Разобрать выбор в меню или сообщение от дочернего окна

switch (wmId)

{ case ID_Red1: Red+=5;if(Red>255)Red=255;

break;

case ID_Red2: Red-=5;if(Red<0)Red=0;

break;

case ID_Green1: Green+=5;if(Green>255)Green=255;

break;

case ID_Green2: Green-=5;if(Green<0)Green=0;

break;

case ID_Blue1: Blue+=5;if(Blue>255)Blue=255;

break;

case ID_Blue2: Blue-=5;if(Blue<0)Blue=0;


break;

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

}

// создадим цвет

mycolor=RGB(Red,Green,Blue);

// помечаем область, соответствующую прямоугольнику, требующей обновления

InvalidateRect(hWnd,&Rect,TRUE);

UpdateWindow(hWnd);

break;

case WM_PAINT:

//получаем контекст для рисования

hdc = BeginPaint(hWnd, &ps);

//создаем сплошную кисть нужного цвета

hBr=CreateSolidBrush(mycolor);

//окрашиваем прямоугольник Rect кистью hBr

FillRect(hdc,&Rect,hBr);

//создаем сплошную кисть черного цвета

hBr=CreateSolidBrush(RGB(0,0,0));

//рисуем рамку вокруг прямоугольника

FrameRect(hdc,&Rect,hBr);

//заканчиваем рисовать

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

Задание

                1. При каждом изменении цвета выводить значения его составляющих.

                2. Вывод осуществлять в элемент управления Static.

                3. Вывод осуществлять в элемент редактирования Edit.

                4. Вывод осуществлять при помощи функции TextOut.

2.3Работа со списками


В этом приложении используются три элемента управления: кнопка, список и выпадающий список. В списках содержится одинаковый набор цветов, в которые можно окрасить прямоугольную область. При нажатии кнопки «Смени цвет на следующий» в каждом списке выбирается очередной элемент, и окрашивается прямоугольник. При нажатии на кнопку выбор цвета осуществляется циклически, то есть после серого будет выбран желтый цвет. Выбирать цвет из списка можно и произвольно.



Рис.3 Исходный вид окна в л/р №3

Порядок работы

Сначала создадим простейшее приложение Список.

В файл Список.h добавим определения констант-идентификаторов для элементов управления:

#define ID_ButtonSelect 1

#define ID_List 2

#define ID_ButtonExit 3

#define ID_Combo 4

#define MAX_LOADSTRING 100

В файл Список.cpp добавим:

                1. Глобальные переменные, соответствующие главному и дочерним окнам.

HWND hWnd, hButtonSelect, hList, hButtonExit, hCombo;

                1. В функцию BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) добавим блок создания элементов управления:

hButtonSelect = CreateWindow("button", "смени цвет на следующий", WS_CHILD| BS_DEFPUSHBUTTON| WS_VISIBLE, 20,20,190,30, hWnd,(HMENU)ID_ButtonSelect, hInstance, NULL);

hList = CreateWindow("listbox", NULL, WS_CHILD| WS_BORDER| WS_VISIBLE|LBS_NOTIFY , 20,60,190,100, hWnd,(HMENU)ID_List, hInstance, NULL);


hButtonExit = CreateWindow("button", "выход", WS_CHILD| BS_PUSHBUTTON| WS_VISIBLE, 250,20,190,30, hWnd,(HMENU)ID_ButtonExit, hInstance, NULL);
hCombo = CreateWindow("combobox", NULL, WS_CHILD| WS_BORDER| WS_VISIBLE|CBS_SIMPLE |CBS_DROPDOWNLIST ,20,185,190,160, hWnd,(HMENU)ID_Combo, hInstance, NULL);

// заполним списки названиями цветов, хранящихся в массиве Color

char Color[6][8]={"желтый","зеленый","красный","синий","белый","серый"};

int i;

for(i=0;i<6;i++)

{SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Color[i]);

SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)Color[i]);

}
Изменения в оконной процедуре:

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

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

int nSelect=0;//номер выбранной строки

HRGN hReg=CreateRectRgn(250,60,440,205);//прямоугольная область для окрашивания

HBRUSH hBr;//кисть

static COLORREF mycolor;//текущий цвет

//набор цветов

static COLORREF color_set[6]={RGB(255,236,128), RGB(0,255,0), RGB(255,0,0), RGB(0,0,255), RGB(255,255,255), RGB(118,118,118)};

switch (message)

{

case WM_COMMAND:// какой элемент управления послал сообщение

switch (LOWORD(wParam))

{

// нажата кнопка смены цвета

case ID_ButtonSelect:

// посылаем сообщение списку и узнаем, какая в нем выбрана строка

//увеличиваем номер и сохраняем в nSelect

nSelect = SendMessage(hList, LB_GETCURSEL, 0,0L)+1;

// если была выбрана последняя строка, то следующей будет первая

if(nSelect>=SendMessage(hList, LB_GETCOUNT, 0,0L)) nSelect=0;

//посылаем сообщения спискам, чтобы выбрать в них строку nSelect

SendMessage(hList, LB_SETCURSEL, (WPARAM)nSelect,0L);

SendMessage(hCombo,CB_SETCURSEL, (WPARAM)nSelect,0L);

break;

// пришло сообщение от списка

case ID_List:

// выясняем, какую строку выбрали

nSelect = SendMessage(hList, LB_GETCURSEL, 0,0L);

// устанавливаем тот же выбор в выпадающем списке

SendMessage(hCombo,CB_SETCURSEL, (WPARAM)nSelect,0L);

break;

// пришло сообщение от выпадающего списка

case ID_Combo: nSelect = SendMessage(hCombo, CB_GETCURSEL, 0,0L);

SendMessage(hList, LB_SETCURSEL, (WPARAM)nSelect,0L);

break;

// пришло сообщение от кнопки Выход

case ID_ButtonExit:

// посылаем сообщение главному окну о завершении работы

SendMessage(hWnd,WM_DESTROY , 0,0L);

break;

}
// определяем, какой цвет выбрали

mycolor=color_set[nSelect];

// помечаем главное окно как целиком требующее обновления

InvalidateRect(hWnd,0,TRUE);

// обновляем окно, ему придет сообщение WM_PAINT

UpdateWindow(hWnd);

break;

//это сообщение будет приходить каждый раз, когда окно будет изменять свое состояние с активного на неактивное

case WM_ACTIVATE:

nSelect=0;

SendMessage(hCombo,CB_SETCURSEL, (WPARAM)nSelect,0L);

SendMessage(hList, LB_SETCURSEL, (WPARAM)nSelect,0L);

mycolor=color_set[nSelect];

InvalidateRect(hWnd,0,TRUE);

UpdateWindow(hWnd);

break;

//сообщение о перерисовке содержимого окна

case WM_PAINT:

//получаем контекст для рисования

hdc = BeginPaint(hWnd, &ps);