Вы находитесь на странице: 1из 427

Галявов И. Р.

BorlandC++длясебя

Самоучитель

Галявов И. Р . BorlandC++длясебя Самоучитель Москва

Москва

ББК 32.973.26 018.2

Г17

Г17

Галявов И. Р. Borland C++ для себя. – М.: ДМК Пресс. – 432 с.: ил. (Самоучитель).

ISBN 5 94074 094 4

В этой книге простым и понятным для начинающих языком объясняются осно вы визуальной разработки программ в средах Borland C++ и C++ Builder и даются важнейшие понятия языка С++. Подробно рассказывается, как создать проект «с нуля» и постепенно его совершенствовать. Рассмотрены все важнейшие действия программиста: работа с файлами, окнами проектов и сообщений, вставка изобра жений, создание баз данных и Internet приложений. Основной упор сделан не на сухое и последовательное изложение опре деленного объема материала по схеме: сначала понятие, потом примеры, как это принято в классических учебниках, а на рассмотрение примеров программ, кото рые могут быть интересны начинающим. Все понятия объясняются по мере необ ходимости, что поможет читателям лучше и быстрее освоить предлагаемый мате риал. Книга адресована студентам, школьникам и просто начинающим изучать програм мирование. Может использоваться в качестве самоучителя.

ББК 32.973.26 018.2

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

ISBN 5 94074 094 4

© Галявов И. Р. © ДМК Пресс

Содержание

Предисловие

7

Часть I

Borland, просто Borland

15

Глава 1 Создание заготовки программы

16

1.1. Необходимые действия

16

1.2. Дополнительная информация

20

Глава 2 Кнопки и сообщения

25

2.1. Создание кнопки в окне программы

26

2.2. Обработчик нажатия на кнопку

29

2.3. Окна сообщений

33

2.4. Стили окон программы

34

Глава 3 Предупреждения и сообщения об ошибках

36

3.1. Сообщения об ошибках

36

3.2. Предупреждения

39

Глава 4 Возвращаемые значения и условное выполнение команд

41

Глава 5 Дополнительные элементы окна

44

Глава 6 Красота – страшная сила

51

6.1. Вешаем картину на гвоздь

51

6.2. Движущиеся картинки

54

Глава 7 Рисование в окне программы

58

4

Borland C++ 5 для себя

Глава 8 Элементарная защита паролем

70

Глава 9 Работа с файлами

78

Глава 10 Переменные и их типы

84

Глава 11 Продолжаем работу с файлами

87

11.1. Защита типа trial

87

11.2. Взлом созданной защиты

95

Глава 12 Отладка программы

101

12.1. Отладка без использования специальных средств

103

12.2. Специальные средства отладки

106

Глава 13 Простейший калькулятор

118

Глава 14 Обработка нажатий клавиш

127

14.1. Сколько места требуется для разработки программ

127

14.2. Вернемся к калькулятору

128

14.3. Мышь – это маленькая клавиатура

132

Глава 15 Радиокнопки и флажки

135

15.1. Флажки

135

15.2. Радиокнопки

138

Глава 16 Списки

144

Глава 17 Использование диалоговых окон

156

Глава 18 Работа с картинками

169

18.1. Включение/отключение картинок

169

18.2. Фотографии в телефонной книге

170

Содержание

5

Глава 19 Нет предела совершенству

178

19.1. Открытие файла

178

19.2. Заголовок окна и иконки

181

19.3. И снова рисуем сами

183

Глава 20 Кнопки с картинками

188

Глава 21 Работа с процессами

192

Глава 22 В движении – жизнь

196

22.1. Линейка с движком

197

22.2. Стрелки

200

Глава 23 Ярлыки

205

Глава 24 Дополнительная глава

210

Часть II

Borland C++ Builder 5

213

Глава 25 Первый взгляд на C++ Builder

214

25.1. Стартуем!

214

25.2. Изменяем первую программу

218

25.3. Работа с проектами

221

25.4. VCL против OWL, или Если вы пользовались Borland С++

222

Глава 26 Кнопки и многое другое

224

26.1. Кнопка за два щелчка

224

26.2. Заставим кнопки работать!

225

26.3. Ошибки – это неизбежно

229

26.4. Функции MessageBox

232

Глава 27 Шутить можно и в C++ Builder

234

27.1.

Неподвижная картинка

235

6

Borland C++ 5 для себя

27.3. Богатый текст

240

27.4. Полезные советы

244

Глава 28 Всегда должен быть выбор

249

28.1. Одно из двух

249

28.2. И снова одно из двух

253

28.3. Выбор становится шире

259

28.4. Длинные списки

265

Глава 29 Движущиеся объекты

284

29.1. Привлечь внимание

284

29.2. «Бегущий слон»

289

29.3. Не забудьте о мелочах

296

29.4. Создаем trial версию программы

307

Глава 30 Пишем текстовый редактор

322

30.1. Простейший редактор

322

30.2. Своя функция

332

30.3. Расширяем возможности телефонной книги

338

30.4. Печатаем на принтере

350

30.5. Последние штрихи

363

Глава 31 Базы данных

373

31.1. Создание базы данных

374

31.2. Программа для работы с базой данных

380

31.3. Расширяем возможности телефонной книги

388

31.4. Базы данных в Borland C++

395

Глава 32 Создаем свой браузер

399

32.1. Компонент для разработки браузеров

399

32.2. Дополнительные возможности браузера

409

32.3. Усовершенствование навигации

416

Глава 33 Свойства проекта и его компиляция

421

Заключение

424

Посвящается моей маме

Предисловие

Язык С++ был придуман специально для того, чтобы профессиональными программистами не становились случай ные люди.

Одна из легенд языка С++

Е сли вы после прочтения эпиграфа решили отказаться от намерения из учать язык С++, то обратите внимание на слово «легенда». Здесь оно не означает выдумку, а приведено в том смысле, что некогда (а именно

в момент рождения языка С++) такая ситуация имела место. В настоящее вре мя освоить С++ несколько легче. Учебная литература – не обязательно по программированию – пишется, как хотелось бы верить, мастерами своего дела. Необходимы недюжинные педаго гические способности, чтобы с высот своего понимания предмета спуститься до уровня непосвященного человека. И тем более трудно применить эти спо собности при написании книги, когда нет обратной связи с учеником и возмож ности по другому – более понятно – формулировать свои объяснения. Эксперт знает практически все. На тот момент, когда он пишет «контекст устройства», он уже имел дело с «контекстом» тысячи раз, и, стараясь объяснить это поня тие на уровне новичка, подсознательно все равно остается на своем уровне – обремененный опытом использования «контекста». Данная книга написана по другому. Я начинал работать над ней, будучи но вичком в С++. Поэтому задумывал я, конечно, не учебник, а справочник для са мого себя – чтобы приемы и навыки, с трудом освоенные в результате чтения книг экспертов и долгих сражений с компилятором, не пришлось с таким же трудом восстанавливать заново через несколько недель при решении задач, похожих на уже встречавшиеся ранее. На первом этапе книгу можно было бы назвать «От новичка – новичку», так как она создавалась на уровне, понятном начинающему. Когда я уже сам стал давать советы по программированию и даже обучать ему других, пришло понимание того, что получившийся справочник может лег ко стать учебником для людей, только что взявшихся за С++. Исходный матери ал был несколько переработан; главы выстроены в порядке возрастания слож ности; к каждой главе были добавлены подробные пояснения, в том числе раскрывающие основы языка С++. В итоге текст претерпел существенные из менения. Надеюсь, что книга будет понятна новичкам, хотя каждое добавление так или иначе усложняет восприятие. Попутно была исправлена часть «ошибок

8

Borland C++ 5 для себя

молодости». Часть, поскольку язык безграничен и таит самые неожиданные возможности. Когда нибудь вы, став экспертом, поймете, что один код в данной книге можно значительно сократить, а другой лучше вообще заменить. Но разве сложные коды программ были бы понятны вам в самом начале освоения С++? В связи с вышесказанным не стоит ждать от книги академической строгос ти. Впрочем, я старался избегать явного программистского жаргона. Стиль книги получился довольно вольный с точки зрения формы представления ма териала. Есть главы длиной в пятьдесят страниц, а есть совсем маленькие. Меж ду прочим, я показывал рукопись книги человеку, далекому от программирова ния, и он ее читал просто как художественную. Закончив с обоснованием преимуществ данной книги, необходимо отме тить, что для ее чтения желательно иметь на своем компьютере Borland C++ 5 или C++ Builder 5. Если вы не знаете, какую из этих двух программ выбрать, сначала изучите текст, не прикасаясь к клавиатуре. Когда вам станет понятно, как написать собственную программу, установите Borland C++ (или C++Builder) и читайте книгу второй раз. Другой вариант – у вас уже есть некоторый опыт

в освоении С++ и книга нужна вам для изучения каких либо новых приемов. Тог

да можно пополнить ей уже имеющуюся у вас библиотеку по С++ – наличие не скольких вариантов объяснения одного и того же позволяет глубже понять изучаемый предмет. Представленный здесь материал поможет постепенно, шаг за шагом, из учить основные принципы и конкретные приемы программирования на С++. Текст дополнен иллюстрациями, на которых поэтапно показана работа различ ных программ. Всегда можно проверить себя, сравнивая рисунки в книге с тем, что вы видите на экране. Для более наглядного ознакомления с Borland С++ (С++ Builder) в начале каждой части иллюстраций даже больше, чем текста. Поскольку в книге содержится информация и о Borland С++, и о С++ Builder, две части книги можно рассматривать в какой то степени как варианты описа ния одних и тех же элементов языка С++, но в первой части все примеры отно сятся к среде Borland С++, а во второй – к среде С++ Builder. Если эта книга первая для вас, то для дальнейшего освоения языка про граммирования потребуется какой либо из стандартных учебников. Здесь же делается упор на практические действия, а теория объясняется лишь по мере применения ее на практике (временами – несколько шире). Из за такого подхода часть теоретических сведений о языке С++ (а также С, его предшественнике),

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

в любом учебнике нет всего необходимого. В свое время у меня было две книги

по Borland С++ 5 и классическая книга авторов языка С Б. Кернигана и Д. Ричи (Brian W. Kernighan, Dennis M. Ritchie, «The C Programming Language»). А в даль нейшем я пользовался справочной системой Borland С++. Если достаточно места на диске, лучше установить Borland С++ или С++ Builder полностью, поскольку никогда заранее не известно, что именно будет нужно и каких глубин вы сможете достигнуть. А если установка уже выполнена, изучайте первую часть книги (с Borland С++) или вторую (с С++ Builder) и на

чинайте создавать свою первую программу.

Предисловие

9

Любые замечания, вопросы, претензии принимаются с удовольствием. Ад рес электронной почты – cborland@mail.ru. Настало время выразить признательность всем, кто мне помогал. Большое спасибо жене Вере за моральную поддержку. Вторая благодарность – моему компьютерному другу Алексею Пересторонину. Мой компьютер (основной ра бочий инструмент, как понимаете) практически полностью состоит из предо ставленных им комплектующих. Особая признательность – моему начальнику Олегу Викторовичу Понину за предоставленный (хочется надеяться, что не последний) творческий отпуск. Москва, декабрь 2000 года

Borland, Borland Builder или Microsoft

Русские программисты работают в Bor land, но дополнительно устанавливают Microsoft из за хорошей справочной систе мы по API функциям.

Анекдот из серии «Что думают о русских программистах их западные коллеги»

П рограммировать сейчас может каждый. Microsoft, Borland и их после дователи создали средства быстрой разработки приложений (RAD – Rapid Application Development) таким образом, что любой че

ловек, может используя эти средства, написать программу для Windows. И эта программа будет выглядеть профессионально (любимый рекламный и, как ни странно, справедливый термин вышеупомянутых фирм). За несколько минут можно создать программу калькулятора или текстового редактора. Чуть боль ше времени понадобится для создания программы, работающей с компьютер ной базой данных, или собственного браузера для Internet. Поскольку круг задач, которые программист ставит перед собой, не беско нечен, разработчики средств программирования в полном объеме справились с их решением. Последние версии продуктов от Borland и Microsoft помогут создать практически все, на что хватит фантазии. Так как данные средства ра ботают в Windows и неизбежно придерживаются привычного всем интерфей са, они приобретают значительное сходство друг с другом. Лично я любую техническую новинку оцениваю по одному критерию – мо жет ли она приносить хозяину тапочки. К сожалению, моего идеала пока никто не достиг. Средства программирования, если рассматривать предмет еще шире, суще ствуют не только для языка С++, но и для других основных языков программи рования – Pascal, Basic, Fortran. Самое интересное, что средства для всех язы ков становятся более похожими друг на друга с каждой новой выпускаемой версией. В любом из этих языков есть примерно одинаковые возможности для

написания программ.

10

Borland C++ 5 для себя

Возникает закономерный вопрос – какой язык и какое средство программи рования выбрать? Если вы держите в руках эту книгу, можно предположить, что частично выбор уже сделан. Ваше предпочтение отдано одному из замечательных про дуктов фирмы Borland, связанных с языком С++. Но если вам еще надо удосто вериться в правильности своего выбора, попробую привести дополнительные аргументы. Очень многое зависит от поставленной цели. Если вы решили сначала из учать программирование «для себя» и хотите просто научиться писать програм мы для Windows, то можно использовать любой язык и любую среду програм мирования из указанных в заголовке. Известно, что при изучении иностранных языков труднее всего дается пер вый, а все последующие осваивать намного легче. С языками программирова ния то же самое: если овладеть хотя бы одним, перейти потом на другой будет не очень сложно. И таким же образом обстоит дело со средствами программи рования. Они настолько схожи друг с другом, что, освоив одно из средств, без особого труда можно работать в другом. Но начинать, разумеется, лучше с бо лее простого – с Borland С++ (последняя версия – 5.02). Можно долго рассуждать о том, какой из языков программирования для каких задач лучше приспособлен, но на начальном этапе освоения это не так важно. С моей точки зрения, С++ все таки лучше остальных. Предназначался он (точнее, его предшественник С) для разработки операционных систем, и это уже говорит о его глубине и возможностях. Хотя большинство из нас не собирается создавать свой Linux, согласитесь, что приятно знать язык, который имеет подобный потенциал*. Если у вас есть намерение связать с программированием профессиональную деятельность, то стоит упомянуть о том, что программистам на С++ платят больше. И наконец, чтобы покончить с вопросом выбора языка, скажу, что моя лю бимая игра – очень красивая и увлекательная – написана на языке С++. Надо сказать несколько слов о средстве (среде) программирования. По мне нию исследователей, которые специально изучали и сравнивали средства раз работки программ на языке С++, бесспорными лидерами в данной сфере явля ются именно Borland и Microsoft. Что то, согласно авторам исследований, лучше сделано у Borland, что то – у Microsoft. В эпиграфе, который я придумал не сам, говорится примерно о том же. Но если следовать эпиграфу, ваша судь ба – Borland. В самом начале изучения языка С++ я пробовал использовать продукты обе их фирм. По субъективным ощущениям, будучи новичком в С++ (но работая до

* Строго говоря, из современных языков для написания операционных систем не использовался разве что BASIC, но такие наиболее используемые системы, как Windows и различные варианты UNIX, включая Linux, написаны именно на C. – Прим. науч. ред.

Предисловие

11

этого с другими языками программирования), я отдал предпочтение Borland. И хотя мною отслеживается появление новых версий Visual C++ от Microsoft, переходить к Microsoft, по моему мнению, причин пока нет. А теперь о путанице, которая возникла с продукцией фирмы Borland. У фирмы есть две среды разработки программ на языке С++. Первой была сре да Borland C++. Вторая среда называется С++ Builder, или Borland C++ Builder, или Inprise C++ Builder. В сущности, Borland и Builder – два разных продукта. Одни и те же функции они выполняют немного по разному и имеют некото рые отличия во внешнем виде. Если вы только начинаете программировать, то начните с Borland C++ – он проще и, следовательно, его легче освоить. Я не сомневаюсь в ваших способ ностях, но начинать лучше с того, что проще. Кроме того, Borland C++ работает несколько быстрее прочих. Это можно понять по минимальным требованиям к компьютеру, предъявляемым им и дру гими средствами. Для Borland C++ требуется хотя бы 486 й процессор и 16 Мб оперативной памяти; а для C++ Builder – уже Pentium 90 и 32 Мб*. Даже на Pentium III Borland C++ будет работать быстрее прочих. На начальном этапе обучения программированию необходима определенная скорость, поскольку в освоении языка неизбежен метод проб и ошибок. Изменили что то в програм ме, запустили компилятор, прочитали сообщение об ошибке, снова изменили программу и т.д. Чем быстрее будет происходить компиляция, тем менее дол гим будет ожидание ее результата. Но если у вас установлен C++ Builder или еще ничего не установлено, неми нуемо возникнет вопрос о наличии преимуществ C++ Builder. Некоторые пре имущества, несомненно, есть. Поскольку C++ Builder 5 появился в 2000 м году, у него больше возможностей, чем у Borland C++ 5. Необходимо сказать лишь об очевидных вещах, не вдаваясь в подробности разработки распределенных систем баз данных. В Borland C++ есть средства для создания программ, рабо тающих с локальными базами данных, но в C++ Builder такая разработка, на первый взгляд, смотрится чуть проще. Работа с Internet в C++ Builder произво дится на более высоком уровне. Для освоения Borland C++ я рекомендую прочитать книгу с первой главы и до последней, поскольку во второй части также есть многое, к нему относя щееся. Для изучения C++ Builder надо начинать сразу со второй части и только по общим вопросам, связанным с языком C++, а не со средой разработки, по соответствующим ссылкам обращаться к первой части. Уже перед самой сдачей книги я снова заглянул в форумы Internet. Там про должаются дискуссии на тему «BC или MVC?». Но основные идеи, в общих чер тах изложенные в данном разделе, там разногласий не вызывают.

* Хотя кому то может показаться, что такие компьютеры встречаются только в музее, не торопи тесь с выводами: подобные машины все еще пользуются большим спросом у тех, кто только на чинает программировать. – Прим. науч. ред.

12

Borland C++ 5 для себя

Стоя перед прилавком

Эта

оставляет далеко позади серию «Для чай ников»!

изложения

книга

по

простоте

Из отзывов читателей

Р аздел предназначен для тех, кто стоит перед книжным прилавком и пы

тается выбрать учебник для освоения Borland C++ или C++ Builder. Не

всегда бывает просто выбрать книгу по предисловию. Необходимо хотя

бы бегло ознакомиться с ее содержанием, но это может занять много времени и не дает гарантии найти то, что вам надо. Чтобы помочь составить мнение о данной книге, здесь представлены суждения людей, прочитавших ее бета вер сию (первые пять глав). Нет сомнения в том, что эти люди близки вам по жела нию освоить замечательный язык C++. Поскольку бета версия была опубликована в Internet, все отзывы были полу чены по электронной почте. В качестве подписей к отзывам указано то, что стоя ло в поле From (От) письма. Спасибо и тем, чьи письма не было возможности здесь поместить, так как отзывов очень много и они приходят каждый день.

Здравствуйте, уважаемый Галявов И. Р. Пишет Вам человек, на подобных которому ориентирована Ваша книга о Borland C++. По специаль ности я программист, окончил техникум и пошел в армию. По возвращении обнаружил, что мои знания ассемблера и паскаля, мягко говоря, не популярны. Сейчас занялся изучением С++ и Delphi. Установил у себя C++ Builder 4 и полез в Internet. Столкнулся со следующей проблемой: литературы очень мало, та, что есть, не дает полностью понять работу системы. Рассматривается все очень однобоко – либо есть, как вставлять кнопочки, либо как ра ботать с объектами. Внятного ответа на вопрос, как связать данные из разных объектов, как вставить зна чение из поля в переменную и наоборот, я не смог получить. Уже не надеясь на то, что найду что нибудь вразумительное, щелкнул по последней ссылке. Увидел заго ловок. Прочитал влет, минут за 15. Сейчас ставлю Borland 5.01. Вы знаете, я уже не могу понять, как я жил без такой книги. Ощущение, что первые пять глав писались именно для меня. Я нашел ответы почти на все вопросы, что искал в течение почти двух дней. Это то, что называется «чистый восторг», «в яблочко»… Как Вы можете скрывать от жадной до знаний общественности такое достояние?…

Олег Бубнов

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

Валентин Судницын

Я недавно в Компьютерной библиотеке http://www.rusdoc.ru/ прочитал Ваш учебник по Borland C++. Я и не ожидал найти книгу, написанную таким понятным для новичка языком.

Предисловие

13

Вообще то я еще определяюсь с тем, какой язык изучать телось изучать именно этот язык… Большое спасибо вам за такую замечательную книгу!

Прочитал Ваши пять глав по C, и мне захо

Vadim S

Недавно наткнулся на часть Вашей книги по Borland C++ 5. Необычность представления материала меня приятно удивила и, надо сказать, очень понравилась… Начал обучаться программированию на С++ и столкнулся с вопросом по документации и разного рода справочникам. Крайне мало справочных материалов на русском языке, а так как я язык учу вместе с младшей сестрой, то это стало особенно актуально. А здесь нашел часть Вашей книги «Borland C++ 5 для себя» – простая в понимании, не требующая сверхъестественного от человека.

Eugeny Mazunin

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

hdesk

Наконец то нашел книгу, вразумительно описывающую работу в Borland C++5… Объяснения и при меры достаточно наглядны и просты для понимания….

Wizard

С большим любопытством прочитал первые главы Вашей книги. Очень интересно, полезно и доступ но, а главное – понятно.

Titan

Здравствуйте! Совсем недавно решил заняться программированием (точнее, научиться этому). Не знаю почему, но язык С++ мне понравился больше всего. Достал Borland C++ 5.02 и несколько книг. Но оказалось, что они (книги) рассчитаны на некоторый уровень знакомства с языком. Я никогда этим не занимался, поэтому 95% содержания осталось для меня непонятным. В поисках более доступного описания подобного материала наткнулся в Internet на Вашу книгу. Мне очень понравилось!… Очень хочу научиться программировать на С++…

Руслан Бернацкий

Прочитал главы Вашей книги «Borland C++ 5 для себя». Замечательная книга. Просто

и доступно Такой информации и в такой подаче действительно почти нет. То, что Вы делаете – на самом деле очень нужное дело!

German

На мой взгляд, эти уроки самые доступные и понятные, а главное интересные, по сравнению с другой обучающей литературой по Borland C++.

Makhov Denis

14

Borland C++ 5 для себя

Принятые обозначения

Чтобы облегчить читателю работу с книгой, издательством «ДМК Пресс» при няты следующие обозначения:

коды программ, операторы, объекты, методы и свойства выделены моноширинным шрифтом;

названия элементов интерфейса (команд, пунктов меню, окон т.д.), а так же клавиш выделены полужирным шрифтом;

фрагменты текста, на которые следует обратить особое внимание, поня тия и термины, встретившиеся впервые, набраны курсивом.

I

Borland,

Часть просто Borland

ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 11111 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 22222 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 33333 ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 44444 ▼▼▼▼▼

Создание заготовки программы Кнопки и сообщения Предупреждения и сообщения об ошибках Возвращаемые значения

ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 55555 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 66666 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 77777 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 88888 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 99999 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1010101010 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1111111111 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1212121212 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1313131313 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1414141414 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1515151515 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1616161616 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1717171717 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1818181818 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 1919191919 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 2020202020 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 2121212121 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 2222222222 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 2323232323 ▼▼▼▼▼ ГЛАВАГЛАВАГЛАВАГЛАВАГЛАВА 2424242424 ▼▼▼▼▼

и условное выполнение команд Дополнительные элементы окна Красота – страшная сила Рисование в окне программы Элементарная защита паролем Работа с файлами Переменные и их типы Продолжаем работу с файлами Отладка программы Простейший калькулятор Обработка нажатий клавиш Радиокнопки и флажки Списки Использование диалоговых окон Работа с картинками Нет предела совершенству Кнопки с картинками Работа с процессами В движении – жизнь Ярлыки Дополнительная глава

1

Глава

Создание заготовки программы

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

Народная мудрость

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

ем из анекдота, приведенного в эпиграфе, поскольку будет построена путем вы бора вариантов, предложенных Borland C++. Надо признаться, что в печатном варианте книги черно белые картинки предпочтительнее цветных с экономической точки зрения. Хочется надеяться, вы не встретите затруднений, читая ниже фразы типа «красный цвет на рисунке означает…». То же относится и к выделению цветом строк кода в Borland C++ – в книге это выделение не показано. Если же вам захочется взглянуть на цветной вариант, напишите мне письмо, и мы что нибудь придумаем.

1.1. Необходимые действия

Запустите Borland C++. Появится серое окно, в котором всего пять кнопок и строка меню. В этой строке выберите пункт File (Файл) New (Создать) AppExpert (Эксперт приложений) – см. рис. 1.1. При выборе этого пункта был произведен запуск Эксперта приложений, ко торый поможет создать шаблон будущей программы. Эксперт сначала задаст вопрос об имени будущей программы и папке, где она будет находиться. Для

1.1. Необходимые действия

17

1.1. Необходимые действия ▼ 17 Рис. 1.1 ▼ Запуск Эксперта приложений

Рис. 1.1 Запуск Эксперта приложений

примера, чтобы ни с чем по ходу книги не перепутать имя программы, назови те ее 2000 (рис. 1.2). Нажмите кнопку Open (Открыть). На экране появится перечень парамет ров будущей программы. Для начала выберите параметр Dialog Client (Диало говое окно) и снимите флажок у надписи Document/View (Документ/Вид) – см. рис. 1.3.

/ View (Документ/Вид) – см. рис. 1.3. Рис. 1.2 ▼ Ввод имени программы и

Рис. 1.2 Ввод имени программы и выбор папки

Затем надо щелкнуть по плюсику слева от пункта Application (Приложение), чтобы развернуть его содержимое. Выделите Basic Options (Основные парамет ры) и снимите все флажки, так как они пока будут только мешать (рис. 1.4). В пункте Admin Options (Административные параметры) вы можете ввес ти некоторую информацию (рис. 1.5). Данные на любом этапе всегда можно из менить. Разверните пункт Main Window (Главное Окно) и оставьте только те флаж ки, которые показаны на рис. 1.6. Все остальные – пока лишние, а некоторые – даже вредные. Осталось нажать на кнопку Generate (Сгенерировать), но этим дело не закончится. Необходимо будет еще раз подтвердить, что вы не передумали создавать новую программу (рис. 1.7).

18

ГЛАВА 1 Создание заготовки программы

▼ Создание заготовки программы Рис. 1.3 ▼ Выбор основного вида

Рис. 1.3 Выбор основного вида программы

Выбор основного вида программы Рис. 1.4 ▼ Выбор основных

Рис. 1.4 Выбор основных параметров программы

1.1. Необходимые действия

19

1.1. Необходимые действия ▼ 19 Рис. 1.5 ▼ Идентификационные данные

Рис. 1.5 Идентификационные данные

1.5 ▼ Идентификационные данные Рис. 1.6 ▼ Параметры оформления

Рис. 1.6 Параметры оформления окна программы

20

ГЛАВА 1 Создание заготовки программы

▼ Создание заготовки программы Рис. 1.7 ▼ Последнее

Рис. 1.7 Последнее подтверждение намерений

Нажмите кнопку Yes (Да), и Borland примется за работу. После оконча ния действия кнопок в окне стало больше, появилось окно проекта 2000 – это структура вашей программы (рис. 1.8). Чтобы в результате возник один единственный файл с именем 2000.exe, создано множество исходных файлов, с которыми и придется иметь дело. Позже будет понятно, что представляют из себя данные файлы.

из себя данные файлы. Рис. 1.8 ▼ Проект программы Чтобы

Рис. 1.8 Проект программы

Чтобы увидеть итог выполненных действий, нажмите на кнопку Run (Вы полнить). И через несколько секунд/минут/часов (зависит от возможностей ПК) на экране появится ваша первая программа (см. рис. 1.9). Ее цветовая гам ма будет совпадать с установленной на вашем компьютере. Конечно, в программе еще нельзя выполнить никаких операций, можно лишь открыть, свернуть или закрыть ее окно. В следующих главах вы ее кое чему научите.

1.2. Дополнительная информация

Следует немного отступить от пройденного в предыдущей части пути. Давайте посмотрим, что было нами пропущено при создании программы.

1.2. Дополнительная информация

21

Самый первый и главный выбор был сделан в окне, показанном на рис. 1.3.

Среди трех моделей окна программы в разделе Window Model (Модель окна) был выбран «диалоговый» вид программы (пункт Dialog Client). Это вид глав ного окна программы, появляющегося при ее запуске. Из главного окна можно вызывать или запускать окна любого другого типа. Потом на данном поле раз местятся разные элементы – кнопки, окошки для ввода и вывода информации, движки и индикаторы, появится графическая информация (картинки).

информация (картинки). Рис. 1.9 ▼ Только что родившаяся

Рис. 1.9 Только что родившаяся программа

Следующим типом модели программы (если идти по рис. 1.3 снизу вверх)

является SDI (Single Document Interface) – так называемое однодокументное окно. Если выбрать этот пункт, созданная по умолчанию заготовка программы будет выглядеть, как на рис. 1.10.

будет выглядеть, как на рис. 1.10. Рис. 1.10 ▼ Вид программы типа SDI

Рис. 1.10 Вид программы типа SDI

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

22

ГЛАВА 1 Создание заготовки программы

есть многие обычные функции, например, поиск или замена символов. Но об

ратите внимание, что стандартные игры Windows тоже построены на этом типе окон (см. рис. 1.11).

на этом типе окон (см. рис. 1.11). Рис. 1.11 ▼ Эта игра также создана

Рис. 1.11 Эта игра также создана в окне типа SDI

Для написания подобной игры тип SDI – то, что вам нужно. Данному типу мне хотелось бы посвятить отдельную книгу. Третья модель – MDI (Multiple Document Interface) – многодокументное окно. Это почти то же самое, что SDI, только MDI подразумевает, что в глав ном окне типа SDI можно создавать несколько подобных окон. Яркий предста витель таких программ – Word, так как в нем можно открыть несколько тексто вых файлов – каждый в своем окне. Причем ни одно из окон с открытым файлом невозможно переместить за пределы главного окна программы. О пункте Document/View (см. рис. 1.3) стоит говорить лишь применитель но к программам типа SDI и MDI, но и в них он не всегда используется. В самом верхнем окне задавался вопрос о поставленной цели и о папке, где будет храниться наша программа при ее разработке. Папка уже выбрана рань ше, хотя можно всегда поменять ее. А вот цель – это имя будущего exe файла. Может показаться, что имя уже присвоено – 2000 (см. рис. 1.2), но, строго го воря, вы выбрали имя проекта. А в рамках одного проекта могут храниться и разрабатываться несколько программ, поэтому в проекте с именем 2000 можно

1.2. Дополнительная информация

23

Дополнительная информация ▼ 23 Рис. 1.12 ▼ Не все версии Windows

Рис. 1.12 Не все версии Windows понимают длинные имена файлов

сделать программу с названием, например, My Super Program (см. рис. 1.4). Имя

надо вписать в поле Target name (Имя цели). Правда, при этом могут возник нуть некоторые трудности (рис. 1.12). Если вам нужно длинное имя, установите флажок около Use long file names (Использовать длинные имена файлов) и нажмите на ОК. В результате исполня емый файл будет называться my super program.exe (именно с такими пробелами, как было написано, но все маленькими буквами). В заголовке программы вмес то 2000 (см. рис. 1.9) будет красоваться надпись My Super Program. Все это мож но потом поменять. Флажки, снятые вами в окне, показанном на рис. 1.4, с точки зрения но вичка, – лишние вещи. Например, Dockable ToolBar (Закрепленная панель) – это панель с кнопками, которая находится вверху окна программы (см. рис. 1.9). Подобные панели обычно не применяются в диалоговых окнах и, даже если оставить флажок, панель не появится. При желании можно добавить такую панель к программе вручную. Со Status line (Строка состояния) дело обстоит следующим образом. Это строка, идущая внизу окна типа SDI (см. рис. 1.4). В диалоговых программах строка не используется. Но если оставить этот фла жок, под строку будет зарезервировано дополнительное место. В этой зоне можно поместить свои элементы, но это создаст вам совершенно ненужные трудности. Лучше снять флажки, пока нет абсолютной уверенности, что какой то из них вам необходим. Отдельно надо сказать о поле Help file name (Имя файла справки). Про граммы, у которых есть справочная система, вызывают уважение, особенно – маленькие программы, выполняющие лишь одно действие, но файл справки которых написан по всем правилам. Когда нибудь мы поговорим о написании данного файла (его создание не входит в обязанности самого Borland С++). Пока флажок здесь ставить не нужно.

Теперь хотелось бы обратить ваше внимание на окно, показанное на рис. 1.6. Из тех флажков, что стояли там по умолчанию, вам по моей просьбе пришлось убрать их около Max box (Кнопка максимизации) и Thick frame (Толстая рам ка). Данные особенности стиля окна являются лишними в программе диалогового

24

ГЛАВА 1 Создание заготовки программы

типа. Раздел, в котором отключались эти флажки, назывался Window Styles (Стили окна). Флажок в Max box активизирует кнопку максимизации окна, вто рую справа в правом верхнем углу. Диалоговые окна обычно имеют определен ный вами размер, поэтому не стоит давать пользователю возможность растяги вать окно программы во весь экран. То же самое обоснование – не давать пользователю менять размеры окна – является причиной снятия флажка с пункта Thick frame. Сформированная с этим параметром программа будет иметь утолщенную рамку, размеры кото рой изменяются при помощи мыши. Каждый из остальных параметров, несом ненно, тоже что то означает. Если есть желание и время, вы можете потрениро ваться в создании проектов, изменяя установки (см. рис. 1.6). Правда, вам каждый раз надо будет проходить весь путь формирования проекта, генериро вать его, потом компилировать, запускать программу и смотреть, что в ней изменилось. Но есть способ лучше. К тому же он позволяет определить, где в тексте про граммы можно поменять эти установки. Иногда бывает, что после создания программы с помощью Эксперта приложений становится ясно, что не нужна, например, кнопка минимизации. Как ее убрать? Не создавать же проект зано во. В конце главы 2, а именно в разделе 2.4, будет об этом рассказано.

2

Глава Кнопки и сообщения

С

Во имя Отца, и Сына, и Духа Святого, Enter!

«Молитва» программиста

ледует вернуться к тому, о чем говорилось в первой главе. Необходимо

выяснить, из чего же состоит исходный код программы. Щелкните по

всем плюсам в единственном пока окне – Project:…2000.ide. На экране

появится полная структура проекта (см. рис. 2.1).

структура проекта (см. рис. 2.1). Рис. 2.1 ▼ Полная структура

Рис. 2.1 Полная структура проекта

Каждая строка – это отдельный файл. С большинством из них придется ра ботать в текстовом режиме. Но есть и такие, где все можно делать с помощью мыши.

26

ГЛАВА 2 Кнопки и сообщения

2.1. Создание кнопки в окне программы

В проекте выделите строку 2000app.rc и дважды щелкните по ней. Появится новое окно – Редактора ресурсов. Разверните, щелкнув по плюсу, пункт DIALOG и выделите единственный подпункт IDD_CLIENT (2000) – см. рис. 2.2. В скоб ки заключен идентификационный номер ресурса диалогового окна – 2000, ко торый никак не связан с именем программы. Если выбрать другое имя, назва ние подпункта IDD_CLIENT (2000) не изменится.

IDD_CLIENT (2000) не изменится. Рис. 2.2 ▼ Редактор ресурсов

Рис. 2.2 Редактор ресурсов

Справа будет находиться окно вашей программы. Надпись Dialog Client в верх ней части окна и отсутствие справа крестика не должны вас смущать – все это изменяется в других частях программы, так как проект содержит много исход ных файлов. Теперь дважды щелкните по выделенному пункту IDD_CLIENT (2000). От кроется новое окно вашей программы с панелью Controls (Элементы управле ния), при помощи которой можно изменить вид окна программы (рис. 2.3).

вид окна программы (рис. 2.3). Рис. 2.3 ▼ Панель Controls Если

Рис. 2.3 Панель Controls

Если панели нет, щелкните правой кнопкой мыши вне прямоугольника Dialog Client и в появившемся меню включите параметр Control Palette (Па нель элементов управления) – см. рис. 2.4. Кстати, флажок можно поставить и около пункта Grid (Сетка). Сетка помо жет выравнивать все, что будет нарисовано в окне программы. На панели Controls нажмите кнопку с изображением кнопки (убедитесь сами, что это не каламбур) OK. Если теперь переместить курсор на окно программы,

2.1. Создание кнопки в окне программы

27

он примет вид перекрестья. Щелкните где нибудь в окне программы – и вы по лучите собственную кнопку (рис. 2.5). Далее нужно навести на нее курсор и нажать правую кнопку мыши. Появив шееся меню (рис. 2.6) содержит ряд полезных пунктов, но сначала следует отметить Properties (Свойства).

отметить Properties (Свойства). Рис. 2.4 ▼ Выбор панелей

Рис. 2.4 Выбор панелей Редактора ресурсов

панелей Редактора ресурсов Рис. 2.5 ▼ Создание новой кнопки

Рис. 2.5 Создание новой кнопки

В открывшемся окне свойств в поле Caption (Заголовок) введите вместо надписи Button3 надпись Нажимать здесь, чтобы назначение кнопки было понятно будущему пользователю (рис. 2.7). Нажав затем OK, вы увидите, что надпись на кнопке не помещается, поскольку название слишком длинное (рис. 2.8).

слишком длинное (рис. 2.8). Рис. 2.6 ▼ Изменение свойств

Рис. 2.6 Изменение свойств кнопки

2.6 ▼ Изменение свойств кнопки Рис. 2.7 ▼ Изменение названия

Рис. 2.7 Изменение названия кнопки

28

ГЛАВА 2 Кнопки и сообщения

Для устранения этой проблемы нужно за один из левых или правых квадра

тиков растянуть кнопку до необходимых размеров (рис. 2.9). Чтобы увидеть результат, закройте все окна, оставив только проект, и на жмите кнопку Run.

проект, и на жмите кнопку Run . Рис. 2.8 ▼ Надпись не поместилась

Рис. 2.8 Надпись не поместилась на кнопке

Надпись не поместилась на кнопке Рис. 2.9 ▼ Кнопка с надписью

Рис. 2.9 Кнопка с надписью

Когда я писал эти строки и по ходу повествования выполнял все описыва емые действия, то после нажатия на кнопку Run получил сообщение, с кото рым большинство из нас, наверное, хорошо знакомо (рис. 2.10).

хорошо знакомо (рис. 2.10). Рис. 2.10 ▼ Сообщение о системной

Рис. 2.10 Сообщение о системной ошибке

Даже если у вас не произошло автоматического отключения Borland, то все равно прочитайте следующие абзацы – там содержится очень полезная инфор мация. Итак, снова запустите Borland C++. Но теперь файл – 2000.ide нужно открыть уже через меню File Open. Еще раз откройте Редактор ресурсов (см. рис. 2.1), чтобы убедиться в наличии созданной вами кнопки – Редактор ресурсов при закрытии автоматически сохранил все изменения. Теперь можно закрыть его и нажать кнопку Build (Создать) – см. рис. 1.7. А теперь поговорим о том, как проверить работу программы при ее созда нии. Все просто: надо держать открытой папку, в которой находится проект. В ней всегда есть файл с именем 2000.exe, запускаемый как обычная програм ма. А для создания программы заново после внесения каких либо изменений служат кнопки Build и Make (см. рис. 1.7). В переводе оба названия означают «создать». При использовании кнопки Make заново создается файл 2000.exe, но при этом перекомпилируются только файлы, изменявшиеся с момента по следнего создания 2000.exe (Borland С++ учитывает все изменения). При нажа тии же кнопки Build перекомпилируются все файлы – независимо от того, из менялись ли они, – что, конечно, требует большего времени. Поэтому после внесения изменений лучше нажать на кнопку Make, а если программа по непо нятной причине не запустится (а должна бы, по вашему мнению!) щелкните по кнопке Build: это иногда помогает.

2.2. Обработчик нажатия на кнопку

29

Обработчик нажатия на кнопку ▼ 29 Рис. 2.11 ▼ Завершение создания

Рис. 2.11 Завершение создания исполняемого файла

После щелчка по кнопке Make (Build) будет выведено сообщение об удачном завершении работы (надпись Status: Success в верхней строке окна) – см. рис. 2.11.

строке окна) – см. рис. 2.11. Рис. 2.12 ▼ Окно программы с

Рис. 2.12 Окно программы с созданной вами кнопкой

Затем откройте папку с файлом 2000.exe и запустите программу. Ее окно содержит вашу кнопку (рис. 2.12). На кнопку можно даже нажимать – она, как и положено в таких случаях, будет утопать под курсором. Но пока в результате нажатия не происходит ни каких действий.

2.2. Обработчик нажатия на кнопку

Как говорится в книгах, кнопка в программе – это самый простой, интуитивно понятный и удобный элемент. Любому ясно – если есть кнопка, то надо на нее нажать… и посмотреть, что получится.

30

ГЛАВА 2 Кнопки и сообщения

Закройте вашу программу и вернитесь в Borland C++. Откройте Редактор ресур сов и снова обратитесь к меню, изображенному на рис. 2.6. Только теперь в меню надо выбрать пункт ClassExpert (Эксперт классов). Можно было бы попасть в Эксперт классов, минуя Редактор ресурсов, но обычно это делается сразу после того, как была нарисована новая кнопка. Вы увидите новое окно (рис. 2.13).

Вы увидите новое окно (рис. 2.13). Рис. 2.13 ▼ Окно Эксперта классов

Рис. 2.13 Окно Эксперта классов

Если вы внимательно изучали предыдущие рисунки, то вспомните, что обо значение IDC_BUTTON1 уже встречалось в свойствах кнопки (см. рис. 2.7). Это идентификатор кнопки в рамках вашего проекта. Щелкните по символу «плюс» слева от IDC_BUTTON1. Будет показано множество событий, на которые может реагировать кнопка (рис. 2.14). Кнопка должна реагировать на нажатие, поэтому выделите пункт BN_CLICKED (щелчок по кнопке) и нажмите правую кнопку мыши. Появится меню (рис. 2.15).

мыши. Появится меню (рис. 2.15). Рис. 2.14 ▼ События, на которые

Рис. 2.14 События, на которые может реагировать кнопка

может реагировать кнопка Рис. 2.15 ▼ Создание обработчика

Рис. 2.15 Создание обработчика нажатия

Выберите пункт Add handler (Добавить обработчик). Появится еще один запрос, уточняющий, каково будет внутреннее имя обработчика нажатия. Луч ше присваивать кнопкам разные имена, чтобы легко отличать их друг от друга в тексте программы. Назовите ее BNClickedOne (рис. 2.16).

2.2. Обработчик нажатия на кнопку

31

Обработчик нажатия на кнопку ▼ 31 Рис. 2.16 ▼ Присвоение имени

Рис. 2.16 Присвоение имени обработчику нажатия

Теперь в Эксперте классов идентификатор кнопки и действие BN_CLICKED будут помечены флажками. В нижней части окна Эксперта появится часть текс та некоего файла, содержащего строку с только что введенным вами именем (рис. 2.17).

введенным вами именем (рис. 2.17). Рис. 2.17 ▼ Созданный обработчик

Рис. 2.17 Созданный обработчик нажатия

Теперь закройте Эксперт классов и Редактор ресурсов, вернувшись к окну, в котором есть только окно проекта. Выделите строку 2000dlgc.cpp и дважды щелкните по ней. Это один из файлов исходного кода, который и будет, в основ ном, редактироваться вручную. Файл откроется в своем собственном окне. Здесь надо найти текст, который ранее показывался в Эксперте классов (рис. 2.18).

в Эксперте классов (рис. 2.18). Рис. 2.18 ▼ Обработчик в исходном

Рис. 2.18 Обработчик в исходном тексте программы

Если вы читаете по английски, то вам будет понятен смысл темно синей надпи си: INSERT>> Your code here (Вставьте ваш код здесь). На этом месте кончается

32

ГЛАВА 2 Кнопки и сообщения

использование мыши и начинается работа с клавиатурой. Именно здесь надо написать, что при возникновении события «нажатие на кнопку» на экране должно появиться окошко с неким сообщением и кнопкой ОК (рис. 2.19).

и кнопкой ОК (рис. 2.19). Рис. 2.19 ▼ Результат нажатия на

Рис. 2.19 Результат нажатия на созданную кнопку

Делается это очень просто – впишите туда, где сказано «вставьте», следу ющий код:

void T2000DlgClient::BNClickedOne()

{

// INSERT>> Your code here. MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!", "Наше сообщение", MB_OK | MB_ICONINFORMATION);

}

сообщение", MB_OK | MB_ICONINFORMATION); } Рис. 2.20 ▼ Компиляция прошла

Рис. 2.20 Компиляция прошла успешно

К сожалению, только в книге это выглядит красиво. В Borland С++ при вве дении данной строки можно столкнуться с тем, что буквы русского алфавита отображаются в виде непонятных символов. Это не повлияет на работу буду щей программы – там буквы кириллицы будут иметь обычный вид (см. рис. 2.19). Более того, при отладке они тоже будут выглядеть нормально в другом окне. Од нако нечитаемость текста, конечно, создает некоторые неудобства. Чтобы выйти из подобной ситуации, нужно выбрать в строке меню пункт Options

2.3. Окна сообщений

33

(Параметры), а затем Enviroment (Окружение). В левом окошке появившего ся окна разверните пункт Editor (Редактор), выберите Display (Дисплей). По том откройте пункт Font (Шрифт) и найдите какой либо шрифт с пометкой Cyr. Теперь текст будет выглядеть нормально. При наборе кода можно сделать следующую ошибку. Дело в том, что некото рые части кода, например MB_OK, MB_ICONINFORMATION и MessageBox, должны быть набраны латинскими буквами. Буква кириллицы здесь будет выделена красным цветом, что сигнализирует об ошибке. Такие ошибки автоматически отслеживаются в среде Borland С++. В Borland С++ различаются строчные и прописные буквы во всех набранных латиницей выражениях (кроме текстов и комментариев). Поэтому написание Mb_ok вместо MB_OK является ошибкой * . Учитывайте регистр букв! Настало время рассказать о последней помеченной кнопке на рис. 1.7 – Compile (Компилировать). При нажатии на нее происходит компиляция (трансляция) файла, который в данный момент является активным для среды Borland C++. В вашем случае это файл 2000dlgc.cpp. После нажатия на кнопку Compile Borland С++ проверит его и выдаст сообщение об отсутствии ошибок, если в файле их нет (рис. 2.20). Если же получено сообщение об ошибке, следует тщательно проверить на бранный текст. В главе 3 будет подробно сказано об ошибках в программе. После успешной компиляции можно щелкнуть по кнопке Make – должно по явиться сообщение об успешном создании программы. Запустите программу на выполнение – из ее папки или кнопкой Run. Откроется знакомая панель с един ственной пока кнопкой. Нажмите на нее. Появилось сообщение (см. рис. 2.20).

2.3.2.3.2.3.2.3.2.3. ОкнаОкнаОкнаОкнаОкна сообщенийсообщенийсообщенийсообщенийсообщений

Сравнивая увиденное на экране сообщение с введенным ранее текстом, можно легко понять структуру (синтаксис) команды MessageBox. Первая фраза в ка вычках – это текст сообщения. Сочетание \n означает переход на новую стро ку. Вторая фраза – заголовок. А третья часть – это некие флаги (разделенные вертикальными черточками), определяющие внешний вид сообщения. Напри мер, вместо флага MB_ICONINFORMATION можно поставить другой, и тогда вме сто значка с буквой i появятся иные значки (табл. 2.1).

Таблица 2.1 Флаги и рисунки в сообщениях MessageBox

Флаг

Рисунок

MB_ICONINFORMATION

MB_ICONINFORMATION

MB_ICONWARNING

MB_ICONWARNING

MB_ICONQUESTION

MB_ICONQUESTION

MB_ICONSTOP

MB_ICONSTOP

* Чувствительность к строчным и прописным буквам определяется стандартами языков C и C++ и свой ственна всем средам разработки на языках C и C++, а не только среде Borland С++. – Прим. науч. ред.

34

ГЛАВА 2 Кнопки и сообщения

Флаг MB_OK означает, что в появившемся сообщении будет только одна кноп ка – ОК. Безусловно, бывают и сообщения, имеющие более одной кнопки. Вме сто флага MB_OK могут стоять другие флаги (табл. 2.2).

Таблица 2.2 Флаги и кнопки в сообщениях MessageBox

Флаг

Результат применения флага (кнопки, содержащиеся в сообщении)

MB_ABORTRETRYIGNORE MB_OK (применяется по умолчанию) MB_OKCANCEL MB_RETRYCANCEL MB_YESNO MB_YESNOCANCEL

Abort, Retry и Ignore ОК OK и Cancel Retry и Cancel Yes и No Yes, No и Cancel

Попробуйте заменить флаг MB_OK на какой либо флаг из таблицы, откомпи лируйте и запустите программу. Теперь при нажатии на вашу кнопку появится сообщение с двумя или тремя кнопками – в зависимости от выбранного флага. Если щелкать по данным кнопкам, результат будет всегда одинаков – окно сооб щения закроется, и ничего больше не произойдет. Но раз кнопки разные, зна чит, они должны соответствовать разным действиям.

2.4. Стили окон программы

Данный раздел является дополнительным. Можете прочитать его, не выполняя описанных здесь действий. Как вы помните, в разделе 1.2 были рассмотрены более подробно все момен ты выбора при создании проекта, а также стили окна программы. В этой же главе было рассказано о Редакторе ресурсов (файл 2000app.rc и называется файлом ресурсов). Вами вручную редактировался файл 2000dlgc.cpp – соб ственно, большую часть времени вы будете проводить, работая именно с ним. Это основной файл программы, в нем будут записаны все реакции программы на действия пользователя или внешние события. Стоит сказать, что проект разбит на файлы лишь для удобства. Можно свести все эти файлы в один и работать с ним. Даже Файл ресурсов представляет собой обычный текстовый файл, и лишь Borland С++ показывает его содержимое в удобном виде. Кстати, сначала в файле 2000dlgc.cpp почти ничего нет. В отличие от него 2000app.cpp (самый верхний файл проекта) заполнен больше, поскольку именно там сконцентрирована немалая часть установок, заданных при формировании проекта с помощью Эксперта приложений. В данном файле есть две такие строки:

frame >Attr.Style |= WS_BORDER | WS_CAPTION | WS_CLIPCHILDREN | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE; frame >Attr.Style &= ~(WS_CHILD | WS_MAXIMIZEBOX | WS_THICKFRAME);

Это установки стиля, которые вы выбирали в окне, показанном на рис. 1.6. Следует отметить, что в первой строке перечислены элементы стиля, которые

2.4. Стили окон программы

35

присутствуют в программе (маркиро

вались флажками в окне Эксперта приложений), во второй строке – от сутствующие (непомеченные в окне). Здесь вы и будете проводить экспери менты. Например, перенесите параметр WS_SYSMENU из первой строки во вто рую, чтобы пользователь не мог свер нуть окно программы. Но можно и пе реместить во вторую строку параметр WS_MINIMIZEBOX. Откомпилируйте

и запустите программу (рис. 2.21). Такой стиль тоже встречается, правда, не среди главных, а среди проме жуточных диалоговых окон программ. Полное описание всех параметров стиля окон прочитайте в справочнике по указателю на TWindowAttr::Style. Можно использовать для оформления окна один из параметров так называ емого расширенного стиля – «всегда сверху».После его установки программа будет всегда (почти всегда) находиться на экране поверх всех остальных. Задей ствовать данный параметр несложно – после рассмотренных выше строк вставьте такую:

выше строк вставьте такую: Рис. 2.21 ▼ Окно без кнопок в

Рис. 2.21 Окно без кнопок в правом верхнем углу

frame >Attr.ExStyle |= WS_EX_TOPMOST;

Если вы уже заглянули в справочник среды Borland С++, то догадались, что у каждого окна (программы) есть параметры атрибуты, хранящиеся в некой пе ременной. Поскольку таких параметров много, она является структурой.

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

В данном случае атрибуты окна хранятся в структуре Attr. Имя, как вы понима

ете, придумано еще до вас. В структуре Attr есть элемент Style. В нем находят ся стили окна программы. Две строки, в которых устанавливаются некоторые стили, вы нашли в тексте и попробовали изменить. В структуре Attr содержит ся также элемент ExStyle. В нем хранятся расширенные стили (один из них установлен в добавленной вами строке).

Ознакомьтесь с остальными атрибутами, найдя их в справочнике в разделе «Указатель TWindowAttr struct». Самыми понятными из них представляются

X, Y, W, H – координаты и размеры окна. Если, например, задать координаты X

и Y равными нулю (это координаты левого верхнего угла), окно программы бу

дет появляться всегда в левом верхнем углу экрана. Задается это двумя строка ми, помещенными рядом с предыдущей вставкой:

frame >Attr.X =0; frame >Attr.Y =0;

Но лучше располагать окно запускаемой программы не в углу, а в центре экрана. Как это сделать, будет рассказано в главе 17.

3

Глава

Предупреждения и сообщения об ошибках

– Как вам удалось так быстро выучить

английский язык?

– Да а, ерунда какая. Они там почти все слова из С++ взяли.

Из разговора с программистом

Н е всегда вас будет радовать сообщение, представленное на рис. 2.20. Вы получили его, выполняя написанное в предыдущей главе. Теперь вернитесь к файлу 2000dlgc.cpp и внесите туда ошибку.

3.1.3.1.3.1.3.1.3.1. СообщенияСообщенияСообщенияСообщенияСообщения обобобобоб ошибкахошибкахошибкахошибкахошибках

Чтобы было проще освоить исправление ошибки, внесите ее сами, а потом по смотрите, как Borland С++ на нее отреагирует. Удалите, например, первые ка вычки во фразе "Вы нажали".

MessageBox(Вы нажали на кнопку\nСпасибо Вам за это!",

В результате текст из синего стал красным (в книге это превращение пока зать, конечно, невозможно – смотрите на монитор). Красный цвет в Borland С++ всегда означает нарушение каких либо правил. Таким простым способом со общается, что сделано что то некорректное. Верните кавычки на место и удалите первую запятую.

MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!" "Наше сообщение", MB_OK | MB_ICONINFORMATION);

Немедленной реакции не последовало – это не такая тривиальная ошибка, как первая. Но она все равно будет обнаружена. Нажмите на кнопку Compile. Появится сообщение, приведенное на рис. 3.1.

3.1. Сообщения об ошибках

37

3.1. Сообщения об ошибках ▼ 37 Рис. 3.1 ▼ Неудачное завершение

Рис. 3.1 Неудачное завершение компиляции

В строке статуса написано уже не Success (Успешно), а Failure (Неудачно). И в строке Errors (Ошибки) вместо нулей теперь горит число 2. Это не означа ет, кстати, что сделаны две ошибки. Нажмите на ОК – становится активным нижнее окно с заголовком Messages (Сообщения). В нем сразу выводятся сооб щения о допущенных ошибках (см. рис. 3.2).

о допущенных ошибках (см. рис. 3.2). Рис. 3.2 ▼ Сообщения об ошибках

Рис. 3.2 Сообщения об ошибках

Красный цвет восклицательного знака, согласно традиции, свидетельству ет о грубых нарушениях. Для новичка сообщение об ошибке чаще всего выгля дит очень загадочным, но это только на первый взгляд. Прежде чем пытаться перевести его, надо обратить внимание на более важную вещь – указание на место ошибки. Во первых, видно, что оба сообщения – два красных восклица тельных знака – указывают на позицию 48 строки 60 файла 2000dlgc.cpp (60, 48). Если говорится об одном и том же месте, то обычно ошибка одна. Просто компилятором Borland С++ она была оценена с двух точек зрения. Во вторых, необходимо учитывать, что в среде Borland не указывается точное место ошиб ки. Поскольку правильных вариантов может быть много, неизвестно, что имен но вы хотели написать. Таким образом, позиция чаще всего находится после

38

ГЛАВА 3 Предупреждения и сообщения об ошибках

места ошибки. И даже нельзя знать точно, присутствует ли ошибка в указан ной строке. Щелкните по выделенной строке в окне Messages, чтобы увидеть предполагаемое место ошибки. Вы окажетесь перед точкой с запятой в конце ко манды MessageBox, на основании чего можно предположить, что ошибка на ходится где то в этой команде. Подсказка, естественно, была – во втором сооб щении об ошибке, не уместившемся из за своей длины на рис. 3.2. Полный текст сообщения выглядел так:

Error: 2000dlgc.cpp(60,48):Type mismatch in parameter "caption" in call to "TWindow::MessageBox(const char *,const char *,unsigned int)"

Здесь среди прочего вам напоминается, каким должен быть синтаксис коман ды MessageBox. При сравнении данного текста с вашим вы увидите, что тексты отличаются друг от друга количеством запятых. К сожалению, все не так про сто – в команде могут быть необязательные параметры (то есть такие, которые можно не указывать), следовательно, запятых в реальном коде может быть мень ше, чем в описании синтаксиса. Но проверять такие вещи стоит. Более точное предполагаемое место ошибки можно увидеть в начале сообщения. Похоже, что неправильно введен параметр caption, то есть заголовок окна сообщения,

и ошибку надо искать где то около текста Наше сообщение. Это соответствует

действительности, так как именно перед заголовком не хватает сейчас запятой.

Если же чтение сообщений об ошибке не помогает найти ее в тексте файла, загляните в справочник Borland С++. В нем есть раздел, который называется Error messages (Сообщения об ошибках). Иногда там действительно можно найти информацию, помогающую устранить ошибку. Но лучше сначала щелк нуть правой кнопкой мыши по выделенному сообщению об ошибке и в контек стном меню выбрать пункт Help. Пропуск запятой оказался не такой простой ошибкой. Надо взять что либо более легкое. Запятую верните на место, а удалите последнюю скобку:

MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!", "Наше сообщение", MB_OK | MB_ICONINFORMATION;

После компиляции появится сообщение лишь об одной ошибке. На нее бу дет четко указано:

Error: 2000dlgc.cpp(60,48):Function call missing )

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

и тщательно отлаживать программу – редактировать, компилировать, запус

кать – и все это много раз. Запустите программу не командой Run, а просто из ее папки – там всегда есть какая либо работоспособная версия. Не закрывая программы, вернитесь в Borland С++, удалите все ошибки, щелкните по кноп ке Build. И снова получите ошибку (рис. 3.3). Щелкните по кнопке OK. Сообщение об ошибке будет иметь следующий

3.2. Предупреждения

39

3.2. Предупреждения ▼ 39 Рис. 3.3 ▼ Создание приложения завершилось

Рис. 3.3 Создание приложения завершилось неудачно

Данная ошибка, как вы уже догадались, возникла, потому что среда Borland

С++ попыталась сформировать новый вариант исполняемого файла програм мы 2000.exe в тот момент, когда она была запущена. Об этом свидетельствует текст в скобках: «Программа все еще работает?» Вывод – надо всегда закрывать программу, когда создается (Make, Build) новый вариант.

создается (Make, Build) новый вариант. Рис. 3.4 ▼ Сообщение об ошибке

Рис. 3.4 Сообщение об ошибке открытия файла

3.2.3.2.3.2.3.2.3.2. ПредупрежденияПредупрежденияПредупрежденияПредупрежденияПредупреждения

На рис. 3.1 и 3.3 в строке Warnings (Предупреждения) были нули. Следует те перь уяснить их значение. Добавьте в код новую строку:

void T2000DlgClient::BNClickedOne()

{

// INSERT>> Your code here. MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!", "Наше сообщение", MB_OK | MB_ICONINFORMATION); int a;

}

Полученный результат показан на рис. 3.5. Об отсутствии ошибок в коде свидетельствуют и ноль в строке Errors, и ста тус – Success. Но появилось одно (1) предупреждение (Warnings). Оно указы вает на нечто, что не мешает программе правильно откомпилироваться, но

40

ГЛАВА 3 Предупреждения и сообщения об ошибках

и сообщения об ошибках Рис. 3.5 ▼ Результат компиляции с

Рис. 3.5 Результат компиляции с предупреждениями

вызывает у компилятора Borland С++ некоторые сомнения. Прочтите сообще

ние, помеченное желтым восклицательным знаком:

Warn : 2000dlgc.cpp(64,2):'a' is declared but never used

Это означает, что переменная a объявлена в тексте программы, но нигде – ни в какой команде – не используется. Такое случается, если вводить перемен ные, а потом отказываться от них. Данное предупреждение – самое безобид ное, следовательно, если вас не раздражает единица в строке Warnings, можно все оставить, как есть. Кстати, бывает, что такое предупреждение Borland С++ выдает несправедливо, без каких либо на то оснований. В общем, на предупреждения нужно обращать внимание и подправлять текст программы, чтобы их не было. Но не стоит тратить много усилий на их устранение, если вы несетесь вперед на крыльях вдохновения, создавая новые шедевры программного кода, и боитесь потерять мысль.

4

Глава

Возвращаемые значения и условное выполнение команд

Новости из жизни Microsoft: разрабо тан женский Windows 98. К кнопкам «да» и «нет» добавлена третья – «может быть».

Из анекдота

К огда я только начал изучать программирование, самой первой непонят

ной вещью для меня были Return Values – значения, возвращаемые

вызванной функцией.

Попробуем понять их. Дана функция – например, синус. Вызовите функцию обычным способом:

y = sin(x);

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

sin(x);

Функция sin вычислит значение синуса х и обязательно вернет это значе ние. Только в этом случае оно ничему не присвоится и пропадет. Команда MessageBox, с помощью которой в главе 2 были созданы сообще ния, – это тоже функция. Программа вызывает ее, передавая ей некоторые

42

ГЛАВА 4 Возвращаемые значения и условное выполнение команд

значения (тексты) и параметры флаги. Данная функция выводит на экран окно сообщения. При щелчке по кнопке в сообщении – именно в этот момент функ ция считается полностью выполненной – она возвращает вызвавшей ее про грамме какое то значение. Возникает вопрос: что именно может возвращать функция? Ранее рассматривались возможные варианты сообщений, в том чис ле и с тремя кнопками. Значение, которое вернет функция MessageBox, будет зависеть от того, по какой кнопке щелкнет пользователь. Значит, программу надо научить понимать, по какой кнопке произведен щелчок в сообщении. Для этого следует познакомиться с оператором if (если). Введите в ту же самую часть файла 2000dlgc.cpp следующие строки:

void T2000DlgClient::BNClickedOne()

{

 

// INSERT>> Your code here.

if ( (MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!", "Наше сообщение", MB_YESNO | MB_ICONINFORMATION) ) == IDYES)

{

MessageBox("А теперь Вы нажали\nна кнопку YES/ДА", "Наше второе сообщение", MB_OK | MB_ICONWARNING);

}

else

{

MessageBox("А теперь Вы нажали\nна кнопку NO/НЕТ", "Наше второе сообщение", MB_OK | MB_ICONSTOP);

}

}

Обратите внимание, что в первом сообщении указан флаг MB_YESNO вместо MB_ОК, в результате чего получилось окно с двумя кнопками – Да и Нет. Далее можно было бы добавить в программу новую переменную, потом присвоить ей значение, возвращаемое функцией MessageBox (как делается с функцией си нус); а потом сравнить эту переменную с IDYES и т.д. Но незачем использовать лишние переменные, лучше сразу сравнить функцию MessageBox (а точнее – значение, ею возвращаемое) с интересующим вас значением, а именно IDYES. Сравнение происходит в данной части:

if ( (MessageBox(

) ) == IDYES)

Знак == – это логический оператор «равно». Его легко спутать с оператором присвоения – одиночным знаком =. Ошибка коварнейшая, поскольку компиля тор ее не замечает, в языке программирования все это допустимо, а программа работает не так, как задумано. Уточните теперь синтаксис оператора «если»:

if ( условие )

{

действие, выполняемое, если условие истинно

}

else

ГЛАВА 4 Возвращаемые значения и условное выполнение команд

{

43

действие, выполняемое, если условие ложно

}

Второй части может и не быть, то есть оператор может выглядеть следу ющим образом:

if ( условие )

{

действие, выполняемое, если условие истинно

}

Так пишется, когда что то делается лишь в случае истинности условия, а в слу чае невыполнения условия не производится никаких действий. В данном примере программа работает следующим образом: дойдя до стро ки с оператором «если», она обратится внутрь – к условию сравнения. Выяснит ся, что в одной из сопоставляемых частей должно стоять значение, возвраща емое функцией MessageBox. Программе надо будет вызвать ее, в результате чего на экране появится ваше сообщение с двумя кнопками (рис. 4.1). Затем программа будет ждать щелчка по одной из кнопок. Как только это произойдет, функция MessageBox вернет программе одно из двух значений:

IDYES, если была нажата кнопка Да, или IDNO, если нажата кнопка Нет. Про грамма проверит, не равно ли данное значение второй части условия (а там у вас записано IDYES). Если равно, значит, условие истинно – и программа вы полнит то, что написано в первых фигурных скобках, то есть снова вызовет функцию MessageBox, но уже с другими параметрами. Появится сообщение о том, что была задействована кнопка Да (рис. 4.2). Если же условие окажется ложным, программа выполнит то, что написано в фигурных скобках после слова else (иначе). В таком случае появится сооб щение о нажатии кнопки Нет (рис. 4.3).

о нажатии кнопки Нет (рис. 4.3). Рис. 4.1 ▼ Сообщение с двумя

Рис. 4.1 Сообщение с двумя кнопками

4.1 ▼ Сообщение с двумя кнопками Рис. 4.2 ▼ Была нажата кнопка Да

Рис. 4.2 Была нажата кнопка Да

Рис. 4.2 ▼ Была нажата кнопка Да Рис. 4.3 ▼ Была нажата кнопка Нет

Рис. 4.3 Была нажата кнопка Нет

5

Глава

Дополнительные элементы окна

Начинается демонстрация нового ком пьютера, управляемого голосом. Изобре татель просит зал соблюдать тиши ну. Только он открывает рот, из зала крик:

– FORMAT C:!!! ENTER!!!

Из анекдота

Н а тему форматирования диска C существует огромное количество шуток. Попробуйте написать на данную тему программу шутку. Идея – не моя, она была где то услышана мною. Конечный результат будет выглядеть

примерно так: пользователь запускает программу, щелкает по кнопке в ее окне – и программа, не реагируя на панические движения пользователя, «фор матирует» диск С. Естественно, для ее написания надо изучить новые элемен ты С++: текстовые поля, вывод в них текста, создание индикатора и его изме нения с течением времени, а следовательно, и один из способов создания таймера. Вы научитесь придавать курсору внешний вид всем известных песоч ных часов. Также здесь рассказывается о типах переменных и операторе цикла. Итак, вернитесь к проекту – 2000.ide. Запустите Редактор ресурсов, щелк нув по названию файла 2000app.rc, и откройте окно редактирования картин ки IDD_CLIENT (2000). Перетащите созданную вами кнопку на самый верх окна. Затем на панели Controls щелкните по кнопке с большой буквой А и на рисуйте под кнопкой прямоугольник (см. рис. 5.1). Данный элемент называется статическим текстом. Это текст, который не из меняется, в отличие от редактируемого. Он обычно используется в надписях, которые пользователь не должен трогать. А программист – изнутри програм мы – может изменить текст. Этим вы и займетесь. Но сначала надо зайти в меню Properties (Свойства) данного элемента (щелкнуть по нему правой кноп кой и выбрать пункт Properties в контекстном меню) и удалить слово Text1.

ГЛАВА 5 Дополнительные элементы окна

45

элементы окна ▼ 45 Рис. 5.1 ▼ Создание элемента

Рис. 5.1 Создание элемента статического текста

Чтобы заставить программу писать на этом месте разные хорошие слова,

поставьте в соответствие элементу некую переменную. Для этого, вызвав пра вой кнопкой меню, выберите уже известный вам Эксперт классов. Щелкните правой кнопкой по выделенному пункту IDC_STATICTEXT – появится маленькое меню, в котором вас должен интересовать пункт Add instance variable – «доба вить переменную» (рис. 5.2). В качестве имени переменной возьмите, например, mytext1, введя его в по явившемся окошке (рис. 5.3).

в по явившемся окошке (рис. 5.3). Рис. 5.2 ▼ Связь элемента

Рис. 5.2 Связь элемента статического текста с переменной

текста с переменной Рис. 5.3 ▼ Присвоение имени

Рис. 5.3 Присвоение имени переменной

Вернитесь в Редактор ресурсов и выберите на панели Controls ярлычок Common. Щелкните по кнопке, изображенной на рис 5.4. Это – индикатор процесса. Создайте прямоугольничек в окне программы сразу под текстовым элементом (рис. 5.5). Кстати, статический текст будет сейчас невидим, посколь ку в нем пока ничего нет. Вызовите для индикатора Эксперт классов и присвойте новому элементу IDC_PROGRESSBAR1 пе

ременную bar1. Закройте Эксперт классов и Редактор ресур сов и вернитесь в проект.

Рис. 5.4 Кнопка создания индикатора процесса

вернитесь в проект. Рис. 5.4 ▼ Кнопка создания индикатора процесса

46

ГЛАВА 5 Дополнительные элементы окна

▼ Дополнительные элементы окна Рис. 5.5 ▼ Создание индикатора

Рис. 5.5 Создание индикатора процесса

Задача для самостоятельного решения: найти все изменения, которые Экс перт классов внес в файлы проекта. Попробуйте сами, а потом прочитайте пра вильный ответ. Итак, Эксперт классов внес дополнения:

в файл 2000dlgc.cpp*:

// Construction/Destruction handling. // static T2000DlgClientXfer T2000DlgClientData;

T2000DlgClient::T2000DlgClient(TWindow* parent, TResId resId, TModule* module)

:

TDialog(parent, resId, module)

{

 

//{{T2000DlgClientXFER_USE}}

mytext1 = new TStatic(this, IDC_STATICTEXT1, 255); bar1 = new TGauge(this, IDC_PROGRESSBAR1);

SetTransferBuffer(&T2000DlgClientData);

}

в файл 2000dlgc.h:

//{{T2000DlgClientXFER_DEF}}

protected:

TGauge* bar1;

TStatic* mytext1;

В общем, рутина уже кончилась, остается использовать переменные bar1 и mytext1 для управления текстовым элементом (то есть поместить на поле про граммы свои слова) и изменения внешнего вида индикатора. Далее будет рассказа но о значении всех этих строк – как создаются элементы класса и т.п. А пока вставь те текст действий, выполняемых при щелчке по кнопке, следующие строки:

void T2000DlgClient::BNClickedOne()

* Строки с дополнениями выделены полужирным шрифтом (в Borland С++ такого выделения нет).

{

ГЛАВА 5 Дополнительные элементы окна

// INSERT>> Your code here. MessageBox("Вы хотите отформатировать диск С: ?", "Вопрос дня", MB_YESNO | MB_ICONQUESTION); bar1 >SetRange(0, 100); int dwSecs = 20; ::SetCursor(::LoadCursor(NULL, IDC_WAIT));

mytext1 >SetText("Производится форматирование Вашего \

диска С:

DWORD dwTimeStart = GetTickCount(); DWORD dwTimeEnd = dwTimeStart + (dwSecs * 1000);

Расслабьтесь.");

47

while (GetTickCount() < dwTimeEnd) { bar1 >SetValue((GetTickCount() – dwTimeStart)/(dwSecs *10));}

mytext1 >SetText("Форматирование завершено. \ Перезагрузите компьютер.");

}

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

MessageBox – уже знакомая нам функция – создает сообщение, представлен ное на рис. 5.6. Хотя мы могли бы различить, по какой кнопке щелкнул пользователь, диск С будет все равно «отформатирован» независимо от его выбора.

bar1 >SetRange(0, 100);

Здесь начинается работа с индикатором. Он представляет собой объект клас са TGauge. Расскажем, что такое объект. Кнопка, индикатор, элемент статичес кого текста – это объекты, уже однажды со зданные вами. Класс – это тип объектов. Так, класс TGauge – это объекты, родствен ные индикатору процесса. Поскольку ваш индикатор связан с переменной bar1, надо управлять им с помощью следующей конст рукции:

bar1–> функция класса TGauge (

);

bar1–> функция класса TGauge ( ); Рис. 5.6 ▼ Сообщение о

Рис. 5.6 Сообщение о предстоящем форматировании диска

Кстати, после прочтения нескольких книжек по С++ мне стало понятно, что сразу невозможно полностью осмыслить понятия классов, объектов и т.п. Это придет постепенно, по мере изучения конкретных примеров. В справочнике Borland С++ есть описания каждого класса (иногда с примером); приведены советы по созданию объекта; рассказывается, какие функции присущи классу, а следовательно, и объекту этого класса.

48

ГЛАВА 5 Дополнительные элементы окна

Так, например, класс TGauge имеет 12 разных функций. В вашей программе ис пользуется всего две. С помощью первой – SetRange – устанавливается диапазон индикатора. То есть пустой индикатор будет соответствовать нулю, а полный – значению 100. Можно было взять любые другие, например, 0 и 1 и т.д.

int dwSecs = 20;

Здесь определяется (объявляется, инициализируется) переменная dwSecs. Во первых, вы указываете, что она является целым числом – int (сокращение от слова integer – целый), во вторых, ей присваивается значение . Строго гово ря, эти операции можно разделить. Обычно тип переменной задается в начале:

// INSERT>> Your code here. int dwSecs;

А присвоение значения переменной производится непосредственно перед местом ее использования:

dwSecs = 20;

Переменная dwSecs – это время (в секундах) заполнения индикатора (про цесса «форматирования»). Конечно, можно не создавать переменную, а про сто записать число 20 в функциях, использующих это время. Но применение переменной облегчает понимание программы – надо только, чтобы имя пере менной было вам известно – и ее изменение. Чтобы задать другое время, нуж но просто заменить 20 другим числом в одном единственном месте. Если бы число было вставлено сразу в функции, то пришлось бы помнить все места его использования и не забыть заменить его везде. В данном случае всего два та ких места, но бывают программы, где переменные с одним и тем же значением используются в десятках и сотнях мест. Здесь надо бы отвлечься и поговорить об основах языка С++ – о перемен ных, их типах и объявлении, об операторах присвоения и о других простей ших операторах, потом о функциях и т.д. Но об этом еще будет рассказываться далее, а сейчас рассмотрим оператор

::SetCursor(::LoadCursor(NULL, IDC_WAIT));

Владеющим английским языком назначение оператора будет понятно. Сна чала используется функция LoadCursor, загружающая курсор, определенный в системе Windows под идентификатором IDC_WAIT (ожидание). Это и есть песочные часы. Затем данный курсор вы устанавливаете (SetCursor) для сво ей программы:

mytext1 >SetText("Производится форматирование Вашего \

диска С:

Расслабьтесь.");

В данной строке применяется функция SetText класса TStatic для объек та mytext1, ему принадлежащего и созданного ранее Экспертом классов. Смысл ее прост – она записывает в объект mytext1 текст, заданный ей в каче стве аргумента. После выполнения функции на поле программы появится над пись, которая была у нее в скобках.

ГЛАВА 5 Дополнительные элементы окна

DWORD dwTimeStart = GetTickCount();

49

Теперь следует объявить переменную dwTimeStart типа DWORD и присвоить ей значение, возвращенное функцией GetTickCount. Тип DWORD относится к типу unsigned long, то есть беззнаковому (неотри цательному) длинному целому числу*. Функция GetTickCount, которая используется без аргумента, возвращает число миллисекунд, прошедших после запуска Windows. Оно получается про граммой и сохраняется в переменной dwTimeStart. Это время, когда начался процесс «форматирования». Если снова вызвать функцию GetTickCount и вы честь новое значение из сохраненного в данной переменной, то можно узнать, сколько времени прошло между двумя какими либо событиями. Это один из способов создания счетчиков времени. Данная функция возвращает, как можно понять или прочитать в справоч нике, значение типа DWORD – это число в диапазоне от 0 до 4,294,967,295. Если перевести эти миллисекунды в сутки, то получится 49,7 суток. То есть счетчик сбросится в ноль, если компьютер будет работать больше этого времени. Не которые утверждают, что при этом компьютер «зависает»**.

DWORD dwTimeEnd = dwTimeStart + (dwSecs * 1000);

Здесь вы объявляете переменную dwTimeEnd и присваиваете ей значение. Возьмите начальное время и прибавьте к нему время заполнения индикатора, переведя его из секунд в миллисекунды умножением на 1000. Таким образом, переменная dwTimeEnd – это планируемое время окончания процесса «форма тирования».

while (GetTickCount() < dwTimeEnd) {bar1 >SetValue((GetTickCount() dwTimeStart)/(dwSecs *10));}

А вот и первый для вас цикл. Его имя – while (пока). Синтаксис его выглядит следующим образом:

while ( условие ) { операторы }

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

*

**

При программировании для 32 разрядных версий Windows (Windows 9x/NT/2000) длинное целое (long, или long int) ничем не отличается от обычного целого (int). – Прим. науч. ред. Достоверно известно, что Windows NT не «зависает», даже если будет работать в несколько раз дольше, хотя счетчик через 50 дней действительно сбрасывается в ноль. – Прим. науч. ред.

50

ГЛАВА 5 Дополнительные элементы окна

В данном случае условием выполнения операторов цикла является выражение:

GetTickCount() < dwTimeEnd

Каждый раз, дойдя до этого условия, программа вызывает функцию GetTickCount и сравнивает полученное от нее время с намеченным вами вре менем окончания процесса. Если время еще не пришло (пока продолжается процесс) выполняется оператор, записанный в фигурных скобках. То есть ис пользуется функция SetValue класса TGauge для передачи индикатору bar1 нового значения. Это значение вы вычисляете, исходя из текущего времени, времени начала и запланированной продолжительности процесса. В результа те выполнения данной функции индикатор изменит значение. За 20 с, задан ных вами в переменной dwSecs, индикатор заполнится до конца. Когда это произойдет, станет ложным и проверяемое в цикле условие. Тогда программа перейдет к следующему оператору.

mytext1 >SetText("Форматирование завершено. Перезагрузите компьютер.");

Этот оператор полностью идентичен оператору, описанному ранее. Стоит обратить внимание лишь на то, что старый текст в объекте mytext1 исчезнет и полностью заменится новым.

и полностью заменится новым. Рис. 5.7 ▼ Выполнение программы

Рис. 5.7 Выполнение программы «форматирования диска»

На рис. 5.7 показано, как выглядит выполнение программы «форматиро вания».

В качестве самостоятельной работы можете украсить программу дополни

тельным статическим текстом, чтобы заманить будущего пользователя щелк нуть по кнопке.

В рамках изучения языка попробуйте поэкспериментировать с функциями

класса TGauge – там есть несколько интересных.

6

Глава страшная сила

Красота –

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

Приписывается Биллу Гейтсу

В предыдущей главе уже рассматривался один из элементов, который украшает программу, – индикатор процесса. Когда на экране монитора

что то движется, переливается или просто светится, это всегда привле кает внимание пользователя к программе и отлично характеризует работу про

граммиста. Начните с простого – статичной картинки в окне программы.

6.1. Вешаем картину на гвоздь

Создайте заготовку программы, как описано в первой главе. Только теперь назо вите ее 2006. Затем откройте Редактор ресурсов, но не выбирайте сразу диалого вое окно, а, оставшись в самом первом, щелкните по правой кнопке. В появив шемся меню отметьте Add to project (Добавить к проекту) – см. рис. 6.1. Затем выберите тип файла *.bmp и найдите какой нибудь файл с таким расширением (рис. 6.2). Если у вас имеется ваша фотография в таком формате, берите ее – для буду щего пользователя не может быть ничего лучше, чем увидеть лицо того, кто создал такую замечательную, прекрасно работающую и никогда не «зависа ющую» программу. Для учебного примера годится любой из найденных файлов небольшого размера, помещающийся на поле программы. Если на вашем ком пьютере среда Borland С++ установлена полностью, вместе с примерами, най дите файл со следующим адресом:

C:/bc5/examples/owl/apps/aclock/face_bmp.bmp

52

ГЛАВА 6 Красота – страшная сила

6 ▼ Красота – страшная сила Рис. 6.1 ▼ Добавление нового

Рис. 6.1 Добавление нового ресурса к проекту

Итак, выбрав файл, щелкните по кнопке ОК. Теперь в левой части Редактора ресурсов появится новый раздел – BITMAP, а в нем – элемент IDB_BITMAP1. Если выделить данный элемент, то в правой части Редактора ресурсов будет ви ден рисунок (рис. 6.3). Это и есть ваша картина.

(рис. 6.3). Это и есть ваша картина. Рис. 6.2 ▼ Выбор типа файла

Рис. 6.2 Выбор типа файла

Теперь нужно для нее «вбить гвоздь». Откройте элемент IDD_CLIENT (2000), немного растяните его, чтобы рисунок там поместился. Затем на панели инст рументов щелкните по кнопке, изображенной на рис. 6.4. При наведении курсора на данную пиктограмму всплывает подсказка – Static Picture (Статическая картинка). Щелкнув по кнопке, поставьте курсор

6.1. Вешаем картину на гвоздь

53

6.1. Вешаем картину на гвоздь ▼ 53 Рис. 6.3 ▼ Рисунок из примеров Borland

Рис. 6.3 Рисунок из примеров Borland

на поле программы и щелкните там, где будет находиться левый верхний угол рисунка. В этом месте появится небольшая иконка (рис. 6.5). «Гвоздь» на месте. Щелкните по иконке правой кнопкой мыши, выберите Properties и в поле Caption введите идентификатор картинки – IDB_BITMAP1. Затем надо поставить флажок возле надписи Interpret Caption As Number (рис. 6.6). Флажок – это «веревка», с помощью которой картина вешается на гвоздь. Потом можно поэкспериментировать с прочими флажками в свойствах. А пока закройте данное окно, щелкнув по кнопке ОК. При этом на поле про граммы покажется ваш рисунок – см. рис. 6.7. Если его нет – значит, вы рано начали экспериментировать с флажками или файл (если он взят не из приме ров) не подошел Borland С++.

из приме ров) не подошел Borland С++. Рис. 6.4 ▼ Кнопка создания

Рис. 6.4 Кнопка создания статического изображения

Рис. 6.5 Иконка статического изображения

Иконка статического изображения Рис. 6.6 ▼ Создание связи Рис. 6.7

Рис. 6.6 Создание связи

Рис. 6.6 ▼ Создание связи Рис. 6.7 ▼ Рисунок в Редакторе

Рис. 6.7 Рисунок в Редакторе ресурсов

54

ГЛАВА 6 Красота – страшная сила

Впрочем, возможна еще и такая ситуация, когда появившийся рисунок закроет

другие элементы. Например, если еще не изменен размер окна программы (рис. 6.8). В данном случае растяните окно и переместите кнопки. А теперь, чтобы уви деть результат, закройте Редактор ресурсов, скомпилируйте и запустите программу.

6.2. Движущиеся картинки

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

используя файлы данного формата. Рис. 6.8 ▼ Рисунок не поместился

Рис. 6.8 Рисунок не поместился в окне программы

не поместился в окне программы Рис. 6.9 ▼ Кнопка создания

Рис. 6.9 Кнопка создания анимационного объекта

Вы напишете программу, в окне которой будет находиться такой же движу щийся файл. Для этого, как обычно, понадобится заготовка. Потом в Редакто ре ресурсов создайте на поле программы кнопку с именем Играть и назначьте ей с помощью Эксперта классов обработчик нажатий на кнопку – функцию BNClickedPlay. Данные действия показаны ранее на рис. 2.15 и 2.16. Затем на панели инструментов выберите ярлычок Common, а в нем нажми те кнопку, изображенную на рис. 6.9. Щелкните по полю окна программы – таким образом создается объект клас са TAnimateCtrl. Вызовите правой кнопкой мыши его свойства, проверьте флажки (см. рис. 6.10). Потом в Эксперте классов создайте переменную avione, связанную с объек том IDC_ANIMATION1. Далее надо закрыть Редактор ресурсов и возвратиться в проект к файлу 2006dlgc.cpp. Здесь найдите обработчик нажатия кнопки:

void T2001D6gClient::BNClickedPlay()

Теперь надо вставить сюда команды, которые открывали бы файл типа AVI и показывали его на поле программы. Но сначала надо найти файл со следу ющим адресом:

c:\bc5\examples\mfc\general\cmnctrls\search.avi

6.2. Движущиеся картинки

55

Данный файл взят из примеров Borland С++. Скопируйте его в папку, где

создается проект 2006. Теперь, используя пункт Help в контекстном меню, посмотрите, какие функ ции применимы к объекту класса TAnimateCtrl. О действиях, которые они

выполняют, можно легко догадаться по их названиям:

Open – открывает файл AVI;

Play – проигрывает его;

Seek – ищет в AVI файле кадр с заданным номером;

Stop – останавливает проигрывание.

– останавливает проигрывание. Рис. 6.10 ▼ Свойства объекта

Рис. 6.10 Свойства объекта IDC_ANIMATION1

Добавьте в функцию обработки нажатия кнопки BNClickedPlay две строки:

void