获取插入符在文本中的位置(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。
解释:
文本串: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。