2014-02-04 4 views
2

Я использую MFC (но это также относится к Win32), и у меня есть представление, которое я хочу рисовать. Поэтому я переопределяю метод OnDraw. Вот немного psuedocode, я кодирования:Как создать контекст устройства суб-прямоугольника для рисования на

void OnDraw(DC* pDC) 
{ 
    foreach(Node n in nodes) 
    { 
    n->DrawOnCanvas(pDC) 
    } 
} 

Я думал, что это было хорошее решение OO. Но я столкнулся с проблемой. Теперь я хочу нарисовать границу вокруг исходного DC, но я не хочу, чтобы узлы знали об этом. Я хочу, чтобы узлы все еще рисовали относительно полного размера холста, начиная с 0,0 (и не знали о смещении). Если я дам узлам знания о границе в родительском окне, это кажется беспорядочным.
Как вы решаете такие проблемы? Как я могу определить новый DC, который по сравнению с существующим?

+1

Хитрость состоит в том, чтобы передать весь прямоугольник чертежа каждому узлу, но перед тем, как сделать это, скопируйте «недопустимый» прямоугольник DC на уменьшенный размер. Это позволяет узлам рисовать на полный прямоугольник и оставляет GDI для вырезания битов, которые будут перезаписывать границу. Функции поиска, такие как 'CDC :: Set/GetBoundsRect' и' CDC :: ExcludeClipRect'. – user1793036

+0

Я никогда не видел этих функций раньше, и после небольшой игры я не мог заставить их делать что-нибудь полезное. Это выглядит действительно интересно, есть ли у вас образец кода? – DanDan

ответ

3

Вы не создаете новый DC, вы устанавливаете источник на существующий. Поэтому в вашем цикле перед DrawOnCanvas() вы должны использовать CDC :: SetViewportOrg() и друзей. См. http://msdn.microsoft.com/en-us/library/46t66w7t.aspx. Вы также можете реализовать масштабирование, прокрутку и т. Д.

+0

Это помогло, спасибо. Это действительно разрушило мой существующий CScrollView, поэтому вам нужно добавить то, что может быть первым изначально: CPoint currentOrigin; GetViewportOrgEx (pDC-> GetSafeHdc(), и currentOrigin); SetViewportOrgEx (pDC-> GetSafeHdc(), currentOrigin.x + XBorder, currentOrigin.y + YBorder, NULL); – DanDan

+1

Да, это так, CScrollView использует тот же механизм для прокрутки. Хорошо, что у вас это работает - вот некоторые волосатые вещи, которые могут вызвать много горя :) – Roel

 Смежные вопросы

  • Нет связанных вопросов^_^