Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problemi con la struct NOTIFYICONDATA
Forum - C/C++ - Problemi con la struct NOTIFYICONDATA

Avatar
Exor (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/08/2009

Segnala al moderatore
Postato alle 5:24
Venerdì, 30/10/2009
ciao a tutti :)

ho un problemino con la struct NOTIFYICONDATA .. per chi non lo sapesse serve per visualizzare i balloon tooltip di windows sulla taskbar.

ok il problema è il compilatore: riporta costantemente che il valore NIF_INFO non è dichiarato per quello scopo.

il codice è questo
Codice sorgente - presumibilmente C++

  1. #include "main.h"
  2. #ifdef _WIN32_IE
  3. #undef _WIN32_IE
  4. #define _WIN32_IE 0x0800
  5. #endif
  6.  
  7. #include <windows.h>
  8. .
  9. .
  10. .
  11. void tooltip::initToolTip(char* titolo, char* mex)
  12. {
  13. NOTIFYICONDATA nfd;
  14. nfd.cbSize = sizeof(NOTIFYICONDATA);
  15. nfd.hWnd = (HWND)wnd->GetHandle();
  16. nfd.uID = (UINT)123;
  17. nfd.uFlags = NIF_INFO | NIF_ICON;
  18. nfd.szInfo = mex;
  19. nfd.szInfoTitle = titolo;
  20. nfd.dwInfoFlags = NIIF_INFO;
  21. nfd.uID = (UINT)ID_ICONA_TASKBAR;
  22. nfd.hIcon = (HICON)LoadIcon((HINSTANCE)GetModuleHandle(NULL),0);
  23. Shell_NotifyIcon(NIM_ADD, &nfd);
  24. }


Ecco l'errore
Codice sorgente - presumibilmente Delphi

  1. main.cpp:117: error: `NIF_INFO' was not declared in this scope
  2. main.cpp:118: error: 'struct NOTIFYICONDATA' has no member named 'szInfo'
  3. main.cpp:119: error: 'struct NOTIFYICONDATA' has no member named 'szInfoTitle'
  4. main.cpp:120: error: 'struct NOTIFYICONDATA' has no member named 'dwInfoFlags'
  5. main.cpp:120: error: `NIIF_INFO' was not declared in this scope
  6. main.cpp:117: warning: unused variable 'NIF_INFO'
  7. main.cpp:120: warning: unused variable 'NIIF_INFO'



Grazie

PS: Ho Windows 7 e uso il MingGcc con wxDevC++ come IDE

Ultima modifica effettuata da Exor il 30/10/2009 alle 5:25
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 7:29
Venerdì, 30/10/2009
Testo quotato

ok il problema è il compilatore: riporta costantemente che il valore NIF_INFO non è dichiarato per quello scopo.



'Scope' non e' da tadurre in scopo ... ma in ambito.

Molto probabilmente è necessario indicare la versione del sistema operativo target.

Prima dell'include di Windows prova ad inserire

Codice sorgente - presumibilmente C/C++

  1. #define _WIN32_WINNT 0x0601



Inoltre, assegni in modo sbagliato due puntatori ai due array che stanno nella struttura.
Le righe corrette sono

Codice sorgente - presumibilmente Plain Text

  1. strcpy(nfd.szInfo, mex);
  2. strcpy(nfd.szInfoTitle, titolo);



e, per sicurezza, dovresti controllarne la lunghezza massima in precedenza (oppure usare la strcpy safe se supportata dal tuo compilatore)

PM Quote
Avatar
Exor (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/08/2009

Segnala al moderatore
Postato alle 10:50
Venerdì, 30/10/2009
uff ... niente ..

sempre lo stesso.

inoltre riferendomi a quest'articolo su msdn http://msdn.microsoft.com/en-us/library/aa383745%28VS.85%2 ...
ho aggiunto un po' di cose:
Codice sorgente - presumibilmente C++

  1. #include "main.h"
  2.  
  3. #ifdef _WIN32_IE
  4. #undef _WIN32_IE
  5. #define _WIN32_IE 0x0500
  6. #else
  7. #define _WIN32_IE 0x0500
  8. #endif
  9.  
  10. #ifdef _WIN32_WINNT
  11. #undef _WIN32_WINNT
  12. #define _WIN32_WINNT 0x0502
  13. #else
  14. #define _WIN32_WINNT 0x0502
  15. #endif
  16.  
  17. #ifdef NTDDI_VERSION
  18. #undef NTDDI_VERSION
  19. #define NTDDI_VERSION NTDDI_WINXPSP3
  20. #else
  21. #define NTDDI_VERSION NTDDI_WINXPSP3
  22. #endif
  23.  
  24. #include <windows.h>



leggendo che si deve definire NTDDI_VERSION con la versione minima da usare, allora ho messo WINXPSP3 al posto di WIN7... cmq non funzionava lo stesso.
ed ho modificvato la parte dell'assegnazione ... in effetti non mi ero accorto che assegnavo un char ad un char*.

Codice sorgente - presumibilmente Plain Text

  1. nfd.cbSize = sizeof(NOTIFYICONDATA);
  2. nfd.hWnd = (HWND)GetHandle();
  3. nfd.uID = (UINT)ID_ICONA_TASKBAR;
  4. nfd.uFlags = NIF_INFO | NIF_ICON;
  5. strcpy(nfd.szInfo,"asads");
  6. strcpy(nfd.szInfoTitl,"asdasd");
  7. nfd.dwInfoFlags = NIIF_INFO;
  8. nfd.hIcon = (HICON)LoadIcon((HINSTANCE)GetModuleHandle(NULL),0);



cmq questa soluzione l'avevo gia provata ma a quanto pare sono l'unico a cui non va -.-

Ultima modifica effettuata da Exor il 30/10/2009 alle 10:58
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 12:18
Venerdì, 30/10/2009
Ma con

#define _WIN32_WINNT 0x0601

hai provato?

PM Quote
Avatar
Exor (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/08/2009

Segnala al moderatore
Postato alle 12:19
Venerdì, 30/10/2009
Testo quotato

Postato originariamente da theprogrammer:

Ma con

#define _WIN32_WINNT 0x0601

hai provato?



sisi

PM Quote
Avatar
Exor (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/08/2009

Segnala al moderatore
Postato alle 12:30
Venerdì, 30/10/2009
ci sono riuscito -.-

se definivo _WIN32_IE nel sorgente non funzionava ... definendolo nelle opzioni di compilazione del compilatore funziona

grazie 1000 dell'aiuto :)

PM Quote