duilib 绘制IP控件

时间:2023-03-09 02:58:07
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 = {};
::GetTextExtentPoint32(hHdc,m_pOwner->GetText(),,&sizeIP1); SIZE sizeIP2 = {};
::GetTextExtentPoint32(hHdc,m_pOwner->GetText(),,&sizeIP2); SIZE sizeIP3 = {};
::GetTextExtentPoint32(hHdc,m_pOwner->GetText(),,&sizeIP3); SIZE sizeIP4 = {};
::GetTextExtentPoint32(hHdc,m_pOwner->GetText(),,&sizeIP4); SelectFont(hHdc,nOldFont);//恢复旧字体 ::ReleaseDC(m_hWnd, hHdc);//释放句柄 if(sizeIP1.cx >= pt.x &&pt.x >= )//判断光标区域
{
//pEdit->SetFocus();
m_pOwner->SetSel(,);
m_enType = POS_IP1; //pEdit1->SetFocus();
}
else if(pt.x > sizeIP1.cx && pt.x <= sizeIP2.cx)//判断光标区域
{
m_pOwner->SetSel(,);
m_enType = POS_IP2; }
else if(pt.x > sizeIP2.cx && pt.x <= sizeIP3.cx)//判断光标区域
{ m_pOwner->SetSel(,);
m_enType = POS_IP3; }
else if(pt.x > sizeIP3.cx && pt.x <= sizeIP4.cx)//判断光标区域
{
m_pOwner->SetSel(,);
m_enType = POS_IP4; }

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