- •1А. Побудова проекту додатка без майстра.
- •1Б. Побудова windows-додаткa за допомогою майстра
- •2. Розробка windows-додатку з діалоговим вікном
- •3.Програмування простих арифметичних виразів
- •Завдання до лабораторної роботи:
- •4.Створення файлів даних
- •Void cMyAppView::OnDraw(cdc* pDc)
- •Використання постійних наборів даних. Серіалізація
- •6.Робота з клавіатурою та мишою.
- •Void cLab6View::OnChar(uint nChar, uint nRepCnt, uint nFlags)
- •Void cLab6View::OnChar(uint nChar, uint nRepCnt, uint nFlags)
- •Void cLab6View::OnDraw(cdc* pDc)
- •Void cCenteredView::OnDraw(cdc* pDc)
- •Void cLab6View::OnDraw(cdc* pDc)
- •Void cLab6View::OnDraw(cdc* pDc)
- •If(!CaretCreated)
- •Void cLab6View::OnKillFocus(cWnd* pNewWnd)
- •Void cLab6View::OnSetFocus(cWnd* pOldWnd)
- •7.Обробка текстових даних.
- •Void cTextView::OnDraw(cdc* pDc)
- •8.Обробка одномірних масивів.
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •9. Обробка двомірних масивів.
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •10. Функції. Перевантаження та шаблони функцій.
- •Додаток1.Пояснення архітектури документ/облік
- •Додаток2.Аналіз коду, створеного майстром у lab4
- •MainFrm.H и MainFrm.Cpp
- •Lab4View.H та lab4View.Cpp
- •Список літератури
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().
