CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

如何创建位图按钮??

楼主ying989()2001-11-27 09:36:22 在 VC/MFC / 基础类 提问

问题点数:20、回复次数:1Top

1 楼jason802(小糊涂仙)回复于 2001-11-27 09:37:44 得分 20

转载赚分,和和和  
   
   
   
  在众多的Windows软件中,位图按钮(BitmapButton)确实是一个相当重要的角色。与普通按钮相比,它以图形代替文字,形象直观,使画面更加活泼,使人机界面更加友善。笔者在用Visual   C++编制软件时,经常用到位图按钮。但在编制的过程中,发现它也还存在着美中不足的地方。    
  一、问题的提出  
   
    我们在上Internet时,经常使用各种浏览器,例如IE或Netscape,它在工具条上的位图按钮不能不给使用者留下深刻印象。当鼠标未触及时,正常状态下的位图按钮只是平面图形;一旦触及,它立即“浮现”出来,一方面提示用户,另一方面其色彩以及立体感的反差也给人以耳目一新的感觉。而现在众多用Visual   C++编写的软件中,位图按钮在触及前后并不改变,尽管它较普通的按钮已有很大的进步,但仍不免显得有些呆板,缺乏“动感”。本文试利用位按钮的“获得输入状态”(focused)与鼠标操作相结合加以解决。  
   
  二、解决的方法及相关函数  
   
    Microsoft基本类库(MFC)提供CBitmapButton类,其常用的成员函数有AutoLoad和LoadBitmaps。下面简略加以介绍:  
   
    1.   BOOL   AutoLoad(   UINT   nID,   CWnd*   pParent   );  
   
    该函数将一个普通按钮与一个CBitmapButton类对象联系起来。    
   
  BOOL   LoadBitmaps(   LPCSTR   lpszBitmapResource,   LPCSTR   lpszBitmapResourceSel   =   NULL,   LPCSTR   lpszBitmapResourceFocus   =   NULL,   LPCSTR   lpszBitmapResourceDisabled   =   NULL   );    
    位图按钮具有四种状态:正常(U)状态,按下(D)状态,获得输入(F)状态,   禁止(X)状态。其中F状态并不常用。  
   
  该函数将CBitmapButton类对象的上述四种状态与四个位图文件相对应,其中参数:  
   
  lpszBitmapResource是位图按钮正常状态(U)下的位图文件名。       
   
    lpszBitmapResourceSel   是位图按钮按下状态(D)下的位图文件名。  
   
    lpszBitmapResourceFocus   是位图按钮获得输入状态(F)下的位图文件名。  
   
    lpszBitmapResourceDisabled   是位图按钮禁止状态(X)下的位图文件名。    
   
  SetCapture(   )和   ReleaseCapture(   )    
    SetCapture()对鼠标进行”捕捉”,即使鼠标光标已经移出该窗口,窗口仍能够接受到所有有关鼠标的消息。ReleaseCapture(   )则用来释放对鼠标的捕捉。  
   
    当鼠标触及但尚未按下时,并不对应其中任何一种状态,可见VC++并不提供相应的机制,以解决本文所提出的问题。本程序利用鼠标在该位图按钮所在范围移动时,将其设置成获得输入状态,调入第三资源文件“F”位图文件加以实现。在鼠标触及该位图时,使之“浮现”出来,并将鼠标光标变成小手形状,再加以振铃以示提醒。同时由于使用SetCapture()函数,故需要对鼠标的各种操作进行设计。主要程序段如下。  
   
     
   
  三、主要程序段  
   
    笔者编写了一个小演示程序,简单模拟电器开关功能。它有两个位图按钮和一个用作状态显示屏的编辑控制框。当鼠标位于位图按钮之上时,状态显示屏均显示"鼠标的光标在位图按钮上"。电源开关开时,按“喇叭”位图按钮则会发声;否则“喇叭”位图按钮变灰,不起作用。  
   
  void   CBmpDlg::OnMouseMove(UINT   nFlags,   CPoint   point)  
   
  {  
   
  CWnd   *   pWnd;  
   
  HCURSOR   MyCursor;  
   
  CRgn   m_regionPower;   //Region   of   POWER   Button  
   
  CRgn   m_regionPlay;   //Region   of   PLAY   Button  
   
  //建立位图按钮的矩形区域  
   
  m_regionPower.CreateEllipticRgnIndirect(CRect(27,56,72,92));  
   
  m_regionPlay.CreateEllipticRgnIndirect(CRect(78,56,120,92));  
   
  CString   ShowString0   =   "鼠标的光标在位图按钮上!!!";  
   
  …   …   …   …  
   
  m_bPlay   =   FALSE;  
   
  m_bPower=   FALSE;  
   
  if   (m_regionPower.PtInRegion(point))   //鼠标落在位图按钮之上  
   
  {  
   
  m_bPower   =   TRUE;  
   
  //将位图按钮设置成获得输入状态  
   
  pWnd=   GetDlgItem(IDC_BUTTON_POWER);  
   
  pWnd->SetFocus();  
   
  SetCapture();  
   
  InputEdit().SetWindowText(ShowString0);  
   
  InputEdit().ShowWindow(TRUE);  
   
  //将鼠标光标变成小手形状  
   
  MyCursor   =   AfxGetApp()->LoadCursor(IDC_MYCURSOR);  
   
  ::SetCursor(MyCursor);  
   
  VERIFY(m_Play.LoadBitmaps("PLAYU","PLAYD","PLAYF","PLAYX"));  
   
  m_bPressedPlay   =   FALSE;  
   
  return;  
   
  }  
   
  if   (m_regionPlay.PtInRegion(point))   //鼠标落在位图按钮之上  
   
  {  
   
  if   (m_bPowerOn)   {   //如果电源已被开启  
   
  m_bPlay   =   TRUE;  
   
  pWnd=   GetDlgItem(IDC_BUTTON_PLAY);  
   
  pWnd->SetFocus();  
   
  SetCapture();  
   
  InputEdit().SetWindowText(ShowString0);  
   
  InputEdit().ShowWindow(TRUE);  
   
  MyCursor   =   AfxGetApp()->LoadCursor(IDC_MYCURSOR);  
   
  ::SetCursor(MyCursor);  
   
  VERIFY(m_Power.LoadBitmaps("POWERONU","POWEROND","POWERONF"));  
   
  }  
   
  else   {   //如果电源已被关闭  
   
  ReleaseCapture();  
   
  InputEdit().SetWindowText(ShowString0+ShowString2);  
   
  InputEdit().ShowWindow(TRUE);  
   
  VERIFY(m_Power.LoadBitmaps("POWEROFU","POWEROFD","POWEROFF"));  
   
  }  
   
  m_bPressedPower=   FALSE;  
   
  return;  
   
  }  
   
  //鼠标落在所有的位图按钮之外  
   
  ReleaseCapture();  
   
  InputEdit().SetWindowText(ShowString1);  
   
  InputEdit().ShowWindow(TRUE);  
   
  pWnd=   GetDlgItem(IDOK);  
   
  pWnd->SetFocus();  
   
  VERIFY(m_Play.LoadBitmaps("PLAYU","PLAYD","PLAYF","PLAYX"));  
   
  if   (m_bPowerOn)  
   
  VERIFY(m_Power.LoadBitmaps("POWERONU","POWEROND","POWERONF"));  
   
  else  
   
  VERIFY(m_Power.LoadBitmaps("POWEROFU","POWEROFD","POWEROFF"));  
   
  m_bPressedPlay   =   FALSE;  
   
  m_bPressedPower=   FALSE;  
   
  CDialog::OnMouseMove(nFlags,   point);  
   
  }  
   
  void   CBmpDlg::OnLButtonDown(UINT   nFlags,   CPoint   point)  
   
  {  
   
  CWnd   *pWnd;  
   
  if   (m_bPlay   &&   m_bPowerOn)   {  
   
  //   Change   Focus   so   as   to   Change   the   bitmap   of   m_Play  
   
  pWnd=   GetDlgItem(IDOK);  
   
  pWnd->SetFocus();  
   
  VERIFY(m_Play.LoadBitmaps("PLAYD"));  
   
  m_Play.UpdateWindow();  
   
  m_Play.Invalidate(TRUE);  
   
  OnButtonPlay();  
   
  m_bPressedPlay   =   TRUE;  
   
  }  
   
  if   (m_bPower==   TRUE)   {  
   
  //   Change   Focus   so   as   to   Change   the   bitmap   of   m_Power  
   
  pWnd=   GetDlgItem(IDOK);  
   
  pWnd->SetFocus();  
   
  if   (m_bPowerOn)  
   
  VERIFY(m_Power.LoadBitmaps("POWEROND"));  
   
  else  
   
  VERIFY(m_Power.LoadBitmaps("POWEROFD"));  
   
  m_Power.UpdateWindow();  
   
  m_Power.Invalidate(TRUE);  
   
  OnButtonPower();  
   
  m_bPressedPower   =   TRUE;  
   
  }  
   
  CDialog::OnLButtonDown(nFlags,   point);  
   
  }  
   
     
   
  void   CBmpDlg::OnLButtonUp(UINT   nFlags,   CPoint   point)  
   
  {  
   
  CWnd   *   pWnd;  
   
  if   (m_bPressedPlay   ==   TRUE)   {  
   
  pWnd=   GetDlgItem(IDOK);  
   
  pWnd->SetFocus();  
   
  VERIFY(m_Play.LoadBitmaps("PLAYF"));  
   
  m_Play.UpdateWindow();  
   
  m_Play.Invalidate(TRUE);  
   
  m_bPressedPlay   =   FALSE;  
   
  }  
   
  if   (m_bPressedPower   ==   TRUE)   {  
   
  pWnd=   GetDlgItem(IDOK);  
   
  pWnd->SetFocus();  
   
  if   (m_bPowerOn)  
   
  VERIFY(m_Power.LoadBitmaps("POWERONF"));  
   
  else  
   
  VERIFY(m_Power.LoadBitmaps("POWEROFF"));  
   
  m_Power.UpdateWindow();  
   
  m_Power.Invalidate(TRUE);  
   
  m_bPressedPower   =   FALSE;  
   
  }  
   
  CDialog::OnLButtonUp(nFlags,   point);  
   
  }    
     
     
     
     
     
  Top

相关问题

  • 请问如何动态创建按钮?
  • 如何在toolbar中用自己的图标创建一个按钮~~~~~~
  • 如何在视图的客户区中动态创建一个CButton按钮??
  • 谢谢各位大侠,win32中怎样创建自定图画的按钮啊,当鼠标移至按钮时如何使鼠标变成其他样式啊
  • 请问如何在VC中动态创建一个按钮?
  • 如何创建一个无任何按钮的提示框?
  • 如何创建象开始按钮一样的菜单呀??
  • 如何用程序动态创建一个按钮?
  • 请问如何在dialogbar中动态创建按钮
  • 如何在pb8中动态创建控件,如按钮等!

关键词

  • visual c++
  • 鼠标
  • 文件名
  • 函数
  • idc
  • 文件
  • 普通
  • 图按钮
  • 状态
  • inputedit

得分解答快速导航

  • 帖主:ying989
  • jason802

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo