- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
Контрольні питання
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);
}