MFC中添加状态栏显示时间1_第1页
MFC中添加状态栏显示时间1_第2页
MFC中添加状态栏显示时间1_第3页
MFC中添加状态栏显示时间1_第4页
MFC中添加状态栏显示时间1_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/MFC中添加状态栏1.首先在stringtable里添加两个字串,ID分别为IDS_INDICATOR_MESSAGEandIDS_INDICATOR_TIME2.在你的dlg.h类里面加个CStatusBarm_bar;3.在dlg.cpp开头加上staticUINTindicators[]={

IDS_INDICATOR_MESSAGE,

IDS_INDICATOR_TIME};4.OnInitDialog里面加上m_bar.Create(this);//Wecreatethestatusbarm_bar.SetIndicators(indicators,2);//SetthenumberofpanesCRectrect;GetClientRect(&rect);//Sizethetwopanesm_bar.SetPaneInfo(0,IDS_INDICATOR_MESSAGE,

SBPS_NORMAL,rect.Width()-100);

m_bar.SetPaneInfo(1,IDS_INDICATOR_TIME,SBPS_STRETCH,0);//ThisiswhereweactuallydrawitonthescreenRepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,

ID_INDICATOR_TIME);5.时间显示OnInitDialog里面加SetTimer(1,1000,NULL);为你的dlg类添加WM_TIMER的响应函数,在其中添加代码:

CTimet1;

t1=CTime::GetCurrentTime();

m_bar.SetPaneText(1,t1.Format("%H:%M:%S"));

CDialog::OnTimer(nIDEvent);这样添加的程序刚开始运行时在时间一栏中显示的是初始设置的字符,为了使程序在刚开始运行时就显示系统时间,可在m_bar.SetPaneInfo(1,IDS_INDICATOR_TIME,SBPS_STRETCH,0);后添加如下代码:CTimet1;

t1=CTime::GetCurrentTime();

m_bar.SetPaneText(1,t1.Format("%H:%M:%S"));这样在程序刚启动时就会显示系统时间,然后实时更新。以上编译完成后,可能会弹不出程序需要清理解决方案,重新生成解决方案同时状态栏显示的是:设置字符串的时候的文字信息///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////本来以为自己对MFC有所了解的,最近再写程序的时候才发现,原来我对MFC一窍不通,记录一下吧:

第一步、先件两个字符串资源:IDS_STATESTRING1,IDS_STATESTRING2,分别用来显示提示信息和版权信息!

第二步、创建一个数组,分别将上面的两个字符串资源ID写到里面:staticUINTindicators[]={IDS_STATESTRING1,IDS_STATESTRING2};

第三步、再MFC的对话框类中添加成员变量:CStatusBar

m_wndStatusBar;

第四步、由于创建状态栏要再主对话框创建成功以后创建,所以就再对话框初始化的时候添加吧!

到这里就创建好了!

如果要调整状态栏每个窗格的大小可以这样,比如我要调整第一个窗格的大小:m_WndStatusBar.SetPaneInfo(0,m_WndStatusBar.GetDlgCtrlID(),SBPS_NORMAL,650);

在程序中,如果要改变制定窗格中文字的化,这样:m_WndStatusBar.SetPaneText(0,"提示:恭喜你,参数设置成功...");

如果出现字符不能正常显示等问题的话,需要给这个控件添加Update处理函数:

CRectrect;

GetClientRect(rect);

if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))

{

TRACE0("Can'tcreatestatusbar\n");

returnfalse;

}

m_wndStatusBar.MoveWindow(0,rect.bottom-20,rect.right,20));//调整状态栏的位置和大小例如:在MainFrm.h中添加

afx_msgvoidOnUpdate1(CCmdUI*pCmdUI);

在MainFrm.cpp中添加

ON_UPDATE_COMMAND_UI(ID_INDICATOR_1(要显示字的栏),OnUpdate1)

实现函数:

voidCMainFrame::OnUpdate1(CCmdUI*pCmdUI)

{

pCmdUI->Enable();

好了,就这么多~~~//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1、在状态栏中设置两个新的栏位Timer和Progress。首先到ResourceView中编辑StringTable,增加IDS_TIMER(时间),PROGRESS(进度)。然后在MainFrame的OnCreate函数中修改indicators数组,插入IDS_TIMER和PROGRESS。插入的位置,即为显示的位置。2、现在我们让状态栏上的IDS_TIMER的位置显示系统当前的时间。我们只要在MainFrame的OnCreate函数中写入:CTimet=CTime::GetCurrentTime();

//获得当前的系统时间CClientDCdc(this);

CSizesz=dc.GetTextExtent(str);

//设置一个CClientDC对象来获取str的长度

CStringstr=t.Format("%H:%M:%S");

//格式可以参考MSDN中的strftime函数

intindex=0;

index=m_wndStatusBar.CommandToIndex(IDS_TIMER);

//此处也可以直接输入IDS_TIMER在indicators数组中从0开始的序号。m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);

//设置状态栏宽度

m_wndStatusBar.SetPaneText(index,str);

//设置IDS_TIMER指示器字符串如果我们在MainFrame的OnCreate函数中,添加一个SetTimer(1,1000,NULL);并在OnTimer消息响应函数中,插入以上代码,便可实现随时变化时间的状态栏。3、在窗口中创建一个进度栏首先,在MainFrame中新建一个成员变量private:CProgressCtrm_progress;然后在OnCreate函数中,写入:m_progress.Create(WS_CHILD|WS_VISIBLE,CRect(100,100,200,130),this,123);

/*在MainFrame的10,40位置,产生一个长100,高30的进度栏,注意在CRect中,后两个数一定要大于前两个,否则会产生一个虚框,看不见任何东西。如果产生一个垂直的进度栏,只要在第一个参数中或一个PBS_VERTICAL参数即可*/

m_progress.SetPos(50);

/*进度栏显示为50%*/4、现在我们将状态栏中的PROGRESS栏位显示一个50%的进度栏。如果我们只是简单的在MainFrame的OnCreate函数中写入以下代码:CRectrect;

m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);

/*获取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值。解决的办法是,添加一个自定义的消息,把消息放入消息队列,等窗体和状态栏创建完毕后,再通过消息响应,创建进度栏。步骤如下:4.1在MainFrame的头文件中,自定义个消息#includeUM_PROGRESSWM_USER+1

//自定义的消息ID,注意要在WM_USER=0x0400之后。4.2然后添加消息响应原型protected:

//{{AFX_MSG(CMainFrame)

afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);

afx_msgvoidOnTimer(UINTnIDEvent);

afx_msgvoidOnViewNewtool();

afx_msgvoidOnUpdateViewNewtool(CCmdUI*pCmdUI);

//}}AFX_MSG

afx_msgvoidOnProgress();

//定义消息响应原形

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,OnViewNewtool)

ON_UPDATE_COMMAND_UI(IDM_VIEW_NEWTOOL,OnUpdateViewNewtool)

//}}AFX_MSG_MAP

ON_MESSAGE(UM_PROGRESS,OnProgress)

//添加消息映射

END_MESSAGE_MAP()4.5然后再return0;之前发布消息:PostMessage(UM_PROGRESS);

/*注意这里要用PostMessage不能用SendMessage,否则系统会先处理OnProgress消息响应,然后再创建窗体,出现仍看不见进度栏的情况。必须用PostMessage先把消息放入消息响应队列当中,等窗体创建完毕后,系统再处理OnProgress函数。*/4.4最后写OnProgress函数voidCMainFrame::OnProgress()

{

CRectrect;

m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);

m_progress.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,123);

m_progress.SetPos(50);

}

这时在IDS_PROGRESS状态栏中就能看到进度栏了。但是还存在问题,当改变窗口大小时,进度栏会离开IDS_PROGRESS栏位位置。5、另一种简单的方法可以实现以上相同的功能,并且可以解决以上的问题,是利用windows窗体发生重绘时的消息响应函数。在MainFrame中右键增加一个windows的WM_PAINT消息响应函数,然后加入一下代码:CRectrect;

m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);

if(!m_progress.m_hWnd)

/*注意这里必须增加一个判断,否则在窗体再次发生重绘时,

由于已经存在m_progress实例,会出现一个错误。*/

{

m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);

}

else

{

m_progress.MoveWindow(rect);

/*移动窗口,比SetWindowPos简单。*/

}

m_progress.SetPos(50);6、现在我们要让状态栏上显示鼠标在窗口中的坐标。由于View窗体在MainFrame框架前,所以我们要响应的是View窗体上OnMouseMove事件。首先我们在View类中右键新建一个window消息响应函数,添加一个WM_MOUSEMOVE的消息响应函数。添加如下代码:CStringstr;

str.Format("x=%d,y=%d",point.x,point.y);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论