Bonjour,
J'aimerai definir une progression de la fenetre courante dans la bare des taches pour vista et seven, hors je ne comprends pas bien comment faire. Je veux le faire pour une application Qt.
Merci d'avance de votre aide.
Bonjour,
J'aimerai definir une progression de la fenetre courante dans la bare des taches pour vista et seven, hors je ne comprends pas bien comment faire. Je veux le faire pour une application Qt.
Merci d'avance de votre aide.
Je ne crois pas que Qt gère cela, en tous cas ce n'est pas via QProgressBar. Il te faut passer par de la programmation COM et Win32 (ITaskbarList3::SetProgressValue). Un exemple ici :
http://www.codeproject.com/KB/vista/...barStatus.aspx
Mais si tu débutes, ça risque d'être dur...
Je suis un gros débutant en api win32...
Tu doit surement pouvoir le faire toi même en modifiant l'icône régulièrement :
http://qt.developpez.com/faq/?page=a...cone-animation
Je ne veux pas animer une icone, met bien faire une progression dans la barre de tache de windows.
En fait, c'est de la programmation COM. C'est quelque chose qui devient vite très complexe, mais dans ce cas précis, ça peut encore aller.
Tu dois instancier la classe ITaskbarList3, qui est en quelque sorte une classe de Windows (du Shell Explorer plus exactement). Pour cela, on utilise un identifiant unique, ainsi qu'une description de l'interface attendue. Tout cela se trouve dans le dernier Windows SDK (Win 7).
Pour savoir si le SDK que tu as est à jour, ouvre le fichier "shobjidl.h" et regarde si tu y trouves le texte "ITaskbarList3". Si tu ne trouves que le texte "ITaskbarList" ou "ITaskbarList2", c'est pas bon, tu dois mettres à jour :
http://msdn.microsoft.com/en-us/windows/bb980924.aspx
Tu dois ensuite configurer VC++ pour qu'il utilise bien ce SDK et pas ton ancien qui est déjà installé. Un lien pour t'aider :
http://arb.developpez.com/vc++/expre...#Linstall-psdk
Ensuite, tu peux partir d'un code C++ existant autour de ITaskbarList et le modifier. Par exemple, je tombe là dessus :
http://social.msdn.microsoft.com/For...b-e0c2540064d6
Tu dois le modifier pour utiliser ITaskbarList3 au lieu de ITaskbarList2. Je vais découper ce code en 2 parties pour que tu comprennes mieux ce qui se passe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CoInitialize(NULL); ITaskbarList2* pITask = NULL; HRESULT hr = CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList2,(LPVOID*) &pITask); hr = pITask->HrInit(); hr = pITask->DeleteTab(hwnd); pITask->Release(); CoUninitialize();
A priori, si tu es sous Seven, init() devrait réussir (non testé). Si ça échoue, c'est que soit le code est buggé soit que tu n'es pas sous un OS qui supporte cette barre de progression (Vista/XP).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 ITaskbarList3* pITask = NULL; bool init() { CoInitialize(NULL); HRESULT hr = CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList3,(LPVOID*) &pITask); if (FAILED(hr)) { CoUninitialize(); return false; } pITask->HrInit(); return true; } void cleanup() { pITask->Release(); pITask = NULL; CoUninitialize(); }
Une fois que ça a réussi, tu peux utiliser pITask comme un pointeur vers une classe normale. Son interface est documentée ici :
http://msdn.microsoft.com/en-us/libr...92(VS.85).aspx
Les fonctions vont te demander un HWND, qui est le handle de ta fenêtre Qt principale (QMainWindow). Tu peux l'obtenir avec winId(). Ca devrait donner :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void test() { if (!init()) return; HWND hMainWnd = QApplication::activeWindow()->winId(); // à ajuster avec ta QMainWindow for (int i = 0; i < 100; i++) { pITask->SetProgressValue(hMainWnd, i, 100); Sleep(50); // pause de 50ms POUR l'EXEMPLE seulement } pITask->SetProgressState(hwnd, TBPF_NOPROGRESS); cleanup(); }
Partager