注意:这不是广告贴。我只是想让大家讨论一下,一些bug的解决办法我实现效果如下:
下载源码请到我的博客:http://www.cguage.com/post-35.html未实现的功能:    * 文本框背景图像(现在只实现了背景色)
    * 实现不了圆形密码(设置不了UNICODE字符: · )
    * 鼠标滑过文本框变大,离开时变小,不能擦除多余图像
    * 不能设置密码模式的灰色文字提示
    * 不能设置圆形密码

解决方案 »

  1.   

    自己写一个CEdit倒还简单,重载CEdit好困难啊~大家先去我的博客下载源码,再讨论一下,未实现的功能,该怎么解决:  * 文本框背景图像(现在只实现了背景色)
      * 实现不了圆形密码(设置不了UNICODE字符:“ ·” )
      * 鼠标滑过文本框变大,离开时变小,不能擦除多余图像
      * 不能设置密码模式的灰色文字提示
      

  2.   

    我大概说一下实现原理:
    CtlColor返回空画刷的句柄,以便在OnEraseBkgnd里面画的东西能够显示OnEraseBkgnd里面画背景、阴影,做法比较简单,就是简单的GDI绘图。做的阴影也没有GDI+的炫,而是用了比较土的办法边缘画到了客户区之外,一来不被文字背景色挡住,另外如果设置文字背景为透明,就会出现问题了。具体问题,下载源码,改一下就知道了而如果在OnPaint里面画背景啊、边框啊什么的,就会影响文字的正常操作。(比如不选中文字,依然还是选中时的状态,而不会自动重绘)在OnNcPaint里面画一点反应也没有,估计被OnEraseBkgnd覆盖掉了对WM_MOUSEHOVER、WM_MOUSELEAVE的响应,是在OnMouseMouse里面用_TrackMouseEvent分发消息灰色文字提示,也只是把文字设置成灰色的而已。不是画出来的(画出来的字往往有很大的问题)在Edit控件里面画东西比自己做个Edit控件麻烦多了,主要是不太清楚CEdit里面的绘图机制,如果能搞到一份CEdit类的源码就好了
    另:不支持动态创建(我懒得写了,有兴趣可以写写),只支持用模板方式创建,但是这样就不能动态更改文本框的属性(比如不能动态更改WS_BORDER属性)
      

  3.   

    “鼠标滑过文本框变大,离开时变小,不能擦除多余图像”这一条,大家可能不太清楚是什么意思,我解释一下:就是,把源码中
    注释掉的这几句恢复一下
    //按标志放大
    //  int nTmp = m_nFontSize;
    //  //  SetFont(((m_nHoverStyle & FOCUS_ENLARGE) && m_bHover) ? 
    //  //  m_nHoverFontSize : m_nFontSize, m_lpszFaceName);
    // 
    //  if(m_nHoverStyle & FOCUS_ENLARGE)
    //  {
    //  if(m_bHover)
    //  SetFont(m_nHoverFontSize, m_lpszFaceName);
    //  else
    //  SetFont(m_nFontSize, m_lpszFaceName);
    //  }
    // 
    //  m_nFontSize = nTmp;然后,
    m_AdvEdit[6].SetHoverStyle(FOCUS_ENLARGE | FOCUS_BKCOLOR | FOCUS_BORDERTHICK,
    250, RGB(255, 255, 228), 2);中的FOCUS_ENLARGE标志位就会调用这个功能。
    不过,大家会发现,鼠标滑过时文本框是变大了,但是离开之后,不会自己擦除画过的东西。想调用对话框类的InvalidateRect(这样就需要一个主对话框类的this指针),但是又想保持CEdit类的独立性,好纠结呀
      

  4.   

    完3 d  头很晕的e zui hao b yao yong 
      

  5.   

    本帖最后由 xyzhaopeng 于 2010-07-13 09:43:53 编辑
      

  6.   

    我还达不到楼主的境界 我一般都是用人家已经封装好的EDIT 然后加个皮肤界面 一样的效果 
    不想在这种控件上花太多时间 多花点时间在 怎么样搭建架构吧
    期待接分
      

  7.   

    哥哥,,链接打不开,,你能不能发我邮箱啊,。。[email protected]..谢谢噢。。
      

  8.   

    楼主,与其这样做到不如换方法来做。
    你可以了解一下ITextHost 与ITextServices 接口,通过这两个接口你可以实现一个无窗口的编辑器,这样的话你可以绘制任何你想要的效果。
      

  9.   


    用COM的技术哦,似乎复杂了~ 
    能不能再详细点
      

  10.   

    DirectUI用起来固然简单,但是控件自绘是必需的基础。直接用别人的现成的技术,总会遇到实现不了的功能的时候。
    ……
    大家下了源码之后,有没有以上未实现功能的解决办法的啊?
      

  11.   

    你查一下MSDN,上面有接口的详细介绍。这个COM组件的使用不复杂。
      

  12.   

    其实GOOGLE上很多相关的消息,楼主你只要搜一下就会了解。附上一段代码。
    LRESULT CTextHostImpl::TxWindowProc(Msg msg, WPARAM wParam, LPARAM lParam)
    {
    LRESULT result;
    switch (msg)
    {
    case WM_SETCURSOR:
    ...
    ...
    default:
    ////////////////////Marked code
    if (SUCCEEDED(m_pTextServices->TxSendMessage(msg, wParam, lParam, &result)
    return &result;
    break;
    ////////////////////Marked code
    }
    return DefWindowProc(m_pWnd, msg, wParam, lParam);
    }
      

  13.   

    把CEdit的边框去掉,直接画到父窗口上。
      

  14.   

    看效果就是不错的Coder,继续努力
      

  15.   

    codeproject有一堆改写的button类.