Frage zu: CString in LPWSTR
-
Guten Morgen,
ich habe mir die Klasse von Codeproject übernommen, um in nem ListCtrl nur in bestimmten Spalten ein Tooltip anzuzeigen. Der Link:
http://www.codeproject.com/KB/list/ctooltiplistctrl.aspxBei mir sieht es so aus:
if (lvhitTestInfo.flags == 4 && LVHT_ONITEMLABEL) { CString key, strText; key.Format("%i", nItem * 100 + nSubItem); if (TextFlags.Lookup(key, strText)) { ::SendMessage(pNMHDR->hwndFrom, TTM_SETMAXTIPWIDTH, 0, strText.GetLength()); // multiline ::SendMessage(pNMHDR->hwndFrom, TTM_SETDELAYTIME, (WPARAM)TTDT_AUTOPOP, (LPARAM)MAKELONG(7000, 0)); // 7s Anzeigedauer USES_CONVERSION; LPWSTR newStr = T2W(strText); pTTTW->lpszText = newStr; return FALSE; }}
Nur in der 13. und 14. Spalte wird ein Tooltip angezeigt.
Problem ist, dass der multiline Tooltip im Debug korrekt angezeigt wird und im Release fehlen aber die letzten Zeichen im Tooltip!Kann das nicht verstehen, auch das meine Anwendung MBCS ist und nicht Unicode, aber trotzdem muss ich die Unicode-Varianten benutzen.
Kann mich da mal jemand aufklären ??
Vielen Dank im Voraus !
-
USES_CONVERSION; LPWSTR newStr = T2W(strText); pTTTW->lpszText = newStr;
Das kann doch nicht gehen!
T2W legt den String auf dem Stack an. Anschließend wird die Funktion verlassen und der Stack wird natürlichfreigegeben.Warum füllst Du das bestehende Feld lpszText nicht bis zu der Größe die in der Struktur angegeben ist.
Wie lang kann der Text denn werden?
Oder lege eine CStringW Membervariable an, in die Du den Tooltip-Text hineinlädst. Anschließend übergibst Du den Zeiger mit GetBuffer. Dadurch blebt der Zeiger gültig, wird wiederverwendet und auch wieder freigegeben.
-
Ok, das war mir überhaupt nicht klar.

Der Text hat ne feste Länge, bzw. die 2, da ich 2 unterschiedliche Tooltips einblenden will, aber ich brauche TTM_SETMAXTIPWIDTH, da der Text wiederum länger ist.
Der eine ist genau 48 Zeichen lang und der andere 92, um genau zu sein.
Nur noch die Frage, wie man an dieser Stelle:
if (TextFlags.Lookup(key, toolText))vernünftig in CString& casten kann, sehe da noch nicht so durch !
-
War ne dumme Frage: bei Lookup wird gefundener Text in CString kopiert und dann an den CStringW-Member zugewiesen.
Damit klappt auch die Anzeige im Release !!
Vielen Dank für deine Hilfe !
