在完成搜索工具项目的时候,给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得到的值是相同的。