2017-08-08 75 views
0

我正在使用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

看到这篇文章在MSDN上:https://msdn.microsoft.com/en-us/library/windows/desktop/dd378460(v=vs.85).aspx#progress –

+0

什么的C++版本和你是什么用于GUI? –

+0

可再发行组件包被称为'2015 Redistrbutable(x86)-14.0.24215' –

回答

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

有一个很好的包装https://www.codeproject.com/Articles/42345/Windows-Goodies-in-C-Taskbar-Progress-and-Statushttps://www.codeproject.com/Articles/42345/Windows-Goodies-in-C-Taskbar-Progress-and-Status

1

如前所述,您指出的示例项目不使用MFC,而是WTL,它是ATL的扩展,目前没有与Visual Studio一起提供。 因此,为了让他们编译你必须download WTL,安装并摆脱了一些弃用的东西。

但是,当然,接口也可以用在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; 
} 

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

[已更新]

对不起,我之前的例子是错误的!根据文档,在调用任何ITaskbarList3方法之前,必须处理“TaskbarButtonCreated”注册的消息,以确保任务栏按钮已就位。

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

+0

谢谢,下落我会在这里实现SetProgressState?它会在OnInitDialog或其他地方吗? –

+0

为了表明发生了某些事情,可能需要将它称为其他地方。由您选择。 –

相关问题