zoukankan      html  css  js  c++  java
  • Toolkit Pro学习--Toolbar的创建

    一、新建Toolkit Pro应用程序

      安装好Toolkit Pro后,打开VS2008,新建-项目-Toolkit Pro Application。如图1所示。

      

                         图1:Toolkit Pro创建窗口 

      输入项目名称和位置,如Test,一直默认直到工程建立好。

      系统将生成四组文件:CTestCView类、CTestDoc类、CChildFrame类、CMainFrame类,及相应的.h和.cpp文件。

    二、MFC状态栏介绍

      首先在CMainFrame.cpp中找到OnCreate()函数,可以看到该框架已自动创建了状态栏:

    1     if (!m_wndStatusBar.Create(this) ||
    2         !m_wndStatusBar.SetIndicators(indicators,
    3         sizeof(indicators)/sizeof(UINT)))
    4     {
    5         TRACE0("Failed to create status bar
    ");
    6         return -1;      // fail to create
    7     }

      1.m_wndStatusBar

      m_wndStatusBar为CMainFrame类定义的一个成员对象:

      protected:CXTPStatusBar  m_wndStatusBar;

      2. Create()函数

    1 BOOL Create(
    2     // 状态栏父窗口指针
    3     CWnd* pParentWnd,       
    4     // 状态栏的风格          
    5     DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 
    6     // 状态栏的ID
    7     UINT nID = AFX_IDW_STATUS_BAR
    8     );

      3.SetIndicators()函数

    1 BOOL SetIndicators(
    2     const UINT* lpIDArray,  // 指定指示器的ID
    3     int nIDCount);          // 状态栏窗格中显示的文本

      4.indicator数组

      SetIndicators()函数的第一个参数已指定为indicate数组,为窗格ID数组。

    1 static UINT indicators[] =
    2 {
    3     ID_SEPARATOR,           // status line indicator
    4     ID_INDICATOR_CAPS,
    5     ID_INDICATOR_NUM,
    6     ID_INDICATOR_SCRL,
    7 };

      其中ID_INDICATOR_CAPS表示Caps Lock按键,即大小写按键

        ID_INDICATOR_NUM 表示Num Lock按键,即小键盘按键  

        ID_INDICATOR_SCRL表示Scroll Lock按键,在键盘大小写指示灯左侧第二个按钮

      程序默认运行效果如图2所示:

      

                       图2:Toolkit Pro应用程序默认状态栏

      从图2红色框中可见,状态栏加载了四个窗格,标题分别是:Ready,CAP,NUM,SCRL。

      第一个窗格为默认窗格,一般可以通过SetText来覆盖其名称来显示想要的内容。

      第二个窗格为CAP Lock按键状态,在键盘上按下CAP Lock按键后该窗格的CAP标题处于激活状态。

      第三个窗格为NUM Lock按键状态,默认为激活状态,在键盘上按下NUM Lock后该窗口标题变为灰色。

      第四个窗格为SCroll Lock按键状态,按下对应按钮标题激活。

    三、设置自定义状态栏

      要想得到自己想要的状态栏效果,可以重写状态栏。

      1.将MainFrame.cpp中OnCreate的工具栏创建代码注释,添加自己写的CreateStatusBar()函数:

     1 //if (!m_wndStatusBar.Create(this) ||
     2 //    !m_wndStatusBar.SetIndicators(indicators,
     3 //      sizeof(indicators)/sizeof(UINT)))
     4 //{
     5 //    TRACE0("Failed to create status bar
    ");
     6 //    return -1;      // fail to create
     7 //} 
     8 
     9 if (!CreateStatusBar())
    10 {
    11     TRACE0("Failed to create status bar
    ");
    12     return -1;
    13 }

      2.在资源中建立PNG分组,加入两个PNG图片,分别命名为ID_SCREEN_TUBE和ID_SCREEN_NULL

      3.CreateStatusBar()具体实现如下:

     1 // 创建状态栏
     2 BOOL CMainFrame::CreateStatusBar()
     3 {
     4   // 状态栏创建
     5     if (!m_wndStatusBar.Create(this))
     6     {
     7         return FALSE;
     8     }
     9 
    10     // 状态栏面板
    11     CXTPStatusBarPane* pPane;
    12 
    13     // 状态栏面板-添加指示器,完成第一个窗格的初始化
    14     pPane = m_wndStatusBar.AddIndicator(ID_SEPARATOR);
    15     // 状态栏面板-设置宽度
    16     // 如果SetStyle设置了可拉伸属性SBPS_STRETCH,则无需SetWidth
    17     // pPane->SetWidth(1);
    18     // 状态栏面板-设置面板类型:可拉伸+无边框
    19     pPane->SetStyle(SBPS_STRETCH | SBPS_NOBORDERS); 
    20     pPane->SetBeginGroup(TRUE);
    21 
    22     // 状态栏面板-添加指示器,完成第二个窗格的初始化
    23     pPane = m_wndStatusBar.AddIndicator(ID_SCREEN_TUBE);
    24     // 状态栏面板-设置按钮,调用该函数使窗格可点击,否则为文本状态。
    25     pPane->SetButton();
    26     // 状态栏面板-设置填充物(左,高,右,宽)
    27     pPane->SetPadding(8, 0, 8, 0);
    28     // 状态栏面板-设置图标索引
    29     pPane->SetIconIndex(ID_SCREEN_TUBE);
    30     pPane->SetBeginGroup(TRUE);
    31 
    32     // 状态栏面板-加载图片
    33     UINT nID_Link = ID_SCREEN_TUBE;
    34     m_wndStatusBar.GetImageManager()->SetIcons(ID_SCREEN_TUBE, &nID_Link, 1, 0);
    35 
    36   // 状态栏面板-设置第三个窗格
    37     pPane = m_wndStatusBar.AddIndicator(ID_SCREEN_NULL);
    38     pPane->SetButton();
    39     pPane->SetPadding(8, 0, 8, 0);
    40     pPane->SetBeginGroup(TRUE);
    41     // 状态栏面板-设置窗格标题
    42     pPane->SetText(_T("状态指示灯"));
    43 
    44     UINT nID_UnLink = ID_SCREEN_NULL;
    45     m_wndStatusBar.GetImageManager()->SetIcons(ID_SCREEN_NULL,     &nID_Link, 1, 0);
    46 
    47     return TRUE;
    48 }

      4.运行效果如图3所示:

      

                    图3:自定义状态栏

      5.添加其他窗格

      在CreateStatusBar()函数后面添加代码。

    1 pPane = m_wndStatusBar.AddIndicator(ID_STATUSBAR_TITLE);
    2 pPane->SetButton();
    3 pPane->SetPadding(8, 0, 8, 0);
    4 pPane->SetBeginGroup(TRUE);
    5 pPane->SetText(_T("Title"));

      其中ID_STATUSBAR_TITLE是Resource.h中添加的宏:#define ID_STATUSBAR_TITLE 6001,具体数字与其他宏不冲突即可。

      运行效果如图4所示:

      

                    图4:添加窗格

      6.添加时间窗格

      添加时间响应消息;添加SetTimer函数;实现时间消息响应函数OnTimer:

     1 void CMainFrame::OnTimer(UINT_PTR nIDEvent)   
     2 {   
     3     // TODO: Add your message handler code here and/or call default   
     4     CString strTime;   
     5     // 获取系统当前时间,并保存到curTime   
     6     CTime curTime = CTime::GetCurrentTime();   
     7 
     8     // 格式化curTime,将字符串保存到strTime   
     9     strTime = curTime.Format(_T("%H:%M:%S"));   
    10     // 在状态栏的时间窗格中显示系统时间字符串   
    11     m_wndStatusBar.SetPaneText(3, strTime);   
    12 
    13     CMDIFrameWnd::OnTimer(nIDEvent);   
    14 }  

      注意:1)代码11行SetPaneText()函数第一个参数为窗格索引号,从0开始。

         2)若该参数值大于已设定的窗口数,windows会弹出Debug Assertion Failed对话框。比如只添加了3个窗格,那么该参数值的范围就只能是0-2,若设成比2大的值如4就会报错。    

      添加时间窗格详见http://www.jizhuomi.com/software/219.html 《VS2010/MFC编程入门之三十八(状态栏的使用详解)》。

  • 相关阅读:
    对象数组深拷贝
    百度地图 轨迹
    vant mp-vue
    Nginx代理webSocket时60s自动断开, 怎么保持长连接
    python_传递任意数量的实参
    python_函数传递列表
    python_形参、实参
    python_函数、局部变量与全局变量
    python_三级字典
    python_字典的使用
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4366210.html
Copyright © 2011-2022 走看看