| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vc >> vc控件 >> 文章正文
论坛典型问题的一个解决方法        【字体:
论坛典型问题的一个解决方法
作者:-    文章来源:-    点击数:    更新时间:2006-4-20

下载本文所附源代码


介绍
在很多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进行界面的重绘工作.

程序运行界面见下:

[1] [2] [3] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章: 没有了

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • VC控件 TreeCtrl 与 ListCtr…

  • CListCtrl 使用演示的例子

  • VC通用控件编程之CList控件

  • VC++在应用程序中使用标准窗…

  • 用ATL和MFC来创建ActiveX控件

  • 动态控件的生成与响应

  • 可设置颜色的静态控件、单选…

  • 支持数据项查找功能的树控制…

  • VC通用控件编程之CImageList…

  • 做一个可编辑的表格控件

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |