C语言综合:典型疑难地一个处理办法
来源:优易学  2010-1-14 11:41:52   【优易学:中国教育考试门户网】   资料下载   IT书店
  介绍
  在很多VC技术论坛中经常看到一些人提出来许多的问题,其中有很多的问题具有很多的针对性和普片性,这里就两个问题进行简要的回答,也许很多高手有更简单的解答方法,不过这里的方法希望能给各位或者初学者有帮助.
  正文
  问题一.如何是ED99v支持小数的输入.
  一般的ED99v控件支持很多格式的输入,如果要支持数据的输入的话,你可以修改ED99v控件属性,选中NUMBER属性就可以了,但是这样不支持.号的输入,也就是不支持小数的输入了.
  这里的解决方法是派生一个类CED99v,然后映射消息EN_CHANGE,因为如果你的控件使用这个派生类的话,在你进行你的ED99v控件进行输入字符改变的时候都会触发这个事件,不用为你的控件每个触发EN_CHANGE事件了.然后判断新输入的字符,如果这个字符符合数字规则或者.号规则,再计算已经出现的.号次数,当符合这种条件时允许输入操作,否则删除刚输入的字符,进行重新设置编辑框字符串的操作.
  可能涉及到的问题,1:如何判断一个字符串是数字还是别的类型.2:如何查找一个字符串中某个符号出现的次数.3:如何设置ED99v光标的位置.
  1 问题的解决方法可以利用下面的方法解决.
  CString strtemp=szTemp.SpanIncluding(\"0123456789\");
  if(!strtemp.IsEmpty())
  //这个字符串为数字
  else
  //非数字
  2 问题我用循环递归的方法实现,首先查找最先出现的符号位置,然后利用字符串分割技术取RIGHT部分再进 行循环调用就可以了,相关代码可以见下:
  int CNumEditCtrl::GetStringNum(CString szVal)//获得字符串中间.号的个数
  {
  int nNum=0;
  while(1)
  {
  int nCount=szVal.Find(\’.\’);
  if(nCount==-1)
  break;
  szVal=szVal.Right(szVal.GetLength()-nCount-1);
  nNum++;
  }
  return nNum;
  }
  3 问题可以采用获得ED99v控件句柄发送EM_SETSEL消息的方法实现.
  所以基本代码可以实现见下了:
  void CNumEditCtrl::OnChange()
  {
  // TODO: If this is a RICHED99v control, the control will not
  // send this notification unless you override the CEdit::OnInitDialog()
  // function and call CRichEditCtrl().SetEventMask()
  // with the ENM_CHANGE flag ORed into the mask.
  CString m_estr,szTemp;
  GetWindowText(m_estr);
  int nLen=m_estr.GetLength();
  if(!m_estr.IsEmpty())
  {
  szTemp=m_estr.Right(1);
  BOOL bNum=TRUE;
  CString strtemp=szTemp.SpanIncluding(\"0123456789\");
  if(!strtemp.IsEmpty())
  bNum=TRUE;
  else
   bNum=FALSE;
  nPoint=GetStringNum(m_estr);
  if(strcmp(szTemp,\".\")==0 || bNum)
  {
  if(nPoint>1)
  {
  nPoint--;
  ::AfxMessageBox(\".号出现次数超过两次!\");
  m_estr=m_estr.Left(m_estr.GetLength()-1);
  SetWindowText(m_estr);
  nLen--;
  SendMessage(EM_SETSEL,nLen,nLen);
  return;
  }
  }
  else
  {
  ::AfxMessageBox(\"输入格式错误\");
  m_estr=m_estr.Left(m_estr.GetLength()-1);
  SetWindowText(m_estr);
  nLen--;
  SendMessage(EM_SETSEL,nLen,nLen);
  return;
  }
  }
  // TODO: Add your control notification handler code here
  }
  问题二.如何使用PICTURE控件显示ED99v控件内容
  PICTURE控件不能进行SETWINDOWTEXT操作,所以不能直接使用控件不能显示字符.但是如果派生CSTATIC,然后处理WM_PAINT消息进行控件的重绘操作就可以实现了.代码其实都是狠简单的.下面的方法可以参考.
  void CShowStrPicWnd::OnPaint()
  {
  CPaintDC dc(this); // d
  m_Brush.DeleteObject();
  m_Brush.CreateSolidBrush(RGB(255,128,64));
  CDC* pDC = GetDC();
  pDC->SetBkMode(OPAQUE);
  pDC->SetBkColor(RGB(255,128,64));
  pDC->SelectObject(&m_Brush);
  CRect rc;
  GetClientRect(&rc);
  ScreenToClient(&rc);
  pDC->Rectangle(0, 0, rc.Width(), rc.Height());
  pDC->SetTextColor(RGB(255,0,0));
  pDC->TextOut(2, 2, strText.GetBuffer(strText.GetLength()));
  // Do not call CStatic::OnPaint() for painting messages
  }
  然后触发控件EN_CHANGE消息,这样就能够将信息传递到PIC了,再调用INVALIDATERECT进行界面的重绘工作.

责任编辑:cyth

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训