宇文成风VC技巧总结之Edit的重载
转载请注明http://blog.csdn.net/daydayuplo
也许有人和我一样对VC6自带的EDIT控件很不满意,当然使用系统自带风格的就好很多了,那个也很简单,不过还是不自由,打造自己的EDIT控件是一件很舒服得事;
重载EDIT控件不像重载BUTTON,它没有DRAWITEM这个东西,所以必须在ONNCPAINT或者是ONPAINT里面重画,可能你已经这样做了,可能你遇到了重画后EDIT内容被覆盖的问题,又或者是滚动条消失的问题,总之呢,我的重绘不是很彻底,并没有重绘滚动条,我只重绘了边框,鼠标在EDIT内一个外型,鼠标在外又是一个外形,怎么说呢,觉得腾讯的EDIT不错,一个字,抄。
我只谈论具体思路,代码其实不是很重要,注意以下几点即可完成;
在WM_MOUSEMOVE中把鼠标标记为进入了EDIT,之后设置一个定时器,定时检测鼠标是否在EDIT内部;
void CComEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bIsInEditRect)
{
m_bIsInEditRect = TRUE;
OnNcPaint();
SetTimer(1, 50, NULL);
}
CEdit::OnMouseMove(nFlags, point);
}
//定时器操作
void CComEdit::OnTimer(UINT nIDEvent)
{
POINT pt;
GetCursorPos(&pt);
CRect rcItem;
GetWindowRect(&rcItem);
if(!rcItem.PtInRect(pt))
{
m_bIsInEditRect = FALSE;
RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME); //重绘客户区和边框;
KillTimer(1);
return;
//RedrawWindow(NULL, NULL,RDW_INVALIDATE );
}
CEdit::OnTimer(nIDEvent);
}
//记录鼠标左键是否按下
void CComEdit::OnLButtonDown(UINT nFlags, CPoint point)
{
if (!m_readonly)
{
m_mousedown = TRUE;
SetCapture();
}
CEdit::OnLButtonDown(nFlags, point);
}
void CComEdit::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_mousedown)
ReleaseCapture();
m_mousedown = FALSE;
RedrawWindow(NULL, NULL, RDW_INVALIDATE); //当鼠标在EDIT中按下,在EDIT外部弹起的时候重绘客户区,保证内容不被抹掉
CEdit::OnLButtonUp(nFlags, point);
}
void CComEdit::OnNcPaint()
{
// TODO: Add your message handler code here
//请在这里第一次拷贝EDIT的背景,可以在重画的时候还原边缘,如果你不需要圆角,那这里就不用
//这里的代码你们自己搞定,我的提示是windows程序设计第5版的
Bitmaps and Bitblts
这章有一个给图片打掩码的例子,可以在这里用,就提示到这里;
CEdit::OnNcPaint(); //VC交代不让在ONNCPAINT里面调用,不过不调用滚动条就永远离开我们了,所以大家放心调
RedrawWindow(NULL, NULL, RDW_INVALIDATE);//这里是为了防止窗口部分被遮挡时重画客户区内容消失;
//下面就是你的工作了,想画什么边框都行,不过别忘了整个透明刷子,别画到客户区的内容了;
//这里你可以分开画不同的外形,鼠标在内部或者不在
}
EDIT的重载就讲完了,这是我的个人体验,下面上图。
鼠标在在内部就是方角,在外部就是圆角,看起来还不错;