关闭

Windows编程基础--第17节 MFC之状态栏(CStatusBar)

标签: mfcwindows
155人阅读 评论(0) 收藏 举报
分类:

Windows编程基础–第17节 MFC之状态栏(CStatusBar)

1、CStatusBar在MFC中类继承关系:

CObject
CCmdTarget
CWnd
CControlBar
CStatusBar

2、CStatusBar成员函数介绍:

virtual BOOL Create(
   CWnd* pParentWnd,
   DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,
   UINT nID = AFX_IDW_STATUS_BAR 
);

函数用途:创建一个CStatusBar并将其与CStatusBar对象关联;
参数说明:pParentWnd:指向CStatusBar的父窗口(Windows窗口);
dwStyle:CStatusBar的类型,CBRS_TOP:将Bar放在框架的顶部,CBRS_BOTTOM:将其放在框架的底部。CBRS_NOALIGN:当父窗口改变时,不重型调整Bar;
nID:toolbar的子窗口ID; 返回值:成功返回非零,否则返回零;

BOOL SetIndicators(
   const UINT* lpIDArray,
   int nIDCount 
);

函数用途:加载lpIDArray中的ID所对应的字符串资源,并将ID所对应的文本保存在字符串资源中;
参数说明:lpIDArray:ID队列指针
nIDCount:队列中元素的个数; 返回值:成功返回非零,否则返回零;

BOOL SetPaneText(
   int nIndex,
   LPCTSTR lpszNewText,
   BOOL bUpdate = TRUE 
);

函数用途:将CStatustBar中的长方块设置成lpszNewText所指向的内容;
参数说明:nIndex:长方块的索引号(从零开始计,第零个固定用来状态指示)
lpszNewText:需要加载的内容;(需要在第nIndex个长方块上显示的字符串)
bUpdate:等于TRUE时,当加载了新的字符内容后,将长方块设置为无效。无效使得窗口自动刷行,那么新内容就被显示在界面上了。

void GetItemRect(
   int nIndex,
   LPRECT lpRect 
) const;

函数用途:将nIndex所在的位置的矩形坐标拷贝到lpRect中。 参数说明:nIndex:长方块的标识;
lpRect:指向Rect结构的指针,用来保存获得到的矩形坐标; 返回值:无 注意:坐标是以象素为单位的,原点在左上角。

void GetPaneInfo(
   int nIndex,
   UINT& nID,
   UINT& nStyle,
   int& cxWidth 
) const

函数用途:
获得Pane的相关信息:ID,Style,宽度。
参数说明:
nIndex:需要获得的Pane的索引
nID:nIndex所对应Pane的ID
nStyle:nIndex对应的Pane的类型;
cxWidth:nIndex对应的Pane的宽度; 返回值:无

void SetPaneInfo(
   int nIndex,
   UINT nID,
   UINT nStyle,
   int cxWidth 
);

函数说明:设置Pane的相关信息; 参数说明:nIndex:需要设置的Pane的索引; 其余和5相同; 返回值:无

void SetPaneStyle(
   int nIndex,
   UINT nStyle 
);

函数说明:设置Pane的类型 参数说明:nIndex:需要设置的Pane的索引 nStyle:类型; 返回值:无
nStyle的值可以为:
CBRS_TOP Control bar is at top of frame window.
CBRS_BOTTOM Control bar is at bottom of frame window.
CBRS_NOALIGN Control bar is not repositioned when the parent is resized.

 UINT GetPaneStyle(
   int nIndex 
) const
函数说明:获得Pane的类型
参数说明:nIndex:需要获得的Pane的索引
返回值:无

举例:
生成一个MFC应用程序,参照如下说明修改代码:

static UINT indicators[] =
{
 ID_SEPARATOR,           // 状态行指示器
 ID_INDICATOR_CLOCK,
 ID_INDICATOR_CAPS,
 ID_INDICATOR_NUM,
 ID_INDICATOR_SCRL,
};
说明:
indicator数组提供了状态栏窗格的分配信息,它的第一项一般为ID_SEPARATOR,该ID对应的窗格用来显示命令提示信息,后三项都是字符串ID,读者可以在String Table字符串资源中找到这三个字符串分别是CAP、NUM和SCRL。它们对应的三个窗格用来显示键盘的状态。

1. 新建项目

新建一个基于对话框项目“day19”,布局如下,自行处理:
这里写图片描述

2.添加状态栏

切换到解决方案视图,进入day19Dlg.h头文件,添加一个CStatusBar成员变量(CStatusBar m_statusBar;),如下图:
这里写图片描述

现在进入BOOL Cday19Dlg::OnInitDialog()初始化函数中创建状态栏,在return前添加如下代码:

    m_statusBar.Create(this);
    UINT nID[]  = {10000,10001};
    m_statusBar.SetIndicators(nID,2);
    m_statusBar.SetPaneInfo(0,10000,SBPS_NORMAL,100);
    m_statusBar.SetPaneInfo(1,10001,SBPS_STRETCH,0);
    RECT rect={0};
    GetClientRect(&rect);
    m_statusBar.MoveWindow(0,rect.bottom - 30,rect.right,30,TRUE);

代码解释:

1.创建一个状态栏到当前窗体;
2.创建两个状态栏Pane的ID;
3.在状态栏上添加两个Pane,分别为正常模式,长度为100,另一个自动填充模式;
4.获取窗口客户区的坐标。客户区坐标指定客户区的左上角和右下角。由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0)。这里应该注意一下:坐标包含两种:屏幕坐标与客户区坐标。严格区分这两种坐标对于理解Windows编程是很重要的。
5.将状态栏设置到窗口的距离底部30,长度为窗口长度,高度为30的位置;

运行结果:
这里写图片描述
可以看到下方已经有了状态栏;

3.实现状态栏方法

编辑EDIT控件的属性:

属性名
Multiline true
Horizontal Scroll true
Vertical Scroll true
Want Return true

添加EDIT控件的变量,如图所示:
这里写图片描述

添加EDIT控件的OnEnChange消息处理方法:
这里写图片描述
编辑EDIT控件的OnEnChange消息处理方法:

void Cday19Dlg::OnEnChangeEdit1()
{
    // TODO:  如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
    int nLen = m_edit.GetWindowTextLength();
    int linecount=m_edit.GetLineCount();
    CString strText;
    strText.Format(_T("字数: %d  行数: %d"),nLen,linecount);
    m_statusBar.SetPaneText(1,strText,TRUE);
}

代码解释:

1.获取文本框中的文本长度;
2.获取文本框中的文本行数;
3.格式化文本后设置到状态栏第二个Pane中;

最终效果图:
这里写图片描述

项目源码可以访问我的码云

>>>我的私人博客<<<

0
0
查看评论

MFC中状态栏CStatusBar的使用

MFC界面状态栏类CStatusBar的使用
  • qq_33723441
  • qq_33723441
  • 2017-01-18 11:34
  • 839

MFC-CStatusBar(状态栏)

效果如图: 首先在头文件中定义一个CStatusBar变量CStatusBar m_statusbar;然后在初始化对话框中创建状态栏并且设置面板信息 //创建状态栏 m_statusbar.Create(this); //创建两个面板//第一个面板是1,第二个面板是2 ...
  • qq_18297675
  • qq_18297675
  • 2016-03-26 15:48
  • 1376

MFC对话框CDialog中使用CStatusBar状态栏

<br />在MFC的通用对话框中使用状态栏,只需要在对话框成员中增加一个CStatusBar类型的成员变量,然后在OnInitDialog函数中添加如下代码:<br />CRect rect; GetClientRect(rect); static UI...
  • loongee
  • loongee
  • 2011-01-03 11:24
  • 5161

MFC的状态栏CStatusBar编程

MFC的状态栏CStatusBar编程   1.   新建一个多文档的MFC应用程序; 2.   状态栏的定义:在CMainFrame类中定义,如下: protected:  // control bar embedded memb...
  • NUPTboyZHB
  • NUPTboyZHB
  • 2012-01-01 13:52
  • 3257

"-"状态栏(CStatusBar)汇总文件

目录; 1.常用方法 1.常用方法 创建状态栏:   Create 设置状态栏指示器(用于添加或减少状态栏上窗格):   SetIndicators 获得 / 设置状态栏上窗格的显示的字符串:   GetPaneText / SetPaneText 用标识获得窗格索引:   Co...
  • qq_24571549
  • qq_24571549
  • 2017-07-31 15:45
  • 75

MFC进度条编程

1. 进度条的主要功能 进度条控制(Progress Control)主要用来进行数据读写、文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动窗口标题条的颜色来不断填充。 进度条控制在MFC类库中的封装类为CProgressCtr...
  • liangjisheng
  • liangjisheng
  • 2017-05-20 18:10
  • 600

在状态栏中加载进度条

C技巧:在程序的状态栏中实现进度条 读者朋友们可能天天使用Visual 这个强大的工具来应用程序,不知道注意到没有,Visual 每次装载一个项目的时候,为了使项目加载过程不至于太单调,会在状态栏的左半部分会出现一个装载进度条,用来即时显示Visual 装载项目的进度,当项目装载完毕后,进度条...
  • liqing19850102
  • liqing19850102
  • 2012-06-01 06:57
  • 4881

MFC控件 状态条的简单介绍及使用 CStatusBar

 1、CStatusBar在MFC中类继承关系:CObject  CCmdTarget    CWnd      CControlBar     &#...
  • ma1kong
  • ma1kong
  • 2009-09-28 22:18
  • 3508

VS2010-MFC下在状态栏中添加进度条用于显示当前文件的读取进度

VS2010-MFC在状态栏上添加进度条比在VC6.0中更加简单,不需要再从CStatusBar类中派生子类。 仔细查看VS2010生成的MainFrm.h文件我们可以看出,m_wndStatusBar已经是CMFCStatusBar的对象了,而不是CStatusBar对象。 所以就去微软的官网...
  • HW140701
  • HW140701
  • 2017-03-19 15:01
  • 2235

vs2010修改状态栏的CStatusBar指针的的SetPaneText()方法时死活不对问题

vs2010的mfc在有些地方不太一样不容易注意到,今天在修改状态栏的时候,就
  • wangyaninglm
  • wangyaninglm
  • 2014-08-10 17:17
  • 3245
    个人资料
    • 访问:40743次
    • 积分:698
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类