CEdit 中CEdit静态文本上下滚动 滚轮、SetSel 的使用

来源:互联网 发布:linux less more 编辑:程序博客网 时间:2024/05/16 06:05

首先介绍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);
}

 

 

 





 

 

 


 

 

原创粉丝点击