Задание 3. Элементы управления

Методические указания к выполнению контрольной работы №1 по дисциплине «Программирование приложений Windows” для студентов заочной формы обучения специальности 230105 «Программное обеспечение ВТ и АС»

 

Цель и состав работы

Цель контрольной работы – закрепление знаний, полученных при изучении дисциплины «Программирование приложений Windows», и развитие навыков самостоятельной работы при разработке программного обеспечения.

Работа состоит из 3-х заданий для каждого варианта.

Общие требования к оформлению контрольной работы

Отчет включает в себя основные исходные коды программы и копии экранов – результатов работы приложения. Текст готовится с помощью текстового процессора Word и размещается на одной стороне листа формата А4 шрифтом Times New Roman, 12 пунктов, с одиночным интервалом.

На дискете должны быть все файлы, имеющие отношение к контрольной работе: тексты программ (исходные файлы), exe-файлы, файлы скриншотов, текст отчета контрольной работы (в виде файла редактора Word).

Для выбора вариант используется таблица (Номер – 2 последние цифры номера зачетки):

 

Номер

Вар

Номер

Вар

Номер

Вар

Номер

Вар

Номер

Вар

1

1

21

21

41

16

61

11

81

6

2

2

22

22

42

17

62

12

82

7

3

3

23

23

43

18

63

13

83

8

4

4

24

24

44

19

64

14

84

9

5

5

25

25

45

20

65

15

85

10

6

6

26

1

46

21

66

16

86

11

7

7

27

2

47

22

67

17

87

12

8

8

28

3

48

23

68

18

88

13

9

9

29

4

49

24

69

19

89

14

10

10

30

5

50

25

70

20

90

15

11

11

31

6

51

1

71

21

91

16

12

12

32

7

52

2

72

22

92

17

13

13

33

8

53

3

73

23

93

18

14

14

34

9

54

4

74

24

94

19

15

15

35

10

55

5

75

25

95

20

16

16

36

11

56

6

76

1

96

21

17

17

37

12

57

7

77

2

97

22

18

18

38

13

58

8

78

3

98

23

19

19

39

14

59

9

79

4

99

24

20

20

40

15

60

10

80

5

100

25


Задания контрольной работы

Задание 1. Создание окон

1. В центре рабочей области окна расположено окно без заголовка с вертикальной и горизонтальной полосами просмотра размером в четверть рабочей области. При нажатии разных клавиш мыши временное окно выдает разный звуковой сигнал.

2. Создать окно размером в четверть площади экрана. После двойного щелчка мыши окно перемещается так, что его центр совпадает с координатами курсора мыши в момент щелчка.

3. Дочернее окно размером 100*100 пикселей при перемещении курсора мыши над ним "убегает" от курсора мыши в произвольном направлении, оставаясь в пределах рабочей области родительского окна.

4. При запуске второго экземпляра приложения сообщить о запрете запуска нескольких экземпляров, на передний план переместить первый экземпляр приложения, 3 раза изменить подсветку его окна, выдавая звуковое предупреждение, и завершить работу второго экземпляра.

5. После нажатия на левую (правую) клавишу мыши над рабочей областью окна в левом верхнем (правом нижнем) углу области отобразить временное окно размером в четверть области. Временное окно скрыть после отжатия клавиши в любом месте экрана.

6. В левом верхнем (в правом нижнем) углу рабочей области окна создать временное (дочернее) окно. После нажатия левой клавиши мыши 4 раза "мигает" временное окно, а после нажатия правой - 3 раза "мигает" дочернее окно. При этом окна выдают различные звуковые сигналы.

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

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

9. Окно первого экземпляра приложения расположить в левом верхнем, второго - в правом верхнем, третьего - в левом нижнем, четвертого - в правом нижнем углу экрана. Причем все окна равных размеров и вместе занимают весь экран. В заголовке окна указать номер экземпляра. Запретить запуск пятого экземпляра.

10. В центре рабочей области окна располагается невидимое окно без заголовка размером в четверть площади рабочей области. После нажатия левой клавиши мыши над рабочей областью любого из окон окно без заголовка должно стать видимым, а после нажатия правой - невидимым.

11. В рабочей области окна приложения рядом друг с другом расположить 4 временных окна, в заголовках которых указан номер окна. После нажатия левой клавиши мыши временное окно выдает сообщение, содержащее номер окна.

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

13. В левом верхнем углу рабочей области окна создать временное окно площадью в одну шестнадцатую площади этой области. При нажатии на левую (правую) клавишу мыши временное окно переместить в соседний по ходу (против хода) часовой стрелки угол рабочей области.

14. При запуске i-ro экземпляра (i>2) приложения спросить пользователя, нужно ли его запустить. Если пользователь ответит "Да", то запустить его. Иначе на передний план переместить 2-й экземпляр приложения и завершить работу i-ro экземпляра.

15. Углы рабочей области окна приложения полностью занимают 4 временных окна одного класса. Если нажать левую клавишу мыши над временным окном, то это окно выдает сообщение о своем заголовке.

16. Окно приложения без заголовка занимает весь экран фоном рабочего стола.

17. В центре рабочей области окна располагается невидимое окно без заголовка размером в четверть площади рабочей области. После нажатия левой клавиши мыши над рабочей областью любого из окон окно без заголовка должно стать видимым, а после нажатия правой - невидимым.

18.Правый верхний угол рабочей области окна приложения занимает временное окно размером в четверть этой области. После нажатия правой клавиши мыши над рабочей областью окна приложения временное окно сворачивается в пиктограмму в левом нижнем углу, а после нажатия левой - распахивается в правом верхнем углу рабочей области. В углах рабочей области окна приложения созданы невидимые временные окна с заголовком. Каждое окно становится видимым после нажатия левой клавиши мыши над его частью рабочей области и становится невидимым после нажатия левой клавиши мыши над его рабочей областью.

19.Окно приложения размером в четверть площади экрана занимает один из углов экрана. После нажатия левой клавиши мыши окно сворачивается в пиктограмму. После щелчка по пиктограмме оно восстанавливается в другом углу экрана.

20.При запуске приложения показать окна уже существующих копий этого приложения и спросить пользователя, нужно ли запустить еще один экземпляр. Если пользователь ответит "Да", то запустить его. Иначе завершить работу приложения.

21. Центр рабочей области окна занимает временное окно размером в четверть площади области в свернутом состоянии. После нажатия левой клавиши мыши над рабочей областью временное окно распахивается в центре области, а после нажатия правой - сворачивается в центре.

22. Центр рабочей области окна занимает временное окно размером в четверть площади области. Оно перемещается в тот угол рабочей области, где щелкнули левой клавишей мыши. А после щелчка правой клавишей мыши временное окно перемещается в угол, противоположный текущему углу.

23. Окно приложения занимает четверть экрана и расположено в левом верхнем углу. Создать временное окно такого же размера в правом нижнем углу экрана. Любое окно после нажатия левой клавиши мыши перемещается в свободный по ходу часовой стрелки угол.

24. Окно размером в четверть площади экрана расположено в центре экрана. После нажатия левой клавиши мыши окно несколько раз меняет подсветку и перемещается в угол экрана так, что курсор мыши оказывается за пределами окна.

25. При запуске не первого экземпляра приложения выдать предупреждающий звуковой сигнал и сообщить о количестве уже работающих копий этого приложения. Запустить экземпляр, только если согласен пользователь.

 

Задание 2. Вывод в окно

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

2. Разработать функцию вывода текста в заданной позиции со специальным эффектом. Эффект заключается в том, что текст медленно "выплывает" слева направо.

3. От левого верхнего до нижнего правого угла рабочей области окна вывести текст таким образом, чтобы он полностью помещался в окне при любых изменениях размеров окна. Использовать шрифт Times New Roman Cyr.

4. В окне приложения многократно отобразить текст "Привет!!!" жирным шрифтом Arial Cyr. Вывод текста начинать от нижнего края окна и продолжать до верхнего края, плавно меняя цвет текста от желтого до черного и цвет фона от синего до желтого. При этом текст должен полностью помещаться по ширине при любых размерах окна.

5. В центре окна нарисовать эллиптическую диаграмму. Диаграмму разбить на секторы 25, 65 и 10 % красного, зеленого и голубого цветов и указать по центру дуги каждого сектора проценты. При всех изменениях размеров окна диаграмма должна быть отображена полностью.

6. В окне приложения вывести текст "Анкета" на русском языке и строго под ним "Anketa" на английском языке, первую букву "А" увеличить в размере и сделать общей для обоих слов. Букву "А" вывести красным цветом, остаток слова на русском языке - синим, на английском - зеленым. При этом выводимый текст должен занимать всю высоту или ширину окна при любых размерах окна. Текст заголовка окна отобразить красным цветом на фоне заголовка, а правее этого текста нарисовать синий эллипс, вписанный в зеленый прямоугольник шириной в 3 полосы заголовка.

7. В рабочей области снизу вверх многократно отобразить строку "Пробный текст", плавно меняя фон и цвет и увеличивая высоту и толщину шрифта. Вывод центрировать по горизонтали. Начальную высоту шрифта взять по умолчанию. Вывод завершается, если очередная строка по высоте не помещается в рабочей области.

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

9. В центре окна нарисовать мишень из 10 полей и в каждом поле вывести его значение (от 1 с краю до 10 в центре). При любых изменениях размеров окна мишень должна полностью отображаться в окне. Поля раскрасить случайно выбранными различными цветами.

10.В окне отобразить черным цветом оси координат (Оху) и синим цветом график функции c*cos(x), где х принимает значения от 0 до 10π и с≠0. Размах вывода по осям ординат и абсцисс - 90 % размеров окна при любых изменениях размеров.

11.Центр рабочей области занимает малиновый прямоугольник с вписанным голубым эллипсом размером в половину области по осям. После нажатия левой клавиши мыши это место занимает синий прямоугольник, а правой клавиши - зеленый эллипс. При изменении размера окна вернуться к исходному состоянию.

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

13.Разрисовать рабочую область окна в разноцветные клеточки, очерченные черным цветом, плавно переходя от красного цвета в левом верхнем углу окна к синему в нижнем правом углу.

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

15.В рабочей части окна при движении мыши с нажатой левой клавишей рисовать траекторию движения курсора мыши. При нажатии правой клавиши мыши поменять цвет для рисования.

16.Рабочую область закрасить спектром цветов, начиная слева красным цветом и заканчивая, на правом краю, синим. Цвет изменять в 4 этапа: на первом этапе, при максимальном красном составляющем, увеличивать зеленую, на втором, при максимальном зеленом, уменьшать красную составляющую, затем, при максимальном зеленом, увеличивать синюю составляющую и, на последнем этапе, при максимальном синем уменьшать зеленую составляющую.

17.В окне отобразить клетки для игры в крестики-нолики. При нажатии левой клавиши мыши в клетке нарисовать крестик, а правой - нолик. Запретить заполнять клетку более одного раза. Рекомендация: если при перемещении курсора была нажата левая клавиша мыши, то параметр wParam содержит значение MK_LBUTTON.

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

19.В окне приложения отобразить рейтинг участников какого-либо события: для каждого участника нарисовать геометрическое тело (например, цилиндр), высота которого пропорциональна рейтингу участника, ниже фигуры вывести фамилию участника, выше - рейтинг (в %). Причем текст должен быть наклонен на некоторый угол. Для всех участников использовать разные цвета.

20.Нарисовать светофор, в котором цвет "зажигается" при нажатии на эту лампу левой клавишей мыши. Одновременно может гореть только один цвет.

21.В окне с помощью мыши выделить прямоугольник и создать эффект мигания этого прямоугольника.

22.Нарисовать несколько геометрических фигур. При нажатии над любой из них показать, что выбрана эта фигура.

23.Нарисовать графики функций 2*a*Cos(kt)*exp(-nt) и 0.5*a*Sin(kt)*exp(-nt).

24.В рабочей области окна кистью по умолчанию в метрической системе координат нарисовать эллипс.

25.Рабочую области окна закрасить 7-ю вертикальными полосами с цветами радуги. Переход между цветами должен быть плавный.

 

Задание 3. Элементы управления

 

1. Создать группу флажков с возможными вариантами данных о студенте и кнопку "Да". После нажатия на кнопку сообщить об установленных данных.

2. Создать два. списка, между ними расположить кнопки "Переместить»" и "«Переместить". Левый список должен быть изначально заполнен списком строк. Если выбрать строку и нажать одну из кнопок, то выбранная строка должна переместиться слева направо или наоборот.

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

4. В рабочей области окна приложения отобразить кнопку по умолчанию с надписью "Да" и обычную кнопку с надписью "Отмена" с идентификаторами соответственно IDОК и IDCANCEL. Сообщить пользователю о действиях над этими кнопками.

5. В окне приложения отобразить однострочный редактор, под ним список и еще ниже - кнопку с надписью "Да". При нажатии на кнопку записать в окно редактора текст о нажатии кнопки.

6. Окно содержит пустую строку ввода с надписью "Введите фамилию, имя и отчество", группу переключателей "Пол" из двух пунктов ("Мужчина" и "Женщина") и кнопку "Да". При нажатии на кнопку "Да" непустое содержимое строки ввода записать в заголовок группы. Затем при выборе пола сообщить новое содержимое заголовка группы, выбранный пол и вернуться к исходному состоянию.

7. В центре экрана отобразить окно без заголовка с фоном цвета трехмерных элементов. Окно содержит текст о правах на программный продукт и кнопки "Выход" и "Да". При нажатии кнопки "Выход" завершить работу, а кнопки "Да" - текст в окне заменить текстом о правилах работы, а кнопки заменить кнопками "Назад" и "Далее". При нажатии кнопки "Назад" вернуться к исходному состоянию.

8. В окне приложения создать временное окно с фоном цвета трехмерных элементов, содержащее группу вариантов взаимно исключающих действий и 3 кнопки: "Да", "Нет" и "Отмена".

9. В окне приложения отобразить кнопку "Клавиши отжаты". При нажатии любой клавиши мыши над рабочей областью окна эта кнопка исчезает и под курсором мыши появляется кнопка "Клавиша нажата". При отжатии клавиши мыши вернуться к исходному состоянию.

10.В рабочей области отображена кнопка с надписью "Нажмите правую клавишу мыши над рабочей областью". После нажатия правой кла­виши мыши кнопка скрывается и отображается многострочный редактор с текстом "Нажмите левую клавишу мыши над рабочей областью". После нажатия левой клавиши мыши вернуться к исходному состоянию.

11.В окне расположить группу переключателей, группу флажков, кнопки "Да" и "Нет", причем кнопка "Да" выбирается по умолчанию. Если нажата кнопка "Да", то сообщить о состоянии переключателей и флажков. Если нажата кнопка "Нет", то завершить работу.

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

13.Создать строку ввода с числом 0 и справа от нее - маленькую вертикальную полосу прокрутки. Под ними кнопки "Выход" и "Да". При нажатии на верхнюю кнопку полосы число в строке ввода увеличить на единицу, а на нижнюю кнопку - уменьшить на единицу. При нажатии кнопки "Да" отобразить содержимое строки ввода, а кнопки "Выход" - завершить работу.

14.Окно приложения без заголовка с рамкой стиля кнопки сообщает о форматировании гибкого диска и содержит кнопку "Прекратить". При попытке нажать на кнопку изменить текст сообщения и переместить кнопку в другое место.

15.Создать однострочный редактор, список и кнопки "Добавить" и "Изменить". При нажатии на кнопку "Добавить" содержимое редактора (если оно не пустое) добавить в список, очистить редактор и передать ему фокус ввода. При нажатии на кнопку "Изменить" выбранную строку списка (если она выбрана) записать в редактор, удалить из списка и передать фокус ввода редактору.

16.Создать однострочный редактор, список и кнопку "Найти". Изначально заполнить список набором строк. При нажатии на кнопку "Найти" содержимое редактора (если оно не пустое) использовать в качестве начальных букв поиска строки в списке и выбрать найденную строку.

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

18.В рабочей области окна перечислить названия изучаемых в семестре дисциплин и пометить названия изучаемых сегодня дисциплин. Выделить среди изучаемых сегодня дисциплин те, по которым нет экзамена.

19.В центре экрана отобразить окно без рамок, в верхней части которого отобразить текст "Анкетные данные служащего", ниже - поле ввода фамилии, имени и отчества, под которым группы переключателей о поле и образовании. Окно также содержит кнопки "Запись", "Очистка" и "Выход".

20.В окне приложения отобразить два статических органа с текстами "Группа 1" и "Группа 2". При нажатии левой клавиши мыши над первым органом должна появиться кнопка с надписью "Кнопка 1", а при нажатии над вторым органом - "Кнопка 2". Любая кнопка при нажатии должна исчезнуть.

21.Комбинированный список изначально заполнить произвольными различными строками. Рядом расположить кнопку "Вверх". Если выбрать строку и нажать кнопку "Вверх", то эта строка должна переместиться вверх на одну позицию в списке. Если эта строка уже первая в списке, то сообщить об этом и заблокировать кнопку.

22.При запуске первого экземпляра приложения в окне приложения отобразить поле ввода пароля, а при запуске следующих экземпляров того же приложения запросить, действительно ли нужно запускать еще один экземпляр. Если "Да", запустить еще один экземпляр, но пароль больше не запрашивать.

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

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

25.Окно в центре экрана с фоном цвета трехмерных элементов содержит переключатели, имитирующие работу светофора. Названия цветов светофора расположены слева от переключателей. При нажатии на переключатель сообщить название его цвета.

 


Пример выполнения

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

 

 

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

 

 

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

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

 

Листинг программы

// --- Обязательный включаемый файл

#include <windows.h>

#include <math.h>

#include <windowsx.h>

#include <stdlib.h>

#include "resource.h"

#define PI 3.14156

 

// --- Описание функции главного окна

 

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

LRESULT CALLBACK DlgProc1(HWND hDlg1, UINT msg, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK DlgProc2(HWND hDlg2, UINT msg, WPARAM wParam, LPARAM lParam);

double CalculateProcentToRad(double Percent);

 

//===================================================

 

double Edit[7];

 

struct TSector

{

double Percent;

int Color;

};

 

TSector Sectors[20];

 

int sector_count = 0;

int percent_count = 0;

 

//==========================================================================

 

void PrintRect(HDC hDC){

HPEN hpenW1, hpenOldPen;

     

hpenW1 = CreatePen(PS_SOLID, 1, RGB(0,0,0));

     

hpenOldPen = SelectPen(hDC, hpenW1);

 

MoveToEx(hDC, Edit[1], Edit[2], NULL);

LineTo(hDC, (Edit[1]+Edit[4]), Edit[2]);

MoveToEx(hDC, (Edit[1]+Edit[4]), Edit[2], NULL);

LineTo(hDC, (Edit[1]+Edit[4]), (Edit[2]+Edit[3]));

MoveToEx(hDC, (Edit[1]+Edit[4]), (Edit[2]+Edit[3]), NULL);

LineTo(hDC, Edit[1], (Edit[2]+Edit[3]));

MoveToEx(hDC, Edit[1], (Edit[2]+Edit[3]), NULL);

LineTo(hDC, Edit[1], Edit[2]);

 

SelectPen(hDC, hpenOldPen);

DeletePen(hpenW1);

}

 

//=========================================================================

 

void PrintRadPie (HDC hDC, int X0, int Y0, int A, int B, double R1, double R2, int Color){

HBRUSH hBr = CreateSolidBrush(Color);

HBRUSH hBrOld = (HBRUSH)SelectObject(hDC,hBr);

                 

Pie ( hDC,      // дескриптор контекста отображения

       X0, Y0,   // координаты верхнего левого угла

       A+X0, B+Y0,   // координаты правого нижнего угла

       ((A/2)*cos(R1) + X0 + (A/2)), (-(B/2)*sin(R1) + Y0 + (B/2)),       // координаты начала дуги

       ((A/2)*cos(R2) + X0 + (A/2)), (-(B/2)*sin(R2) + Y0 + (B/2))       // координаты начала дуги

);

 

SelectObject(hDC,hBrOld);

DeleteObject(hBr);

}

 

//===========================================================================

 

void PrintRadDiagram(HDC hDC, int X0, int Y0, int A, int B, TSector* Sectors, int SectorCount)

{

double R1 = 0;

for(int i=0; i<SectorCount; i++){

       double R2 = CalculateProcentToRad(Sectors[i].Percent)+R1;

       if(Sectors[i].Percent!=0){

             PrintRadPie (hDC, X0, Y0, A, B, R1, R2, Sectors[i].Color);

       }

       R1 = R2;

}

}

 

//===========================================================================

     

double CalculateProcentToRad(double Percent){

double Rad = ((2*PI)*Percent)/100;

return Rad;

}

 

...

// --- Функция WinMain

int WINAPI WinMain( HINSTANCE hInstance,

...

for(int i=0;i<20;i++){

Sectors[i].Percent = 0;

Sectors[i].Color = 0;

}

 

Edit[0]=0;

Edit[1]=100;

Edit[2]=100;

Edit[3]=300;

Edit[4]=300;

Edit[5]=255;

Edit[6]=255;

Edit[7]=0;

...

// --- Функция окна

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

{    

switch(msg)

{

       case WM_PAINT:

       {

             HDC hDC;

             PAINTSTRUCT ps;

                 

             InvalidateRect(hWnd,NULL,TRUE);

             hDC=BeginPaint(hWnd,&ps);

                 

             PrintRect(hDC);  

                 

             if(sector_count!=0)

                   PrintRadDiagram(hDC, Edit[1], Edit[2], Edit[4], Edit[3], Sectors, sector_count);

 

             EndPaint(hWnd,&ps);    

                 

       }; break;

 

       case WM_LBUTTONDOWN:

       {

DialogBox(hInst,(LPCTSTR)IDD_DIALOG1,hWnd,(DLGPROC)DlgProc1);

                 

             InvalidateRect(hWnd,NULL,TRUE);

             UpdateWindow(hWnd);

       };

       break;

 

       case WM_RBUTTONDOWN:

       {

DialogBox(hInst,(LPCTSTR)IDD_DIALOG2,hWnd,(DLGPROC)DlgProc2);

                 

             InvalidateRect(hWnd,NULL,TRUE);

             UpdateWindow(hWnd);

       };

       break;

 

       case WM_DESTROY:

       {

             PostQuitMessage(0);

       }; break;

 

       default: return DefWindowProc(hWnd, msg, wParam, lParam);

}

return 0l;

}

 

//==========================================================================

 

LRESULT CALLBACK DlgProc1(HWND hDlg1, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch(msg)

{

       case WM_CREATE:

       {

             SetDlgItemInt(hDlg1,IDC_EDIT2,Edit[1],0);

             SetDlgItemInt(hDlg1,IDC_EDIT3,Edit[2],0);

             SetDlgItemInt(hDlg1,IDC_EDIT4,Edit[3],0);

             SetDlgItemInt(hDlg1,IDC_EDIT5,Edit[4],0);

                 

             return TRUE;

       }; break;

     

       case WM_INITDIALOG:

       {

             SetDlgItemInt(hDlg1,IDC_EDIT2,Edit[1],0);

             SetDlgItemInt(hDlg1,IDC_EDIT3,Edit[2],0);

             SetDlgItemInt(hDlg1,IDC_EDIT4,Edit[3],0);

             SetDlgItemInt(hDlg1,IDC_EDIT5,Edit[4],0);

                 

             return TRUE;

       }; break;

 

       case WM_COMMAND:

       {

             switch(wParam)

             {

                   case IDOK:

                   {

                        Edit[1] = GetDlgItemInt(hDlg1,IDC_EDIT2,FALSE,0);

                        Edit[2] = GetDlgItemInt(hDlg1,IDC_EDIT3,FALSE,0);

                        Edit[3] = GetDlgItemInt(hDlg1,IDC_EDIT4,FALSE,0);

                        Edit[4] = GetDlgItemInt(hDlg1,IDC_EDIT5,FALSE,0);

 

                        EndDialog(hDlg1,TRUE);

                   }; break;

 

                   case IDC_CLEAR:

                   {

                    SetDlgItemInt(hDlg1,IDC_EDIT2,0,0);

                        SetDlgItemInt(hDlg1,IDC_EDIT3,0,0);

                        SetDlgItemInt(hDlg1,IDC_EDIT4,0,0);

                        SetDlgItemInt(hDlg1,IDC_EDIT5,0,0);

                            

                   }; break;

                       

                   case IDCANCEL:

                   {

                        EndDialog(hDlg1,TRUE);

                   }; break;

 

       default: return FALSE;

             };

       }

       default: return FALSE;

};

 

return TRUE;

}

 

//==========================================================================

 

LRESULT CALLBACK DlgProc2(HWND hDlg2, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch(msg)

{

       case WM_CREATE:

       {

             SetDlgItemInt(hDlg2,IDC_PERCENT,Edit[0],0);

 

             SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);

                       

             return TRUE;

       }; break;

     

       case WM_INITDIALOG:

       {

             SetDlgItemInt(hDlg2,IDC_RED,Edit[5],0);

             SetDlgItemInt(hDlg2,IDC_GREEN,Edit[6],0);

             SetDlgItemInt(hDlg2,IDC_BLUE,Edit[7],0);

                 

             SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);

 

             return TRUE;

       }; break;

 

       case WM_COMMAND:

       {

             switch(wParam)

             {

                   case IDOK2:

                   {

                        Edit[0] = GetDlgItemInt(hDlg2,IDC_PERCENT,FALSE,0);

                        Edit[5] = GetDlgItemInt(hDlg2,IDC_RED,FALSE,0);

                        Edit[6] = GetDlgItemInt(hDlg2,IDC_GREEN,FALSE,0);

                        Edit[7] = GetDlgItemInt(hDlg2,IDC_BLUE,FALSE,0);

                            

                        SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);

 

                        EndDialog(hDlg2,TRUE);

                   }; break;

 

                   case IDC_SECTOR:

                   {

                   if((GetDlgItemInt(hDlg2,IDC_PERCENT,FALSE,0)+percent_count)>100){

                              MessageBox(NULL,

                              "Слишком большой процент","Превышен лимит",MB_OK|MB_ICONSTOP);

                              return FALSE;

                        }

                            

                        else {

                              Sectors[sector_count].Percent = GetDlgItemInt(hDlg2,IDC_PERCENT,FALSE,0);

                              percent_count += GetDlgItemInt(hDlg2,IDC_EDIT1,FALSE,0);

                              Sectors[sector_count].Color = RGB(GetDlgItemInt(hDlg2,IDC_RED,FALSE,0),

                                                                       GetDlgItemInt(hDlg2,IDC_GREEN,FALSE,0),

                                                                       GetDlgItemInt(hDlg2,IDC_BLUE,FALSE,0)

                                                                              );

                        }

                            

                        sector_count++;

 

                        SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);

                   }; break;

 

                   case IDC_DEL_SECTOR:

                   {

                        if(percent_count>0){

                        sector_count--;

                              percent_count -= (int)Sectors[sector_count].Percent;

                              SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);

                            

                              Sectors[sector_count].Percent = 0;

                              Sectors[sector_count].Color = 0;

                        }                

                   }; break;

                       

                   case IDCANCEL2:

                   {

                        EndDialog(hDlg2,TRUE);

                   }; break;

 

                   default: return FALSE;

             };

       }

       default: return FALSE;

};

 

return TRUE;

}


Дата добавления: 2018-02-28; просмотров: 770; Мы поможем в написании вашей работы!




Мы поможем в написании ваших работ!