控件初始化时会在上面显示两个字符,不想让用户通过鼠标将光标移动到这两个字符之前,即控制光标在这两个字符后面移动。我的想法是添加CEdit的Setfocus响应函数,然后在里面判断光标的位置,如果发现光标的位置是0或者1,就将光标位置移动到2,可是实现起来发现不起作用。当我用鼠标点最前面,响应函数里能判断出位置为0,但是移动光标不起作用。移动光标用的是SetSel的方法。后来这样做的,当判断光标的位置小于2时,将焦点转到其它控件上,然后再设置光标的位置,可实验中发现光标还是位置没有发生改变。再后来这样实验了一下,当光标位置大于10时,就将焦点转到其它控件上,不转回来了,然后一直输入,结果光标一直好好的在Edit控件上。不太清楚原理,不知道能不能通过这种方式实现。
要是内部用的,获取输入后,自己添加
BOOL CTest2Dlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_LBUTTONUP)
{
CRect rcEdit;
m_cltEdit.GetWindowRect(&rcEdit);
CPoint point = pMsg->pt;
if(rcEdit.PtInRect(point))
{
int nS,nE;
nS = nE = 0;
m_cltEdit.GetSel(nS,nE);
CString str;
str.Format("nS:%d,nE:%d",nS,nE);//取得当前光标位置
TRACE(str+"\n");
if(nS<4)
m_cltEdit.SetSel(4,4);//将光标移动到第四个光标之后
}
}
return CDialog::PreTranslateMessage(pMsg);
}
现在基本上实现了这个功能了,派生了一个CEdit类,响应了WM_CHAR、WM_LBUTTONDOWN、WM_LBUTTONUP三个消息,方法就是在消息响应函数里判断光标位置,如果位置小于2,就移动光标,现在的问题就是用WM_LBUTTONDOWN消息处理时,移动光标间隔性的成功,用WM_LBUTTONUP来处理时,每次都能移动成功,但移动成功后会把移动后的位置与当前位置间的内容选定。 LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CPoint pt = this->GetCaretPos();
int nPos = this->CharFromPos(pt);
if(nPos < 2)
{
this->SetSel(2, 2, TRUE);
this->SetFocus();
return 0;
}
bHandled = FALSE;
return 0;
}
LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CPoint pt = this->GetCaretPos();
int nPos = this->CharFromPos(pt);
if(nPos < 2)
{
this->SetSel(2, 2, TRUE);
this->SetFocus();
return 0;
}
bHandled = FALSE;
return 0;
}
看能不能改进一下?
edit.SetSel(edit.GetWindowTextLength(),edit.GetWindowTextLength());
edit.SetFocus();
最简单的办法就是换 VS2008 sp1, 有个 CMFCMaskedEdit你看图上 Mask4 的 0x、Mask3 的 S/N 就是固定的,光标移动不过去。
{
if(VK_LEFT == wParam)
{
CPoint pt = this->GetCaretPos();
int nPos = this->CharFromPos(pt);
if(nPos <= 2)
{
return 0;
}
}
bHandled = FALSE;
return 0;
}
LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// CPoint pt = this->GetCaretPos();
int nPos = this->CharFromPos(GET_X_LPARAM(lParam));
if(nPos < 2)
{
this->SetSel(2, 2, TRUE);
this->SetFocus();
return 0;
}
bHandled = FALSE;
return 0;
}
LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int nPos = this->CharFromPos(GET_X_LPARAM(lParam));
if(nPos < 2)
{
return 0;
}
bHandled = FALSE;
return 0;
}
由于受到处理键盘时思路的影响,处理鼠标时也用了GetCaretPos(),绕了一个弯,总算绕回来了。