АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Void CPainterView::OnMouseMove(UINT nFlags, CPoint point)

Читайте также:
  1. Void CPainterView::OnLButtonUp(UINT nFlags, CPoint point)

{

int nOldMode;

CClientDC* pDC = new CClientDC(this);

……………………………………………..

if((nFlags && MK_LBUTTON) && bRectangleFlag){

CClientDC dc(this);

nOldMode = pDC->GetROP2();

pDC->SetROP2(R2_NOT);

pDC->SelectStockObject(NULL_BRUSH);

pDC->Rectangle(OldPoint.x, OldPoint.y, Anchor.x, Anchor.y);

pDC->Rectangle(Anchor.x, Anchor.y, point.x, point.y);

OldPoint.x = point.x;

OldPoint.y = point.y;

pDC->SetROP2(nOldMode);

}

if((nFlags && MK_LBUTTON) && bEllipseFlag){

CClientDC dc(this);

nOldMode = pDC->GetROP2();

pDC->SetROP2(R2_NOT);

pDC->SelectStockObject(NULL_BRUSH);

pDC->Ellipse(OldPoint.x, OldPoint.y, Anchor.x, Anchor.y);

pDC->Ellipse(Anchor.x, Anchor.y, point.x, point.y);

OldPoint.x = point.x;

OldPoint.y = point.y;

pDC->SetROP2(nOldMode);

}

delete pDC;

CView::OnMouseMove(nFlags, point);

}

Когда пользователь нажимает кнопку мыши и перемещает указатель к конечной точке, на экране растягивается фигура нужного типа — пользователь видит, как будет выглядеть готовое изображение. Теперь эта чрезвычайно полезная возможность реализована в программе painter.

И все же программу рано считать законченной — мы еще не написали метод OnDraw(). Его код обновляет изображение в окне программы. В сложных приложениях с написанием метода OnDraw() нередко возникают проблемы, потому что в нем необходимо воспроизвести все изображение, каким бы сложным оно ни было.

Например, в нашем случае пользователь может нарисовать сколько угодно фигур различных типов. Как выйти из положения — неужели придется запоминать каждое перемещение мыши? Как мы вскоре убедимся, возможный выход заключается в использовании метафайлов.

 

Обновление изображения в программе painter

Метафайлом называется хранящийся в памяти объект, поддерживающий собственный контекст устройства. Любые операции, выполняемые с контекстом устройства, можно продублировать в метафайле. Если позднее потребуется повторить действия, выполненные пользователем (например, при обновлении изображения), можно просто воспроизвести данный метафайл. В результате все графические операции повторяются, что приводит к автоматическому созданию нужного изображения. Давайте посмотрим, как это делается. Методы класса CMetaFileDC перечислены в табл. 2.

 

Таблица 2. Методы класса CmetaFileDC

Метод Назначение
Close Закрывает контекст устройства и создает логический номер метафайла
CloseEnchanced Закрывает контекст устройства улучшенного метафайла и создает логический номер улучшенного метафайла
CMetaFileDC Конструирует объект класса CMetaFileDC
Create Создает контекст устройства Windows для метафайла и связывает его с объектом CmetaFileDC
CreateEnchanced Создает контекст устройства Windows для метафайла улучшенного формата

 

 

Обновление экрана происходит в методе OnDraw(). В настоящий момент он выглядит так:

 

void CPainterView::OnDraw(CDC* pDC)

{

CpainterDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: добавьте код для отображения данных

}

 

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

Сначала мы включим в заголовочный файл документа указатель на контекст устройства метафайла pMetaFileDC, который будет использоваться в программе:

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)