Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии программирования. Программирование графических интерфейс

.pdf
Скачиваний:
3
Добавлен:
15.11.2022
Размер:
2.24 Mб
Скачать

4.В карту сообщений записать макрос для нашего сообщения. Его имя – это ON_ плюс имя сообщения.

5.Определить метод для обработки сообщения (записать код метода).

Для того чтобы наша программа выполнялась, необходимо создать объект класса приложения, например CMyApp theApp.

3.3. Классы графического интерфейса

Библиотека MFC обеспечивает программиста мощными средствами графического вывода в виде функций – членов соответствующих классов. При этом библиотечные классы берут на себя большую часть работы по созданию, инициализации и корректному освобождению графических ресурсов.

Для организации графического вывода приложению необходимо работать как с контекстом устройства, так и с рядом объектов GDI: перьями, кистями, шрифтами и т.д. Однако функции рисования связаны именно с контекстом устройства.

Классы контекстов устройств и графических объектов инкапсулируют функции API.

Для контетста устройств MFC предоставляет следующие классы (рис. 3.1).

Рис. 3.1

51

Экран дисплея в Windows рассматривается как три графических устройства, для каждого из которых можно создать и определить свой контекст устройства. Этими устройствами являются: весь экран; Windows-окно; клиентская область окна.

Класс CDC

Класс CDC – это базовый класс контекста устройства. Объекты этого класса используются для работы со всем экраном дисплея или с таким устройством, как принтер. Кроме того, именно указатель CDC* передается в такие функции, как, например,CView::OnDraw(), хотя может фактически указывать на объекты других производных классов контекстов устройств.

В программе контекст устройства создается вызовом соответствующего конструктора

CPaintDC::CPaintDC(CWnd*pWnd);

CClientDC::CClientDC(CWnd*pWnd);

Например, CClientDC dc(pWnd);

3.4. Графические объекты

Библиотека MFC обеспечивает разработчиков всеми необходимыми классами, которые инкапсулируют соответствующие графические объекты Windows. Кроме того, библиотека имеет в своем составе дополнительные классы, значительно облегчающие решение ряда задач (классы CPoint, CSize, CRect, CRectTracker) или унифицирующие работу с графическими объектами как таковыми (CGdiObject).

Для графических объектов MFC предоставляет следующие классы.

Класс CGdiObject

Базовый класс для всех классов, обеспечивающий интерфейс с графическими объектами Windows.

Класс CPen

Инкапсулирует объект Windows «перо», который может быть выбран в контекст устройства и использоваться для определения типа и цвета линий или графических фигур.

52

Класс CBrush

Инкапсулирует объект Windows «кисть», который может быть выбран в контекст устройства и использоваться для определениятипаи цветазаливкивнутреннихобластей замкнутых фигур.

Класс CFont

Инкапсулирует объект Windows «шрифт», который может быть выбран в контекст устройства и использоваться при операциях вывода текстовой информации.

Создать объект класса CPen или CBrush можно двумя способами:

1. Конструктор используется как для создания собственно объекта, так и для его инициализации.

Пример 3.1

CPen pen(PS_DOT,1,RGB(255,0,0)); CBrush brush(HS_CROSS,RGB(0,255,0));

2.Конструктор используется только для создания объекта,

адля его инициализации дополнительно вызывается функции (эта функции имеет префикс Create).

Пример 3.2

CPen pen; pen.CreatePen(PS_SOLID,2,RGB(200,150,50)); CBrush brush;

brush.CreateSolidBrush(RGB(0,0,255));

Чтобы настроить параметры рисования с помощью соответствующего графического объекта, необходимо выполнить следующие действия:

1)создать графический объект;

2)заменить в контексте устройства текущий графический объект вновь созданным, сохранив при этом указатель на «старый» объект;

3)закончив операции рисования, восстановить «старый» графический объект в контексте устройства при помощи сохраненного указателя;

53

4) обеспечить удаление созданного объекта при выходе из области видимости, что происходит автоматически для объектов, созданных в стеке приложения.

Установка объектов рисования выполняется функцией

SelectObject()

CPen* SelectObject( CPen* pPen ); CBrush* SelectObject( CBrush* pBrush );

virtual CFont* SelectObject( CFont* pFont );

Кроме графических объектов, созданных в приложении, можно использовать и предопределенные системные объекты. Для установки системных графических объектов используется

функция SelectStockObject( )

virtual CGdiObject* SelectStockObject( int nIndex );

Параметр nIndex задает тип создаваемого объекта.

Для отображения графических фигур можно использовать следующие функции – члены класса CDC, инкапсулирующие соответствующие функции API:

прямоугольник (квадрат)

BOOL Rectangle( int x1, int y1, int x2, int y2 );

BOOL Rectangle( LPCRECT lpRect );

эллипс (окружность)

BOOL Ellipse( int x1, int y1, int x2, int y2 );

BOOL Ellipse( LPCRECT lpRect );

сегмент

BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );

BOOL Chord( LPCRECT lpRect, POINT ptStart, POINT

ptEnd );

сектор

BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );

BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );

Фигуры рисуются установленным пером CPen и закрашиваются кистью CBrush.

54

Для вывода текста можно использовать функции – члены класса CDC DrawText() и TextOut() , инкапсулирующие соответствующие функции API.

int DrawText(LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat );

int DrawText(const CString& str, LPRECT lpRect, UINT nFormat );

virtual BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount );

BOOL TextOut(int x, int y, const CString& str );

Цвет символов и фона текста устанавливается следующими функциями:

CDC::virtual COLORREF SetTextColor(COLORREF crColor );

CDC::virtual COLORREF SetBkColor(COLORREF

crColor );

Для создания шрифта для вывода текста необходимо создать объект класса TFont, проинициализировать его и установить в контексте устройства.

CFont::BOOL CreateFontIndirect(const LOGFONT* lpLogFont );

Пример 3.3

CFont font; LOGFONT lf;

memset(&lf, 0, sizeof(LOGFONT)); lf.lfHeight = 12; strcpy(lf.lfFaceName, "Arial");

VERIFY(font.CreateFontIndirect(&lf)); CClientDC dc(this);

CFont* def_font = dc.SelectObject(&font);

dc.TextOut(5, 5, "Hello", 5); dc.SelectObject(def_font); font.DeleteObject();

55

CFont::BOOL CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );

Пример 3.4

 

 

CFont font;

 

 

VERIFY(font.CreateFont(

 

12,

// nHeight

0,

// nWidth

 

0,

// nEscapement

0,

// nOrientation

FW_NORMAL,

// nWeight

FALSE,

// bItalic

 

FALSE,

// bUnderline

0,

// cStrikeOut

ANSI_CHARSET,

// nCharSet

OUT_DEFAULT_PRECIS,

// nOutPrecision

CLIP_DEFAULT_PRECIS,

// nClipPrecision

DEFAULT_QUALITY,

// nQuality

DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily

"Arial"));

// lpszFacename

CClientDC dc(this);

 

CFont* def_font = dc.SelectObject(&font); dc.TextOut(5, 5, "Hello", 5); dc.SelectObject(def_font); font.DeleteObject();

BOOL CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL);

56

Пример 3.5

CClientDC dc(this); CFont font;

VERIFY(font.CreatePointFont(120, "Arial", &dc)); CFont* def_font = dc.SelectObject(&font); dc.TextOut(5, 5, "Hello", 5); dc.SelectObject(def_font);

font.DeleteObject();

3.5.Пример содания приложения с графимой

1.Загружаем Visual C++ и выбираем File->New.

2.Выбираем тип проекта Win32 Application. Этот тип – приложение под Windows, но без использования MFC. MFC же подсоединяем позже (рис. 3.2).

Рис. 3.2

3. Задаем имя проекту, например, mfc.

В последующих диалоговых окнах отвечаем по умолчанию. После этого у вас возникает пустой проект.

4.Добавяем в проект файлы. Для этого снова выбираем File->New (рис. 3.3). Сейчас уже активна вкладка Files. В списке файлов выбираем C++ Source file.

5.Вводим имя файла и убеждаемся, что строка Add to Project отмечена галочкой.

57

Рис. 3.3

6. Укажем явно, что мы хотим использовать MFC. Для этого заходим в менюProject идалееSettings (рис. 3.4).

Рис. 3.4

В диалоге Project Settings выбираем Use MFC in a Shared DLL. Теперь наш проект будет использовать MFC (рис. 3.5).

7. Закрываем диалог, нажав OK.

58

Рис. 3.5

8. Вставяем в файл вашего приложения следующий код:

#include <afxwin.h>

class CMyMainWnd : public CFrameWnd{

public:

// конструктор

CMyMainWnd(){Create(NULL,"My title");} };

class CMyApp : public CWinApp{

public:

CMyApp(){}; // конструктор virtual BOOL InitInstance(){

m_pMainWnd=new CMyMainWnd(); m_pMainWnd->ShowWindow(SW_SHOW); return TRUE;

}

};

CMyApp theApp;

59

9. Запускаем программу на выполнение. Должно появиться окно с заголовком "My title" (рис. 3.6).

Рис. 3.6

10. Разбирем программный код.

Мы создали два класса: CMyMainWnd и CMyApp. Первый из них задаёт главное окно нашего приложения, второй – само приложение. В конце нашего кода в строке CMyApp theApp; мы создаем экземпляр нашего приложения.

Вклассе главного окна ничего, кроме конструктора, нет.

Вконструкторе вызываем метод Create, который наш класс окна наследует от родительского класса.

Вклассе CMyApp переопределяется функция InitInstance родительского класса. В ней в строке

m_pMainWnd=new CMyMainWnd();

динамически создается новый экземпляр нашего главного окна. В следующей строке

m_pMainWnd->ShowWindow(SW_SHOW);

созданное окно показывается на экране.

11. Сделаем так, чтобы программа обращала внимание на наши действия. Например, чтобы при щелчке мышкой появ-

лялся MessageBox.

Для этого в наш класс окна вставьте следующие строчки (они выделены):

class CMyMainWnd : public CFrameWnd{ public:

CMyMainWnd(){ Create(NULL,"My title");

60