I need to draw some Unicode text with ScriptString API inside a dialog box.
I tried using these functions inside dialog procedure's WM_INITDIALOG:
WCHAR g_szCurrentString[30] =
{
'H', 'e', 'l', 'l', 'o',
0x064a, 0x064f, 0x0633, 0x0627, 0x0648, 0x0650, 0x064a,
'W', 'o', 'r', 'l', 'd',
0
};
SCRIPT_STRING_ANALYSIS GetStringAnalysis(HDC hdc, WCHAR *wstr, UINT wlen)
{
SCRIPT_CONTROL scriptControl = { 0 };
SCRIPT_STATE scriptState = { 0 };
SCRIPT_STRING_ANALYSIS scriptStringAnalysis;
ScriptStringAnalyse(
hdc,
wstr,
wlen,
wlen * 2,
-1,
SSA_GLYPHS|SSA_FALLBACK,
0,
&scriptControl,
&scriptState,
0,
0,
0,
&scriptStringAnalysis
);
return scriptStringAnalysis;
}
void Uniscribe_TextOut(HDC hdc, int xpos, int ypos, int selstart, int selend)
{
SCRIPT_STRING_ANALYSIS ssa = GetStringAnalysis(hdc, g_szCurrentString, lstrlen(g_szCurrentString));
if(selend < selstart)
{
int t = selstart;
selstart = selend;
selend = t;
}
ScriptStringOut(
ssa,
xpos,
ypos,
0,
NULL,
selstart,
selend,
FALSE
);
ScriptStringFree(&ssa);
}
void PaintWnd(HWND hWnd)
{
PAINTSTRUCT ps;
RECT rect;
HDC hdcMem;
HBITMAP hbmMem;
BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rect);
hdcMem = CreateCompatibleDC(ps.hdc);
hbmMem = CreateCompatibleBitmap(ps.hdc, rect.right, rect.bottom);
SelectObject(hdcMem, hbmMem);
FillRect(hdcMem, &rect, GetSysColorBrush(COLOR_WINDOW));
Uniscribe_TextOut(hdcMem, XBORDER, YBORDER, nSelStart, nSelEnd);
BitBlt(ps.hdc, 0, 0, rect.right,rect.bottom, hdcMem, 0, 0, SRCCOPY);
DeleteObject(hbmMem);
DeleteDC(hdcMem);
EndPaint(hWnd, &ps);
}
Code is btw from http://www.catch22.net/tuts/zips/scriptstring.zip/
It works fine in main window (WM_PAINT), but something is wrong with dialogs. I tried replacing ps.hdc with GetDC(dialogHwnd) too. Should I draw inside an owner-drawn element?
Thanks.
-- modified at 7:33 Thursday 22nd February, 2007
|