获取插入符在文本中的位置(SDK方式)?解决方案

获取插入符在文本中的位置(SDK方式)?
解释:
文本串:abcde|g
|:代表插入符。
从左-> 右数:插入符在第6个位置。

我在编写一个记事本仿值程序。其中要用到获取当前插入符,所在文本串字符中的位置。
通过下述算法计算编辑框一行能存放103个字符(大小下面给出),实际输入只能存放93个字符。请大虾们帮我看看问题出在那里。

编辑框大小如下:
rect.left   =   0,   rect.right   =   743,   rect.top   =   0,   rect.bottom   =   464。
xChar   =   7,   yChar   =   16。

注:同时求从edit类中,获取插入符在文本串字符中的位置方法。

函数如下:
POINT
GetTextInCaretPos   (HWND   hWnd)
{
//获取插入符在文本中的位置。
RECT rect;
POINT point;
long   iCyVscroll,   iCxHscroll;
long xChar   =   tm.tmAveCharWidth   +   tm.tmExternalLeading,
yChar   =   tm.tmHeight;//注:这里调用了一个全局变量(这里没有给出实现它的方法)。

long iLineCharCount, //行字符个数。
iColumnCharCount; //列字符个数。
long xCaret,   yCaret; //插入符在字符串的位置(单位:个)。

iCxHscroll   =   GetSystemMetrics   (SM_CXHSCROLL);
iCyVscroll   =   GetSystemMetrics   (SM_CYVSCROLL);

//返回编辑框中格式化矩形的坐标(返回值无意义)。
SendMessage   (hWnd,   EM_GETRECT,   NULL,   (LPARAM)(LPRECT)&rect);

//计算行、列容纳的字符个数。
iLineCharCount   =   (rect.right   -   iCxHscroll)   /   xChar;
iColumnCharCount   =   (rect.bottom   -   iCyVscroll)   /   yChar;

SendMessage   (hWnd,   WM_SETFOCUS,   0,   0); //向窗体发送输入焦点消息。
GetCaretPos   (&point); //获取插入符当前位置。

xCaret   =   iLineCharCount   -   (rect.right   -   iCxHscroll   -   point.x)   /   xChar;
yCaret   =   iColumnCharCount   -   (rect.bottom   -   iCyVscroll   -   point.y)   /   yChar;

point.x   =   xCaret;
point.y   =   yCaret;

return   (point);
}

------解决方案--------------------
POINT pt;
int nPos;

if(GetCaretPos(&pt))
{
nPos=SendMessage(hEdit, EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y));
}

------解决方案--------------------
另:yChar=tm.tmExternalLeading+tm.tmHeight; //tm.tmExternalLeading是用于计算行间距
此外,用tm.tmAveCharWidth作为字符间距的方法不准确


------解决方案--------------------
选用等间距字体,例如Courier New。