注意:这不是广告贴。我只是想让大家讨论一下,一些bug的解决办法我实现效果如下:
下载源码请到我的博客:http://www.cguage.com/post-35.html未实现的功能: * 文本框背景图像(现在只实现了背景色)
* 实现不了圆形密码(设置不了UNICODE字符: · )
* 鼠标滑过文本框变大,离开时变小,不能擦除多余图像
* 不能设置密码模式的灰色文字提示
* 不能设置圆形密码
下载源码请到我的博客:http://www.cguage.com/post-35.html未实现的功能: * 文本框背景图像(现在只实现了背景色)
* 实现不了圆形密码(设置不了UNICODE字符: · )
* 鼠标滑过文本框变大,离开时变小,不能擦除多余图像
* 不能设置密码模式的灰色文字提示
* 不能设置圆形密码
* 实现不了圆形密码(设置不了UNICODE字符:“ ·” )
* 鼠标滑过文本框变大,离开时变小,不能擦除多余图像
* 不能设置密码模式的灰色文字提示
CtlColor返回空画刷的句柄,以便在OnEraseBkgnd里面画的东西能够显示OnEraseBkgnd里面画背景、阴影,做法比较简单,就是简单的GDI绘图。做的阴影也没有GDI+的炫,而是用了比较土的办法边缘画到了客户区之外,一来不被文字背景色挡住,另外如果设置文字背景为透明,就会出现问题了。具体问题,下载源码,改一下就知道了而如果在OnPaint里面画背景啊、边框啊什么的,就会影响文字的正常操作。(比如不选中文字,依然还是选中时的状态,而不会自动重绘)在OnNcPaint里面画一点反应也没有,估计被OnEraseBkgnd覆盖掉了对WM_MOUSEHOVER、WM_MOUSELEAVE的响应,是在OnMouseMouse里面用_TrackMouseEvent分发消息灰色文字提示,也只是把文字设置成灰色的而已。不是画出来的(画出来的字往往有很大的问题)在Edit控件里面画东西比自己做个Edit控件麻烦多了,主要是不太清楚CEdit里面的绘图机制,如果能搞到一份CEdit类的源码就好了
另:不支持动态创建(我懒得写了,有兴趣可以写写),只支持用模板方式创建,但是这样就不能动态更改文本框的属性(比如不能动态更改WS_BORDER属性)
注释掉的这几句恢复一下
//按标志放大
// 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类的独立性,好纠结呀
不想在这种控件上花太多时间 多花点时间在 怎么样搭建架构吧
期待接分
你可以了解一下ITextHost 与ITextServices 接口,通过这两个接口你可以实现一个无窗口的编辑器,这样的话你可以绘制任何你想要的效果。
用COM的技术哦,似乎复杂了~
能不能再详细点
……
大家下了源码之后,有没有以上未实现功能的解决办法的啊?
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);
}