Бакалаврська робота на тему
Візуалізація контактних перетворень в середовищі Visual C + + 6. P>
План. P>
Введення. P>
Глава 1. Створення графічного інтерфейсу.o Генерація вихідного коду.o Класи і файли програми.
Глава 2. Використання функцій малювання. o Створення об'єкта контексту пристрою.o Вибір інструментів малювання. p>
Вибір стандартних інструментів малювання. p>
o Створення інструментів малювання. p>
Глава 3.Печать і попередній перегляд. p>
Основи друку і попередній перегляд. P>
Удосконалена друк. P>
Висновок.
Література і джерела. P>
Тема моєї бакалаврської роботи - «Візуалізація контактних перетворень
(в середовищі Visual C + + 6.0) ». Моя програма буде малювати два еліпса зпевними аргументами, які задаються користувачем через діалогові вікна.
Також програма дозволяє виводити зображення на принтер і здійснюватипопередній просмотр.Visual C + + 6.0 - це порівняно нова системапрограмування, яка здобула повагу та популярність по всьому світу. Зїї допомогою легко та зручно писати різні типи програм для Windows.
Шоста версія системи стала ще більш модною та зручною і позбавляє відвеликої кількості рутинної роботи з вибійці і копіювання стандартнихфрагментів переважної більшості програм. Безумовно, серцевиноюсистеми, багато в чому визначає її міць і гнучкість, є бібліотекакласів MFC (Microsoft Foundation Classes - базові класи Microsoft). p>
Новий 32-розрядний компілятор Microsoft Visual C + + 6.0 для Windows NT і
Windows 95 - одна із складових частин потужного пакета компіляторів
Developer Sudio, в який вхолят новітні версії таких відомихпрограмних продуктів, як Visual Basic, Visual J + +, Visual FoxPro ... p>
Система програмування Visual C + + - одна з найбільш повних ідосконалих продуктів, призначених для розробки програмногозабезпечення. Це високошвидкісна і зручна для програмування система,що пропонує широкий набір різноманітних інструментів для проектуваннябудь-якого стилю программірованія.Новие компоненти містять засоби дляпрограмування додатків, поліпшену реалізацію ActiveX та Internet,додаткові можливості розробки баз даних, а також нові архітектуридодатків і елементи взаємодії між користувачами. Вивчення правилзастосування даної системи програмування (часто дуже не простих, наперший погляд) може вас налякати, як це сталося зі мною при першійзнайомстві із середовищем Visual C ++. p>
Глава 1. Створення графічного інтерфейсу. P>
Для створення моєї програми мені потрібно програмуванняграфічного інтерфейсу (GUI-Graphical User Interface). У програмах зграфічним інтерфейсом можна створювати один і більше вікон з елементамиінтерфейсу (меню, панелі інструментів, рядка стану, списки, смугипрокручування і тд). Ці програми можуть виводити малюнки, растровізображення і текст з використанням великого набору шрифтів. Я будустворювати свою програму, використовуючи майстер створення додатків App Wizardі бібліотеки MFC. p>
Існує декілька способів написання програм з графічнимінтерфейсом за допомогою Visual C + +. По-перше - на мові С чи С + + збезпосереднім зверненням до основних функцій Win32 API, якіє частиною операційних систем Windows. При такому підході потрібнонаписати безліч рядків програмного коду, перш ніж перейти до вирішенняцільової завдання розробляється. p>
По-друге - за допомогою бібліотеки MFC, яка містить великий набір готовихкласів і допоміжний код для виконання стандартних завданьпрограмування в середовищі Windows (наприклад, створення вікон та обробкиповідомлень). Крім того, MFC використовується для швидкого додати допрограми панелей інструментів, многопанельних вікон підтримки OLE.
Застосовується для створення елементів, які використовуються програмнимикомпонентами і відображаються в Web-браузерах та інших додатках.
Використання MFC дозволяє спростити програми з графічним інтерфейсом,що значно полегшить процес програмування. Відзначимо: функції MFCмістять виклики функцій Win32 API. Кажуть, що Win32 API «упакований» убібліотеку MFC, що представляє більш високорівневі і стерпні коштипрограмного інтерфейсу. Крім того, в MFC-програми можна вільновикликати функції Win32 API, зберігаючи можливість використання цьогоінтерфейсу. p>
По-третє - на мові С + + з використанням бібліотеки MFC і різнихмайстрів. Майстер AppWizard використовується для створення основи вихіднихпакунку програми. Аналогічно, майстер AppWizard генерує основну частинукоду для визначення похідних класів і обробників повідомлень,настройки бібліотеки MFC, управління діалоговими вікнами, а також виконанняінших завдань. Зауважте: можливості майстрів не обмежуються генерацієюпростих оболонок програм. Вони дозволяють створювати програми з великимнабором складних компонентів. До таких належать панелі інструментів,рядка стану, контекстна довідка, об'єкти OLE, засоби доступу добаз даних і навіть закінчені меню з частково або повністюфункціонуючими командами відкриття і збереження файлів, друку,попереднього перегляду друку та виконання інших завдань. Післястворення основного коду програми за допомогою майстра додайте власнийкод, що визначає логіку роботи програми p>
Перевага третього підходу полягає у використанні не тільки вженаписаного коду MFC, але і згенерованого вихідного коду, що дозволяєвирішити багато рутинних завдань програмування. Бібліотека MFC і майстразвільняють нас від необхідності створювати засоби візуального інтерфейсувручну і забезпечують відповідність цього інтерфейсу вимогам MicroSoft. p>
Генерація вихідного коду.
Для створення програми за допомогою AppWizard створюється новий проектнеобхідного типу. Потім в послідовності діалогових вікон, що відображаютьсямайстром, задаються необхідні характеристики програми. Запускаємо Developer
Studio і виконуємо наступні кроки:
1) Вибираємо в меню File команду New. У результаті з'явиться діалогове вікно New.
2) Відкриваємо вкладку Projects (якщо вона не відображена), щоб можна булостворити новий проект.
3) У списку типів проекту вибираємо "MFC AppWizard (Exe)". Це призведе дотому, що майстер AppWizard спочатку запропонує ввести необхідну інформацію,а потім створить основу коду MFC-програми.
4) Вводимо ім'я Ellipse в поле Project Name. Visual C + + присвоїть новомупроекту і пов'язаної з ним робочої області ім'я Ellipse.
5) У полі Location задаємо шлях до папки з файлами, тобто до каталогу проекту.
Можна прийняти стандартний каталог, вказаний в цьому полі. Стандартногокаталогу присвоюється те ж ім'я, що і робочої області - Ellipse.
6) Щоб завершити роботу з вкладкою Projects діалоговому вікні New,переконайтеся, що в полі Platforms відзначений пункт Win32. До тих пір, поки небуде встановлена версія Visual C + + із засобами крос-платформеннийрозробки, Win32 залишиться єдиною опцією в цій галузі.
7) Клацаємо на кнопці ОК у діалоговому вікні. Відобразиться першому з діалоговихвікон майстра AppWizard, позначений "MFC AppWizard - Step 1". У параметрахмайстри AppWizard, які обирають за замовчуванням, буде вказано стандартнезначення.
8) У діалоговому вікні вибираємо тип програми Single Document, відзначаємостандартний параметр Document/View Architecture Support і задаємо підтримкуанглійської мови. Вибір типу програми Single Document визначає те, що
AppWizard генерує додатки з одновіконному інтерфейсом (Single Document
Interface - SDI), що відображає єдине вікно документа. Завданняпараметра Document/View Architecture Support призведе до того, що майстер p>
AppWizard згенерує окремі класи для зберігання і відображення даних програми, а також код для читання і запису даних на диск. p>
Клацаємо Next для переходу до наступного діалогового вікна.
9) Щоб виключити з програми підтримку баз даних, у діалоговомувікні вибираємо пункт None. Клацаємо Next для переходу до наступногодіалогового вікна.
10) У діалоговому вікні вибираємо пункт None щоб виключити з програмипідтримку складових документів. Прибираємо опцію Automation, щобусунути підтримку автоматизації. Клацаємо Next, щоб перейти до наступногодіалогового вікна.
11) У діалоговому вікні вибираємо підтримку друку (Printing and Printpreview), панель інструментів (Docking toolbar), рядок стану (Initialstatus bar) і підтримку допомоги (Context-sensitive Help), а також 3Dcontrols. Клацаємо Next, щоб перейти до наступного діалогового вікна.
12) Щоб згенерувати для програми традиційний для користувачаінтерфейс бібліотеки MFC, у діалоговому вікні майстра вибираємо установкустилю проекту "MFC Standart". Щоб майстер включив коментарі вгенеруються вихідні тексти, вибираємо установку "Yes, Please". Коментаріпояснюють призначення коду і визначають місця, в які програміст повинендодати власний код. Нарешті вибираємо варіант зв'язку бібліотеки MFC "Asa staticaly linked library ". При цій установці код переноситься прямо ввиконуваний файл. Клацаємо на Next, щоб відобразити наступне діалоговевікно.
13) Це діалогове вікно відображає інформацію по кожному з чотирьохголовних класів, створених для програми майстром. Чи не змінюємо цюінформацію. Клацаємо Finish
14) Діалогове вікно New Project Information дозволяє підсумувати p>
зроблений раніше вибір характеристик програми. Клацаємо ОК, і майстер створить вказаний каталог проекту, згенерує вихідні файли програми і відкриє новостворений проект Ellipse. P>
Класи і файли програми.
Програму Ellipse будемо називати додатком з одновіконномуінтерфейсом (SDI). Це означає, що в даний момент часу в ній можевідображатися тільки один документ. Коли майстер створює додаток SDI, вінпороджує чотири головних класи:
- Клас документа;
- Клас уявлення (view);
- Клас головного вікна;
- Клас програми; p>
Вихідні завдання програми розподіляються по цих чотирьох головнихкласам, і майстер створює чотири окремих вихідних файлу для кожного зних. За замовчуванням він породжує імена класів та вихідних файлів на ім'япроекту. p>
Клас документа в Ellipse називається CЕllipseDoc. Він породжується зкласу CDocument бібліотеки MFC. Заголовки CEllipseDoc має ім'я
CEllipseDoc.h, а назва файлу реалізації - CEllipseDoc.cpp. Клас документавідповідає за зберігання даних програми і за читання і запис даних на диск. p>
Клас подання до Ellipse називається CЕllipseView і породжується від
MFC-класу Cview. Заголовки CEllipseView називається
CEllipseView.h, а назва файлу реалізації - CЕllipse.cpp. Клас поданнявідповідає за відображення даних програми (на екрані, на принтері, абоіншому пристрої) і за обробку інформації, що вводиться користувачем.
Цей клас управляє вікном представлення (view window), якевикористовується для відображення даних програми на екрані. Класподання до Ellipse просто відображає рядок повідомлення всередині вікнаподання. p>
Клас головного вікна в Ellipse називається CMainFraim і породжується від
MFC-класу CFrameWnd. Заголовки CMainFrame називається MainFrm.h, аназва файлу реалізації - MainFrm.cpp. Клас головного вікна керує головнимвікном програми, яке є обрамляють вікном і містить рамку вікна,рядок заголовка, рядок меню та системне меню. Обрамляють вікно такожмістить кнопки Minimize, Maximize, Close, а іноді й інші елементипризначеного для користувача інтерфейсу, наприклад, панель інструментів, рядокстану. Вікно уявлення, що керується класом подання, займаєусередині обрамляє вікна порожню область, яка називається клієнтськоїобластю головного вікна. Вікно уявлення не має видимих елементів,окрім тексту та графіки, що відображає явно. Вікно подання - дочірнєвікно головного вікна, тому воно завжди відображається поверх і всередині кордонівробочої області головного вікна. p>
Нарешті, клас програми названий CEllipseApp і породжений з MFC-класу
CWinApp. Файл заголовків класу CEllipseApp названий Ellipse.h, а файлреалізації - Ellipse.cpp. Клас програми керує програмою в цілому.
Це означає, що він виконує спільні завдання, які не відносяться до яких-небудьіншим трьом класах (наприклад, ініціалізацію програми та її заключнуочищення). Кожна MFC-програма повинна створити в точності один примірниккласу, породженого з класу CWinApp. Чотири головних класу звертаютьсяодин до одного і обмінюються даними, викликаючи відкриті функції-члени іншогокласу і посилаючи повідомлення. p>
Глава 2. p>
Використання функцій малювання p>
1) Створення об'єкта контексту пристрою
2) Вибір інструментів малювання
3) Вибір стандартних інструментів малювання
4) Створення інструментів малювання p>
Існують два різних підходи до створення і маніпулюванняграфічними зображеннями. Можна також викликати функції малювання впроцесі виконання програми. Ці функції призначені для створеннямалюнків, що складаються з окремих геометричних фігур, таких, як прямілінії, дуги та прямокутники. Можливе створення і відображення растровихзображень (званих точковими малюнками), що зберігають поточні кодипікселів, що використовуються для відтворення образів на пристрої. Растровізображення зручні для створення більш складних малюнків, які нелегкорозділити на окремі геометричні фігури. Засоби, що описані в цихрозділах, взаємопов'язані. Опції малювання використовуються для зміни візерунківпікселів всередині растрових зображень, а бітові операції застосовуються дляманіпулювання зображеннями, створеними за допомогою функцій малювання,наприклад, для переміщення або розтягування зображення. p>
Розглядається як використовуються функції малювання, що надаютьсясистемою Windows і бібліотекою MFC. Ці функції в поєднанні з растровимизасобами складають повний набір інструментів створення графічнихобразів всередині вікна подання або будь-якого іншого пристрою
(наприклад, принтера). Існують спеціальні технічні прийоми друкуграфічних зображень або текстів. У цьому розділі я розгляну основнідії, що виконуються при створенні графічнихзображень:
1. Створення об'єкта контексту пристрою.
2. Вибір засобів малювання всередині об'єкта.
3. Установка атрибутів малювання для об'єкта.
4. Виклик функцій-членів об'єкта для малювання графіки. P>
1). Створення об'єкта контексту пристрою p>
Як відомо, для відображення тексту або графіки необхідний об'єктконтексту пристрою, відповідний вікна або пристрою виведення даних.
При малюванні цей об'єкт зберігає вибрані засоби і встановленіатрибути і надає функції-члени для малювання точок, ліній,прямокутників і інших фігур. p>
Для відображення графічного об'єкта за допомогою функції OnDraw класуподання використовується об'єкт контексту пристрою, адреса якогопередається у функцію. void CMyView:: OnDraw (CDC * pDC) p>
( p>
// відобразіть графіку, використовуючи 'pDC->' p>
) p>
Функція OnDraw викликається при малювання або перемальовуванні вікнаподання. Якщо клас подання підтримує прокручування (тобтопороджений від класу CScrollView), то переданий в нього об'єкт контекступристрої налаштовується на поточну позицію прокрутки документа. p>
Якщо програма відображає графіку не в вікні вистави, а в якомусьіншому вікні (наприклад, у діалоговому), то клас вікна для малювання абоперемальовування надає обробник повідомлень wm_paint, званий
OnPaint, який створює об'єкт контексту пристрою, породжуваний від MFC -класу CPaintDC. p>
void CMyDialog:: OnPaint () p>
( p>
CPaintDC PaintDC (this); p>
// відобразіть графіком, використовуючи 'PaintDC "... p>
) p>
Примітка
Коли потрібно намалювати чи перемалювати вікно подання, йому передають повідомлення wm_paint. Клас cview надає функцію OnPaint, яка створює та готує об'єкт контексту пристрою, а потім передає його у функцію OnDraw. Клас вікна, який не породжується від cview, повинен надавати власну функцію OnPaint, що виконує малювання вмісту вікна. p>
Щоб відобразити графіку у вікні подання або іншому вікні з функції,яка не обробляє повідомлення OnDraw або OnPaint, потрібно створити об'єктконтексту пристрою, який є членом MFC-класу CClientDC. Якщо вікноподання підтримує прокрутку, то перед використанням об'єктанеобхідно викликати функцію CScrollView:: OnPrepareDC для налаштування об'єктана поточну позицію документа. p>
void CMyView:: OtherFunction () p>
( p>
CClientDC ClientDC (this) p>
// Якщо графіка відображається у вікні вистави, p>
// підтримує прокрутку: p>
OnPrepareDC (sdientDC); p>
// для відображення графіки використовується 'ClientDC' ... p>
) p>
Щоб відобразити графіку поза робочої області вікна, створюємо об'єкт класу cwindowDC. p>
Всі функції малювання є членами класу CDC. Так як cdc - базовийклас по відношенню до інших класів об'єкта контексту пристрою, то ціфункції викликаються при використанні об'єкта контексту пристроюдовільного типу. p>
Основний акцент зроблений на малюванні всередині вікна (перш за все вікнаподання). Однак перелічені?? УНКЦ і способи не залежать від типівпристроїв і використовуються для відображення малюнків на інших пристроях,наприклад принтерах або плоттерах. p>
2) Вибір інструментів малювання. p>
Є два інструменти, вибір яких відбивається на роботі функційкласу CDC - перо і пензель. Перо впливає на спосіб малювання лінії. Вонодіє як на прямі і криві лінії (наприклад, намальовані звикористанням функції LineTo або Arc), так і на межі замкнутих фігур
(наприклад, прямокутників і еліпсів). Кисть діє на спосіб малюваннявнутрішній області замкнутих фігур. Очевидно, що замкнута фігура складаєтьсяз двох окремих елементів: межі і внутрішній області. p>
Інструменти малювання, визначені в цьому розділі, тобто пера і пензля, належать до категорії об'єктів, які називаються графічними або об'єктами
GDI (термін об'єкт належить до структури даних Windows, а не до об'єкта
C + +; GDI означає графічний інтерфейс пристрою - graphics device interface). Існують інші графічні об'єкти: шрифти, растрові зображення, області, контури і палітри. Хоча області, контури і палітри також відносяться до малювання. Повний опис областей, контурів і палітр приведено в наступних розділах довідкової системи:
Platform SDK, Graphics and Multimedia Services, GDI. Інформація про використання областей і палітр в MFC - в наступних розділах довідкової системи: Visual C + + Documentation, Reference, Microsoft Foundation Class
Library and Templates, Microsoft Foundation Class Library, Class Library
Reference, CRgn і CPalette. Інформація про використання контурів в MFC - в розділах Visual C + + Documentation, Reference, Microsoft Foundation Class
Library and Templates, Microsoft Foundation Class Library, Class Library
Reference, CDC, CDC Class Members, а також у розділі Path Functions. p>
При первинному створенні об'єкт контексту пристрою містить задані позамовчуванням перо і пензель. Перо малює суцільну чорну лінію шириною в 1піксель незалежно від поточного режиму відображення (який буде розглянутийдалі). Кисть заливає внутрішню область фігури із замкнутим контуромнепрозорим білим кольором. Для кожного з цих інструментів наведеніфункції малювання, на які впливає вибір інструменту, і обраний заумовчанням код інструменту. Якщо потрібно вибрати інструмент,ідентифікатор передається у функцію SelectStockObject. p>
Щоб змінити поточне перо або кисть, вибираємо стандартне перо абокисть або створюємо для користувача, а потім вибираємо їх в об'єкті контекступристрою. Вибрані перо або кисть використовуються до наступного явноговибору інших інструментів малювання. p>
3) Вибір стандартних інструментів малювання p>
Вибирається перо або кисть викликом функції SelectStockObject класу cdc: p>
CGdiObject * SelectStockObject (int nIndex); p>
Параметр nIndex є кодом окремого стандартного об'єкта, щопередається в об'єкт контексту пристрою. Можна викликати функцію
SelectStockObject для вибору стандартного шрифту. P>
Наприклад, наступні рядки обирають біле перо і сіру кисть. P>
void CMyView:; OnDraw (CDC * pDC) p>
(
pDC-> SelectStockObject (WHITE_PEN); pDC-> SelectStockObject (GRAY_BRUSH); p>
// Виклик інших графічних функцій і малювання графіки ...// (лінії і кордони будуть білими, внутрішні області// фігур з замкнутими контурами - сірими) p>
) p>
При виборі пера null_pen лінії не малюються. Значить, вибір не вдалий.
Аналогічно при виборі NULL_BRUSH внутрішня частина фігури не закрашується.
Цей інструмент зручний при малюванні фігур, що складаються тільки з кордону
(прямокутник), якщо необхідно залишити незмінним існуючий на екраніграфічне зображення всередині кордону. p>
Примітка
Стандартне перо малює суцільні лінії шириною в один піксель незалежно від заданого режиму відображення. Стандартна кисть зафарбовує суцільним кольором, а не візерунками. P>
4) Створення інструментів малювання p>
Можна створити перо або кисть, виконавши наступні дії.
1. Створюємо екземпляр класу СРеn для пера або CBrush для кисті.
2. Викликаємо відповідну функцію класу СРеn або CBrush для ініціалізації пера або кисті.
3. Вибираємо перо або кисть в об'єкті контексту пристрою, зберігаючи покажчик на попереднє перо або кисть.
4. Викликаємо функції малювання для виконання графічного виводу.
5. Знову вибираємо старе перо або кисть в об'єкті контексту пристрою. P>
Для створення тимчасового пера або кисті можна оголосити екземпляр класу
СРеn або CBrush як локальний об'єкт усередині функції, що генеруєграфічний висновок. Цей метод продемонстрований в прикладі фрагментапрограми, наведеному в кінці цього розділу. При багаторазовомувикористанні в програмі обраного пера або кисті об'єкт зручніше оголоситияк змінну класу подання або будь-якого класу, керуючого вікномвиводу. p>
Для ініціалізації пера викликаємо функцію CreatePen класу СРеn. p>
BOOL CreatePen (int nPenStyle, int nWidth, COLORREF crColor); p>
Параметр nPenStyle описує стиль лінії , намальованій пером.
Присвоєння стилю ps_null створює перо, що збігається зі стандартним перомnull_pen. Стиль ps_insideframe вибирає перо для малювання кордону навколофігури із замкнутим контуром, розташованої всередині обмежуєпрямокутника. Обмежуючі прямокутники та ефекти стилюps_insideframe описані далі. Стилі ps_dash, ps_dot, ps_dashdot і PSdashdotdot використовуються, якщо ширина пера дорівнює 1 пікселю. Якщо ширина пераперевищує цей розмір, то перелічені стилі генерують суцільні лінії. p>
Параметр nWidth описує ширину лінії в логічних одиницях,використовуються в поточному режимі відображення. Якщо ширина пера - 0, тоширина лінії - 1 піксель, незалежно від поточного режиму відображення. Такаширина генерується і стандартним пером, і заданим за умовчанням. p>
Параметр crColor задає код кольору лінії. Легше за все описати колір,використовуючи макрос Win32 rgb. p>
ColorRef RGB (bRed, bGreen, bBlue) p>
Параметри bRed, bGreen і bBlue показують відносну інтенсивністьчервоного, зеленого і синього кольорів. Кожному параметру можна присвоїтизначення в діапазоні від 0 до 255. У табл. 19.3 наведені значення, якіпередаються в макрос RGB для опису 16 чистих кольорів, доступних устандартному графічному режимі VGA. p>
Звернемо увагу: перу присвоюється лише чистий колір. Чистий колір --це колір, що генерується апаратними засобами для відеовідображення, якийне потрібно імітувати змішуванням різних кольорів (відомим якімітація півтонів (dithering)). Якщо присвоїти перу код кольору, якийне відноситься до жодного з чистих кольорів, то лінія буде намальована звикористанням найближчого чистого кольору. Виключення з цього правила: якщоперо має стиль ps_insideframe і ширину більше 1 пікселя, то Windowsвикористовує півтони (якщо привласнений колір не є чистим).
Примітка
Клас СPеn надає більш досконалу функцію ініціалізації пера, звану ExtCreatePen. У середовищі Windows NT ця функція задає спосіб зміни та об'єднання широких пір'я, що дозволяє створювати пір'я з призначеним для користувача стилем. Однак Windows 95 не підтримує більшість з цих коштів. Зауважимо також, що замість виклику функції CPen:: CreatePen, об'єкт пера можна ініціалізувати при його створенні, передаючи конструктору СPеn відповідні параметри. Інформація про конструкторах СРеn і ExtCreatePen - в наступних розділах довідкової системи: Visual C + + Documentation, Reference, Microsoft Foundation Class
Library and Templates, Microsoft Foundation Class Library, Class Library
Reference, СРеп. P>
Кисть можна ініціалізувати так, щоб вона забарвлювала однорідним кольоромвнутрішню область фігур, викликаючи функцію CreateSolidBrush класу CBrush зпараметром crColor, що описує колір заливки. Ви можете задати будь-який колір. Якщоприсвоєний колір не є чистим, то Windows генеруєпсевдополутоновий колір (отриманий імітацією півтонів). p>
BOOL CreateSolidBrush (COLORREF crColor); p>
Крім того, для заливки внутрішній області фігур можна ініціалізуватикисть, викликавши функцію CreateHatchBrush класу Cbrush. p>
BOOL CreateHatchBrush (int nindex, COLORREF crColor); p>
Параметр nIndex задає візерунок. Параметр crColor описує колір лінійштрихування. p>
Функція CreatePatternBrush класу CBrush викликає кисть для заповненняфігури заданим візерунком. p>
BOOL CreatePatternBrush (CBitmap * pBitmap); p>
Параметр pBitmap є вказівником на об'єкт растрового зображення.
Якщо фігура малюється за допомогою кисті, то її внутрішня область повністюзаповнюється копіями растрового зображення, розміщеними один біля одної.
Об'єкт растрового зображення створюється і ініціалізується. Задаємо розміррастрового зображення рівним 8х8 пікселів. p>
Якщо растрове зображення монохромне, то Windows використовує поточнікольору тексту і фону. p>
Примітка
Об'єкт кисть (як і перо) можна ініціалізувати при створенні, передаючи конструктору CBrush відповідні параметри. Інформація про це - в наступних розділах довідкової системи: Visual C + + Documentation,
Reference, Microsoft Foundation Class Library and Templates, Microsoft
Foundation Class Library, Class Library Reference, CBrush. P>
Як тільки перо або кисть ініціалізований, їх вибирають в об'єктіконтексту пристрою за допомогою функції SelectObject класу cdc. Для виборупера викличте функцію SelectObject, p>
CPen * SelectObject (CPen * рРеn); p>
де рРеn - покажчик на об'єкт-перо. Функція SelectObject повертаєвказівник на попередній об'єкт-перо, вибраний в об'єкті контекступристрою. Якщо перо раніше не вибиралося, це буде тимчасовий об'єкт пера,заданого за замовчуванням. Для вибору кисті викликається функція SelectObject. P>
CBrush * SelectObject (CBrush * pBrush); p>
де pBrush - покажчик на об'єкт-кисть. Функція SelectObject повертаєвказівник на раніше обрану кисть. Якщо вона раніше не обиралася, то цебуде тимчасовий об'єкт для заданої за замовчуванням кисті. p>
При виконанні функції SelectObject для вибору пера або кисті потрібно зберегтиповертається покажчик. Після виклику графічних функцій для відображеннящо виводиться інформації з використанням пера або кисті (що описано далі вцьому ж розділі) видаліть перо або кисть з об'єкта контексту пристрою івикличте функцію SelectObject для вибору попереднього об'єкту. p>
Перо або кисть необхідно видалити з об'єкта контексту пристрою, щобоб'єкт контексту пристрою не зберігав некоректний дескрипторпісля видалення об'єкта. При ініціалізації пера або кисті Windows додаєдескриптор, зберігається всередині об'єкта. При виборі пера або кисті об'єктконтексту пристрою також зберігає цей дескриптор. Коли об'єкти виходятьза межі області видимості або видаляються, деструктор об'єкта знищуєдескриптор. Однак цей крок не потрібно виконувати, якщо об'єкт контекступристрої видаляється до видалення об'єкта пера або кисті. p>
У моїй програмі будуть малюватися два еліпса, перший за формулою x2 y2
(--- --- = 1; a2 b2 а друге, за формулою p>
x = a cos t
(Y = b sin t p>
Ось функція, яка малює обидва еліпса: void CEllipseView:: OnDraw (CDC * pDC)
( p>
CEllipseDoc * pDoc = GetDocument (); p>
ASSERT_VALID (pDoc); float x, y, t, PI = 3.1415926; for (x =-pDoc-> A; x A; x + = 0.005) p> (y = sqrt (abs ((1.0 - (x * x)/(pDoc-> A * pDoc-> A)) * (pDoc-> B * pDoc-> B))); pDC-> SetPixel (x * 5 + pDoc-> A * 5 10, y * 5 + pDoc-> B * 5 10, RGB (0xFF, 0,0)) ; y =-sqrt (abs ((1.0 - (x * x)/(pDoc-> A * pDoc-> A)) * (pDoc-> B * pDoc-> B))); pDC-> SetPixel (x * 5 + pDoc-> A * 5 10, y * 5 + pDoc-> B * 5 10, RGB (0xFF, 0,0 )); p>
) for (t =-PI; t (x = pDoc-> Ac * cos (t); y = pDoc-> Bc * sin (t); pDC-> SetPixel (x * 5 + MAX (pDoc-> A, pDoc-> Ac) * 15 +20, y * 5 + MAX (pDoc-> B, pDoc-> Bc) * 5 +10, RGB (0,0 x20, 0x80 )); p >
) p>
Для передачі параметрів у функцію малювання я створив два діалоговихвікна, одне для першої формули (перший еліпса), інше - для другоїформули (друга еліпса). При натисканні на іконки еліпсів з'являються цідіалогові вікна і пропонується ввести відповідні параметри формулиеліпса. Діалогові вікна викликаються у файлі EllipseDoc.Cpp, ось функціївиклику обох діалогових вікон: void CEllipseDoc:: OnNewEllipseProperties ()
( p>
CEditEllipseProperties dlg; dlg.m_A = A; dlg.m_B = B; dlg.DoModal (); p>
A = dlg.m_A; p>
B = dlg.m_B; p>
UpdateAllViews (NULL);
) p>
void CEllipseDoc:: OnEditEllipseProperties2 ()
( p>
CEditEllipseProperties dlg; dlg.m_A = Ac; dlg.m_B = Bc; dlg.DoModal (); p>
Ac = dlg.m_A; p>
Bc = dlg.m_B; p>
UpdateAllViews (NULL);
) p>
Глава 3.Печать і попередній перегляд p>
1) Основи друку і попередній перегляд
2) Удосконалена друк p>
У цьому розділі я поясню, як виконується друк текстів і графічнихзображень, а також попередній перегляд зовнішнього вигляду документа передпечаткою. А також, як виконуються стандартні команди Print ..., Print
Preview та Print Setup з меню File. Так як в Windows застосовується модельвиведення даних, яка не залежить від пристроїв, для відображення тексту і графікина друкованій сторінці можна використовувати вже відомі вам способи.
Розглянемо особливі способи друку - вибір і установку принтера, розбивкадокумента на сторінки і інші дії, необхідні для роботи принтером. p>
Насамперед розглянемо як забезпечується підтримка друку, що дозволяєпрограмі друкувати або попередньо переглядати одну сторінку. Показанібільш досконалі способи друку або перегляду сторінок документа, якийне вміщується на одну сторінку. Приклади додавання засобів підтримки друкуі попереднього перегляду наведені у програмі. p>
Основи друку і попередній перегляд p>
При генерації нової програми з використанням майстра AppWizard, в неїможна включити основні засоби підтримки друку і попередньогоперегляду, встановивши опцію Printing And Print Preview в діалоговому вікні
(Step 4) AppWizard, в наслідок чого команди Print ..., Print Preview і
Print Setup ... додаються в меню програми File. При реалізації майстром
AppWizard команда Print ... друкує ту частину документа, яка міститьсяна одній сторінці. Частина документа ігнорується. P>
Подібним чином команда Print Preview відображає роздруківку,що з'являється на одній сторінці документа. Як ви побачите, команди Print ...та Print Preview викликають функцію OnDraw, щоб згенерувати реальновиведену текстову або графічну інформацію. Команда Print Setup ...відображає звичайне діалогове вікно Print Setup, що дозволяє вибрати типпринтера і задати його установки. p>
У цьому розділі в мою програму Ellipse додано всі засоби друку,що дозволяє друкувати так само, як і при виборі опції Printing And Print
Preview в першому варіанті програми, згенероване майстром AppWizard. Унову версію моєї програми Ellipse включені всі кошти, які увійшли допрограму. p>
Модифікація ресурсів p>
Щоб відобразити ресурси програми, перед початком модифікації ресурсів відкриємо проект Ellipse і вкладку Resource View у вікні Workspace. Потім відкриємо меню idr_mainframe в конструкторі меню. Безпосередньо під існуючою командою Save As ... в меню File додаємо роздільник і команди Print ..., Print Preview і Print Setup .... p>
Відкриємо в редакторі акселераторів таблицю idr_main frame, щоб задатиклавіатурний акселератор для команди Print ... (Ctrl + P). Додамо акселераторз ідентифікатором id_file_print і комбінацією клавіш Ctrl + P. p>
Тепер необхідно включити в файл визначення ресурсів Ellipse деякізумовлені додаткові ресурси. Для цього вибираємо команду
Resource Includes ... в меню View Developer Studio. У діалоговому вікні
Resource Includes додаємо наприкінці тексту в полі Compile-Time Directivesнаступний рядок: p>
# include "afxprint.re" p>
Клацаємо на кнопці ОК, а після запиту Developer Studio підтверджуємо своїдії. Додавання цього рядка наказує компілятору ресурсів додатиїх визначення, що містяться у списку Afxprint.rc, які задають кількаресурсів, що використовуються для підтримки команд Print ... та Print Previewпрограми (наприклад, діалогове вікно Printing, що відображається під часдруку). p>
Модифікація тексту програми p>
Перший крок модифікації тексту програми полягає у створенні обробникадля нової команди Print Setup ..., доданої в меню File. Його не потрібнописати самостійно, так як клас cwinApp надає обробник,званий OnFilePrintSetup. Однак MFC не додає його в схему повідомлень,тобто поточна функція не отримує управління при виборі команди Print
Setup ... Отже, його необхідно вручну додати схему повідомленькласу програми Ellipse. Для цього відкриємо файл Ellipse.cpp і додамооператори, виділені напівжирним шрифтом, у визначення схеми обробкиповідомлень. p>
///////////////////////////////////////// /////////////////////// p>
// Клас CMiniDrawApp p>
BEGIN_MESSAGE_MAP (CMiniDrawApp, CWinApp)// ( (AFX_MSG_MAP (CMiniDrawApp) p>
//-Входи 'схеми обробки повідомлень майстра ClassWizard ... p>
//)) AFX_MSG_MAP p>
// Команди роботи з файлами документів • ON_COMMAND (ID_FILE_NEW, p>
CWinApp:: OnFileNew) p>
ON_COMMAND (ID_FILE_OPEN, CWinApp:: OnFileOpen) p>
ON_COMMAND (ID_FILE_PRINT_SETUP, CWinApp:: OnFilePrintSetup) END p>
MESSAGE MAP () p>
Новий запис у схемі повідомлень призводить до того, що при виборі команди
PrintSetup ... буде викликатися функція CWinApp:: OnFilePrintSetup. Функція
'OnFilePrintSetup відображає діалогове вікно PrintSetup, в якому потрібновибрати тип принтера і встановити його параметри. Це все, що необхіднодля підтримки команди PrintSetup ... p>
Подібним чином клас cview надає обробники повідомлень длястандартних команд меню Print і Print Preview. Ці обробники необхідноактивувати, додавши їх у схему повідомлень для класу поданняпрограми Ellipse. Відкриємо файл Ellipse.cpp і додамо наступні два записив кінці схеми обробки повідомлень. p>
BEGIN_MESSAGE_MAP (CEllipse, CScrollView)// ((AFX_MSG__MAP (CEllipse) p>
ON_WM_LBUTTONDOWN () ON_WM_MOUSEMOVE () ON_WM_LBUTTONUP () p>
//)) AFX_MSG_MAP p>
ON_COMMAND (ID_FILE_PRINT, CView:: OnFilePrint) p>
ON_COMMAND (ID_FILE_PRINT_PREVIEW, CView:: OnFilePrintEreview) p>
END_MESSAGE_MAP (). p>
Обидві функції, CView:: OnFilePrint і CView:: OnFilePrintPreview, управляютьопераціями друку. Однак OnFilePrint передає результат на p>
принтер, а функція OnFilePrintPreview - у вікно попереднього переглядудруку, отображаемое поверх звичайного вікна програми. При цьому вонапоказує результат у вигляді однієї або двох друкованих сторінок. У процесіуправління печаткою ці функції викликають віртуальні функції, визначеніусередині класу CView. Реалізація віртуальних функцій в класі CView позамовчуванням накладає обмеження на процес друку. Для поліпшенняможливостей програми друку одну (або більше) з цих функцій можнаперевизначити. p>
Щоб реалізувати підтримку друку або попереднього перегляду друку,необхідно перевизначити тільки віртуальну функцію OnPreparePrinting. MFCвикликає її або перед друком, або перед попереднім переглядом.
Щоб створити функцію OnPreparePrinting для програми Ellipse, викличтемайстер ClassWizard, відкриємо вкладку Message Maps, виберемо CEllipse всписках Class Name і Object Ids, а в списку Messages - OnPreparePrinting іклацнемо на кнопці Add Function. Потім клацніть на кнопці Edit Code, вфункції OnPreparePrinting видалимо виклик основної версії функції
OnPreparePrinting і додамо виклик функції CView:: DoPrepa-rePrinting. P>
BOOL CEllipse:; OnPreparePrinting (CPrintInfo * pinfo) ( p>
// TODO: Тут додайте власний код обробника p>
// і/або виклик базового класу p>
return DoPreparePrinting (pinfo);// видаліть виклик// CScrollView:: p>
OnPreparePrinting (pinfo) p>
) p>
Функція DoPreparePrinting створює об'єкт контексту пристрою, пов'язаний з принтером. Якщо документ друкується, то DoPreparePrinting відображає звичайне діалогове вікно Print, що дозволяє вибрати певний принтер і встановити кілька опцій друку. Потім функція p>
створює об'єкт контексту пристрою для вибраного принтера і задає длянього вибрані установки. Однак при попередньому перегляді документафункція DoPreparePrinting створює об'єкт контексту пристрою для поточногостандартного принтера Windows, а потім привласнює стандартні установкипринтера, не відображаючи діалогове вікно Print. Якщо об'єкт контекступристрої пов'язаний з принтером, він додатково зберігає установкипринтера при збереженні атрибутів та інструментів малювання, описаних впопередніх розділах. Зверніть увагу: функцію OnPreparePrinting необхідностворити, тому що її стандартна версія нічого не виконує. Це можепризвести до того, що MFC спробує надрукувати або переглянути документ безнаявності коректного об'єкта контексту пристрою. p>
Примітка p>
Покажчик на об'єкт класу cprintinfo передається в усі віртуальні функції виконання друку. Цей об'єкт містить інформацію про друк і надає функції та змінні, які використовуються віртуальними функціями для отримання або зміни установок принтера. Наприклад, якщо відомий номер друкованої сторінки документа, то з функції p>
OnPreparePrinting можна викликати функцію Cprintinfo:: SetMaxPage (перед викликом DoPreparePrinting), щоб задати номер друкованої сторінки. Тоді під час друку документа цей номер відобразиться у діалоговому вікні Print (у текстовому полі Те). Під час перегляду документа надання цього номера призведе до відображення MFC смуги прокрутки у вікні попереднього перегляду, що дозволить прокручувати сторінки документа. MFC повинна передаватися загальну кількість сторінок для коректної установки позиції бігунка на смуг