一个关于MFC在状态栏显示时间的问题......(基于单文档视图工程)--(VC++ 6.0)
1.在ID符号表中添加ID为:IDS_TIMER,staticUINTindicators[]={ID_SEPARATOR,//statuslineindicatorID...
1.在ID符号表中添加ID为:IDS_TIMER,
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
IDS_TIMER,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
2.在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)添加定时器:
SetTimer(1,1000,NULL);
3.在CMainFrame类中添加成员函数SetTime()//任意访问权限
void CMainFrame::SetTime()
{
CTime curTime=CTime::GetCurrentTime();
CString time=curTime.Format("%H:%M:%S");
CWindowDC dc(this);//Or CLientDC/CWindowDC/CPaintDC
CSize sz=dc.GetTextExtent(time);
m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(1,time);
}
4.相应定时器消息WM_TIMER,并在该相应超时消息中调用SetTime()函数,
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
SetTime();
CFrameWnd::OnTimer(nIDEvent);
}
请问一个问题:当程序运行的时候应该可以显示时间,但是就在时间一直在走的时候我拖动任意一个工具栏,一直拖着不放,那时间就被定住了,这样的问题用多线程应该可以解决,请问思路怎么样?怎么样在一个线程(非主线程)里面响应定时器达到当我拖动工具栏的时候时间依旧能走动呢? 展开
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
IDS_TIMER,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
2.在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)添加定时器:
SetTimer(1,1000,NULL);
3.在CMainFrame类中添加成员函数SetTime()//任意访问权限
void CMainFrame::SetTime()
{
CTime curTime=CTime::GetCurrentTime();
CString time=curTime.Format("%H:%M:%S");
CWindowDC dc(this);//Or CLientDC/CWindowDC/CPaintDC
CSize sz=dc.GetTextExtent(time);
m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(1,time);
}
4.相应定时器消息WM_TIMER,并在该相应超时消息中调用SetTime()函数,
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
SetTime();
CFrameWnd::OnTimer(nIDEvent);
}
请问一个问题:当程序运行的时候应该可以显示时间,但是就在时间一直在走的时候我拖动任意一个工具栏,一直拖着不放,那时间就被定住了,这样的问题用多线程应该可以解决,请问思路怎么样?怎么样在一个线程(非主线程)里面响应定时器达到当我拖动工具栏的时候时间依旧能走动呢? 展开
3个回答
2012-11-14
展开全部
如果你是用VC6.0的话,多线程也不好解决,得把工具栏窗口放到另一个线程里。这个问题产生的原因在于VC6.0产生的MFC程序只有一个线程,因此所有的窗口的消息处理橘芦迅都在一个线程里,但是倘若要同时让两个窗口都各自响应自己的消息,那么它们各自的处理程序就不能在同哗腊一线程里。圆此当鼠标拖着不放的时候,只让工具栏的窗口工作,主窗口被阻塞就算有消息也不能处理。在VS2010中,MFC提供了5个线程,没有出现这种情况。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这应该不是多线程的问题,而且多线程也不一定租烂瞎能很好的解决你的问题。你的程序只有在执行到OnTimer时时间才会显示,那么你的窗口弊空从后台到前台的瞬间应该也是没有时间显示的。所以你要处理的是窗口重绘时的时间显示问题。你只需要重写(或响应 WM_PAINT,注意是CMainFrame的)OnPaint,在历咐调用默认方法后加上你的SetTime函数。
追问
按照你的思路不行,我也做个了测试,拖着工具栏不放的时候并没有响应WM_PAINT消息,只有拖着拖着在放开工具栏的那一瞬间才响应一次啊
追答
我把问题想的简单了。参考下面那篇文章吧。正确思路是你找到工具栏拖动的消息响应或事件函数,在里面SetTime
参考资料: http://blog.csdn.net/water_lwj/article/details/7279594
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不要用世闭尺CMainFrame的OnTimer,而要态敬用CStatusBar的SetTimer()
这个SetTimer需要指定一个OnTimer()的响应函数就搜高可以更新时间了
这个SetTimer需要指定一个OnTimer()的响应函数就搜高可以更新时间了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询