首页 > 编程知识 正文

状态栏的设计和使用方法,状态栏制作

时间:2023-05-03 09:16:47 阅读:250885 作者:4780

状态栏窗口既不接受用户输入也不产生命令消息,它的作用就是在程序的控制下在窗格中显示一些文本。状态栏可支持两种类型的文本窗口——信息行窗口和状态指示器窗格。为了能够在状态栏中显示一些应用程序的特殊数据,我们必须首先禁止标准状态栏显示菜单提示及键盘状态。
3.3.1 状态栏的定义
应用程序在MainFrm.cpp文件中所产生的静态indicator数组就是用来定义状态栏的,其中ID_SEPARATOR 是用标识信息行窗格的,菜单项或工具按钮的许多信息都在这个信息行窗格中显示,而其他一些常量则是一些字符串资源的ID,它们是用来标识指示器窗格的,分别显示出CapsLock、NumLock 和ScrollLock 这三个键的状态。图3-18 列出了indicator 数组及它与标准状态栏的关系。

3.3.2 状态栏的常用操作
1、增加和减少窗格状态栏中的窗格可以分为信息行窗格和指示器窗格两类。若在状态栏中增加一个信息行窗格,则只需要在indicators数组中的适当位置中增加一个ID_SEPARTOR标识即可。
若在状态栏中增加一个用户指示器窗格,则在indicator 数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。若状态栏减
少一个窗格,其操作与增加相类似,只需减少indicators 数组元素即可。
2、在状态栏上显示文本有三种办法可以在状态栏窗格显示文本信息:
(1)调用CWnd::SetWindowText 更新信息行窗格(或窗格0)中的文本。由于状态栏也是一种窗口,故在使用时可直接调用。若状态栏变量为m_wndStatusBar,则m_wndStatusBar.SetWindowsText(“消息”)语句将在信息行窗格(或窗格0)内显示“消息”字样。
(2)手动处理状态栏的ON_UPDATE_COMMAND_UI 更新消息,并在处理函数中调用CcmdUI ::SetText 函数。
(3)调用CStatusBar::SetPaneText 函数更新任何窗格(包括信息行窗格)中的文本。此函数原型描述如下:
Bool SetPaneText(int nIndex,LPCTSTR lpszNewText,BOOL bUpdate=TRUE) ;
其中,lpszNewText表示要显示的字符串。nIndex是表示设置的窗格索引(第一个窗格的索引为0)。若bUpdate为TRUE,则系统自动更新显示的结果。
3、改变状态栏的风格
在CstatusBar类中,有两个成员函数可以改变状态栏风格,它们是:
void SetPaneInfo(int nIndex,UNIT nID,UNIT nStyle,int cxWidth) ;
void SetPaneStyle(int nIndex,UNIT nStyle) ;
其中,参数nIndex表示要设置的状态栏窗格的索引,nID用来为状态窗格指定新的ID,cxWidth表示窗格的像素宽度,nStyle表示窗格的风格类型,用来指定窗格的外观,例如SBPS_POPOUT表示窗格是凸起来的。
3.3.3 状态栏示例程序StatusBar
应用程序StatusBar用一个新的状态栏对标准应用程序框架状态栏进行了替换。新的状态栏包含了如下一些文本窗格:

程序StatusBar的最终运行结果如图3-19所示。我们可以按以下步骤来创建StatusBar应用程序:

1、运行应用程序向导来生成MFC 项目StatusBar。在该应用程序生成过程中,除下面两项:选择“单文档类型”,取消“打印和打印预览支持”,其余所有选项接受默认值。
2、利用字符串编辑器编辑应用程序的字符串表资源,增加两个字符串资源。在资源视图选项卡上的“String Table”图标上双击可进入字符串编辑器,然后在列表的最后的空项上双击,此时弹出一个对话框,允许我们指定ID 和字符串值,如图3-20 所示 。加入如下两个字符串:

3、编辑应用程序的符号。从【编辑】菜单里选择【资源符号...】,加入新的状态栏标识符ID_MY_STATUS_BAR,接受其默认值。
4、利用属性窗口的“事件”标签为CMainFrame 类中加入【视图】菜单下的菜单项【状态栏】命令控制函数。请加入下表所示的命令消息控制函数:

5、在MainFrm.h 中加入如下的函数原型声明:
添加的字符串
Afx_msg void OnUpdateLeft(CCmdUI *pCmdUI);
Afx_msg void OnUpdateRight(CcmdUI *pCmdUI) ;
注意:以上的消息控制函数声明语句必须加在AFX_MSG括弧对之间。
另外,在MainFrm.h打开的同时,使m_wndStatusBar为公有(public)而不是保护(protected)。
6、编辑MainFrm.cpp文件。请用如下粗体和黑体的代码替代原来的indicator数组:
static UINT indicators[] =
{
ID_SEPARATOR, // 状态行指示器
ID_SEPARATOR,
ID_INDICATOR_LEFT,
ID_INDICATOR_RIGHT,
};
然后,再对OnCreate成员函数进行编辑。请把下面的语句:
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏n");
return -1; // 未能创建
}
替换成下面的语句:
if (!m_wndStatusBar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,ID_MY_STATUS_BAR) //修改增加的代码
|| !m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏n");
return -1; // 未能创建
}
在这里我们对Create调用进行了修改,用我们自己定义的状态栏ID:ID_MY_STATUS_BAR代替了AFX_IDW_STATUS_BAR(它标识了应用程序框架的状态栏对象)。
下面需要为类CMainFrame加进如下的消息映射入口。
//mainfrm.cpp
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_UPDATE_COMMAND_UI(ID_INDICATOE_LEFT,OnUpdateLeft) //消息映射宏
ON_UPDATE_COMMAND_UI(ID_INDICATOE_RIGHT, OnUpdateRight)
END_MESSAGE_MAP()
接着需要加入如下的CmainFrame成员函数,它们用来对两个状态栏指示器进行更新:
void CMainFrame ::OnUpdateLeft(CCmdUI *pCmdUI) //函数体
{
pCmdUI->Enable( ::GetKeyState(VK_LBUTTON)<0) ;
}
void CMainFrame ::OnUpdateRight(CCmdUI *pCmdUI) //函数体
{
pCmdUI->Enable( ::GetKeyState(VK_RBUTTON)<0) ;
}
最后,还要在MainFrame.cpp文件中,对已经生成的【视图】菜单下的菜单命令【状态栏】的响应函数和界面更新函数进行编辑:
void CMainFrame ::OnViewStatusBar()
{
m_wndStatusBar.ShowWindow((m_wndStatusBar.GetStyle() &
WS_VISIBLE)== 0) ;
Recalclayout() ;
}
void CMainFrame ::OnUpdateViewStatusBar(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck((m_wndStatusBar.GetStyle() & WS_VISIBLE) != 0) ;
}
这些函数保证了【视图】菜单下的【状态栏】命令能被恰当地连接进新的状态栏。
7、在视图类中加入WM_MOUSEMOVE消息控制函数,并按如下代码编辑该函数。该函数先获得状态栏对象的指针,然后调用SetPaneText函数更新第一和第二信息行窗格。
void CstatusBarView::OnMouseMove(UNIT nFlags,Cpoint point)
{
CString str ;
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd ;
CStatusBar *pStatus= &pFrame->m_wndStatusBar ;
if (pStatus) {
str.Format(“X= %d”,point.x) ;
pStatus->SetPaneText(0,str) ;
str.Format(“Y= %d”,point.y) ;
pStatus->SetPaneText(1,str) ;
}
}
最后将语句:#include “MainFrm.h”加在文件StatuaBarView.cpp靠近最上面的地方。
8、对文件StatuaBarView.cpp中的OnDraw函数进行编辑。OnDraw函数用来在视图窗口中显示一条提示信息。请加入下面粗斜体的代码:
void CStatusBar ::OnDraw(CDC *pDC(
{
pDC->TextOut(0,0, “移动鼠标并按鼠标按钮,观察状态栏!”) ;
}
9、编译并测试StatusBar应用程序。请移动鼠标,观察一下左边的两个窗格中是否准确地反映了鼠标指针的位置。然后再试一试左右鼠标按钮,此时能否通过【视图】菜单的【状态栏】命令对状态栏进行允许和禁止切换?
说明:如果希望第一(索引值为0)状态格能像其他窗格一样具有立体边框,以使状态栏看起来更好看,可以在CMainFrame类的OnCreate函数中加入如下代码行,但必须把它加在对状态栏的Create函数调用之后。
m_wndStatusBar.SetPaneInfo(0,0,0,50) ;
m_wndStatusBar.SetPaneInfo(1,0,SBPS_STRETCH,50) ;
这些语句改变了前面两个窗格的宽度(不再是默认的1/4显示屏尺寸),并使第二个窗格(索引为1)成为了可伸缩的。

 

Python Numpy面向数组编程该怎么进行操作HTML div四边加边框怎么实现Python Numpy常用函数总结

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。