将进度条从正常切换到选取框

时间:2017-12-01 10:35:50

标签: c++ winapi progress-bar

我有一个有进度条的Dialog。 我不想在该对话框中添加一个方法,将进度条设置为选取框。 我试着跟随:

void CDownloader::SetIntermediate(wstring info)
{
    SetDlgItemText(IDC_DOWNLOADER_LABEL, info.c_str());

    auto style = GetWindowLong(GWL_STYLE);
    style &= ~( PBS_SMOOTH | PBS_SMOOTHREVERSE | PBS_VERTICAL);
    style |= PBS_MARQUEE;
    SetWindowLong(GWL_STYLE, style);

    RECT windowRect;
    GetWindowRect(&windowRect);
    SetWindowPos(HWND_TOP, &windowRect,SWP_FRAMECHANGED);

    HWND progress = GetDlgItem(IDC_DOWNLOADER_PROGRESS);
    ::SendMessage(progress, PBM_SETMARQUEE, TRUE, 100);
}

然而,这不起作用:(

我将Window Style设置为MARQUEE,删除可能与之冲突的样式,使用setWindowPos更新样式并将Progress设置为MARQUEE。

我可以将设计器中的进度条设置为选取框,但不能将bac切换为正常。

1 个答案:

答案 0 :(得分:2)

对于所有想要正确代码的人:

void CDownloader::SetPending(bool value)
{
    if(value)
    {
        HWND progress = GetDlgItem(IDC_DOWNLOADER_PROGRESS);
        auto style = ::GetWindowLong(progress, GWL_STYLE);
        style |= PBS_MARQUEE;
        ::SetWindowLong(progress, GWL_STYLE, style);
        ::SendMessage(progress, PBM_SETMARQUEE, TRUE,0);
    }
    else
    {
        HWND progress = GetDlgItem(IDC_DOWNLOADER_PROGRESS);
        auto style = ::GetWindowLong(progress, GWL_STYLE);
        style &= ~PBS_MARQUEE;
        ::SetWindowLong(progress, GWL_STYLE, style);
        ::SendMessage(progress, PBM_SETMARQUEE, FALSE,0);
    }
}