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

duilib 绘制IP控件的更多相关文章

  1. duilib修复ActiveXUI控件bug,以支持flash透明动态背景

    转载请说明原出处,谢谢~~ 昨天在QQ控件里和同学说起QQ2013登陆窗体的开发,从界面角度考虑,单单一个登陆界面是很容易做出来的.腾讯公司为了 防止各种盗号行为可谓煞费苦心,QQ2013采用了动态背 ...

  2. 改进duilib的richedit控件的部分功能

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41208207 如果要使用透明异形窗体功能,首先要改进duilib库让他本 ...

  3. 将webkit内核封装为duilib的浏览器控件

    转载请说明出处,谢谢~~ 原本的duilib是自带浏览器控件的,但是使用了IE内核,我在做仿酷狗音乐播放器时,在右侧乐库要用到浏览器控件,而我使用自带的IE控件却发现了不少缺点,这也是duilib一直 ...

  4. WM_ERASEBKGND官方解释(翻译),以及Delphi里所有的使用情况(就是绘制窗口控件背景色,并阻止进一步传递消息)

    #define WM_ERASEBKGND                   0x0014 Parameters wParam A handle to the device context. //  ...

  5. C#自定义ip控件

    前言:由于项目中有ip输入,但C#中又没有IP控件,如果直接放4个TextBox感觉又怎么好,还不好控制,于是可以通过自定义控件的方式来解决,就又了下面的自定义ip控件,该控件功能基本完善,如果还有未 ...

  6. Android中自定义IP控件

    最近在搞Android项目,之前并没有系统的去学过这方面的编程,只能边看书边撸代码.在项目的开发的过程中,需要一个IP控件,后面了解到Android中并没有这样的控件,于是网上搜索,发现得到的结果并不 ...

  7. 百度地图API示例:鼠标绘制点线面 控件修改

    需求 :在使用地图API时,绘制工具栏控件想自己选择哪些要,哪些不要. 可以查看相应的类:官网地址: http://api.map.baidu.com/library/DrawingManager/1 ...

  8. duilib 增加gif控件(基于gdi+,可控制播放暂停,自动设置大小)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42502081 因为项目需要我需要给duilib增加一个gif控件,目前已 ...

  9. Duilib教程-控件练习

    一.控件消息的响应. 在HelloDuilib例子中,程序不能退出,在这里,我将添加一个关闭按钮,当点击它时,调用PostQuitMessage进行退出. 首先在界面的右上角添加一个关闭按钮,并取名为 ...

随机推荐

  1. spell checking

    Spell checker Description You, as a member of a development team for a new spell checking program, a ...

  2. 系统里有Courier New字体 Eclipse没有这个字体选项

    问题状态: 系统里有Courier New字体 Eclipse没有这个字体选项问题原因: windows(xp)中的系统字体分为"显示"和"隐藏"两种状态,当为 ...

  3. 利用智能手机(Android)追踪一块磁铁(转)

    利用智能手机(Android)追踪一块磁铁(一) 利用智能手机(Android)追踪一块磁铁(二) 利用智能手机(Android)追踪一块磁铁(三)

  4. AFNetWorking发送post请求,Code=-1016错误

    使用AFNetWorking发送post请求时,可能会出现下面Code=-1016问题.打印的error如下: Error:Error Domain=com.alamofire.error.seria ...

  5. STM32驱动DS18B20

    DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器.与传 统的热敏电阻等测温元件相比,它是一种新型的体积小.适用电压宽.与微处理器接口简单的 数字化温度传感器.一线 ...

  6. SQL SERVER 2000 数据恢复(分离数据库+附加数据库)

    一.分离数据库     SQL Server 2000允许分离数据库的数据和事务日志文件,然后将其重新附加到同一台或另一台服务器上.分离数据库将从SQL Server 删除数据库,所以当点击“分离数据 ...

  7. composer 安装和修改中国镜像

    参考:http://docs.phpcomposer.com/00-intro.html#Using-Composer http://www.phpcomposer.com/ 下载安装 下载并且运行 ...

  8. 扫码JSP

    扫码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  9. JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  10. Reactive 网络状态 Activity indicator view

    转动属性:Animating RAC(self.searchActivity, hidden) = [self.m_viewModel.m_searchCommand.executing not];