<?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=414363&amp;view=findpost&amp;p=3791876</guid>
        <pubDate>Wed, 06 Mar 2019 07:03:19 +0000</pubDate>
        <title>Не перерисовываются линии в CListCtrl</title>
        <link>https://forum.sources.ru/index.php?showtopic=414363&amp;view=findpost&amp;p=3791876</link>
        <description><![CDATA[Олег М: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414363&view=findpost&p=3791771'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>erslgoeirjh &#064; <time class="tag-quote__quoted-time" datetime="2019-03-05T09:47:10+03:00">05.03.19, 06:47</time></span><div class='quote '> рисуются только вертикальные линии, а горизонтальные линии не рисуются. В чём причина этого? </div></div><br>
Наверное в том ты сначала рисуешь вертикальные линии, потом вызываешь UpdateWindow/RedrawWindow, которые стирают то, что ты нарисовал и посылают сообщение WM_PAINT, по которому отрисовываются горизонтальные линии.<br>
Рисуй вертикальные тоже в OnPaint.]]></description>
        <author>Олег М</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414363&amp;view=findpost&amp;p=3791771</guid>
        <pubDate>Tue, 05 Mar 2019 06:47:10 +0000</pubDate>
        <title>Не перерисовываются линии в CListCtrl</title>
        <link>https://forum.sources.ru/index.php?showtopic=414363&amp;view=findpost&amp;p=3791771</link>
        <description><![CDATA[erslgoeirjh: Я создал класс ClistCtrlEx2, который является потомком класса CListCtrl.<br>
В этом классе я переопределил метод OnPaint--в нём рисуются только вертикальные линии в таблице:<br>
<br>
<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">void CListCtrlEx2::OnPaint()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int &nbsp;i, n, m, nItem;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RECT &nbsp;rect;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const MSG *msg = GetCurrentMessage();</div><div class="code_line">&nbsp;&nbsp; &nbsp;DefWindowProc(msg-&#62;message,msg-&#62;wParam,msg-&#62;lParam);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((GetStyle() &amp; LVS_TYPEMASK)==LVS_REPORT)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CClientDC &nbsp;dc(this);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dc.SetDCBrushColor(RGB(255,0,0));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;nColumnCount = pHeader-&#62;GetItemCount();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RECT &nbsp;rect;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pHeader-&#62;GetClientRect(&amp;rect);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;top = rect.bottom;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetClientRect(&amp;rect);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;borderx = 0 - GetScrollPos(SB_HORZ);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (int i=0; i&#60;nColumnCount; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;borderx += GetColumnWidth(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (borderx&#62;=rect.right) &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.MoveTo(borderx-1,top);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.LineTo(borderx-1,rect.bottom);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (!GetItemRect(0,&amp;rect,LVIR_BOUNDS))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;height = rect.bottom - rect.top;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetClientRect(&amp;rect);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;width = rect.right;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} </div><div class="code_line">&nbsp;&nbsp; &nbsp;//CListCtrl::OnPaint();</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<br>
Также в этом классе есть поле flagsVector, являющееся вектором (динамическим массивом) типа int (то есть std::vector&lt;int&gt; flagsvector), элементы которого имеют значения 0 или 1.<br>
Есть и функция setFlagsVector, которая устанавливает значения элементов этого вектора:<br>
<br>
<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">void &nbsp;CListCtrlEx2::setFlagsVector(vector&#60;int&#62; flagsVector)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;this-&#62;flagsVector = flagsVector;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<br>
Есть также функция PaintLines, которая рисует вертикальные линии всегда и горизонтальные линии в зависимости от того, чему равно значение соответствующего элемента в векторе flagsVector--если значение элемента вектора равно 0, то горизонтальная линия рисуется, если же она равна 1, то горизонтальная линия не рисуется:<br>
<br>
<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">void CListCtrlEx2::PaintLines()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int &nbsp;i, n, m, nItem;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RECT &nbsp;rect;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const MSG *msg = GetCurrentMessage();</div><div class="code_line">&nbsp;&nbsp; &nbsp;DefWindowProc(msg-&#62;message,msg-&#62;wParam,msg-&#62;lParam);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((GetStyle() &amp; LVS_TYPEMASK)==LVS_REPORT)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CClientDC &nbsp;dc(this);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dc.SetDCBrushColor(RGB(255,0,0));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;nColumnCount = pHeader-&#62;GetItemCount();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RECT &nbsp;rect;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pHeader-&#62;GetClientRect(&amp;rect);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;top = rect.bottom;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetClientRect(&amp;rect);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;borderx = 0 - GetScrollPos(SB_HORZ);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (int i=0; i&#60;nColumnCount; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;borderx += GetColumnWidth(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (borderx&#62;=rect.right) &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.MoveTo(borderx-1,top);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.LineTo(borderx-1,rect.bottom);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (!GetItemRect(0,&amp;rect,LVIR_BOUNDS))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;height = rect.bottom - rect.top;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetClientRect(&amp;rect);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int &nbsp;width = rect.right;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m = flagsVector.size();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (m==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int i=1; i&#60;=GetCountPerPage();i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.MoveTo(0,top+height*i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.LineTo(width,top+height*i);</div><div class="code_line">&nbsp;&nbsp; &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; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int i=1; i&#60;=GetCountPerPage();i++)</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;if (i&#60;=m)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// если i не превышает m--число элементов в векторе flagsVector</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;if ((int)(flagsVector.at(i-1))==0)</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;dc.MoveTo(0,top+height*i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.LineTo(width,top+height*i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</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;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// если i больше m, то рисуется горизонтальная линия без всяких условий</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;dc.MoveTo(0,top+height*i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.LineTo(width,top+height*i);</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;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;} </div><div class="code_line">&nbsp;&nbsp; &nbsp;//CListCtrl::OnPaint();</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<br>
В вызывающей функции код выглядит так:<br>
<br>
<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">m_IDC_LIST1.setFlagsVector(flagsVector);</div><div class="code_line">m_IDC_LIST1.PaintLines();</div><div class="code_line">m_IDC_LIST1.UpdateWindow();</div><div class="code_line">m_IDC_LIST1.RedrawWindow();</div></ol></div></div></div></div><br>
<br>
<br>
Но в программе почему-то не происходит перерисовка линий в этом m_IDC_LIST1 (типа CListCtrlEx2)--в таблице рисуются только вертикальные линии, а горизонтальные линии не рисуются. В чём причина этого? Как сделать так, чтобы работала перерисовка линий в CListCtrlEx2 ?]]></description>
        <author>erslgoeirjh</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      </channel>
      </rss>
	