duilib 绘制IP控件

  在使用duilib时,发现本来的库并没有提供IP控件,如是自己想到绘制IP控件,控件的绘制不难,首先复制UIEdit的两个文件,命名为UIIPEdit,更改完成后,便可以进行修改绘制IP控件。

  绘制难道主要在鼠标点击的时候,标亮所选择的IP的第几个值,解觉得整个问题其实也很简单,步骤如下:

  1.响应鼠标按下和双击消息

  2.响应后,根据鼠标位置,判断当前鼠标点击所在啊的位置

  3.标亮选中的区域

  那如何由鼠标判断位置嘞?做法是获取每个文字所占的鼠标位置。由于,字体大小是变化的,获取位置时需要借助win API GetTextExtentPoint32,由此API可以获取字体SIZE,然后通过获取鼠标点击的位置来判断标亮选择那个位置,代码如下:

        HFONT nFont = m_pOwner->GetManager()->GetFont(m_pOwner->GetFont());//得到当前字体

        ///::CClientDC dcClient(m_hWnd);
        HDC hHdc = ::GetDC(m_hWnd);//由句柄获取当前HDC
        HFONT nOldFont = SelectFont(hHdc,nFont);//选择当前字体

        SIZE sizeIP1 = {0};
        ::GetTextExtentPoint32(hHdc,m_pOwner->GetText(),3,&sizeIP1);

        SIZE sizeIP2 = {0};
        ::GetTextExtentPoint32(hHdc,m_pOwner->GetText(),7,&sizeIP2);

        SIZE sizeIP3 = {0};
        ::GetTextExtentPoint32(hHdc,m_pOwner->GetText(),11,&sizeIP3);

        SIZE sizeIP4 = {0};
        ::GetTextExtentPoint32(hHdc,m_pOwner->GetText(),15,&sizeIP4);

        SelectFont(hHdc,nOldFont);//恢复旧字体

        ::ReleaseDC(m_hWnd, hHdc);//释放句柄

        if(sizeIP1.cx >= pt.x &&pt.x >= 0)//判断光标区域
        {
            //pEdit->SetFocus();
            m_pOwner->SetSel(0,3);
            m_enType = POS_IP1;

            //pEdit1->SetFocus();
        }
        else if(pt.x > sizeIP1.cx   && pt.x  <= sizeIP2.cx)//判断光标区域
        {      
            m_pOwner->SetSel(4,7);
            m_enType = POS_IP2;

        }
        else if(pt.x > sizeIP2.cx   && pt.x  <= sizeIP3.cx)//判断光标区域
        {

            m_pOwner->SetSel(8,11);
            m_enType = POS_IP3;

        }
        else if(pt.x > sizeIP3.cx   && pt.x  <= sizeIP4.cx)//判断光标区域
        {          
            m_pOwner->SetSel(12,15);
            m_enType = POS_IP4;

        }

  判断了区域后,剩下的就是输入了,由于IP有限制,不能超过255,所以输入时要做判断。输入时,响应WM_CHAR消息,在此消息中,对输入的数字做判断和边界处理。解决了难点,IP控件,也就绘制成功,如有问题,欢迎一起讨论。

posted @ 2017-02-09 11:19  公子綦  阅读(1027)  评论(0编辑  收藏  举报