Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

Контрольні питання

1. Призначення функції InitInstance у класі додатку?

2. Призначення функції Serialize у класі документа?

3. Розкрийте призначення та основні функції класу документу.

4. Розкрийте призначення та основні функції класу виду.

5. Яким чином відбувається взаємодія класів документу, виду та головного вікна?

6. Чому зазвичай більшість данних у класі документа відкриті (public)?

7. Призначення функції GetDocument.

8. Призначення класу, похідного від CWinApp.

9. Призначення функції OnNewDocument.

10. Яка відмінність у SDI та MDI додатках при виклику функції OnNewDocument?

Розділ 4. Робота з клавіатурою, мишею і меню

4.1. Робота з клавіатурою

Приклад роботи з клавіатурою знаходиться у папці DISK\Nach\key.

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

Послідовність операцій для створення цієї програми:

1. Запустіть Visual C++ і виконайте команду File → New. При цьому відкривається вікно діалогу New.

2. Виберіть зі списку рядок MFC AppWizard (exe).

3. Введіть у текстовому полі Project Name ім'я проекту key.

4. Натисніть кнопку OK, щоб запустити майстер Visual C++ AppWizard.

5. На екрані з'являється вікно першого (Step1) з шести етапів роботи з AppWizard.

6. Встановіть перемикач Single Document (одновіконний додаток).

7. Далі натискаємо Next для кожного наступного етапу і в кінці кнопку Finish, тобто всі опції на даних етапах прийняті за замовчуванням. Для спрощення можна натиснути на першому етапі кнопку Finish.

Послідовність роботи.

1. Створимо в класі CKeyDoc рядковий об'єкт типу CString з ім'ям StringData.

class CKeyDoc : public CDocument

{

CKeyDoc();

DECLARE_DYNCREATE(CKeyDoc)

CString StringData;

.............................................................

}

2. Ініціалізація об'єкту StringData в класі CKeyDoc.

CKeyDoc::CKeyDoc()

{

StringData = "";

}

3. З використанням ClassWizard додамо метод OnChar() – відгук від натискання клавіші. Для цього у вікні ClassWizard створюємо метод (функцію) на відгук WM_CHAR.

void CKeyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CKeyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData+=nChar;

Invalidate();

CView::OnChar(nChar, nRepCnt, nFlags);

}

У цій функції накопичуються символи змінної StringData при кожному натисканні клавіші. Тут функція GetDocument() повертає вказівку на клас CKeyDoc, що містить змінну StringData. Потім викликається функція Invalidate(), що формує відгук на перемальовування екрану, тобто підключення функції OnDraw().

4. Опис функції OnDraw().

void CKeyView::OnDraw(CDC* pDC)

{

CKeyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetWindowRect(&rect);

int x = rect.Width()/2;

int y = rect.Height()/2;

CSize size = pDC->GetTextExtent(pDoc->StringData);

x-=size.cx/2;

y-=size.cy/2;

pDC->SetTextColor(RGB(255,0,0));

pDC->SetBkColor(RGB(0,0,255));

pDC->TextOut(x,y,pDoc->StringData);

}

Щоб отримати розміри клієнтської області вікна використовується функція GetWindowRect(), входом до якої є вказівка на об'єкт CRect. Функція класу контексту GetTextExtent (pDoc->StringData) визначає ширину в пікселях виведеного тексту. Змінні x та y визначають в пікселях координати початку виведення тексту. Функції SetTextColor() і SetBkColor() визначають, відповідно колір тексту і фону.

Нижче наводиться повний текст програми, а жирним шрифтом виділено вставки тексту в генеруєму програму.

// KeyDoc.h : interface of the CKeyDoc class

//

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

#if !defined(AFX_KEYDOC_H__F65F69E7_10AC_4F37_92B2_0FA83D8D6158__INCLUDED_)

#define AFX_KEYDOC_H__F65F69E7_10AC_4F37_92B2_0FA83D8D6158__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CKeyDoc : public CDocument

{

protected: // create from serialization only

CKeyDoc();

DECLARE_DYNCREATE(CKeyDoc)

CString StringData;

// Attributes

public:

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CKeyDoc)

public:

virtual BOOL OnNewDocument();

virtual void Serialize(CArchive& ar);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CKeyDoc();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

//{{AFX_MSG(CKeyDoc)

// 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()

};

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

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_KEYDOC_H__F65F69E7_10AC_4F37_92B2_0FA83D8D6158__INCLUDED_)

// KeyDoc.cpp : implementation of the CKeyDoc class

#include "stdafx.h"

#include "Key.h"

#include "KeyDoc.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// CKeyDoc

IMPLEMENT_DYNCREATE(CKeyDoc, CDocument)

BEGIN_MESSAGE_MAP(CKeyDoc, CDocument)

//{{AFX_MSG_MAP(CKeyDoc)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// CKeyDoc construction/destruction

CKeyDoc::CKeyDoc()

{

StringData = "";

}

CKeyDoc::~CKeyDoc()

{

}

BOOL CKeyDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

return TRUE;

}

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

// CKeyDoc serialization

void CKeyDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

}

else

{

}

}

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

// CKeyDoc diagnostics

#ifdef _DEBUG

void CKeyDoc::AssertValid() const

{

CDocument::AssertValid();

}

void CKeyDoc::Dump(CDumpContext& dc) const

{

CDocument::Dump(dc);

}

#endif //_DEBUG

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

// CKeyDoc commands

// KeyView.h : interface of the CKeyView class

//

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

#if !defined(AFX_KEYVIEW_H__3C487958_8871_4227_9692_93FBF2DEFA1D__INCLUDED_)

#define AFX_KEYVIEW_H__3C487958_8871_4227_9692_93FBF2DEFA1D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CKeyView : public CView

{

protected: // create from serialization only

CKeyView();

DECLARE_DYNCREATE(CKeyView)

// Attributes

public:

CKeyDoc* GetDocument();

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CKeyView)

public:

virtual void OnDraw(CDC* pDC); // overridden to draw this view

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CKeyView();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

//{{AFX_MSG(CKeyView)

afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

#ifndef _DEBUG // debug version in KeyView.cpp

inline CKeyDoc* CKeyView::GetDocument()

{ return (CKeyDoc*)m_pDocument; }

#endif

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

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_KEYVIEW_H__3C487958_8871_4227_9692_93FBF2DEFA1D__INCLUDED_)

// KeyView.cpp : implementation of the CKeyView class

//

#include "stdafx.h"

#include "Key.h"

#include "KeyDoc.h"

#include "KeyView.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// CKeyView

IMPLEMENT_DYNCREATE(CKeyView, CView)

BEGIN_MESSAGE_MAP(CKeyView, CView)

//{{AFX_MSG_MAP(CKeyView)

ON_WM_CHAR()

//}}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()

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

// CKeyView construction/destruction

CKeyView::CKeyView()

{

}

CKeyView::~CKeyView()

{

}

BOOL CKeyView::PreCreateWindow(CREATESTRUCT& cs)

{

return CView::PreCreateWindow(cs);

}

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

// CKeyView drawing

void CKeyView::OnDraw(CDC* pDC)

{

CKeyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetWindowRect(&rect);

int x = rect.Width()/2;

int y = rect.Height()/2;

CSize size = pDC->GetTextExtent(pDoc->StringData);

x-=size.cx/2;

y-=size.cy/2;

pDC->SetTextColor(RGB(255,0,0));

pDC->SetBkColor(RGB(0,0,255));

pDC->TextOut(x,y,pDoc->StringData);

}

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

// CKeyView printing

BOOL CKeyView::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparation

return DoPreparePrinting(pInfo);

}

void CKeyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: add extra initialization before printing

}

void CKeyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: add cleanup after printing

}

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

// CKeyView diagnostics

#ifdef _DEBUG

void CKeyView::AssertValid() const

{

CView::AssertValid();

}

void CKeyView::Dump(CDumpContext& dc) const

{

CView::Dump(dc);

}

CKeyDoc* CKeyView::GetDocument() // non-debug version is inline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CKeyDoc)));

return (CKeyDoc*)m_pDocument;

}

#endif //_DEBUG

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

// CKeyView message handlers

void CKeyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CKeyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData+=nChar;

Invalidate();

CView::OnChar(nChar, nRepCnt, nFlags);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]