zoukankan      html  css  js  c++  java
  • UIButton 简易的UI

    前些阵子,听说有个DirectUI的源码,很有兴致的去Google code上下载下来阅读,但后来没有坚持下来,DirectUI所看重的是窗口的安全性:只要能得到窗口的句柄,你几乎可以为所欲为了;但DirectUI显然没有这个问题,因为其所支持的控件都是windowless,没有句柄的,所有控件都是画出来的。

    接下来折腾XPButton,总算能看懂。但按钮依旧没有摆脱窗口,只是简单基础基础类库CButton,通过自绘实现DIYbutton。

    通过绘图的方式可以实现UIButton(画出来的按钮)。但在MFC下如果有多个按钮,那么代码会变得比较凌乱,所以可以把这部分抽象出来得到UIButton类。下面只简述实现,用法并附上源码。

    主要用到双缓冲:http://daoluan.net/blog/archives/914  还有结合MFC的消息机制。

    主要功能实现:普通,悬停,按下,响应事件,ToolTip。

    大概设计思路:

    1. 在主窗口进行绘制(OnPaint)的时候,初始化(创建)按钮,包括按钮的位置,按钮的图片资源,ToolTip内。
    2. 在主窗口的OnMouseMove,OnMouseHover,OnMouseLeave,OnLButtonDown和OnLButtonUp设计相应的测试函数(已经包装在UIButton类内)。

    使用方法:

    1. 初始化gdi+环境,具体看附件中的UIButtonApp.h和UIButtonApp.c
    2. 声明UIButton对象
    3. OnPaint()内添加如下代码:
      else
      {
      	CPaintDC dc(this);
      	if(m_btn.IsValid())
      	{
      		m_btn.Create(this,&dc,CRect(10,10,49,30),"关闭");
      		m_btn.InitilizeMem(L"./img/btn.png");
      	}
      	m_btn.Refresh(&dc);
      	CDialog::OnPaint();
      }
    4. 主窗口添加OnMouseMove,OnMouseHover,OnMouseLeave,OnLButtonDown和OnLButtonUp相应函数,分别调用UIButton对象的OnMouseMove,OnMouseHover,OnMouseLeave,OnLButtonDown和OnLButtonUp函数。
      void CUIButtonAppDlg::OnLButtonDown(UINT nFlags, CPoint point)
      {
      	// TODO: 在此添加消息处理程序代码和/或调用默认值
      	m_btn.OnLButtonDown(nFlags,point);
      	CDialog::OnLButtonDown(nFlags, point);
      }
      
      void CUIButtonAppDlg::OnLButtonUp(UINT nFlags, CPoint point)
      {
      	// TODO: 在此添加消息处理程序代码和/或调用默认值
      	if(m_btn.OnLButtonUp(nFlags,point))
      		OnbtnClose();
      	CDialog::OnLButtonUp(nFlags, point);
      }
      
      void CUIButtonAppDlg::OnMouseMove(UINT nFlags, CPoint point)
      {
      	// TODO: 在此添加消息处理程序代码和/或调用默认值
      	m_btn.OnMouseMove(nFlags,point);
      	CDialog::OnMouseMove(nFlags, point);
      }
      
      void CUIButtonAppDlg::OnMouseHover(UINT nFlags, CPoint point)
      {
      	// TODO: 在此添加消息处理程序代码和/或调用默认值
      	m_btn.OnMouseHover(nFlags,point);
      	CDialog::OnMouseHover(nFlags, point);
      }
      
      void CUIButtonAppDlg::OnMouseLeave()
      {
      	// TODO: 在此添加消息处理程序代码和/或调用默认值
      	m_btn.OnMouseLeave();
      	CDialog::OnMouseLeave();
      }
    5. (可选)主窗口重载PreTranslateMessage,添加:
      m_btn.ToolTipRelayEvent(pMsg);
    6. (可选)如果需要使用ToolTip可选功能,需要在主窗口OnInitDialog()中添加:
      EnableToolTips();

    解馋图:

    源代码:https://files.cnblogs.com/daoluanxiaozi/UIButtonApp.rar

    ps:代码有未发现的bug,并且还有可以改进的地方,比如:多线程绘图等。欢迎斧正。

    本文完 2012-09-10

    捣乱小子 http://www.daoluan.net/

  • 相关阅读:
    杭州西郊千湖岛-天下第一秀水
    windows phone7 豆瓣FM
    wp7 中 HubTile控件自定义大小。
    wp7 HubTile
    Windows Phone 7之XNA游戏:重力感应
    WP7:模拟开始屏幕Tile漂动效果
    windows 8 项目
    手把手教你 用 wpf 制作metro ProgressRing (Windows8 等待动画)
    windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放
    仿windows8 开始菜单 实现HubTileBase 以及仿鲜果联播实现 PulsingTile(脉冲磁贴)
  • 原文地址:https://www.cnblogs.com/daoluanxiaozi/p/2678573.html
Copyright © 2011-2022 走看看