dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
在VC中透明浮动按键的实现
来源:PCVC.NET     作者:    

有一种按键,看起来是一幅完整的图片,当鼠标移到按键区域时,图片的一部分凸现,形成一个按键,当鼠标移走时又恢复原来状态。

   最近,看了一些关于浮动按键的代码,其原理大致上跟CBitmapButton差不多,用数幅位图代表按键的各个状态,响应鼠标的各种消息来设置按键的状态,实现按键的浮动显示,但是这样的按键却不能和周围的背景混和成一幅图片。

   为了实现“透明”按键,可以简单地做个试验:先在对话框中加入一个BUTTON,通过框选“Owner Draw”风格,再加入一个PICTURE,并加入图片,将BUTTON移到PICTURE上。运行结果发现,按键没有显示出来,但在按键区域按下鼠标时,该按键仍然能发出WM_COMMAND消息,这样一个纯透明的按键建立了。显然,这个按键是毫无使用意义的,因为用户不知道按键的位置,必须让用户容易觉察到按键的位置,可以把这个按键改造一下:

   (首先从CButton派生出一个新类CDrawButton)

   ·把按键的标题显示出来

   这个实现起来比较简单,我们可以重载CButton类的成员DrawItem(),

void CDrawButton::DrawItem
(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
CRect rect=lpDrawItemStruct->rcItem;//得到按键区域
CString sCaption;
dc.Attach(lpDrawItemStruct- >hDC); //得到设备环境CDC
VERIFY(lpDrawItemStruct- >CtlType==ODT_BUTTON);
GetWindowText(sCaption);//得到按键的标题
dc.SetBkMode(TRANSPARENT);//透明显示
CFont* m_pOldFont=dc.SelectObject(m_pFont);
dc.DrawText(sCaption,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
dc.SelectObject(m_pOldFont);
}

   其中的m_pFont是成员变量,它保存了对话框的字体,为了按键的标题风格与对话框的字体风格一致,在初始化时调用对话框的成员GetFont()即可得到指向对话框字体的CFont类。

   ·使按键浮动显示

  要通过自绘来表示按键的各种状态,可填写DRAWITEMSTRUCT来通知DrawItem()需要做什么,我们先了解一下DRAWITEMSTRUCT:

typedef struct tagDRAWITEMSTRUCT{
  UINT CtlType; // 控件类型
  UINT CtlID;// 控件的ID号
  UNIT itemID;//菜单项的索引
  UINT itemAction;// 绘图操作
  UINT itemState; // 状态
  HWND hwndItem; // 控件的窗口句柄
  HDC hDC; // 相关的设备环境
  RECT rcItem;//控件的范围
  DWORD itemData;//指定与菜单项相联系的应用程序定义的32位值
}DRAWITEMSTRUCT;

  利用这个结构先做一个按键状态设置:
void CDrawButton::SetButtonMode(UINT action, UINT mode)
{
// TODO: Add your message handler code
here and/or call default
  DRAWITEMSTRUCT DIS;
  DIS.CtlType = ODT_BUTTON;
  DIS.CtlID = GetDlgCtrlID();
  DIS.itemAction = action;
  DIS.itemState = mode;
  DIS.hwndItem = GetSafeHwnd();
  DIS.hDC = GetDC()- >GetSafeHdc();
  GetClientRect(&(DIS.rcItem));
  SendMessage(WM_DRAWITEM,(WPARAM)
GetSafeHwnd(),(LPARAM)&DIS);
  ReleaseDC(CDC::FromHandle(DIS.hDC));
}

  这样,我们可以响应鼠标的各种消息来设置按键的各种状态:
void CDrawButton::OnMouseMove
(UINT nFlags, CPoint point)
{
  // TODO: Add your message handler code
here and/or call default
  CRect rect;
  GetClientRect(&rect);
  if(rect.PtInRect(point)){
    if (mBtnStats==BTN_NORMAL){
  SetButtonMode(ODA_SELECT, ODS_FOCUS);
      SetCapture();
    }
  }
  else{
//AutoLoad(GetDlgCtrlID(),GetParent());
SetButtonMode(ODA_DRAWENTIRE,ODS_DEFAULT);
    ReleaseCapture();
  }

  CButton::OnMouseMove(nFlags, point);
}

  这里,mBtnStats是个UINT类型的成员变量,它可以有三种自定义状态:
BTN_NORMAL  正常状态
BTN_UP    鼠标移入按键区域或释放鼠标
BTN_DOWN  按下鼠标
(可以再加一种DISABLE状态)

  当在按键区域释放鼠标时,必须发送WM_COMMAND消息:
void CDrawButton::OnLButtonUp(UINT nFlags, CPoint point)
{
  // TODO: Add your message handler code
here and/or call default
  CRect rect;
  GetClientRect(&rect);
  if(rect.PtInRect(point)){
    if (mBtnStats==BTN_DOWN)
      GetParent()- >SendMessage(WM_COMMAND,
    MAKELPARAM(GetDlgCtrlID(),BN_CLICKED),
    (LPARAM)GetSafeHwnd());
    SetCapture();
  }
  else{
  SetButtonMode(ODA_DRAWENTIRE,ODS_DEFAULT);
    ReleaseCapture();
  }

  CButton::OnLButtonUp(nFlags, point);
}

[1]  

 

 

上一篇:VC++学习:用SDK实现分隔条   下一篇:在视图中同步显示鼠标的位置
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·VC++学习:用SDK实现分隔条
·在视图中同步显示鼠标的位置
·一个对Winsock完成端口模型封装
·无闪烁刷屏技术的实现
·重载函数的应用与深入剖析
·利用VC编程在界面上实现3D文字
·Gzip Zlib PNG 压缩算法,源码详
·窗口类的诞生(注册自己的窗口类)
·窗口类的诞生(注册自己的窗口类)
·让你的控制台程序也支持自动补齐
·显示内存中的HTML内容
·ado方式访问带密码数据库的方法
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763