使用图像制作很酷的按钮

更新:2010年6月8日,我知道你不喜欢我第一次写这篇文章,因为我的非nativity和不熟悉英语语言和ON_MESSAGE宏实现导致崩溃在发布模式。我更新了这篇文章,希望你会喜欢。我已经分别添加了源文件和示例项目供下载,示例项目中的解决方案已经转换为Visual Studio 2008.  Introduction  有一些文章关于创建酷按钮CP和互联网,但如果你正在寻找一个10分钟的解决一个问题,而无需经过不错,巨大而华丽的文章,这是对你又是;它的工作方式是,它假设每个按钮有三种状态,其中,1)正常,2)盘旋和3)轻轻松松;正常:当一个按钮在屏幕上是可见的用户和鼠标没有进入按钮区域只徘徊:当用户将鼠标指针移到按钮上时,按钮已经亮起。向下:这是当按钮被按下(或点击)或当鼠标左键被按下而还没有释放时的状态。对于每个按钮的状态,它需要一个来自资源的图像,并且所有三个图像必须是相同的大小。 下面是这三种状态的快照。 如何使用呢?, 创建一个按钮在你的对话框,设置它的机制只你们大多数人可能知道这已经可以从对话框资源编辑器或者它可以在运行时只存在一个类CCoolButton,来自CButton,您需要创建一个成员CCoolButton类型为每个按钮在你的对话框类,并使用DDX_Control DoDataExchange子类。 下面是唯一可以使用的构造函数:Hide  复制Code

CCoolButton(int nIDNormal, int nIDHover, int nIDDown);

这三个参数是资源id,您应该指定位图资源id。 默认构造函数是私有的,您必须在创建object. 10分钟实现时指定来自resources的三个位图。步骤1:从上面的链接下载源文件。步骤2:添加Fcool.h和Fcool.cpp到您的项目。步骤3:为每个按钮,,,,,,a)添加三张(普通的,悬停的和向下的)图片,除非有一些按钮共享这个外观。,,,,,,b)在cdialog派生的类中添加一个CCoolButton成员,,,,,,c)将您的按钮更改为业主绘制。,,,,,,d)在DoDataExchange()中,使用cdialog派生类中的CCoolButton成员对象DDX_Control按钮资源id。第四步:告诉老板你这周的工作已经做完了:) 它是如何工作的? 它所做的一切,它是陷阱的三个1)当鼠标指针没有进入区域,2)鼠标指针已经进入区域和3)鼠标指针是在按钮区域和用户已按下左键。 在构造函数中,位图已经从资源加载到由CCoolButtons聚合的三个CBitmap对象。 _TrackMouseEvent()用于捕获鼠标指针离开按钮区域时的事件,我将其称为“OnLeave”,并在msg map中使用OnMessage定义。 当用户移动鼠标指针在按钮区域,按钮的状态改变为悬停和自定义(覆盖)DrawItem调用,所以我们绘制悬停图像从m_bmpHover成员。它调用_TrackMouseEvent()来查看指针是否离开了这个区域 下面是OnMouseMove,Hide的代码收缩,复制Code

void CCoolButton::OnMouseMove(UINT nFlags, CPoint point)
{
 CRect ButtonRect;
 TRACKMOUSEEVENT tme;
 
 GetWindowRect(&ButtonRect);
 if (m_Status == DOWN) 
 {
  if (IsInRect(ButtonRect,point))
  {
 
  }
  else
  {
   SetStatus(HOVER);
   Invalidate(FALSE);
  }
 }
 else if (m_PrevStatus == DOWN && m_Status == HOVER)
 {
  SetStatus(DOWN);
 }
 else
 {
  if (IsInRect(ButtonRect,point))
  {
   SetStatus(HOVER);
   Invalidate(FALSE);
  }
  else
  {
   SetStatus(NORMAL);
  }
 }
 CButton::OnMouseMove(nFlags, point);
 tme.cbSize = sizeof(TRACKMOUSEEVENT);
 tme.dwFlags = TME_LEAVE;
 tme.hwndTrack = m_hWnd; _TrackMouseEvent(&tme);
 }

通常情况下,在windows中如果你看正常的按钮,当你按下鼠标左按钮下来,没有释放移动指针的地区,它不备用按钮的灵魂,尽管它再次吸引正常图像但当你移动指针重返该地区(左按钮)再次将“下降”的形象,如果你释放按钮,而在该地区的指针,它发送的命令。为了模拟这种行为,我分别使用了OnLButtonDown()和OnLButtonUp()中的SetCapture()和ReleaseCapture()。 下面是DrawItem。隐藏,复制Code

void CCoolButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 CDC *pthisDC;
 CDC bmpDC;
 CBitmap *pOldBitmap;
 pthisDC = CDC::FromHandle(lpDrawItemStruct->hDC);
 bmpDC.CreateCompatibleDC(pthisDC);
 switch (m_Status)
 {
 case NORMAL:
  pOldBitmap = bmpDC.SelectObject(&m_bmpNormal);
  break;
 case HOVER:
  pOldBitmap = bmpDC.SelectObject(&m_bmpHover);
   break;
 case DOWN:
  pOldBitmap = bmpDC.SelectObject(&m_bmpDown);

  break;
 }
 pthisDC->BitBlt(0,0,lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left,
 lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top,&bmpDC,0,0,SRCCOPY);
 bmpDC.SelectObject(pOldBitmap);
 bmpDC.DeleteDC();
 
}

好了,你的按钮准备好了。我想知道你对这篇文章的意见。 好吧!:), 我不知道它的性能效率,这可能是improved 在很多方面,我还没有完成“禁用”按钮状态又是;但这是对于那些正在寻找一个10分钟的解决方案将所有按钮的形式来冷却按钮只 本文转载于:http://www.diyabc.com/frontweb/news521.html

原文地址:https://www.cnblogs.com/Dincat/p/13451222.html