Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабробС++1к.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.06 Mб
Скачать

MainFrm.H и MainFrm.Cpp

// MainFrm.h : інтерфейс класу CMainFrame

#if !defined(AFX_MAINFRM_H__AF072C87_900A_11D0_8860

_444553540000__#includeD_)

#define AFX_MAINFRM_H__AF072C87_900A_11D0_8860

_444553540000__#includeD_

#if _MSC_VER >= 1000

#pragma once

#endif // _MSC_VER >= 1000

class CMainFrame : public CFrameWnd

{ protected: // створення тільки при серіалізації

CMainFrame();

DECLARE_DYNCREATE(CMainFrame)

// Атрибути

public:

// Операції

public:

// Перевизначення

// Перевизначення віртуальних функцій, згенеровані ClassWizard

//{{AFX_VIRTUAL(CMainFrame)

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

//}}AFX_VIRTUAL

// Реалізація

public:

virtual ~CMainFrame();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected: // Внутрішні керуючі об’єкти

CStatusBar m_wndStatusBar;

CToolBar m_wndToolBar;

// Згенеровані функції схеми повідомлень

protected:

//{{AFX_MSG(CMainFrame)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

// Тут ClassWizard вставляє та видаляє функції класу.

// Не можна змінювати вмісту даних фрагментів згенерованого коду!

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Developer Studio вставлє додаткові оголошення перед попереднім рядком.

#endif // !defined(AFX_MAINFRM_H__AF072C87_900A_11D0_8860

//_444553540000__#includeD_)

// MainFrm.cpp : реалізація класу CMainFrame

#include "stdafx.h"

#include "LAB4.h"

#include "MainFrm.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

///////////////////////////////////////////////////////////

// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

// Тут ClassWizard додає та видаляє макроси схеми.

// Не можна змінювати вміст даних фрагментів згенерованого коду!

ON_WM_CREATE()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

static UINT indicators[] =

{ ID_SEPARATOR, // індикатори рядка стану

ID_INDICATOR_CAPS,

ID_INDICATOR_NUM,

ID_INDICATOR_SCRL,

};

// Створеня/знищення CMainFrame

CMainFrame::CMainFrame()

{

// TODO: додайте код для ініціювання змінних класу

}

CMainFrame::~CMainFrame() { }

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{ if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;

if (!m_wndToolBar.Create(this) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{ TRACE0("Failed to create toolbar\n");

return -1; // невдала спроба створення

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT)))

{ TRACE0("Failed to create status bar\n");

return -1; // невдала спроба створення

}

// TODO: Видаліть цей рядок, якщо не потрібні підказки чи можливість зміни розмірів

//панелі інструментів

m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |

CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

// TODO: Видаліть наступні три рядки, якщо не потрібна закріплювана панель

// інструментів

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);

return 0; }

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{ // TODO: Змініть клас вікна чи його стилі, редагуючи вміст CREATESTRUCT cs

return CFrameWnd::PreCreateWindow(cs);

}

// Діагностика у CMainFrame

#ifdef _DEBUG

void CMainFrame::AssertValid() const

{ CFrameWnd::AssertValid();

}

void CMainFrame::Dump(CDumpContext& dc) const

{ CFrameWnd::Dump(dc); }

#endif //_DEBUG

// Обробники повідомлень CMainFrame

Розглянемо об’єкт вигляду - він відповідає за відображення даних з документу у клієнтській області вікна програми. Біьша частина дій користувача поєднана саме з об’єктом вигляду.

Розглянемо об’єкт вигляду

В об’єкті вигляду виводяться рядки коментарів, вміщені у змінні m_роch та m_kin та значення змінни, отриманих з полів діалогового вікна Це робиться у методі OnDraw() файлу Lab4View.cpp:

void CLab4View::OnDraw(CDC* pDC)

{

CLab4Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(20,20,pDoc->m_роch);

CString s; // оголошена змінна класу CString

Cdialogg pc;

pc.DoModal();

s.Format("a=%d 2*a=%d",pc.m_a,2*pc.m_a);

pDC->TextOut(20,40,s);/*

pDC->TextOut(20,60,pDoc->m_kin);*/

}

Цей метод викликається у тих випадках, коли виникає потреба у перерисуванні клієнтської області. Таким чином працюватимуть всі програми - вони поділяються на велику кількість різних методів, призначених для обробки конкретних повідомлень Windows.

Програми для Windows керуються подіями (event-driven). Це означає, що вони реагують на дії користувача, які називаються подіями, - клацання кнопкою миші, натискання клавіш і т. д. При виникненні довільного з вказаних подій у програмі викликається відповідний метод. Таким чином програма ділиться на невеликі методи, що відповідають різним повідомленням Windows. Наприклад, метод OnDraw() викликається при потребі у перерисуванні клієнтської області - коли вікно вперше відображається на екрані, коли користувач пересуває вікно, яке закрило частину нашого вікна, або ж сгортає та розгортає поточне вікно.

Клас CString містить всі операції з рядками. Він містить наступні методи:

AllocSysString

AnsiToOem

Collate

Compare

CompareNoCase

CString

Empty

Find

FindOneOf

Format

FormatMessage

FreeExtra

GetAt

GetBuffer

GetBufferSetLength

GetLength

IsEmpty

Left

LoadString

LockBuffer

MakeLower

MakeReverse

MakeUpper

Mid

OemToAnsi

оператор []

оператор +

оператор +=

оператор <<

оператор =

оператор == < и т. д.

оператор >>

оператор LPCTSTR

ReleaseBuffer

ReverseFind

Right

SetAt

SetSysString

SpanExcluding

SpanIncluding

TrimLeft

TrimRight

UnlockBuffer

Методи, специфічні для Windows

У методі OnDraw() виводиться текстовий рядок через переданий методу вкаівник pDC, який посилається на об’єкт класу MFC з іменем CDC. Точніше викликається метод TextOut() цього об’єкту:

Клас CDC призначений для роботи з контекстами пристроїв. Все графічне та текстове виведення, яке виконується у Visual C++, буде виконуватися через контексти пристроів.

Розглянемо контекст пристрою

Контекст пристрою – це спеціальний об’єкт з великою кількістю вбудованих методів, які застосовуються для рисування. Все рисування у Windows виконується через контекст пристрою.

Контексти пристроїв можуть відповідати найрізноманітнішим пристроям - наприклад, екрану монітора чи принтеру. Якщо рисувати через контекст пристрою, тоді зображення буде правильно відображатися на різних пристроях, серед яких і екран та принтер.

Для того щоб рисувати у об’єкті вигляду, потрібно отримати контекст пристрою, який відноситься до нього. Окрім того, можна отримати контекст пристрою для всього вікна, всього екрану чи принтера. Для рисування у контексті пристрою застосовуються перелічені нижче методи класу CDC;

AbortDoc

AbortPath

AddMetaFileComment

AngleArc

Arc

ArcTo

Attach

BeginPath

BitBlt

CDC

Chord

CloseFigure

CreateCompatibleDC

CreateDC

CreateIC

DeleteDC

DeletetTempMap

Detach

DPtoHIMETRIC

DPtoLP

Draw3dRect

DrawDragRect

DrawEdge

DrawEscape

DrawFocusRect

DrawFrameControl

DrawIcon

DrawState

DrawText

Ellipse

EndDoc

EndPage

Endpath

EnumObjects

Escape

ExcludeClipRect

ExcludeUpdateRgn

ExtFloodFill

ExtTextOut

FillPath

FillRect

FillRgn

FillSolidRect

FlattenPath

FloodFill

FrameRect

FrameRgn

FromHandle

GetArcDirection

GetAspectRatioFilter

GetBkColor

GetBkMode

GetBoundsRect

GetBrushOrg

GetCharABCWidths

GetCharWidth

GetClipBox

GetColorAdjustments

GetCurrentBitmap

GetCurrentBrush

GetCurrentFont

GetCurrentPalette

GetCurrentPen

GetCurrentPosition

GetDeviceCaps

GetFontData

GetGlyphOutline

GetHalftoneBrush

GetKerningPairs

GetMapMode

GetMiterLimit

GetNearestColor

GetOutlineTextMetrics

GetOutputCharWidth

GetOutputTabbedTextExtent

GetOutputTextExtent

GetOutputTextMetrics

GetPath

GetPixel

GetPolyFillMode

GetROP2

GetSafeHdc

GetStretchBltMode

GetTabbedTextExtent

GetTextAlign

GetTextCharacterExtra

GetTextColor

GetTextExtent

GetTextFace

GetTextMetrics

GetViewportExt

GetViewportOrg

GetWindow

GetWindowExt

GetWindowOrg

GrayString

HIMETRICtoDP

HIMETRICtoLP

IntersectClipRect

InvertRect

InvertRgn

IsPrinting

LineTo

LPtoDP

LPtoHIMETRIC

MaskBlt

Move

OffsetClipRgn

OffsetViewpotOrg

OffsetWindowOrg

PaintRgn

PatBlt

Pie

PlayMetafile

PlgBlt

PolyBezier

PolyBezierTo

PolyDraw

Polygon

Polyline

PolylineTo

PolyPolygon

PolyPolyline

PtVisible

QueryAbort

RealizePalette

Rectangle

RectVisible

ReleaseAttribDC

ReleaseOutputDC

ResetDC

RestoreDC

RoundRect

SaveDC

ScaleViewportExt

ScaleWindowExt

ScrollDC

SelectClipPath

SelectClipRgn

SelectObject

SelectPalette

SelectStockObject

SetAbortProc

SetArcDirection

SetAttribDC

SetBkColor

SetBkMode

SetBoundsRect

SetBrushOrg

SetColorAdjustment

SetMapMode

SetMapperFlags

SetMiterLimit

SetOutputDC

SetPixel

SetPixelV

SetPolyFillMode

SetROP2

SetStretchBltMode

SetTextAlign

SetTextCharacterExtra

SetTextColor

SetTextJustification

SetViewportExt

SetViewportOrg

SetWindowExt

SetWindowOrg

StartDoc

StartPage

StretchBlt

StrokeAndFillPath

StrokePath

TabbedTextOut

TextOut

UpdateColors

WidenPath

В даному випадку для виведення у об’єкті вигляду (який відповідає клієнтській області вікна) використаний метод TextOut класу CDC. Методу OnDraw() передається вказівник pDC, що посилається на контекст пристрою для даного вигляду.

Методу TextOut() передаються координати лівого верхнього кута тієї області вікна, де розташовуватиметься рядок коментара.

У клієнтській області точка (0, 0) розташована у лівому верхньому куті. Значення координати x зростає зліва направо, а координати y - згори вниз. Таку координатну систему можна порівняти з читанням тексту.

Вхідний текст об’єкту вигляду знаходиться у файлах LAB4View.h/LAB4View.cpp.

У різні миті виконання програма може передавати методу OnDraw() різні контексти пристроїв. Наприклад, коли додається код у метод OnDraw(), тоді у програмі виникатиме можливість друкування. Якщо користувач виконає команду File|Print чи натисне кнопку з принтером на панелі інструментів, тоді програма передасть методу OnDraw() контекст пристрою для принтера, і потрібний текст надрукується. Якщо потрібно буде виконати деякі спеціальні дії для підготовки друку (наприклад, особливим чином відформатувати документ), тоді можна внести відповідний код у метод OnPreparePrinting().