在使用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控件,也就绘制成功,如有问题,欢迎一起讨论。