《MFC中添加状态栏_显示时间》由会员分享,可在线阅读,更多相关《MFC中添加状态栏_显示时间(5页珍藏版)》请在金锄头文库上搜索。
1、精品文档,仅供学习与交流,如有侵权请联系网站删除MFC中添加状态栏1.首先在string table 里添加两个字串,ID分别为IDS_INDICATOR_MESSAGE and IDS_INDICATOR_TIME2.在你的 dlg.h 类里面加个 CStatusBar m_bar;3.在dlg.cpp 开头加上static UINT indicators = IDS_INDICATOR_MESSAGE, IDS_INDICATOR_TIME;4.OnInitDialog 里面加上m_bar.Create(this); /We create the status barm_bar.SetIn
2、dicators(indicators,2); /Set the number of panesCRect rect;GetClientRect(&rect);/Size the two panesm_bar.SetPaneInfo(0,IDS_INDICATOR_MESSAGE, SBPS_NORMAL,rect.Width()-100);m_bar.SetPaneInfo(1,IDS_INDICATOR_TIME,SBPS_STRETCH ,0);/This is where we actually draw it on the screenRepositionBars(AFX_IDW_C
3、ONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST, ID_INDICATOR_TIME);5.时间显示OnInitDialog 里面加 SetTimer(1,1000,NULL);为你的dlg类添加WM_TIMER的响应函数,在其中添加代码: CTime t1; t1=CTime:GetCurrentTime(); m_bar.SetPaneText(1,t1.Format(%H:%M:%S); CDialog:OnTimer(nIDEvent);这样添加的程序刚开始运行时在时间一栏中显示的是初始设置的字符,为了使程序在刚开始运行时就显示系统时间,可在m_bar.
4、SetPaneInfo(1,IDS_INDICATOR_TIME,SBPS_STRETCH ,0);后添加如下代码:CTime t1; t1=CTime:GetCurrentTime(); m_bar.SetPaneText(1,t1.Format(%H:%M:%S);这样在程序刚启动时就会显示系统时间,然后实时更新。以上编译完成后,可能会弹不出程序需要清理解决方案,重新生成解决方案同时状态栏显示的是:设置字符串的时候的文字信息/本来以为自己对MFC有所了解的,最近再写程序的时候才发现,原来我对MFC一窍不通,记录一下吧: 第一步、先件两个字符串资源:IDS_STATESTRING1,IDS_
5、STATESTRING2,分别用来显示提示信息和版权信息! 第二步、创建一个数组,分别将上面的两个字符串资源ID写到里面:static UINT indicators=IDS_STATESTRING1, IDS_STATESTRING2; 第三步、再MFC的对话框类中添加成员变量:CStatusBar m_wndStatusBar; 第四步、由于创建状态栏要再主对话框创建成功以后创建,所以就再对话框初始化的时候添加吧! 到这里就创建好了! 如果要调整状态栏每个窗格的大小可以这样,比如我要调整第一个窗格的大小:m_WndStatusBar.SetPaneInfo(0,m_WndStatusBar
6、.GetDlgCtrlID(),SBPS_NORMAL,650); 在程序中,如果要改变制定窗格中文字的化,这样:m_WndStatusBar.SetPaneText(0,提示: 恭喜你, 参数设置成功.); 如果出现字符不能正常显示等问题的话,需要给这个控件添加Update处理函数: CRect rect; GetClientRect(rect);if(!m_wndStatusBar.Create(this)| !m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT) TRACE0(Cant create
7、 status barn);return false; m_wndStatusBar.MoveWindow(0,rect.bottom-20,rect.right,20);/ 调整状态栏的位置和大小例如:在MainFrm.h中添加 afx_msg void OnUpdate1(CCmdUI *pCmdUI); 在MainFrm.cpp中添加 ON_UPDATE_COMMAND_UI(ID_INDICATOR_1(要显示字的栏), OnUpdate1) 实现函数:void CMainFrame:OnUpdate1(CCmdUI *pCmdUI)pCmdUI-Enable(); 好了,就这么多/1
8、、在状态栏中设置两个新的栏位Timer和Progress。首先到ResourceView中编辑String Table,增加IDS_TIMER(时间),PROGRESS(进度)。然后在MainFrame的OnCreate函数中修改indicators数组,插入IDS_TIMER和PROGRESS。插入的位置,即为显示的位置。2、现在我们让状态栏上的IDS_TIMER的位置显示系统当前的时间。我们只要在MainFrame的OnCreate函数中写入:CTime t=CTime:GetCurrentTime(); /获得当前的系统时间CClientDC dc(this);CSize sz=dc.G
9、etTextExtent(str); /设置一个CClientDC对象来获取str的长度CString str=t.Format(%H:%M:%S); /格式可以参考MSDN中的strftime函数int index=0;index=m_wndStatusBar.CommandToIndex(IDS_TIMER); /此处也可以直接输入IDS_TIMER在indicators数组中从0开始的序号。m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx); /设置状态栏宽度m_wndStatusBar.SetPaneText(in
10、dex,str); /设置IDS_TIMER指示器字符串如果我们在MainFrame的OnCreate函数中,添加一个SetTimer(1,1000,NULL);并在OnTimer消息响应函数中,插入以上代码,便可实现随时变化时间的状态栏。3、在窗口中创建一个进度栏首先,在MainFrame中新建一个成员变量 private: CProgressCtr m_progress; 然后在OnCreate函数中,写入:m_progress.Create(WS_CHILD|WS_VISIBLE, CRect(100,100,200,130), this, 123); /*在MainFrame的10,4
11、0位置,产生一个长100,高30的进度栏,注意在CRect中,后两个数一定要大于前两个,否则会产生一个虚框,看不见任何东西。如果产生一个垂直的进度栏,只要在第一个参数中或一个PBS_VERTICAL参数即可*/m_progress.SetPos(50); /*进度栏显示为50%*/4、现在我们将状态栏中的PROGRESS栏位显示一个50%的进度栏。如果我们只是简单的在MainFrame的OnCreate函数中写入以下代码:CRect rect;m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect
12、); /*获取IDS_PROGRESS栏位的CRect值,付给rect*/m_progress.Create(WS_CHILD|WS_VISIBLE, rect, &m_wndStatusBar, 123); /*在IDS_PROGRESS的位置显示一个50%的进度栏*/m_progress.SetPos(50);你会发现IDS_PROGRESS栏位仍然显示的是“进度”两个字。这是为什么呢?原因是因为,在OnCreate函数中,窗台和状态栏并没有真正创建完毕,所以GetItemRect函数无法获取IDS_PROGRESS栏位的CRect值。解决的办法是,添加一个自定义的消息,把消息放入消息队列
13、,等窗体和状态栏创建完毕后,再通过消息响应,创建进度栏。步骤如下:4.1在MainFrame的头文件中,自定义个消息#include UM_PROGRESS WM_USER+1 /自定义的消息ID,注意要在WM_USER= 0x0400之后。4.2然后添加消息响应原型protected:/AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnViewNewtool();afx_msg void OnUpdateViewNewtool(CCmdUI* pCmdUI);/AFX_MSGafx_msg void OnProgress(); /定义消息响应原形DECLARE_MESSAGE_MAP()4.3接着在MainFrame中添加消息映射BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_WM_TIMER()ON_COMMAND(IDM_VIEW_NEWTOOL