vs2010 状态栏添加进度条

步骤:

<1> : 在CMainFrame类中定义一个变量:保护类型.

CProgressCtrl m_progress;

<2> : 添加indicator指示器:

ID_INDICATOR_PROG

<3> : 添加WM_PAINT事件,添加代码如下

void CMainFrame::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: Add your message handler code here
 // Do not call CFrameWndEx::OnPaint() for painting messages
 CRect rect;
 m_wndStatusBar.GetItemRect(1,&rect);
 
 if(m_progress.m_hWnd){
  m_progress.SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),SWP_NOZORDER);
 }else{
  m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,rect,&m_wndStatusBar,123);

//第一个参数为进度条的风格;

//第二个参数进度条尺寸;

//第三个参数父窗口;

//ID号,可以随机一个数输入;
 }

 m_progress.SetPos(50);
}

<4> : 如果要让进度条显示"动起来",在WM_TIME事件中添加:

m_progress.StepIt();

<5> : 附上孙鑫的一个同样的例子,但是我按照他的方法编译器报断点错误,无法运行,暂时没有找到解决的办法,不过我相信他的也是正确的,下面以示参考:

MainFrm.cpp文件中指示器数组indicators中添加这两个资源ID.

static UINT indicators[] =

{

       ID_SEPARATOR,           // 状态行指示器

       IDS_TIMER,               // 新添加的时间指示器

       IDS_PROGRESS,           // 新添加的进度栏指示器

       ID_INDICATOR_CAPS,

       ID_INDICATOR_NUM,

       ID_INDICATOR_SCRL,

};

1 Mainfrm.h中增加protected的成员变量CProgressCtrl    m_progress

2 OnCreate中添加如下代码:

CRect rect;

m_wndStatusBar.GetItemRect(2,&rect);  //获取状态栏中第二项即进度栏的位置

m_progress.Create(WS_CHILD | WS_VISIBLE,// | PBS_VERTICAL,

       rect,&m_wndStatusBar,123);   //创建进度栏,第一个参数是属性,可以是水平的竖直的,第二个参数是位置,第三个参数是父窗口指针,这里设置为状态栏窗口,最后一个参数随便取的一个ID号。

    m_progress.SetPos(50);       //设置进度条中当前进度,100为满格,50为半格

这时运行发现不正确,矩形大小获取不正确,这是因为在OnCreate中状态栏还没有创建完成,因此,获取失败,解决办法可以是自定义消息,当程序执行OnCreate消息时,将自定义的消息放入消息队列中,当Oncreate消息执行完成后,再执行自定义的消息响应函数。

3MainFrm.h#define UM_PROGRESS  WM_USER+1   //自定义消息号要大于WM_USER

MainFrm.h中添加消息映射函数afx_msg LRESULT OnProgress(WPARAM ,LPARAM);

MainFrm.cpp中消息映射中添加ON_MESSAGE ( UM_PROGRESS, &CMainFrame::OnProgress )

MainFrm.cpp中,消息响应函数:

LRESULT CMainFrame::OnProgress(WPARAM ,LPARAM)

{

 CRect rect;

 m_wndStatusBar.GetItemRect(2,&rect);

 m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,

  rect,&m_wndStatusBar,123);

 m_progress.SetPos(50);

 return true;

}

4最后在OnCreate中调用 PostMessage(UM_PROGRESS);//不能用SendMessage()因为这个函数发送的消息是立即响应的,即Oncreate响应还没结束就去响应自定义的消息

解决重绘时进度栏改变的问题

OnPain()中重写代码

 CRect rect;

 m_wndStatusBar.GetItemRect(2,&rect);

 m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,

  rect,&m_wndStatusBar,123);

 m_progress.SetPos(50);

此时将OnCreatePostMessage(UM_PROGRESS);注释掉,因为创建窗口的过程就调用了OnPain()函数。为了让进度随时间改变在定时器消息处理函数中加入

 m_progress.StepIt();

 

 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/2994582.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值