获得DuiLib中CEditUI的光标位置

在完成搜索工具项目的时候,给DuiLib的一个窗口ResizeClient的时候编辑框会失去焦点,我们将焦点想办法重新给到编辑框后,发现光标的位置总是会默认在最前面的位置,这大大的影响了程序的用户体验,通过查看DuiLib源码发现只有SetSel函数而没有GetSel函数,于是通过修改源码实现了一个。

通过查看SetSel的源码我们可以看到如下代码:

void CEditUI::SetSel(long nStartChar, long nEndChar)
{
	if( m_pWindow != NULL ) Edit_SetSel(*m_pWindow, nStartChar,nEndChar);
}

接着查看Edit_SetSel的源码如下:

#define Edit_SetSel(hwndCtl, ichStart, ichEnd)  ((void)SNDMSG((hwndCtl), EM_SETSEL, (ichStart), (ichEnd)))

接着查看SNDMSG的源码如下:

#define SNDMSG :: SendMessage

原来是通过发消息来实现的。

同时Edit_SetSel的上面一行代码就是:

#define Edit_GetSel(hwndCtl)                    ((DWORD)SNDMSG((hwndCtl), EM_GETSEL, 0L, 0L))

通过查询微软文档:EM_GETSEL消息

我们可以知道:返回值是一个从零开始的值,其中光标的起始位置在LOWORD中,而光标末尾的位置在HIWORD中。

所以我们可以完成我们的GetSel了。

WORD CEditUI::GetSel(){
      if(m_pWindow != NULL)
      return LOWORD(Edit_GetSel(*m_pWindow));
}

如果只是为了获得光标位置,这里使用LOWORD和HIWORD得到的值是相同的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注