Разработка программы для Windows на Visual C++
Использование AppWizard для создания программ. Изучение документов Visual C++, видов Visual C++ и структуры программы в Visual C++. Объекты приложения, главного окна, документа и вида программы. Метод кода для вывода сообщения. Редактирование метода.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 09.11.2014 |
Размер файла | 469,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
ЛАБОРАТОРНАЯ РОБОТА №1
Тема: Разработка программы для Windows на Visual C++
Цель:
1. Научиться использовать AppWizard для создания программ.
2. Изучить документы Visual C++, виды Visual C++ и структуру программы в Visual C++
При создании программ на Visual C++ обычно применяются мастера (wizards), например Visual C++ AppWizard. После того как мастер сгенерирует код, можно отредактировать программу и настроить ее в соответствии со своими требованиями. Для этого нужно понимать, как работают различные компоненты программы на Visual C.
Программа для Windows на VisualC++
Первая программа на Visual C++ будет очень простой: так легче изучить новую тему. Все что она будет делать -- это создавать окно и выводить в нем текст «Добро пожаловать в Visual C++».
На самом деле возможности нашей первой программы вовсе не ограничиваются простым выводом сообщения. Visual C++ встроит в нее меню и панель инструментов, хотя они и не будут ничего делать.
1. Запустите Visual C++ и выполните команду File > New; открывается окно диалога New (рис. 1.1).
2. Выберите из списка строку MFC AppWizard(exe).
3. Введите в текстовом поле Project Name имя проекта welcome.
4. Нажмите кнопку ОК, чтобы запустить мастер Visual C++ AppWizard (рис. 1.2).
5. AppWizard напишет за нас основную часть программного кода.
6. На экране (см. рис. 1.2) появляется окно первого (Step 1) из шести этапов работы с AppWizard.
7. Оставьте без изменений все стандартные параметры AppWizard, кроме одного -- по умолчанию AppWizard создает программы с несколькими окнами, а нам нужна программа с одним окном. Это облегчит знакомство с темой и сделает ее более понятной.
8. Установите переключатель Single Document (см. рис. 1.2) и нажмите кнопку Next. Мы переходим ко второму этапу (Step 2) работы с AppWizard (рис. 1.3).
9. На рис. 1.3 AppWizard спрашивает, следует ли включить в программу какую-либо поддержку баз данных; оставьте установленным переключатель None.
Рис. 1.2 MFCAppWizard упрощает создание программ на Visual C++
Рис. 1.3 Второй этап работы с MFCAppWizard
10. Нажимайте кнопку Next до тех пор, пока не доберетесь до шестого этапа (Step 6) AppWizard, изображенного на рис. 1.4.
11. На шестом этапе AppWizard сообщает, какие классы он собирается создать в новой программе: CWelcomeApp, CMainFrame, CWelcomeDoc и CWelcomeView. В этом уроке мы рассмотрим все эти классы.
12. Нажмите кнопку Finish -- откроется окно New Project Information (рис. 1.5).
Рис. 1.5 Окно New Project Information MFC AppWizard
13. Нажмите кнопку ОК, чтобы завершить создание проекта. В указанном вами каталоге будут созданы следующие файлы:
welcome.clw |
Файл ClassWizard |
|
welcome.dsw |
Основной файл рабочей области |
|
welcome.h |
Заголовочный файл приложения |
|
welcome.cpp |
Исходный текст приложения |
|
StdAfx.h |
Заголовочный файл для стандартного «каркаса» приложения |
|
StdAfx.cpp |
Исходный текст стандартного «каркаса» приложения |
|
MainFrm.h |
Заголовочный файл главного окна |
|
MainFrm.cpp |
Исходный текст главного окна |
|
welcomeDoc.h |
Заголовочный файл документа |
|
welcomeDoc.cpp |
Исходный текст документа |
|
welcomeView.h |
Заголовочный файл вида |
|
welcomeView.cpp |
Исходный текст вида |
|
Resource.h |
Файл с ресурсными константами |
|
welcome.гс |
Файл с ресурсами |
|
welcome, neb |
Файл с информацией о представлении и взаимных связях |
|
welcome.dsp |
Файл проекта |
|
res |
Каталог для ресурсов |
13. Программа готова!
AppWizard также создает файл с именем ReadMe.txt, в котором более подробно разъясняется назначение некоторых файлов, созданных AppWizard:
MICROSOFT FOUNDATION CLASS LIBRARY : welcome
AppWizard создал приложение welcome за вас. Оно не только демонстрирует основные принципы использования классов Microsoft Foundation, но и является отправной точкой, для написания вашего собственного приложения.
В этом файле содержится краткое описание всех файлов, составляющих приложение welcome.
welcome.dsp
Файл проекта содержит общие сведения о проекте и используется при построении отдельного проекта или подпроекта. Другие пользователи могут пользоваться файлом проекта (.dsp), однако они должны выполнить локальное экспортирование make-файлов.
welcome.h
Главный заголовочный файл приложения. Он включает другие заголовочные файлы проекта (в том числе Resource.h) и объявляет класс приложения CWelcomeApp.
welcome.cpp
Главный файл с исходным текстом приложения, содержащий класс приложения CWelcomeApp.
welcome.rc
Перечисление всех ресурсов Microsoft Windows, используемых в программе. В их число входят значки, растровые изображения и курсоры, все они хранятся в подкаталоге RES. Данный файл можно редактировать непосредственно в Microsoft Visual C++.
res\welcome.ico
Файл с изображением, используемым в качестве значка приложения. Включается в главный ресурсный файл welcome.гс.
res\welcome.rс2
Файл содержит ресурсы, не редактируемые в Microsoft Visual C++. В него следует помещать все ресурсы, для которых отсутствуют специализированные редакторы.
welcome.clw
Файл содержит информацию, которая используется ClassWizard для модификации существующих или добавления новых классов. ClassWizard также пользуется им для хранения информации, необходимой для создания и модификации схем сообщений и схем данных в окнах диалогов, а также для создания прототипов функций.
Главное окно:
MainFrm.h, MainFrm.cpp
Файлы содержат класс главного окна приложения CMainFrame, производный от CFrameWnd и отвечающий за все аспекты работы с окнами в интерфейсе SDI.
res\Toolbar.bmp
Растровый файл содержит изображения значков на панели инструментов. Исходная панель инструментов и строка состояния конструируются в классе CMainFrame. Чтобы добавить новые кнопки на панель инструментов, измените растровое изображение панели инструментов в редакторе ресурсов и обновите массив IDR_MAINFRAME TOOLBAR в файле welcome.rc.
AppWizard создает один тип документа и один вид:
welcomeDoc.h, welcomeDoc.cpp - документ
Файлы содержат класс CWelcomeDoc. Отредактируйте их, чтобы внести в документ специфические данные и реализовать сохранение/загрузку файлов (через CWelcomeDoc::Serialize).
welcomeView.h, welcomeView.cpp - вид документа
Файлы содержат класс CWelcomeView. Объекты CWelcomeView используются для просмотра объектов CWelcomeDoc.
Другие стандартные файлы:
StdAfx.h, StdAfx.cpp
Файлы используются для построения предварительно компилированных файлов - заголовочного (РСН) файла welcome.pen, а также файла типов StdAfx.obj.
Resource.h
Стандартный заголовочный файл, в котором определяются идентификаторы новых ресурсов. Microsoft Visual C++ читает этот файл и обновляет его содержимое.
AppWizard помечает комментарием "TODO:" те части исходного текста, которые следует дополнить или изменить.
Если приложение использует MFC в виде совместной DLL-библиотеки и его язык отличается от текущего языка операционной системы, вам придется скопировать соответствующую библиотеку с локализованными ресурсами MFC42XXX.DLL с Visual C++ CD-ROM в каталог system или system32 и переименовать ее в MFCLOC.DLL. (Сокращение "XXX" определяет используемый язык. Например, MFC42DEU.DLL содержит ресурсы, переведенные на немецкий.) Если не сделать этого, некоторые элементы пользовательского интерфейса в ваших приложениях сохранят язык операционной системы.
Части программы на Visual C++
Программа, созданная Visual C++ AppWizard, состоит из четырех основных частей: объекта приложения, объекта главного окна, объекта документа и объекта вида. Все они часто будут встречаться нам в книге.
Объект приложения
Объект приложения, находящийся в файлах welcome.h и welcome.cpp (файл.h содержит определения констант, а также объявления переменных и методов класса), -- то, что Windows запускает при старте программы. Когда этот объект начинает работу, он размещает на экране главное окно.
Объект главного окна
Объект главного окна отображает на экране саму программу; в нем находится меню, заголовок окна и панель инструментов. Объект главного окна отвечает за все, что происходит вокруг того места, где собственно работает наша программа (где она рисует, выводит текст и т. д.). Рабочая зона программы называется клиентской областью окна; например, текст выводится в клиентской области текстового редактора. За работу с клиентской областью отвечает объект вида.
Объект вида
Объект вида предназначен для работы с клиентской областью -- местом, где обычно отображаются в соответствующем формате данные нашей программы (текст, если вы работаете с текстовым редактором). На самом деле объект вида представляет собой окно, которое накладывается поверх клиентской области. Объект вида отображает данные, хранящиеся в объекте документа.
Объект документа
В объекте документа хранятся данные программы. Возможно, у вас возникнет вопрос -- а почему бы не хранить эти данные в объекте вида? Дело в том, что таких данных бывает много, причем не все они отображаются в клиентской области. Visual C++ облегчает нашу задачу и позволяет сохранить все данные в объекте документа, а затем поручить объекту вида отобразить лишь те данные, которые попадают в клиентскую область объекта вида. Как мы вскоре увидим, для одного документа можно иметь несколько одновременно открытых видов. Взаимосвязь четырех частей программы на Visual C++ выглядит так:
Вывод приветствия
Мы рассмотрели программу, написанную мастером AppWizard. Давайте изменим ее так, чтобы она выводила сообщение «Добро пожаловать в Visual C++!» Для этого мы добавим небольшой фрагмент кода в метод OnDraw() класса CWelcomeVlew (этот класс служит для отображения данных). Программа вызывает метод OnDraw(), когда ей требуется вывести что-либо в клиентской области программы (например, при запуске программы, при свертывании и восстановлении окна или при перемещении другого окна, закрывающего часть клиентской области). В данный момент метод OnDraw() выглядит так (см. файл welcomeView.cpp):
void CWelcomeView::OnDraw(CDC* pDC)
{
CWelcomeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: добавьте код для отображения данных
}
Добавим в этот метод код для вывода сообщения.
1. Чтобы приступить к редактированию метода, перейдите в окне просмотра VisualC++ на вкладку ClassView.
2. Найдите в иерархическом списке название класса CWelcomeView (рис. ).
3. Щелкните на знаке “плюс” рядом с элементом. На экране выводится список методов данного класса.
4. Найдите в списке метод OnDraw() и дважды щелкните на нем -- метод откроется в текстовом редакторе.
5. Чтобы изменить поведение нашей программы, добавьте в OnDraw() всего две строки:
void CWelcomeView::OnDraw(CDC* pDC)
{
CString welcome_string = "Добро пожаловать в Visual C++";
CWelcomeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0, 0, welcome_string);
// TODO: добавьте код для отображения данных
}
6. Программа готова. Запустите ее: для этого выполните команду Build > Build welcome.exe, а затем -- команду Build >* Execute welcome.exe. Результат ее работы показан на рис. 2.7.
7. Как видите,программа.успешно) выводит в окне сообщение.
Разберем как она работает.
Исследуем объект приложения
При запуске приложения Windows вызывает функцию WinMain() объекта приложения, поэтому наше знакомство с программой начнется именно с объекта приложения. Объект приложения должен выполнять три задачи:
Рис. 1.7 Программа под Windows
- запустить программу,
- создать главное окно и
- организовать передачу сообщений Windows в главное окно и из него.
Что такое «сообщения Windows»? Это особые сигналы с минимальным объемом служебных данных, посредством которых различные объекты в среде Windows общаются между собой. Например, когда пользователь завершает работу программы, Windows посылает объекту приложения сообщение WM_QU IT. Если же пользователь изменяет размеры окна программы, она получает сообщение WM_SIZE. Наиболее интересные сообщения Windows перечислены в табл. 1.1.
программа visual приложение окно
Таблица 1.1
Некоторые сообщения Windows
Сообщение Windows |
Значение |
|
WM_ACTIVATE |
Окно становится активным или неактивным |
|
WM_ACTIVATEAPP |
Активизируемое окно принадлежит другому приложению |
|
WM_CANCELMODE |
Отмена системного режима |
|
WM_CHILDACTIVATE |
Активизируется дочернее окно |
|
WM_CLOSE |
Окно было закрыто |
|
WM_CREATE |
Была вызвана функция создания окна |
|
WM_DESTROY |
Была вызвана функция уничтожения окна |
|
WM_ENABLE |
Окно было заблокировано или разблокировано |
|
WM_ENDSESSION |
Сеанс работы завершается |
|
WM_ENTERIDLE |
Начало пассивного цикла, которым можно воспользоваться для нужд программы |
|
WM_ERASEBKGND |
Необходимо стереть фон окна |
|
MM_GETMINMAXINFO |
Получение информации о размерах окна |
|
WM_GETTEXT |
Получение текста, связанного с окном |
|
WM_GETTEXTLENGTH |
Получение длины текста, связанного с окном |
|
WM_JCONERASEBKGND |
Необходимо стереть фон окна |
|
WM_KILLFOCUS |
Окно теряет фокус ввода |
|
WM_MENUCHAR |
Пользователь нажал клавишу, не используемую в текущем меню |
|
WM_MENUSELECT |
Выбрана команда меню |
|
WM_MOVE |
Окно переместилось |
|
WM_PAINT |
Перерисовать часть окна |
|
WM_PAINTICON |
Перерисовать часть значка приложения |
|
WM_PARENTNOTIFY |
Окно создается или уничтожается |
|
WM_QUERYENDSESSION |
Получена команда на завершение сеанса |
|
WM_QUIT |
Завершение работы приложения |
|
WM_SETFOCUS |
Окно получило фокус ввода |
|
WM_SETFONT |
Изменился шрифт |
|
WM_SETREDRAW |
Снимает флаг перерисовки |
|
WM_SETTEXT |
Задает текст в заголовке окна |
|
WM_SHOWWINDOW |
Окно необходимо скрыть или вывести на экран |
|
WM_SIZE |
Изменился размер окна |
Объект приложения отсылает большинство полученных сообщений объекту главного окна (не считая WM_QUIT, которое завершает работу объекта приложения).
Объекты в программе на Visual C++ интенсивно общаются друг с другом. Это вполне понятно, поскольку программа делится на четыре главных объекта и каждому из них иногда приходится обращаться к услугам других объектов. На приведенной ниже схеме показано, как организовано взаимодействие четырех главных объектов в программе на Visual C++.
Код объекта приложения содержится в файле welcome.cpp. Наибольший интерес для нас представляет метод Initlnstance(), поскольку именно в нем программа собирает остальные классы (главного окна, документа и вида) и объединяет их в шаблон документа, в соответствии с которым объект приложения организует работу программы:
BOOL CWelcomeApp::InitInstance()
{
AfxEnableControlContainer();
// Стандартная инициализация
// Если вы не пользуетесь какими-либо функциями и желаете
// сократить размер выполняемого файла, удалите
// ненужные процедуры инициализации.
#ifdef _AFXDLL
Enable3dControls(); // Вызывается при использовании
// MFC в виде совместной DLL
#else
Enable3dControlsStatic(); // Вызывается при статической
// компоновке MFC
#endif
// Изменить ключ реестра, под которым будут сохраняться
// параметры. Замените строку более подходящей - например,
// названием вашей компании или организации.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Загрузить стандартные параметры
// из INI-файла (включая MRU)
// Зарегистрировать шаблоны документов приложения.
// Шаблоны документов объединяют документы, обрамленные окна и виды.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CWelcomeDoc),
RUNTIME_CLASS(CMainFrame), // Главноеобрамленноеокно SDI
RUNTIME_CLASS(CWelcomeView));
AddDocTemplate(pDocTemplate);
// Просмотреть командную строку в поисках стандартных команд оболочки,
// DDE и открытия файлов
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Организовать обработку команд, содержащихся в командной строке
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// Было инициализировано всего одно окно; отобразить и обновить его.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
Обратите также внимание на строку m_pMainWnd->ShowWindow(SW_SHOW); в конце метода Initlnstance(). Именно в ней наш объект приложения отображает главное окно программы, вызывая метод ShowWindow() объекта главного окна. Переменная m_pMainWnd содержит указатель на объект главного окна, а оператор -> действует точно так же, как и оператор. («точка»), только он работает с указателем на объект. Другими словами, этот оператор обращается к переменным и методам того объекта, на который ссылается данный указатель.
Имена переменных классов в Visual C++ имеют стандартный префикс m_. На самом деле в Visual C++ аналогичные префиксы используются для всех имен переменных (так называемая «венгерская запись»). Префикс обозначает тип переменной; например, префикс с используется для символьных типов, поэтому с первого взгляда становится ясно, что cinput -- символьная переменная. Наиболее распространенные префиксы венгерской записи перечислены в табл. 1.2.
Таблица 1.2
Префиксы венгерской записи
Префикс |
Значение |
|
а |
Массив |
|
b |
Логический тип (int) |
|
by |
Беззнаковый символьный тип (byte) |
|
с |
Символьный тип |
|
cb |
Счетчик байтов |
|
cr |
Цвет |
|
сх, су |
Короткий тип (short) |
|
dw |
Беззнаковый длинный тип (dword) |
|
fn |
Функция |
|
h |
Логический номер (handle) |
|
i |
Целое |
|
m_ |
Переменная класса |
|
n |
Short или int |
|
np |
Ближний указатель |
|
p |
Указатель |
|
l |
Длинный тип (long) |
|
lp |
Длинный указатель |
|
s |
Строка |
|
sz |
Строка, заканчивающаяся нуль-символом |
|
tm |
Текстовая метрика |
|
w |
Беззнаковое целое (word) |
|
x, y |
Короткий тип (координата х или у) |
Исходный текст объекта приложения находится в файлах welcome.h/welcome.cpp
// welcome.h : главный заголовочный файл для приложения WELCOME
//
#if !defined(AFX_WELCOME_H__AF072C83_900A_11D0_8860_444553540000__INCLUDED_)
#define AFX_WELCOME_H__AF072C83_900A_11D0_8860_444553540000__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h" // основные символические константы
/////////////////////////////////////////////////////////
// CWelcomeApp:
// Реализация этого класса содержится в файле welcome.cpp
//
class CWelcomeApp : public CWinApp
{
public:
CWelcomeApp();
// Переопределения
// Переопределения виртуальных функций, сгенерированные ClassWizard
//{{AFX_VIRTUAL(CWelcomeApp)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Реализация
//{{AFX_MSG(CWelcomeApp)
afx_msg void OnAppAbout();
// ВНИМАНИЕ - здесь ClassWizard вставляет и удаляет функции класса.
// НЕ ИЗМЕНЯЙТЕ содержимое этих частей сгенерированного кода!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ вставляет дополнительные объявления
// перед предшествующей строкой.
#endif
// !defined(AFX_WELCOME_H__AF072C83_900A_11D0_8860_444553540000__INCLUDED_)
// welcome.cpp : определяет поведение классов данного приложения.
//
#include "stdafx.h"
#include "welcome.h"
#include "MainFrm.h"
#include "welcomeDoc.h"
#include "welcomeView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////
// CWelcomeApp
BEGIN_MESSAGE_MAP(CWelcomeApp, CWinApp)
//{{AFX_MSG_MAP(CWelcomeApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// ВНИМАНИЕ - здесь ClassWizard добавляет и удаляет макросы схемы.
// НЕ ИЗМЕНЯЙТЕ содержимое этих частей сгенерированного кода!
//}}AFX_MSG_MAP
// Стандартные файловые команды документа
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Стандартная команда настройки принтера
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
///////////////////////////////////
// Конструктор CWelcomeApp
CWelcomeApp::CWelcomeApp()
{
// TODO: добавьте код конструктора,
// Инициализация наиболее важных переменных и функций
// должна выполняться в InitInstance
}
////////////////////////////////////////////////////////////
// Единственный объект класса CWelcomeApp
CWelcomeApp theApp;
////////////////////////////////////////////////////////
// Инициализация CWelcomeApp
BOOL CWelcomeApp::InitInstance()
{
AfxEnableControlContainer();
// Стандартная инициализация
// Если вы не пользуетесь какими-либо функциями и желаете
// сократить размер выполняемого файла, удалите
// ненужные процедуры инициализации.
#ifdef _AFXDLL
Enable3dControls(); // Вызывается при использовании
// MFC в виде совместной DLL
#else
Enable3dControlsStatic(); // Вызывается при статической
// компоновке MFC
#endif
// Изменить ключ реестра, под которым будут сохраняться
// параметры. Замените строку более подходящей - например,
// названием вашей компании или организации.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Загрузить стандартные параметры
// из INI-файла (включая MRU)
// Зарегистрировать шаблоны документов приложения.
// Шаблоны документов объединяют документы, окна и виды.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CWelcomeDoc),
RUNTIME_CLASS(CMainFrame), // Главное окно SDI
RUNTIME_CLASS(CWelcomeView));
AddDocTemplate(pDocTemplate);
// Просмотреть командную строку в поисках стандартных команд оболочки,
// DDE и открытия файлов
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Организовать обработку команд, содержащихся в командной строке
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// Было инициализировано всего одно окно; отобразить и обновить его.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
////////////////////////////////////////////////////////
// Окно диалога CAboutDlg, отображаемое командой About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Диалоговые данные
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// Переопределения виртуальных функций, сгенерированные ClassWizard
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // Поддержка DDX/DDV
//}}AFX_VIRTUAL
// Реализация
protected:
//{{AFX_MSG(CAboutDlg)
// Обработчики сообщений отсутствуют
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// Обработчики сообщений отсутствуют
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// Команда приложения для вызова окна диалога
void CWelcomeApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
///////////////////////////////////////////////////////////
// Команды CWelcomeApp
Исследуем объект главного окна
Объект главного окна отвечает за всю работу окна программы, за исключением клиентской области.
Это означает, что объект главного окна отвечает за заголовок, строку меню, панель инструментов и строку состояния в нижней части окна. Заголовок и строка меню создаются автоматически при создании окна, а панель инструментов и строка состояния добавляются в методе OnCreate(). В файле MainFrm.cpp это делается так:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS|SIZE_DYNAMIC) ||
!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.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
Хотя меню и панель инструментов отображаются объектом главного окна, в нем почти нет кода для выполнения этой задачи. Основная часть текста программы сосредоточена в объекте вида -- окне, которое накрывает клиентскую область. Главное окно также отображает объект вида, поэтому после краткого знакомства с объектом главного окна мы рассмотрим сам объект вида. Исходный текст объекта главного окна находится в файлах 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 Visual C++ вставляет дополнительные объявления
// перед предшествующей строкой.
#endif
// !defined(AFX_MAINFRM_H__8A1BC189_B34B_11D1_887F_D42B07C10710__INCLUDED_)
// MainFrm.cpp : реализация класса CMainFrame
//
#include "stdafx.h"
#include "welcome.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.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS|SIZE_DYNAMIC) ||
!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.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
Перейдем к объекту вида - он отвечает за отображение данных из документа в клиентской области окна программы. Большая часть наших действий связана именно с объектом вида.
Исследуем объект вида
В объекте вида выводится наше сообщение "Добро пожаловать в Visual C++!". Это происходит в методе OnDraw() файла welcomeView.cpp:
void CWelcomeView::OnDraw(CDC* pDC)
{
CString welcome_string = "Добро пожаловать в Visual C++";
CWelcomeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0, 0, welcome_string);
}
Этот метод вызывается в ситуации, когда требуется перерисовать клиентскую область. На самом деле именно так станут работать все программы -- они будут разбиты на множество различных методов, предназначенных для обработки конкретных сообщений Windows.
Программирование, управляемое событиями
Программы для Windows управляются событиями (event-driven). Это означает, что они реагируют на действия пользователя, называемые событиями, -- щелчки кнопкой мыши, нажатия клавиш и т. д. При наступлении любого из этих событий в программе вызывается соответствующий метод. Тем самым удается разбить ее на небольшие методы, соответствующие различным сообщениям Windows. Например, метод OnDraw() вызывается при необходимости перерисовать клиентскую область -- когда окно впервые отображается на экране, когда пользователь перемещает окно, закрывавшее часть нашего окна, или же сворачивает и разворачивает текущее окно.
Вывод сообщения в объекте вида
Что же происходит в методе OnDraw() при выводе текста? Прежде всего мы создаем новый объект welcome_string, принадлежащий классу MFC CString, и заносим в него текст:
void CWelcomeView::OnDraw(CDC* pDC)
{
CString welcome_string = "Добропожаловатьв Visual C++";
CWelcomeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0, 0, welcome_string);
}
Класс CString содержит все операции со строками. Он чрезвычайно полезен и является заметным достижением по сравнению с принятой в языке С интерпретацией строк как символьных массивов.
Класс 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 |
|
Spanlncluding |
TrimLeft |
TrimRight |
|
UnlockBuffer |
Методы, специфические для Windows |
Затем в методе OnDraw() мы выводим текстовую строку через переданный методу указатель pDC, который ссылается на объект класса MFC с именем CDC. Конкретно, мы вызываем метод Text0ut() этого объекта:
void CWelcomeView::OnDraw(CDC* pDC)
{
CString welcome_string = "Добро пожаловать в Visual C++";
CWelcomeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0, 0, welcome_string);
}
Класс CDC чрезвычайно важен для нас, поскольку он предназначен для работы с ком-текстами устройств. Весь графический и текстовый вывод, выполняемый нами в Visual C++, будет осуществляться через контексты устройств.'
Контекст устройства
« Контекст устройства »- область памяти, используемая в системе Windows для выполнения графических операций. Графический вывод может выполняться как на экран, так и на принтер. Объекты класса CDC содержат множество встроенных методов, используемых в процессе рисования в контексте устройства. Все рисование в Windows выполняется через контекст устройства.
На первый взгляд может показаться, что контексты устройств усложняют ситуацию, но вообще-то они упрощают ее. Дело в том, что они могут соответствовать самым разным устройствам, например, экрану монитора или принтеру. Если вы рисуете через контекст устройства, то изображение будет правильно отображаться на разных устройствах, в том числе на экране и на принтере.
Чтобы рисовать в нашем объекте вида, мы получаем контекст устройства, относящийся к нему. Кроме того, можно получить контекст устройства для всего окна, всего экрана или принтера. Для рисования в контексте устройства используются перечисленные ниже методы класса CDC; обратите внимание на их количество.
AbortDoc |
AbortPath |
AddMetaFileComment |
||
AngleArc |
Arc |
ArcTo |
||
Attach |
BeginPath |
BitBIt |
||
CDC |
Chord |
CloseFigure |
||
CreateCoinpatibleDC |
CreateDC |
CreateIC |
||
DeleteDC |
DeleteTempMap |
Detach |
||
DPtoHIMETRIC |
DPtoLP |
Draw3dRect |
||
DrawDragRect |
DrawEdge |
DrawEscape |
||
DrawFocusRect |
DrawFrameControl |
Drawlcon |
||
DrawState |
DrawText |
Ellipse |
||
EndDoc |
EndPage |
End path |
||
EnuinObjects |
Escape |
ExcludeClipRect |
||
ExcludeUpdateRgn |
ExtFloodFill |
ExtTextOut |
||
FillPath |
FillRect |
FillRgn |
||
FillSolidRect |
FlattenPath |
FloodFill |
||
FrameRect |
FrameRgn |
FromHandle |
||
QetArcDirection |
GetAspectRatioFilter |
GetBkColor |
||
QetBkMode |
GetBoundsRect |
GetBrushOrg |
||
GetCharABCWidths |
GetCharWidth |
GetClipBox |
||
GetColorAdj,ustment |
GetCurrentBltmap |
QetCurrentBrush |
||
GetCurrentFont |
GetCurrentPalette |
GetCurrentPen |
||
GetCurrentPosition |
GetDeviceCaps |
QetFontData |
||
GetGlyphOutline |
GetHalftoneBrush |
GetKerningPairs |
||
GetMapMode |
GetMiterLiinit |
GetNearestColor |
||
GetOutlineTextMet rics |
GetOutputCharWidth |
GetOutputTabbedTextExtent |
||
GetOutputTextExtent |
GetOutputTextMet rics |
GetPath |
||
Get Pixel |
GetPolyFillMode |
GetROP2 |
||
GetSafeHdc |
GetStretchBltMode |
GetTabbedTextExtent i |
||
GetTextAlign |
GetTextCharacterExtra |
GetTextColor |
||
GetTextЈxtent |
GetTextFace |
GetTextMetrics |
||
GetViewportExt |
GetViewportOrg |
GetWindow |
||
GetWindowExt |
GetWindowOrg |
GrayString |
||
HIMETRICtoDP |
HIMETRICtoLP |
IntersecllipRect |
||
InvertRect |
InvertRgn |
LineTo |
||
LPtoDP |
LPtoHIMETRIC |
MaskBIt |
||
MoveTo |
OffsetClipRgn |
OffsetViewpotOrg |
||
OffsetWindowOrg |
PaintRgn |
PatBIt |
||
Pie |
PlayMetafile |
PIgBIt |
||
PolyBezier |
PolyBezierTo |
PolyDraw |
||
Polygon |
Polyline |
PolylineTo |
||
PolyPolygon |
PolyPolyline |
PtVisible |
||
QueryAbort |
RealizePalette |
Rectangle |
||
RectVisible |
ReleaseAttribDC |
ReleaseOutputDC |
||
ResetDC |
RestoreDG |
RoundRect |
||
SaveDC |
ScaleViewportExt |
ScaleWindowExt |
||
ScrollDC |
SelectClipPath |
SelectClipRgn |
||
SelectObject |
SelectPalette |
SelectStockObject |
||
SetAbortProc |
SetArcOirection |
SetAttribDC |
||
SetBkColor |
SetBkMode |
SetBoundsRect |
||
SetBrushOrg |
SetCоlorAdjustment |
SetMapMode |
||
SetMapperFlags |
SetMiterLimit |
SetOutputDC |
||
SetPixel |
SetPixelV |
SetPolyFillMode |
||
SetROP2 |
SetStretchBltMode |
SetTextAlign |
||
SetTextCharacterExtra |
SetTextColor |
SetTextJustification |
||
SetViewportExt |
SetViewportOrg |
SetWindowExt |
||
SetWindowOrg |
Start Doc |
StartPage |
||
StretchBIt |
StrokeAndFillPath |
StrokePath |
||
TabbedTextOut |
TextOut |
UpdateColors |
||
WidenPath |
В нашем случае для вывода в объекте вида (соответствующего клиентской области окна) был использован метод TextOut класса CDC. Методу OnDraw() передается указатель pDC, ссылающийся на контекст устройства для нашего вида. Чтобы вывести текст welcome_string в клиентской области, достаточно выполнить следующую строку:
pDC->TextOut(0, 0, welcome_string);
Методу TextOut () передаются координаты левого верхнего угла той области окна, где должна располагаться наша строка. В нашем случае текст выводится с точки (0,0) -- левого верхнего угла клиентской области. Затем метод получает саму строку, welcome_string.
Итак, выполнение этой строки программы приводит к тому, что наша строка выводится на экран. Так данные программы отображаются в объекте вида. В последующих уроках мы узнаем об объекте вида намного больше, потому что именно с ним будет связана основная часть программирования. Исходный текст объекта вида находится в файлах welcomeView.h/welcomeView.cpp.
В различные моменты работы программа может передавать методу OnDraw() разные контексты устройств. Например, когда мы добавили код в метод OnDraw(), в нашей программе появилась возможность вывода на печать. Если пользователь выполнит команду File >* Print или нажмет кнопку с принтером на панели инструментов, программа передаст методу OnDraw() контекст устройства для принтера и наш текст будет напечатан. Если вы захотите предпринять какие-то специальные действия для подготовки печати (например, особым образом отформатировать свой документ), можете внести соответствующий код в метод OnPreparePrinting().
// welcomeView.h : интерфейс класса CWelcomeView
//
//////////////////////////////////////////////////////////
#if !defined(AFX_WELCOMEVIEW_H__AF072C8B_900A_11D0_8860_444553540000__INCLUDED_)
#define AFX_WELCOMEVIEW_H__AF072C8B_900A_11D0_8860_444553540000__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CWelcomeView : public CView
{
protected: // создание только при сериализации
CWelcomeView();
DECLARE_DYNCREATE(CWelcomeView)
// Атрибуты
public:
CWelcomeDoc* GetDocument();
// Операции
public:
// Переопределения
// Переопределения виртуальных функций, сгенерированные ClassWizard
//{{AFX_VIRTUAL(CWelcomeView)
public:
virtual void OnDraw(CDC* pDC); // переопределяется для рисования
// в текущем виде
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
// Реализация
public:
virtual ~CWelcomeView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Сгенерированные функции схемы сообщений
protected:
//{{AFX_MSG(CWelcomeView)
// ВНИМАНИЕ - здесь ClassWizard вставляет и удаляет функции класса.
// НЕ ИЗМЕНЯЙТЕ содержимое этих блоков сгенерированного кода!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // отладочная версия - в welcomeView.cpp
inline CWelcomeDoc* CWelcomeView::GetDocument()
{ return (CWelcomeDoc*)m_pDocument; }
#endif
///////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ вставляет дополнительные объявления
// перед предшествующей строкой.
#endif
// !defined(AFX_WELCOMEVIEW_H__AF072C8B_900A_
// 11D0_8860_444553540000__INCLUDED_)
// welcomeView.cpp : реализация класса CWelcomeView
//
#include "stdafx.h"
#include "welcome.h"
#include "welcomeDoc.h"
#include "welcomeView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////
// CWelcomeView
IMPLEMENT_DYNCREATE(CWelcomeView, CView)
BEGIN_MESSAGE_MAP(CWelcomeView, CView)
//{{AFX_MSG_MAP(CWelcomeView)
// ВНИМАНИЕ - здесь ClassWizard добавляет и удаляет макросы схемы.
// НЕ ИЗМЕНЯЙТЕ содержимое этих частей сгенерированного кода!
//}}AFX_MSG_MAP
// Стандартные команды печати
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()
/////////////////////////////////////////////////////////
// Создание/уничтожение CWelcomeView
CWelcomeView::CWelcomeView()
{
// TODO: добавьте код конструктора
}
CWelcomeView::~CWelcomeView()
{
}
BOOL CWelcomeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Измените класс окна или его стили, редактируя
// содержимое CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////
// Рисование в CWelcomeView
void CWelcomeView::OnDraw(CDC* pDC)
{
CString welcome_string = "Добро пожаловать в Visual C++";
CWelcomeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0, 0, welcome_string);
// TODO: добавьте код для отображения данных
}
//////////////////////////////////////////////////////////
// Печать в CWelcomeView
BOOL CWelcomeView::OnPreparePrinting(CPrintInfo* pInfo)
{
// Стандартная подготовка
return DoPreparePrinting(pInfo);
}
void CWelcomeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: добавьте дополнительную инициализацию перед печатью
}
void CWelcomeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: добавьте код для "сборки мусора" после печати
}
///////////////////////////////////////////////////////////
// Диагностика в CWelcomeView
#ifdef _DEBUG
void CWelcomeView::AssertValid() const
{
CView::AssertValid();
}
void CWelcomeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CWelcomeDoc* CWelcomeView::GetDocument() // не-отладочная версия
// является встроенной
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWelcomeDoc)));
return (CWelcomeDoc*)m_pDocument;
}
#endif //_DEBUG
Объект вида отображает данные программы, которые обычно хранятся в объекте документа. Сейчас мы рассмотрим последний из четырех основных объектов нашей программы.
Исследуем объект документа
В объекте документа хранятся данные программы. В примере welcome нам потребовался только объект welco(ne_st ring. Для простоты мы разместили его в объекте вида, но на самом деле ему следовало бы находиться в объекте документа.
Как разместить welcome_st ring в объекте документа? Прежде всего нам следовало бы объявить welcome_string в заголовочном файле документа welcomeDoc.h:
// welcomeDoc.h : интерфейс класса CWelcomeDoc
//
////////////////////////////////////////////////////////////
#if !defined(AFX_WELCOMEDOC_H__AF072C89_900A_11D0_8860_444553540000__INCLUDED_)
#define AFX_WELCOMEDOC_H__AF072C89_900A_11D0_8860_444553540000__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CWelcomeDoc : public CDocument
{
protected: // создание только при сериализации
CWelcomeDoc();
DECLARE_DYNCREATE(CWelcomeDoc)
CString welcome_String;
.
.
.
}
Затем мы инициализируем объект welcome_st ring в конструкторе класса документа, расположенном в файле welcomeDoc.cpp:
CWelcomeDoc::CWelcomeDoc()
{
welcome_string = "Добро пожаловать в Visual C++!"
}
Данные хранятся в объекте документа и готовы к работе -- но как обратиться к ним из объекта вида?
Обращение к документу из вида
Если взглянуть на код, сгенерированный AppWizard для нашего класса вида, можно заметить, что в нем уже есть фрагмент для получения указателя на объект документа с помощью метода GetDocument() класса вида. AppWizard присвоил этому указателю имя pDoc:
void CWelcomeView::OnDraw(CDC* pDC)
{
CWelcomeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
.
.
}
Возможно, вы обратили внимание на строку ASSERT_VALID(pDoc) в приведенном выше фрагменте. Здесь Visual C++ вызывает макрос ASSERT_VALID и проверяет, что все прошло нормально и полученным ...
Подобные документы
Программирование и структура программы на языке Turbo Pascal и MS Visual C++6.0. Вычисление площади круга. Реализация программы в системе Turbo Pascal и MS VISUAL C++6.0 для Windows. Структура окна ТРW. Сохранение текста программы в файле на диске.
лабораторная работа [3,7 M], добавлен 22.03.2012Принципы визуального программирования. Создание программы, генерирующей звук через определенные промежутки времени. Visual Basic как средство разработки прототипов программы, для разработки приложений баз данных и компонентного способа создания программ.
лабораторная работа [1,1 M], добавлен 10.12.2014Теоретические основы разработки Windows-приложений с использованием библиотеки MFC. Создание приложения с помощью Visual C++. Описание логической структуры приложения. Установка и запуск программы. Входные и выходные данные. Преимущество MFC библиотек.
курсовая работа [563,2 K], добавлен 21.06.2011Исследование теоретических аспектов разработки программы посредством использования Visual Basic. Анализ достоинств и недостатков данного языка программирования. Изучение особенностей создания интерфейса приложения. Основные этапы реализации программы.
практическая работа [460,6 K], добавлен 22.01.2013Техника создания графики при помощи API функций, экспортируемых библиотекой GDI32.DLL. Разработка на языке программирования С++ в среде программирования Microsoft Visual C++ программы для отображения часов реального времени в цифровом и аналоговом виде.
курсовая работа [2,8 M], добавлен 27.01.2010Основы языка Visual Prolog. Введение в логическое программирование. Особенности составления прологов, синтаксис логики предикатов. Программы на Visual Prolog. Унификация и поиск с возвратом. Использование нескольких значений как единого целого.
лекция [120,5 K], добавлен 28.05.2010Объектно-ориентированная технология создания программ. Среда разработки Visual Studio.NET. Особенности среды Microsoft Visual Studio 2010. Приложения C# для расчетов по формулам, консольный ввод-вывод. Форматирование значений данных. Программы с циклами.
методичка [2,1 M], добавлен 11.09.2014Теоретические основы создания баз данных в Visual Foxpro 9.0. Описание программы, использование ее команд. Создание табличной базы данных, отношений между таблицами в многотабличной базе данных больных в больнице. Редактирование табличного отчета.
курсовая работа [681,2 K], добавлен 19.12.2013Разработка программы FileInfo, выдающей полную информацию о заданном файле с применением языка программирования С++, используя API функции Win 32. Использование пространств имён .NetFramework. Руководство пользователя и системные требования программы.
курсовая работа [1,2 M], добавлен 25.04.2012Глoбальныe фyнкции AFX и API. Сoзданиe пpилoжeния с пoмoщью Visual C++. Фyнкциoнальнoe назначeниe, описание логической структуры разрабатываемой программы "Десятичные дроби". Тpeбoвания к тexничeскoмy oбeспeчeнию, листинг и тестирование данной программы.
курсовая работа [2,7 M], добавлен 21.06.2011Структура и основные операции коммерческого банка. Использование языка программирования Visual Basic for Application, математическая формулировка задачи. Разработка модуля программы расчёта кредитов и депозитов. Схема алгоритма выполнения программы.
курсовая работа [2,9 M], добавлен 09.04.2012Общие сведения о работе программы в среде программирования Microsoft Visual Studio 2008, на языке программирования C++. Ее функциональное назначение. Инсталляция и выполнение программы. Разработанные меню и интерфейсы. Алгоритм программного обеспечения.
курсовая работа [585,5 K], добавлен 24.03.2009Разработка приложения Windows "Учет заказов и продаж". Структура базы данных, информационное и программное обеспечение. Описание программы на языке Visual C+ с использованием технологии Microsoft.net, элементы управления и руководство пользователя.
курсовая работа [4,8 M], добавлен 25.06.2011Создание программы на языке Visual C++ с использованием библиотеки MFC для тестирования знаний пользователя в области геометрии. Генерирование тестовых заданий, введение ответа, оценка результата; логическая структура приложения; техническое обеспечение.
курсовая работа [2,1 M], добавлен 26.06.2011Разработка программного продукта с помощью языка программирования Visual Basic. Описание интерфейса пользователя и возможностей программы. Исходный код основных модулей. Программа, демонстрирующая основные возможности диаграмм и среды Visual Basic.
контрольная работа [989,9 K], добавлен 29.03.2011Создание приложения Windows Forms в среде Microsoft Visual Studio 2008. Разработка программы "Курсовой" для организации работы по учёту курсовых работ в учебных заведениях с возможностью добавления, удаления, редактирования и поиска информации.
курсовая работа [2,2 M], добавлен 28.06.2011Теоретические основы написания Windows-приложений с использованием библиотеки MFC. Основы программирования под Windows. Проектирование приложений в среде Microsoft Visual C++. Описание логической структуры приложения, его функциональное назначение.
курсовая работа [1,3 M], добавлен 12.12.2011Основы языка программирвоания C++. Элементы управления в Microsoft Visual C++. Алгоритмические конструкции языка программирования Visual C++ и базовые элементы управления. Глобальные константы и переменные. Управление программой с помощью клавиатуры.
курсовая работа [1,7 M], добавлен 08.04.2015Язык программирования Visual Basic: краткая история возникновения, значение и общая характеристика. Изучение основных свойств Visual Basic, синтаксис языка. Обзор ключевых операторов Visual Basic, пользовательские процедуры и функции данного языка.
контрольная работа [36,4 K], добавлен 23.07.2014Разработка программы "Виселица" с использованием программной среды Visual Basic и средств объектно-ориентированного программирования: программные требования, описание алгоритма, блок-схема программы и дополнительной процедуры. Листинг программы.
курсовая работа [188,2 K], добавлен 28.06.2009