2017-08-08 77 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

爲了表明發生了某些事情,可能需要將它稱爲其他地方。由您選擇。 –