Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI_practice.doc
Скачиваний:
17
Добавлен:
27.03.2015
Размер:
297.47 Кб
Скачать

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

РОССИЙСКОЙ ФЕДЕРАЦИИ

Нижегородский государственный университет им. Н.И. Лобачевского

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

Программирование под 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. Как место получения контекста влияет на характер отображения информации в окне?

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

    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. Перемещать прямоугольник при зажатой правой клавиши мыши внутри прямоугольника.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]