首先介绍CEdit几个函数:
第一: LineFromChar 的作用: 仅用于多行编辑框,参数如果不填写,则默认是-1,直接调用,会返回当前光标所在的行数,MFC 是从0 开始算起的。
参数如果填写,则返回指定字符索引所在行的行索引(从零开始编号)。
第二: LineIndex的作用 : 仅用于多行编辑框,用来获得指定行的开头字符的字符索引,如果指定行超过了编辑框中的最大行数,
该函数将返回-1。参数nLine是指定了从零开始的行索引,如果它的值为-1,则函数返回当前的插入符所在行的字符索引。
第三: SetSel 的作用 : void SetSel( DWORD dwSelection, BOOL bNoScroll = FALSE );
void SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE );
CEdit的成员函数,用来选择编辑框中的正文。参数dwSelection的低位字说明了选择开始处的字符索引,
高位字说明了选择结束处的字符索引。如果低位字为0且高位字节为-1,那么就选择所有的正文,如果低
位字节为-1,则取消所有的选择.参数bNoScroll的值如果是FALSE,则滚动插入符并使之可见,否则就不滚动.
参数nStartChar和nEndChar的含义与参数dwSelection的低位字和高位字相同.
由于最近写一个小项目,遇到了静态文本的上下滚动问题,小小的研究了一下。
滚轮上下滚动 2 中办法:
第一种:响应OnMouseWheel消息。
BOOL CDlgReply::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}
在上述代码中,zDelta的值如果是 负的则 向 下进行滚动, 相反向上滚动。
第二种:很多人会发现OnMouseWheel 消息经常进不去,解决办法是,直接重写 PreTranslateMessage 函数,
代码: 下面的代码 可以实现 CEdit 中 静态文本 随着滚轮的上下滚动,也进行滚动
lineIndex 是当前光标所在的行数,
m_edit_recontext 是控件的对象。
charindex 获取当前行开头字符的字符索引。
BOOL CDlgXXXX::PreTranslateMessage(MSG* pMsg)
{
if ( pMsg->message == WM_MOUSEWHEEL )
{
short zDelta = (short)HIWORD(pMsg->wParam);
short xPos = (short)LOWORD(pMsg->lParam);
short yPos = (short)HIWORD(pMsg->lParam);
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
if( m_edit_recontext.GetSafeHwnd() )
{
CRect rectControl;
m_edit_recontext.GetWindowRect(&rectControl);
ScreenToClient(&rectControl);
if( rectControl.PtInRect(pt) )
{
int lineIndex = m_edit_recontext.LineFromChar();
if( zDelta < 0 )
{
lineIndex += 1;
}
else
{
lineIndex -= 1;
}
int charindex = m_edit_recontext.LineIndex(lineIndex);
m_edit_recontext.SetSel(charindex,charindex);
}
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}