MFC中的EN_CHANGE消息和颜色控制。(想实现的功能是如果输入数据不合法编辑框文本颜色就变红)
下面是放在OnCtlColor中的代码,但是这里的出问题的那个updatedata(),出问题的原因我想的大致是如果编辑框为空就会报错,报完错程序就崩溃了。(PS:这里的...
下面是放在OnCtlColor中的代码,但是这里的出问题的那个updatedata(),出问题的原因我想的大致是如果编辑框为空就会报错,报完错程序就崩溃了。(PS:这里的IDC_EDIT1已经关联了m_edit1我用updatedata的原因就是要录入数据。
[code=c]
HBRUSH Cbasemode::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
[/code]
[code=c]
if(pWnd->GetDlgCtrlID()==IDC_EDIT1)
{
int temp;
char chr[20];
memset(chr,0,sizeof(chr));
temp=GetDlgItem(IDC_EDIT1)->GetWindowText(chr,20);
for (int i=0;i<20;i++)
{
if ((int)chr[i]>57||(int)chr[i]<48)
break;
}
if (i=20)
{
UpdateData();
if(m_edit1>0.5||m_edit1<0)
{
pDC->SetTextColor(RGB(255,0,0));
UpdateData(FALSE);
}
}
}
[/code]
[code=c]
后来想在OnChangeEdit1中加入updatedata,但是只要edit1的数据变化它的内容就会变,但只能记录一位,后面的就显示不出来了。
void Cbasemode::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData();
}
[/code]
不知道有没有什么比较好的方法能实现这个功能,最好是不删掉变量关联(我试过,不用变量关联可以实现,不过我程序的其他地方用来关联的变量,不用的话修改的量比较大)。 展开
[code=c]
HBRUSH Cbasemode::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
[/code]
[code=c]
if(pWnd->GetDlgCtrlID()==IDC_EDIT1)
{
int temp;
char chr[20];
memset(chr,0,sizeof(chr));
temp=GetDlgItem(IDC_EDIT1)->GetWindowText(chr,20);
for (int i=0;i<20;i++)
{
if ((int)chr[i]>57||(int)chr[i]<48)
break;
}
if (i=20)
{
UpdateData();
if(m_edit1>0.5||m_edit1<0)
{
pDC->SetTextColor(RGB(255,0,0));
UpdateData(FALSE);
}
}
}
[/code]
[code=c]
后来想在OnChangeEdit1中加入updatedata,但是只要edit1的数据变化它的内容就会变,但只能记录一位,后面的就显示不出来了。
void Cbasemode::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData();
}
[/code]
不知道有没有什么比较好的方法能实现这个功能,最好是不删掉变量关联(我试过,不用变量关联可以实现,不过我程序的其他地方用来关联的变量,不用的话修改的量比较大)。 展开
3个回答
展开全部
你这里OnChangeEdit1事件的触发方式是只要edit内容被修改就会调用。如果edit内容别清空的时候也会调用这个函数,输入过程中也会调用这个函数。其实OnChangeEdit1事件一般不会这么用。
我们在注册会员的时候,经常看到输入用户名完毕,下一步输入密码的时候,会发现用户名被占用提示,这就是应用了另外一个事件。
给你一个另外的设计思路(一般编写软件也是这种方式):”控件失去焦点事件“
这个事件的好处就是你确定自己输入完毕了,我们将鼠标随意点击其他地方的时候,该事件被触发,此时你可以对输入内容进行判定,并将输入框的颜色改变。
这样你在edit内容改变只需做一次判定。
我们在注册会员的时候,经常看到输入用户名完毕,下一步输入密码的时候,会发现用户名被占用提示,这就是应用了另外一个事件。
给你一个另外的设计思路(一般编写软件也是这种方式):”控件失去焦点事件“
这个事件的好处就是你确定自己输入完毕了,我们将鼠标随意点击其他地方的时候,该事件被触发,此时你可以对输入内容进行判定,并将输入框的颜色改变。
这样你在edit内容改变只需做一次判定。
追问
我觉得判断焦点位置的确是个解决办法,不过怎么判断焦点位置发生变化了呢。
用mousemove么?但是如果客户不用鼠标,直接用tab怎么办呢。
另外,我试着加了个MOUSEMOVE响应,在响应函数里加了个UPDATEDATA()。
但是出现的效果是,输入有误时,不会立即变色,必须在下一次鼠标点回这个窗口的时候才会变色,我想的原因是不是因为mousemove只响应控件内的鼠标移动,而之外的都不响应。
追答
EDIT控件有一个KILLFOCUS事件,代表当控件失去焦点时触发。
展开全部
我有写个自定义CEdit皮肤的例子,可以给你些参考:
http://blog.csdn.net/renstarone/article/details/12718283
http://blog.csdn.net/renstarone/article/details/12718283
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议还是将IDC_EDIT1与m_edit1的关联去掉,虽然其它地方用的多,但是毕竟是可控的,自由的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询