<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[NM_CUSTOMDRAW mit ListView]]></title><description><![CDATA[<p>Hallo C/C++ Forum!<br />
Ich habe mich mittlerweile etwa 5 Stunden intensivst mit diesem Problem rumgeschlagen und komme einfach nicht weiter!</p>
<p>Ich habe in meinem Hauptfenster (nicht in einem Dialog - deshalb muss ich nicht SetWindowLong benutzen) ein ListView. Das erstelle ich so:</p>
<pre><code class="language-cpp">InitCommonControls();

HWND hLV = CreateWindow(	WC_LISTVIEW, &quot;&quot;,
							WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_SINGLESEL,
							50,220,	350,220,
							hWnd, (HMENU)ID_QUEUE, GetModuleHandle(NULL), NULL);

SendMessage(hLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);		
SendMessage(hLV, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);

ListView_SetBkColor(	hLV, (COLORREF)RGB(214,223,247));

CreateListViewColumn(hLV, 0, &quot;Col1&quot;,		160);
CreateListViewColumn(hLV, 1, &quot;Col2&quot;,		50);
CreateListViewColumn(hLV, 2, &quot;Col3&quot;,			40);
CreateListViewColumn(hLV, 3, &quot;Col4&quot;,		100);
</code></pre>
<p>CreateListViewColumn stammt von mir und macht nix anderes als Columns zu erstellen. Funktioniert auch. Ich glaube nicht, dass der Fehler dort liegt (kann es eigentlich ausschließen) aber wenns nötig wird liefer ich den Code nach.</p>
<p>Nun möchte ich die Farben des ListViews ändern. Dafür benutze ich NM_CUSTOMDRAW weil es mir wichtig ist, dass auch das ausgewählte Item anders gefärbt ist.</p>
<p>Ich habe schon sehr viel rumprobiert und benutze momentan diese Methode:</p>
<pre><code class="language-cpp">case WM_NOTIFY:
	{
		switch (LOWORD(wParam))
		{
		// ================================================================
		case ID_QUEUE:
			switch ( ((LPNMHDR)lParam)-&gt;code )
			{

			case NM_CUSTOMDRAW:
				{
					LPNMLVCUSTOMDRAW	lpCD = (LPNMLVCUSTOMDRAW)lParam;

					// ========================================================
					switch (lpCD-&gt;nmcd.dwDrawStage)
					{
					case CDDS_PREPAINT:
						//SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW);
						return CDRF_NOTIFYITEMDRAW;

					case CDDS_ITEMPREPAINT:
						if (lpCD-&gt;nmcd.dwItemSpec == SendMessage(GetDlgItem(hWnd, ID_QUEUE), LVM_GETNEXTITEM, -1, LVNI_SELECTED))
						{
							lpCD-&gt;clrText	= RGB(255,255,255);
							lpCD-&gt;clrTextBk	= RGB(101,122,216);	
						}
						else
						{
							lpCD-&gt;clrText	= RGB(000,000,000);
							lpCD-&gt;clrTextBk	= RGB(214,223,247);
						}
						if (lpCD-&gt;nmcd.uItemState &amp; CDIS_HOT)
							lpCD-&gt;clrText = RGB(255,0,0);
						return CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT;

					/*case CDDS_ITEMPOSTPAINT:
						return CDRF_SKIPDEFAULT;
						if ( lpCD-&gt;nmcd.uItemState &amp; CDIS_FOCUS )
							return CDRF_SKIPDEFAULT;*/

						break;
					}
					return CDRF_DODEFAULT;
					// ========================================================

				}

			default:
				return false;
			}
		// ================================================================
		}

		return false;
	}
</code></pre>
<p>Das klappt auch ausgezeichnet und so wie sein soll - nur: das ausgewählte Item wird mit diesem Standard-blauer-Balken-mit-weißer-Schrift-und-gestricheltem-Rahmen-dieses-Item-ist-ausgewählt-Dingsbums übermalt! Allerdings nur, wenn das ListView den Focus hat. Liegt der Focus woanders sieht es genau so aus wie ich es haben will.</p>
<p><strong>Wie schaff ich es nun, das Standard-blauer-Balken-... abzustellen oder auch mit einer eigenen Version zu überschreiben?</strong></p>
<p>Bitte (wenns geht!) keine MFC-Beispiele (ich benutze reine WinAPI) und keine Links auf Tutorials (die hab ich eh schon alle durch).</p>
<p>Tausend Dank!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/87580/nm_customdraw-mit-listview</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 03:36:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/87580.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Oct 2004 12:53:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to NM_CUSTOMDRAW mit ListView on Fri, 01 Oct 2004 12:53:30 GMT]]></title><description><![CDATA[<p>Hallo C/C++ Forum!<br />
Ich habe mich mittlerweile etwa 5 Stunden intensivst mit diesem Problem rumgeschlagen und komme einfach nicht weiter!</p>
<p>Ich habe in meinem Hauptfenster (nicht in einem Dialog - deshalb muss ich nicht SetWindowLong benutzen) ein ListView. Das erstelle ich so:</p>
<pre><code class="language-cpp">InitCommonControls();

HWND hLV = CreateWindow(	WC_LISTVIEW, &quot;&quot;,
							WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_SINGLESEL,
							50,220,	350,220,
							hWnd, (HMENU)ID_QUEUE, GetModuleHandle(NULL), NULL);

SendMessage(hLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);		
SendMessage(hLV, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);

ListView_SetBkColor(	hLV, (COLORREF)RGB(214,223,247));

CreateListViewColumn(hLV, 0, &quot;Col1&quot;,		160);
CreateListViewColumn(hLV, 1, &quot;Col2&quot;,		50);
CreateListViewColumn(hLV, 2, &quot;Col3&quot;,			40);
CreateListViewColumn(hLV, 3, &quot;Col4&quot;,		100);
</code></pre>
<p>CreateListViewColumn stammt von mir und macht nix anderes als Columns zu erstellen. Funktioniert auch. Ich glaube nicht, dass der Fehler dort liegt (kann es eigentlich ausschließen) aber wenns nötig wird liefer ich den Code nach.</p>
<p>Nun möchte ich die Farben des ListViews ändern. Dafür benutze ich NM_CUSTOMDRAW weil es mir wichtig ist, dass auch das ausgewählte Item anders gefärbt ist.</p>
<p>Ich habe schon sehr viel rumprobiert und benutze momentan diese Methode:</p>
<pre><code class="language-cpp">case WM_NOTIFY:
	{
		switch (LOWORD(wParam))
		{
		// ================================================================
		case ID_QUEUE:
			switch ( ((LPNMHDR)lParam)-&gt;code )
			{

			case NM_CUSTOMDRAW:
				{
					LPNMLVCUSTOMDRAW	lpCD = (LPNMLVCUSTOMDRAW)lParam;

					// ========================================================
					switch (lpCD-&gt;nmcd.dwDrawStage)
					{
					case CDDS_PREPAINT:
						//SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW);
						return CDRF_NOTIFYITEMDRAW;

					case CDDS_ITEMPREPAINT:
						if (lpCD-&gt;nmcd.dwItemSpec == SendMessage(GetDlgItem(hWnd, ID_QUEUE), LVM_GETNEXTITEM, -1, LVNI_SELECTED))
						{
							lpCD-&gt;clrText	= RGB(255,255,255);
							lpCD-&gt;clrTextBk	= RGB(101,122,216);	
						}
						else
						{
							lpCD-&gt;clrText	= RGB(000,000,000);
							lpCD-&gt;clrTextBk	= RGB(214,223,247);
						}
						if (lpCD-&gt;nmcd.uItemState &amp; CDIS_HOT)
							lpCD-&gt;clrText = RGB(255,0,0);
						return CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT;

					/*case CDDS_ITEMPOSTPAINT:
						return CDRF_SKIPDEFAULT;
						if ( lpCD-&gt;nmcd.uItemState &amp; CDIS_FOCUS )
							return CDRF_SKIPDEFAULT;*/

						break;
					}
					return CDRF_DODEFAULT;
					// ========================================================

				}

			default:
				return false;
			}
		// ================================================================
		}

		return false;
	}
</code></pre>
<p>Das klappt auch ausgezeichnet und so wie sein soll - nur: das ausgewählte Item wird mit diesem Standard-blauer-Balken-mit-weißer-Schrift-und-gestricheltem-Rahmen-dieses-Item-ist-ausgewählt-Dingsbums übermalt! Allerdings nur, wenn das ListView den Focus hat. Liegt der Focus woanders sieht es genau so aus wie ich es haben will.</p>
<p><strong>Wie schaff ich es nun, das Standard-blauer-Balken-... abzustellen oder auch mit einer eigenen Version zu überschreiben?</strong></p>
<p>Bitte (wenns geht!) keine MFC-Beispiele (ich benutze reine WinAPI) und keine Links auf Tutorials (die hab ich eh schon alle durch).</p>
<p>Tausend Dank!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/618813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/618813</guid><dc:creator><![CDATA[Yarin]]></dc:creator><pubDate>Fri, 01 Oct 2004 12:53:30 GMT</pubDate></item><item><title><![CDATA[Reply to NM_CUSTOMDRAW mit ListView on Fri, 01 Oct 2004 14:47:50 GMT]]></title><description><![CDATA[<p>moin meister ...</p>
<p>der returnwert ist mit das entscheidende ! siehe Kommentare ...<br />
habe noch eigene Schrift, weil manchmal soll rekursiv gezeichnet werden</p>
<p>Funktion hat aber nen Fehler, der in meinem Fall nicht auftritt, wenn die Spalten zusammengeschoben werden, wird der Text nicht mit &quot;...&quot; abgeschnitten.</p>
<pre><code class="language-cpp">LRESULT DoNotifyList(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	LPNMLISTVIEW	pnm			= (LPNMLISTVIEW)lParam;
	HBRUSH			hBrushBack	= NULL;
	HBRUSH			hBrushFrame = NULL;
	RECT			rc;

	switch (pnm-&gt;hdr.code)
	{
		case NM_CUSTOMDRAW:
		{
			LPNMLVCUSTOMDRAW	lplvcd	= (LPNMLVCUSTOMDRAW)lParam;
			HWND				hLV		= GetDlgItem(hwnd, wParam);
			LVITEM				lvi;

			if(lplvcd-&gt;nmcd.dwDrawStage == CDDS_PREPAINT)
				return CDRF_NOTIFYITEMDRAW;

			if(lplvcd-&gt;nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
			{	
				// BEISPIEL: zeigt an das nur die Farbe geändert wurde, sonst nicht selber zeichnen
				//if(lplvcd-&gt;nmcd.lItemlParam==0)
				//	return(CDRF_DODEFAULT);

				//lplvcd-&gt;clrText = RGB(255, 0, 0);
				//return CDRF_NEWFONT;

				// in allen Fällen ist Hitergrundmodus TRANSPARENT
				SetBkMode(lplvcd-&gt;nmcd.hdc, TRANSPARENT); 

				int iSubItem= 0;
				while( iSubItem &lt; Header_GetItemCount(ListView_GetHeader(hLV)) )
				{
					// Text holen
					TCHAR wcBuffer[256] = {0};
					lvi.iItem = lplvcd-&gt;nmcd.dwItemSpec;
					lvi.iSubItem = iSubItem;
					lvi.mask = LVIF_TEXT;
					lvi.pszText = wcBuffer;
					lvi.cchTextMax = sizeof(wcBuffer) - 1; 
					if( !ListView_GetItem(hLV, &amp;lvi) )
						break;

					if( iSubItem == 0)
					{
						// unterschiedliche Farben für selektiert
						if( ListView_GetItemState(hLV, lplvcd-&gt;nmcd.dwItemSpec, LVIS_SELECTED) &amp; LVIS_SELECTED)
						{
							// selektiert
							hBrushBack = CreateSolidBrush(RGB(200, 200, 200));
							SetTextColor(lplvcd-&gt;nmcd.hdc, RGB(0, 0, 0));
						}
						else
						{
							// nicht selectiert
							hBrushBack = CreateSolidBrush(RGB(255,255,255));
							SetTextColor(lplvcd-&gt;nmcd.hdc, RGB(0, 0, 0));
						}

						// Item
						ListView_GetItemRect(hLV, lplvcd-&gt;nmcd.dwItemSpec, &amp;lplvcd-&gt;nmcd.rc, LVIR_BOUNDS);
						// etwas vom Rand einrücken
						lplvcd-&gt;nmcd.rc.left += 2;
						// Hintergrund zeichnen				
						if( ListView_GetItemState(hLV, lplvcd-&gt;nmcd.dwItemSpec, LVIS_SELECTED) &amp; LVIS_SELECTED)
						{
							memcpy(&amp;rc, &amp;lplvcd-&gt;nmcd.rc, sizeof(rc));
							rc.left += 2;

							// Rahmen zeichnen
							HPEN hPenOld = (HPEN)SelectObject(lplvcd-&gt;nmcd.hdc, CreatePen(PS_SOLID, 1, RGB(0,0,0)));
							Rectangle(lplvcd-&gt;nmcd.hdc, rc.left, rc.top, rc.right, rc.bottom);
							DeleteObject(SelectObject(lplvcd-&gt;nmcd.hdc, (HGDIOBJ)hPenOld));

							// Hintergrund füllen, ohne Rahmen zu überpinseln
							memcpy(&amp;rc, &amp;lplvcd-&gt;nmcd.rc, sizeof(rc));
							rc.left += 3;
							rc.right -= 1;
							rc.top += 1;
							rc.bottom -= 1;
							FillRect(lplvcd-&gt;nmcd.hdc, &amp;rc, hBrushBack);	
							DeleteObject(hBrushBack);
						}
						else
						{
							// Hintergrund füllen, muß Rahmen wenn vorhanden überdecken !!!
							memcpy(&amp;rc, &amp;lplvcd-&gt;nmcd.rc, sizeof(rc));
							rc.left += 2;
							FillRect(lplvcd-&gt;nmcd.hdc, &amp;rc, hBrushBack);	
							DeleteObject(hBrushBack);
						}

						// noch etwas mehr einrücken 
						memcpy(&amp;rc, &amp;lplvcd-&gt;nmcd.rc, sizeof(rc));
						rc.left += 4;
						// Text zeichen
						DrawText(lplvcd-&gt;nmcd.hdc, lvi.pszText, lstrlen(lvi.pszText), &amp;rc, DT_LEFT|DT_VCENTER);
					}
					else
					{
						// SubItems 
						ListView_GetSubItemRect(hLV, lplvcd-&gt;nmcd.dwItemSpec, iSubItem, LVIR_BOUNDS, &amp;lplvcd-&gt;nmcd.rc); 
						// etwas einrücken
						lplvcd-&gt;nmcd.rc.left += 6;
						// Text zeichnen
						DrawText(lplvcd-&gt;nmcd.hdc, lvi.pszText, lstrlen(lvi.pszText), &amp;lplvcd-&gt;nmcd.rc, DT_LEFT|DT_VCENTER);
					}
					iSubItem++;
				}
				// zeigt an, daß alles selber gezeichnet wurde
				return CDRF_SKIPDEFAULT;
			}
		}

	default:
		break;
	}
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/618902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/618902</guid><dc:creator><![CDATA[RED-BARON]]></dc:creator><pubDate>Fri, 01 Oct 2004 14:47:50 GMT</pubDate></item><item><title><![CDATA[Reply to NM_CUSTOMDRAW mit ListView on Sat, 02 Oct 2004 09:35:56 GMT]]></title><description><![CDATA[<p>Mhh... Schonmal vielen Dank für deine Mühe, RED-BARON. Was du da machst ist jetzt das komplette Teil selber zeichnen (soweit ich das erkennen kann). Genau darum wollt ich mich eigentlich drücken <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Gibt es nicht noch eine andere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/619247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/619247</guid><dc:creator><![CDATA[Yarin]]></dc:creator><pubDate>Sat, 02 Oct 2004 09:35:56 GMT</pubDate></item></channel></rss>