<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418709&amp;view=findpost&amp;p=3831150</guid>
        <pubDate>Wed, 20 May 2020 05:18:59 +0000</pubDate>
        <title>Direct2D</title>
        <link>https://forum.sources.ru/index.php?showtopic=418709&amp;view=findpost&amp;p=3831150</link>
        <description><![CDATA[Black_Dragon: Начал изучать. Надо рисовать схемы с прокруткой и масштабированием.<br>
Для основы взял:<br>
<a class='tag-url' href='https://docs.microsoft.com/ru-ru/cpp/mfc/walkthrough-adding-a-d2d-object-to-an-mfc-project?view=vs-2019' target='_blank'>https://docs.microsoft.com/ru-ru/cpp/mfc/wa...ct?view=vs-2019</a><br>
Используются костыли в коде для его корректной работе в двух разных примерах<br>
Гугл на Direct2D дает только разные примеры (ну и топиики с проблемами), как рисовать и т.д. в виде полноценной документации у меня не находится.<br>
<br>
VS 2019<br>
<strong class='tag-b'>I Первая проблема</strong><br>
Создал проект MFC с одним документов без Document/View<br>
<br>
При изменении размера окна, по факту, сперва вызывается OnDraw2D, а потом OnSize.<br>
Хотя, если смотреть пример из документации, то по логике, должно быть на оборот, так как в OnSize меняются настройки Градиента от размера окна (в коде перенесено в OnDraw2D).<br>
<br>
CScrollGraph<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class CScrollGraph : public CScrollView</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;DECLARE_DYNCREATE(CScrollGraph)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CD2DTextFormat &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*m_pTextFormat = nullptr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CD2DSolidColorBrush &nbsp; &nbsp; *m_pBlackBrush = nullptr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CD2DLinearGradientBrush *m_pLinearGradientBrush = nullptr;</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollGraph(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // защищенный конструктор, используемый при динамическом создании</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual ~CScrollGraph();</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">#ifdef _DEBUG</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void AssertValid() const;</div><div class="code_line">#ifndef _WIN32_WCE</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void Dump(CDumpContext&amp; dc) const;</div><div class="code_line">#endif</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">protected:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void OnDraw(CDC* pDC); &nbsp; &nbsp; &nbsp;// для отрисовки этого представления</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void OnInitialUpdate(); &nbsp; &nbsp; // впервые после создания</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DECLARE_MESSAGE_MAP()</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/);</div><div class="code_line">protected:</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg LRESULT OnDraw2D(WPARAM wParam, LPARAM lParam);</div><div class="code_line">&nbsp;&nbsp; &nbsp;void InitObj1();</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg void OnSize(UINT nType, int cx, int cy);</div><div class="code_line">};</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script></div></div><br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">IMPLEMENT_DYNCREATE(CScrollGraph, CScrollView)</div><div class="code_line">&nbsp;</div><div class="code_line">CScrollGraph::CScrollGraph()</div><div class="code_line">{</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">CScrollGraph::~CScrollGraph()</div><div class="code_line">{</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN_MESSAGE_MAP(CScrollGraph, CScrollView)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_WM_CREATE()</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_REGISTERED_MESSAGE(AFX_WM_DRAW2D, &amp;CScrollGraph::OnDraw2D)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_WM_SIZE()</div><div class="code_line">END_MESSAGE_MAP()</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// Рисование CScrollGraph</div><div class="code_line">&nbsp;</div><div class="code_line">void CScrollGraph::OnInitialUpdate()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::OnInitialUpdate();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CSize sizeTotal;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: рассчитайте полный размер этого представления</div><div class="code_line">&nbsp;&nbsp; &nbsp;sizeTotal.cx = sizeTotal.cy = 1000;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetScrollSizes(MM_TEXT, sizeTotal);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CScrollGraph::OnDraw(CDC* pDC)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CDocument* pDoc = GetDocument();</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: добавьте код отрисовки</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// Диагностика CScrollGraph</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef _DEBUG</div><div class="code_line">void CScrollGraph::AssertValid() const</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::AssertValid();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">#ifndef _WIN32_WCE</div><div class="code_line">void CScrollGraph::Dump(CDumpContext&amp; dc) const</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::Dump(dc);</div><div class="code_line">}</div><div class="code_line">#endif</div><div class="code_line">#endif //_DEBUG</div><div class="code_line">&nbsp;</div><div class="code_line">// Обработчики сообщений CScrollGraph</div><div class="code_line">&nbsp;</div><div class="code_line">int CScrollGraph::OnCreate(LPCREATESTRUCT lpCreateStruct)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (CScrollView::OnCreate(lpCreateStruct) == -1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return -1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: &nbsp;Добавьте специализированный код создания</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Enable D2D support for this window:</div><div class="code_line">&nbsp;&nbsp; &nbsp;EnableD2DSupport();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InitObj1();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CScrollGraph::OnUpdate(CView *pSender, LPARAM lHint, CObject *pHint)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: добавьте специализированный код или вызов базового класса</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::OnUpdate(pSender, lHint, pHint);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">afx_msg LRESULT CScrollGraph::OnDraw2D(WPARAM wParam, LPARAM lParam)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CHwndRenderTarget* pRenderTarget = (CHwndRenderTarget*) lParam;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ASSERT_VALID(pRenderTarget);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (pRenderTarget-&#62;IsValid())</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//GetClientRect(rect);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//m_pLinearGradientBrush-&#62;SetEndPoint(CPoint(rect.right, rect.bottom));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int nMapMode;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SIZE sizeTotal;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SIZE sizePage;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SIZE sizeLine;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetDeviceScrollSizes(nMapMode, sizeTotal, sizePage, sizeLine);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//CPoint pos1 = GetScrollPosition();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//CPoint pos2 = GetDeviceScrollPosition();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//CSize sss = GetTotalSize();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// apply translation transform according to view&#39;s scroll position</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CPoint point = GetScrollPosition();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F::Translation((float) -point.x, (float) -point.y);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;SetTransform(matrix);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CRect rect(0, 0, sizeTotal.cy, sizeTotal.cx);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pLinearGradientBrush-&#62;SetEndPoint(CPoint(sizeTotal.cx, sizeTotal.cy));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;FillRectangle(rect, m_pLinearGradientBrush);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;DrawText(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_T(&quot;Hello, World!&quot;),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rect,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pBlackBrush,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pTextFormat);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return TRUE;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CScrollGraph::InitObj1()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Initialize D2D resources:</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pBlackBrush = new CD2DSolidColorBrush(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetRenderTarget(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;D2D1::ColorF(D2D1::ColorF::Black));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pTextFormat = new CD2DTextFormat(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetRenderTarget(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_T(&quot;Verdana&quot;),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;50);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pTextFormat-&#62;Get()-&#62;SetTextAlignment(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWRITE_TEXT_ALIGNMENT_CENTER);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pTextFormat-&#62;Get()-&#62;SetParagraphAlignment(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWRITE_PARAGRAPH_ALIGNMENT_CENTER);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;D2D1_GRADIENT_STOP gradientStops[2];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gradientStops[0].color =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;D2D1::ColorF(D2D1::ColorF::White);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gradientStops[0].position = 0.f;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gradientStops[1].color =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;D2D1::ColorF(D2D1::ColorF::Indigo);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gradientStops[1].position = 1.f;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pLinearGradientBrush = new CD2DLinearGradientBrush(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetRenderTarget(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;gradientStops,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ARRAYSIZE(gradientStops),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;D2D1::LinearGradientBrushProperties(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D2D1::Point2F(0, 0),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D2D1::Point2F(0, 0)));</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CScrollGraph::OnSize(UINT nType, int cx, int cy)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::OnSize(nType, cx, cy);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: добавьте свой код обработчика сообщений</div><div class="code_line">}</div></ol></div></div></div></div></div></div><br>
CChildView <br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class CChildView : public CWnd</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollGraph &nbsp; &nbsp;*m_Graph = nullptr;</div><div class="code_line">// Создание</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;CChildView();</div><div class="code_line">&nbsp;</div><div class="code_line">// Атрибуты</div><div class="code_line">public:</div><div class="code_line">&nbsp;</div><div class="code_line">// Операции</div><div class="code_line">public:</div><div class="code_line">&nbsp;</div><div class="code_line">// Переопределение</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual BOOL PreCreateWindow(CREATESTRUCT&amp; cs);</div><div class="code_line">&nbsp;</div><div class="code_line">// Реализация</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual ~CChildView();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Созданные функции схемы сообщений</div><div class="code_line">protected:</div><div class="code_line">// &nbsp;afx_msg void OnPaint();</div><div class="code_line">&nbsp;&nbsp; &nbsp;DECLARE_MESSAGE_MAP()</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg void OnSize(UINT nType, int cx, int cy);</div><div class="code_line">};</div></ol></div></div></div></div></div></div><br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">CChildView::CChildView()</div><div class="code_line">{</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">CChildView::~CChildView()</div><div class="code_line">{</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN_MESSAGE_MAP(CChildView, CWnd)</div><div class="code_line">// &nbsp;ON_WM_PAINT()</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_WM_CREATE()</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_WM_SIZE()</div><div class="code_line">END_MESSAGE_MAP()</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// Обработчики сообщений CChildView</div><div class="code_line">&nbsp;</div><div class="code_line">BOOL CChildView::PreCreateWindow(CREATESTRUCT&amp; cs) </div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!CWnd::PreCreateWindow(cs))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return FALSE;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cs.dwExStyle |= WS_EX_CLIENTEDGE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cs.style &amp;= ~WS_BORDER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;::LoadCursor(nullptr, IDC_ARROW), reinterpret_cast&#60;HBRUSH&#62;(COLOR_WINDOW+1), nullptr);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return TRUE;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">//void CChildView::OnPaint() </div><div class="code_line">//{</div><div class="code_line">// &nbsp;CPaintDC dc(this); // контекст устройства для рисования</div><div class="code_line">// &nbsp;</div><div class="code_line">// &nbsp;// TODO: Добавьте код обработки сообщений</div><div class="code_line">// &nbsp;</div><div class="code_line">// &nbsp;// Не вызывайте CWnd::OnPaint() для сообщений рисования</div><div class="code_line">//}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (CWnd::OnCreate(lpCreateStruct) == -1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return -1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_Graph = new CScrollGraph();</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_Graph-&#62;Create(nullptr, nullptr, AFX_WS_DEFAULT_VIEW, { 100, 100 }, this, 1, nullptr);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">void CChildView::OnSize(UINT nType, int cx, int cy)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CWnd::OnSize(nType, cx, cy);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (m_Graph-&#62;GetSafeHwnd()) m_Graph-&#62;MoveWindow(0, 0, cx, cy);</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: добавьте свой код обработчика сообщений</div><div class="code_line">}</div></ol></div></div></div></div></div></div><br>
<br>
<strong class='tag-b'>II Вторая проблема</strong><br>
Тот же проект, только с включенным режимом Document/View<br>
Для View (при создании проекта) выбираем базовым классом CScrollView.<br>
<br>
OnDraw2D вызывается перед OnInitialUpdate/OnUpdate (дважды) (в коде добавлен костыль для проверки инициализации)<br>
В OnUpdate команда SetScrollSizes инициирует вызов OnDraw2D, т.е. OnDraw2D вложен в OnUpdate , в первом примере этого не происходит.<br>
При изменении размера, так же как в первом примере, OnDraw2D перед OnSize, но OnDraw2D+OnSize вызывается дважды при однократном изменении размера.<br>
ЗЫ: при создании приложения были добавлены дополнительные фреймы в стиле Outlook, не исключаю, что двойные вызовы из-за этого, так как при втором вызове, отличается размер по высоте (с учетом текущего набора фреймов), но хотелось бы и этого избежать.<br>
<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class CGraph1View : public CScrollView</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CD2DTextFormat &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*m_pTextFormat = nullptr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CD2DSolidColorBrush &nbsp; &nbsp; *m_pBlackBrush = nullptr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CD2DLinearGradientBrush *m_pLinearGradientBrush = nullptr;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CD2DBitmap &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*m_pBitmap = nullptr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//CHwndRenderTarget &nbsp; &nbsp; *m_renderTarget = nullptr;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_Init = false;</div><div class="code_line">&nbsp;</div><div class="code_line">protected: // создать только из сериализации</div><div class="code_line">&nbsp;&nbsp; &nbsp;CGraph1View() noexcept;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DECLARE_DYNCREATE(CGraph1View)</div><div class="code_line">&nbsp;</div><div class="code_line">// Атрибуты</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;CGraph1Doc* GetDocument() const;</div><div class="code_line">&nbsp;</div><div class="code_line">// Операции</div><div class="code_line">public:</div><div class="code_line">&nbsp;</div><div class="code_line">// Переопределение</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void OnDraw(CDC* pDC); &nbsp;// переопределено для отрисовки этого представления</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual BOOL PreCreateWindow(CREATESTRUCT&amp; cs);</div><div class="code_line">protected:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void OnInitialUpdate(); // вызывается в первый раз после конструктора</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);</div><div class="code_line">&nbsp;</div><div class="code_line">// Реализация</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual ~CGraph1View();</div><div class="code_line">#ifdef _DEBUG</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void AssertValid() const;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void Dump(CDumpContext&amp; dc) const;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">protected:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void InitObj1();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// Созданные функции схемы сообщений</div><div class="code_line">protected:</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg void OnFilePrintPreview();</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg void OnRButtonUp(UINT nFlags, CPoint point);</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DECLARE_MESSAGE_MAP()</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);</div><div class="code_line">protected:</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg LRESULT OnDraw2D(WPARAM wParam, LPARAM lParam);</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/);</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;afx_msg void OnSize(UINT nType, int cx, int cy);</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">#ifndef _DEBUG &nbsp;// версия отладки в Graph1View.cpp</div><div class="code_line">inline CGraph1Doc* CGraph1View::GetDocument() const</div><div class="code_line">&nbsp;&nbsp; { return reinterpret_cast&#60;CGraph1Doc*&#62;(m_pDocument); }</div><div class="code_line">#endif</div></ol></div></div></div></div></div></div><br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">IMPLEMENT_DYNCREATE(CGraph1View, CScrollView)</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN_MESSAGE_MAP(CGraph1View, CScrollView)</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Стандартные команды печати</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_COMMAND(ID_FILE_PRINT, &amp;CScrollView::OnFilePrint)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_COMMAND(ID_FILE_PRINT_DIRECT, &amp;CScrollView::OnFilePrint)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_COMMAND(ID_FILE_PRINT_PREVIEW, &amp;CGraph1View::OnFilePrintPreview)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_WM_CONTEXTMENU()</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_WM_RBUTTONUP()</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_WM_CREATE()</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_REGISTERED_MESSAGE(AFX_WM_DRAW2D, &amp;CGraph1View::OnDraw2D)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ON_WM_SIZE()</div><div class="code_line">END_MESSAGE_MAP()</div><div class="code_line">&nbsp;</div><div class="code_line">// Создание или уничтожение CGraph1View</div><div class="code_line">&nbsp;</div><div class="code_line">CGraph1View::CGraph1View() noexcept</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: добавьте код создания</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">CGraph1View::~CGraph1View()</div><div class="code_line">{</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">BOOL CGraph1View::PreCreateWindow(CREATESTRUCT&amp; cs)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: изменить класс Window или стили посредством изменения</div><div class="code_line">&nbsp;&nbsp; &nbsp;// &nbsp;CREATESTRUCT cs</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return CScrollView::PreCreateWindow(cs);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// Рисование CGraph1View</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnDraw(CDC* /*pDC*/)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;//CGraph1Doc* pDoc = GetDocument();</div><div class="code_line">&nbsp;&nbsp; &nbsp;//ASSERT_VALID(pDoc);</div><div class="code_line">&nbsp;&nbsp; &nbsp;//if (!pDoc)</div><div class="code_line">&nbsp;&nbsp; &nbsp;// &nbsp;return;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: добавьте здесь код отрисовки для собственных данных</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnInitialUpdate()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::OnInitialUpdate();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// Печать CGraph1View</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnFilePrintPreview()</div><div class="code_line">{</div><div class="code_line">#ifndef SHARED_HANDLERS</div><div class="code_line">&nbsp;&nbsp; &nbsp;AFXPrintPreview(this);</div><div class="code_line">#endif</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">BOOL CGraph1View::OnPreparePrinting(CPrintInfo* pInfo)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// подготовка по умолчанию</div><div class="code_line">&nbsp;&nbsp; &nbsp;return DoPreparePrinting(pInfo);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: добавьте дополнительную инициализацию перед печатью</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TODO: добавьте очистку после печати</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnRButtonUp(UINT /* nFlags */, CPoint point)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;ClientToScreen(&amp;point);</div><div class="code_line">&nbsp;&nbsp; &nbsp;OnContextMenu(this, point);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnContextMenu(CWnd* /* pWnd */, CPoint point)</div><div class="code_line">{</div><div class="code_line">#ifndef SHARED_HANDLERS</div><div class="code_line">&nbsp;&nbsp; &nbsp;theApp.GetContextMenuManager()-&#62;ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);</div><div class="code_line">#endif</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// Диагностика CGraph1View</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef _DEBUG</div><div class="code_line">void CGraph1View::AssertValid() const</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::AssertValid();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::Dump(CDumpContext&amp; dc) const</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::Dump(dc);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::InitObj1()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Initialize D2D resources:</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pBlackBrush = new CD2DSolidColorBrush(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetRenderTarget(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;D2D1::ColorF(D2D1::ColorF::Black));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pTextFormat = new CD2DTextFormat(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetRenderTarget(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_T(&quot;Verdana&quot;),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;50);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pTextFormat-&#62;Get()-&#62;SetTextAlignment(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWRITE_TEXT_ALIGNMENT_CENTER);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pTextFormat-&#62;Get()-&#62;SetParagraphAlignment(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWRITE_PARAGRAPH_ALIGNMENT_CENTER);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;D2D1_GRADIENT_STOP gradientStops[2];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gradientStops[0].color =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;D2D1::ColorF(D2D1::ColorF::White);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gradientStops[0].position = 0.f;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gradientStops[1].color =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;D2D1::ColorF(D2D1::ColorF::Indigo);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gradientStops[1].position = 1.f;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_pLinearGradientBrush = new CD2DLinearGradientBrush(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetRenderTarget(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;gradientStops,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ARRAYSIZE(gradientStops),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;D2D1::LinearGradientBrushProperties(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D2D1::Point2F(0, 0),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D2D1::Point2F(0, 0)));</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">CGraph1Doc* CGraph1View::GetDocument() const // встроена неотлаженная версия</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;ASSERT(m_pDocument-&#62;IsKindOf(RUNTIME_CLASS(CGraph1Doc)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;return (CGraph1Doc*)m_pDocument;</div><div class="code_line">}</div><div class="code_line">#endif //_DEBUG</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// Обработчики сообщений CGraph1View</div><div class="code_line">&nbsp;</div><div class="code_line">int CGraph1View::OnCreate(LPCREATESTRUCT lpCreateStruct)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (CScrollView::OnCreate(lpCreateStruct) == -1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return -1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Enable D2D support for this window:</div><div class="code_line">&nbsp;&nbsp; &nbsp;EnableD2DSupport();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InitObj1();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnUpdate(CView *pSender, LPARAM lHint, CObject *pHint)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//CScrollView::OnUpdate(pSender, lHint, pHint);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CHwndRenderTarget* pRenderTarget = this-&#62;GetRenderTarget();</div><div class="code_line">&nbsp;&nbsp; &nbsp;ASSERT_VALID(pRenderTarget);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (pRenderTarget-&#62;IsValid())</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CSize size;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// TODO: рассчитайте полный размер этого представления</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size.cx = size.cy = 1000;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetScrollSizes(MM_TEXT, size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ScrollToPosition(CPoint(0, 0));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CSize sizeImage(100, 100);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;delete m_pBitmap;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pBitmap = nullptr;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const CString strFile = L&quot;D:\Photos\73030609.jpg&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!strFile.IsEmpty())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pBitmap = new CD2DBitmap(pRenderTarget, strFile);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HRESULT hr = m_pBitmap-&#62;Create(pRenderTarget);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (m_pBitmap-&#62;IsValid())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CD2DSizeF size = m_pBitmap-&#62;GetSize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sizeImage.SetSize(static_cast&#60;int&#62;(size.width), static_cast&#60;int&#62;(size.height));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetScrollSizes(MM_TEXT, sizeImage);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ScrollToPosition(CPoint(0, 0));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_Init = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">afx_msg LRESULT CGraph1View::OnDraw2D(WPARAM wParam, LPARAM lParam)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CHwndRenderTarget* pRenderTarget = (CHwndRenderTarget*) lParam;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ASSERT_VALID(pRenderTarget);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (m_Init &amp;&amp; pRenderTarget-&#62;IsValid())</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//GetClientRect(rect);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//m_pLinearGradientBrush-&#62;SetEndPoint(CPoint(rect.right, rect.bottom));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int nMapMode;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SIZE sizeTotal;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SIZE sizePage;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SIZE sizeLine;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetDeviceScrollSizes(nMapMode, sizeTotal, sizePage, sizeLine);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//CPoint pos1 = GetScrollPosition();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//CPoint pos2 = GetDeviceScrollPosition();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//CSize sss = GetTotalSize();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// apply translation transform according to view&#39;s scroll position</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CPoint point = GetScrollPosition();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F::Translation((float) -point.x, (float) -point.y);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;SetTransform(matrix);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CRect rect(0, 0, sizeTotal.cy, sizeTotal.cx);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pLinearGradientBrush-&#62;SetEndPoint(CPoint(sizeTotal.cx, sizeTotal.cy));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;FillRectangle(rect, m_pLinearGradientBrush);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;DrawText(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_T(&quot;Hello, World!&quot;),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rect,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pBlackBrush,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pTextFormat);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D2D1_COLOR_F color = { 1.f, 1.f, 1.f, 1.f }; // r, g, b, a</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;Clear(color);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((nullptr != m_pBitmap) &amp;&amp; m_pBitmap-&#62;IsValid())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// apply translation transform according to view&#39;s scroll position</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CPoint point = GetScrollPosition();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F::Translation((float) -point.x, (float) -point.y);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;SetTransform(matrix);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// draw the bitmap</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CD2DSizeF size = m_pBitmap-&#62;GetSize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pRenderTarget-&#62;DrawBitmap(m_pBitmap, CD2DRectF(0, 0, size.width, size.height));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return TRUE;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void CGraph1View::OnSize(UINT nType, int cx, int cy)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CScrollView::OnSize(nType, cx, cy);</div><div class="code_line">}</div></ol></div></div></div></div></div></div>]]></description>
        <author>Black_Dragon</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      </channel>
      </rss>
	