宇文成风VC技巧总结之Edit的重载
也许有人和我一样对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版的
Chapter 14
Bitmaps and Bitblts
这章有一个给图片打掩码的例子,可以在这里用,就提示到这里; CEdit::OnNcPaint(); //VC交代不让在ONNCPAINT里面调用,不过不调用滚动条就永远离开我们了,所以大家放心调
RedrawWindow(NULL, NULL, RDW_INVALIDATE);//这里是为了防止窗口部分被遮挡时重画客户区内容消失;
//下面就是你的工作了,想画什么边框都行,不过别忘了整个透明刷子,别画到客户区的内容了;
//这里你可以分开画不同的外形,鼠标在内部或者不在
}
EDIT的重载就讲完了,这是我的个人体验,下面上图。
鼠标在在内部就是方角,在外部就是圆角,看起来还不错;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/daydayuplo/archive/2010/12/31/6110766.aspx
|
|