Міністерство освіти і науки України
Національний університет „ Львівська політехніка “
Кафедра ІСМ
Звіт
про виконання лабораторної роботи № 9
з курсу „Технології проектування програмних систем”
на тему: «Вивчення структури програми для Windows на основі класів бібліотеки MFC»
Львів-2006
Мета роботи: вивчення структури програми для Windows, побудованої на основі класів бібліотеки MFC як SDI-програма.
Завдання для роботи
Розробити базову SDI MFC-програму на мові С++ для Windows.
Реалізувати ієрархію планіметричних фігур, здійснити їх вивід.
Програма та результати її виконання
#include "stdafx.h"
#include "Lab9.h"
#include "Lab9Doc.h"
#include "Lab9View.h"
#include "ChoiceDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int choice=-1;
/////////////////////////////////////////////////////////////////////////////
// CLab9View
IMPLEMENT_DYNCREATE(CLab9View, CView)
BEGIN_MESSAGE_MAP(CLab9View, CView)
//{{AFX_MSG_MAP(CLab9View)
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLab9View construction/destruction
CLab9View::CLab9View()
{
// TODO: add construction code here
}
CLab9View::~CLab9View()
{
}
BOOL CLab9View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLab9View drawing
void CLab9View::OnDraw(CDC* pDC)
{
CLab9Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
Lockable *shape;
Point p1(10,10), p2(200,50), p3(50,200);
switch (choice)
{
case 0:
shape = new Triangle(p1,p2,p3);
break;
case 1:
shape = new Rect(200,100);
break;
case 2:
shape = new Square(200);
break;
case 3:
shape = new Round(100);
break;
default:
shape = NULL;
}
//draw code for native data
if (shape) shape->OnDraw(pDC,10,10);
if (shape) delete shape;
}
/////////////////////////////////////////////////////////////////////////////
// CLab9View printing
BOOL CLab9View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLab9View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLab9View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CLab9View diagnostics
#ifdef _DEBUG
void CLab9View::AssertValid() const
{
CView::AssertValid();
}
void CLab9View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CLab9Doc* CLab9View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLab9Doc)));
return (CLab9Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLab9View message handlers
void CLab9View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CChoiceDlg dlg;
if(dlg.DoModal()==IDOK)
choice = dlg.m_radio;
Invalidate();
CView::OnLButtonDblClk(nFlags, point);
}
Текст програми файлу Lab9Doc.h:
#if !defined(AFX_LAB9DOC_H__34F88DCF_2546_4559_98DF_188625F8B8AB__INCLUDED_)
#define AFX_LAB9DOC_H__34F88DCF_2546_4559_98DF_188625F8B8AB__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <math.h>
#define Pi 3.14
class CLab9Doc : public CDocument
{
protected: // create from serialization only
CLab9Doc();
DECLARE_DYNCREATE(CLab9Doc)
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CLab9Doc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CLab9Doc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CLab9Doc)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
class Math
{ public:
static int sqr(int exp) { return exp*exp; }
static double sqr(double exp) { return exp*exp; }
};
class Lockable // interface
{
public:
virtual double calcArea(void) = 0;
virtual double calcPerimetr(void) = 0;
virtual void OnDraw(CDC *pDC, int x, int y) = 0;
};
class Point
{
public:
double x,y;
Point(double _x=0, double _y=0) : x(_x), y(_y) {}
};
class Triangle: public Lockable
{
private:
double a, b, c;
Point p1, p2, p3;
public:
Triangle(Point _p1, Point _p2, Point _p3) : p1(_p1), p2(_p2), p3(_p3)
{ a = sqrt(Math::sqr(p1.x-p2.x) + Math::sqr(p1.y-p2.y));
b = sqrt(Math::sqr(p2.x-p3.x) + Math::sqr(p2.y-p3.y));
c = sqrt(Math::sqr(p1.x-p3.x) + Math::sqr(p1.y-p3.y));
}
double calcArea(void)
{ double p = calcPerimetr()/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
double calcPerimetr(void) {return a+b+c;}
void OnDraw(CDC *pDC, int x, int y)
{ pDC->MoveTo((int)p1.x+x,(int)p1.y+y);
pDC->LineTo((int)p2.x+x,(int)p2.y+y);
pDC->LineTo((int)p3.x+x,(int)p3.y+y);
pDC->LineTo((int)p1.x+x,(int)p1.y+y);
}
};
class Rect: public Lockable
{
protected:
double width;
double height;
public:
Rect(double w=0, double h=0) : width(w), height(h) {}
double calcArea(void) {return width*height;}
double calcPerimetr(void) {return 2*(width+height);}
virtual int isSquare()
{ if (width==height) return true;
else return false;
}
virtual void OnDraw(CDC *pDC, int x, int y)
{ pDC->Rectangle(0+x,0+y,(int)width-1+x,(int)height-1+y);
}
};
class Square : public Rect
{
public:
Square(double a) : Rect(a,a) {}
virtual int isSquare() { return true; }
virtual void OnDraw(CDC *pDC, int x, int y)
{ Rect::OnDraw(pDC, x, y);
}
};
class Round : public Lockable
{
private:
double radius;
public:
Round(double r=0) : radius(r) {}
double calcArea(void) {return Pi*radius*radius;}
double calcPerimetr(void) {return 2*Pi*radius;}
virtual void OnDraw(CDC *pDC, int x, int y)
{ pDC->Ellipse(x, y, (int)(x+radius+radius), (int)(y+radius+radius));
}
};
Рис.1. Вигляд вікна програми після виконання
Рис.2. Вікно довідки
Рис.3. Вікно після виклику діалогового вікна
Висновки
Під час виконання лабораторної роботи я розробив базову SDI MFC-програму на мові С++ для Windows, реалізував ієрархію планіметричних фігур, здійснив їх вивід.