Hello, This version gives really proper results. ChangeLog: Phil Krylov <phil@xxxxxxxxxxxxxxxx> Added support for returning caret positions from GetCharacterPlacementW(). This does not work for complex scripts, but still it is better than nothing. Index: font.c =================================================================== RCS file: /home/wine/wine/objects/font.c,v retrieving revision 1.107 diff -p -u -u -r1.107 font.c --- font.c 15 Oct 2003 03:32:31 -0000 1.107 +++ font.c 6 Nov 2003 16:22:50 -0000 @@ -1980,7 +1980,7 @@ GetCharacterPlacementA(HDC hdc, LPCSTR l * * All flags except GCP_REORDER are not yet implemented. * Reordering is not 100% complient to the Windows BiDi method. - * Caret positioning is not yet implemented. + * Caret positioning is not yet implemented for BiDi. * Classes are not yet implemented. * */ @@ -2008,8 +2008,9 @@ GetCharacterPlacementW( lpResults->lpGlyphs, lpResults->nGlyphs, lpResults->nMaxFit); if(dwFlags&(~GCP_REORDER)) FIXME("flags 0x%08lx ignored\n", dwFlags); - if(lpResults->lpCaretPos) FIXME("caret positions not implemented\n"); if(lpResults->lpClass) FIXME("classes not implemented\n"); + if (lpResults->lpCaretPos && (dwFlags & GCP_REORDER)) + FIXME("Caret positions for complex scripts not implemented\n"); nSet = (UINT)uCount; if(nSet > lpResults->nGlyphs) @@ -2047,6 +2048,16 @@ GetCharacterPlacementW( } } + if (lpResults->lpCaretPos && !(dwFlags & GCP_REORDER)) + { + int pos = 0; + + lpResults->lpCaretPos[0] = 0; + for (i = 1; i < nSet; i++) + if (GetTextExtentPoint32W(hdc, &(lpString[i - 1]), 1, &size)) + lpResults->lpCaretPos[i] = (pos += size.cx); + } + if(lpResults->lpGlyphs) GetGlyphIndicesW(hdc, lpString, nSet, lpResults->lpGlyphs, 0); -- Best regards, Phil mailto:phil@xxxxxxxxxxxxxxxx