如何使用任务栏按钮显示进度条?

时间:2017-08-08 12:50:40

标签: c++ visual-studio-2015 mfc taskbar

我正在使用Visual Studio 2015来更新应用程序。该应用程序是在15年前编写的,我想在任务栏按钮上添加进度条覆盖,这是Windows 7现在提供的。我已经按照我能找到的所有教程,例如

http://www.codeproject.com/KB/vista/SevenGoodiesTaskbarStatus.aspx

https://www.codeproject.com/Articles/80082/Windows-How-to-display-progress-bar-on-taskbar-i

然而,它们似乎都使用过时的命名空间,例如 MESSAGE_HANDLER_EX给了我一大堆错误。有谁知道怎么做?

2 个答案:

答案 0 :(得分:2)

MESSAGE_HANDLER_EX宏是WTL的一部分。它在atlcrack.h中定义。 您最有可能需要获取最新的WTL才能在Visual Studio 2015中编译项目。

正如ISun已经提到的,任务栏进度可以基于此MSDN文章中描述的API实现:https://msdn.microsoft.com/en-us/library/windows/desktop/dd378460(v=vs.85).aspx#progress

ITaskbarList3界面有一个不错的包装器:https://www.codeproject.com/Articles/42345/Windows-Goodies-in-C-Taskbar-Progress-and-Status

答案 1 :(得分:1)

如前所述,您指出的示例项目不使用MFC,而是WTL,它是ATL的扩展,目前不随Visual Studio一起提供。 因此,要使它们编译,您必须download WTL,安装并删除一些不赞成的东西。

但是,当然, ITaskbarList3 接口也可以在MFC应用程序中使用。 首先,这是一个简短的例子:

class CMainDialog : public CDialog
{
    // ...
    CComPtr<ITaskbarList3> m_spTaskbarList;
};

BOOL CMainDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    // ...

    HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, 
        __uuidof(ITaskbarList3), reinterpret_cast<void**>(&m_spTaskbarList));

    if(SUCCEDDED(hr))
    {
       hr = m_spTaskbarList->HrInit();
    }

    // ...
    return TRUE;
}

....当然,不要忘记在应用程序的 InitInstance 方法中调用 AfxOleInit

[LATER EDIT]

抱歉,我之前的例子错了!根据文档,必须处理&#34; TaskbarButtonCreated &#34;注册消息,以确保在调用任何 ITaskbarList3 方法之前,任务栏按钮已就位。

UINT WM_TASKBAR_BUTTON_CREATED = ::RegisterWindowMessage(_T("TaskbarButtonCreated"));

BEGIN_MESSAGE_MAP(CMainDialog, CDialogEx)
    // ...
    ON_REGISTERED_MESSAGE(WM_TASKBAR_BUTTON_CREATED, OnTaskbarButtonCreated)
END_MESSAGE_MAP()

LRESULT CMainDialog::OnTaskbarButtonCreated(WPARAM wParam, LPARAM lParam)
{
    HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
        IID_ITaskbarList3, reinterpret_cast<void**>(&m_spTaskbarList));

    if (FAILED(hr))
    {
        // handle error
        return 0;
    }


    hr = m_spTaskbarList->HrInit();
    // ....
    // ... other taskbar list stuff.

    return  0;
}

另见本文:Windows 7: Adding toolbar buttons to taskbar button flyout