|
|||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Void CPainterView::OnMouseMove(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
Обновление экрана происходит в методе OnDraw(). В настоящий момент он выглядит так:
void CPainterView::OnDraw(CDC* pDC) { CpainterDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: добавьте код для отображения данных }
Следующий фрагмент кода предназначен для обновления изображения в окне. После создания контекста устройства для метафайла в нем можно рисовать, дублируя основные графические операции в окне. Когда придет время обновить изображение, мы просто воспроизведем наш метафайл. Сначала мы включим в заголовочный файл документа указатель на контекст устройства метафайла pMetaFileDC, который будет использоваться в программе:
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |