当前位置:C++技术网 > 资讯 > 让窗口作为背景进度条实现方法详细讲解

让窗口作为背景进度条实现方法详细讲解

更新时间:2015-06-25 22:04:42浏览次数:1+次

    无边框窗口的实现和拖动无边框窗口,请参考文章《在客户区拖动窗口(拖动无边框窗口)两种实现方法及原理分析》。
    1.建立MFC的对话框项目,定义一个int的类成员变量记录进度:

int m_pos;

     并在构造函数中,初始化m_pos=0;
    2.在初始化对话框OnInitDialog()中添加代码如下:

SetBackgroundColor(RGB(100,200,200));// - 设置窗口背景颜色
ModifyStyle(0,WS_CLIPCHILDREN);// - 修改窗口风格
SetTimer(0,10,NULL);// - 创建一个计时器

     代码说明:
    2.1 ModifyStyle是修改窗口风格为子窗口剪切,不绘制子窗口,让窗口上的控件不会被覆盖。
    2.2 SetTimer第一个参数是计时器ID,第二个是间隔的时间,毫秒为单位,第三个参数为响应函数,传入NULL,即使用标准的消息响应函数OnTimer。
    3.添加计时器的消息响应
    到窗口属性中的消息中,找到WM_TIMER,添加计时器消息响应。会生成OnTimer(UINT_PTR nIDEvent)消息响应。在这个消息响应函数中,添加以下代码:

CRect rect;
GetClientRect(rect);// - 获取窗口客户区大小
m_pos+=10;// - 进度绘制的矩形宽度增加10
int rate = (100*m_pos)/rect.Width();// - 进度百分比
if (rate>rect.Width())// - 绘制的矩形超过窗口宽度
{
    KillTimer(0);// - 停止计时器
}
CDC * dc = GetDC();// - 获取一个DC指针
CRect dRect;
dRect.left = 0;
dRect.top = 0;
dRect.right = rate;// - 更新绘制的矩形的宽度
dRect.bottom = rect.Height();
CBrush brush;
brush.CreateSolidBrush(RGB(0,100,255));// - 创建一个画刷
dc->FillRect(dRect,&brush);// - 填充客户区的颜色

    代码说明:
    3.1 GetClientRect获取窗口客户区的大小,因为是无边框,所以窗口客户区大小就是整个窗口大小。
    3.2 GetDC获得一个通用的DC,不要使用GetWindowDC,否则会覆盖控件。
    3.3 FillRect用第二个参数指定的画刷填充第一个参数指定的矩形。画刷可以是纯色、图形等等的。这里使用普通的纯色填充。

    4. “重新开始”按钮事件响应
    按钮单击响应代码如下:

m_pos = 0;
SetBackgroundColor(RGB(100,200,200));
SetTimer(0,10,NULL);
    代码说明:
    4.1 此处将原先背景色清除,再重新启动计时器。
    4.2 重置计时器,第一个参数传入计时器0,则启动计时器,而不是重新创建一个计时器,这个迫使前一个计时器重新开始。