| |
| Posted by Bill Baxter in reply to Bill Baxter | PermalinkReply |
|
Bill Baxter
Posted in reply to Bill Baxter
| Bill Baxter wrote:
> snippets\tooltips\Snippet41 does not work properly for me. Instead of the intended tooltip text I see random strings of Japanese characters.
> It could be related to the fact that my default codepage is set to 932 (Japanese). Probably for someone else it would just look like random garbage instead of random Japanese garbage.
>
> --bb
I think the problem may be in Shell.d:1690, this function:
void setToolTipText (NMTTDISPINFO* lpnmtdi, char [] buffer) {
...
if (!hasCursor ()) return;
auto hHeap = OS.GetProcessHeap ();
if (lpstrTip !is null) OS.HeapFree (hHeap, 0, lpstrTip);
int byteCount = buffer.length;
lpstrTip = cast(TCHAR*)OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
OS.MoveMemory (lpstrTip, buffer.ptr, byteCount);
lpnmtdi.lpszText = lpstrTip;
}
It's taking a utf8 string and pointing to it with a TCHAR* which is actually a wide char string type.
This fixes it for me:
void setToolTipText (NMTTDISPINFO* lpnmtdi, char [] buffer) {
/*
* Ensure that the current position of the mouse
* is inside the client area of the shell. This
* prevents tool tips from popping up over the
* shell trimmings.
*/
if (!hasCursor ()) return;
auto hHeap = OS.GetProcessHeap ();
if (lpstrTip !is null) OS.HeapFree (hHeap, 0, lpstrTip);
TCHAR[] tbuffer = StrToTCHARs(buffer);
int byteCount = tbuffer.length * TCHAR.sizeof;
lpstrTip = cast(TCHAR*)OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
OS.MoveMemory (lpstrTip, tbuffer.ptr, byteCount);
lpnmtdi.lpszText = lpstrTip;
}
--bb
|