漂亮Edit控件的重载

宇文成风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版的

Chapter 14

Bitmaps and Bitblts

这章有一个给图片打掩码的例子,可以在这里用,就提示到这里;

 CEdit::OnNcPaint(); //VC交代不让在ONNCPAINT里面调用,不过不调用滚动条就永远离开我们了,所以大家放心调

 

RedrawWindow(NULL, NULL, RDW_INVALIDATE);//这里是为了防止窗口部分被遮挡时重画客户区内容消失;

 

 

//下面就是你的工作了,想画什么边框都行,不过别忘了整个透明刷子,别画到客户区的内容了;

//这里你可以分开画不同的外形,鼠标在内部或者不在

 

 

}

 

EDIT的重载就讲完了,这是我的个人体验,下面上图。

 

 

 

 

 鼠标在在内部就是方角,在外部就是圆角,看起来还不错;

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值