Mitenkä c++/wini ohjelmassa saa kuvakkeen trayhyn?
Tulee vastaus vähän hitaasti, mutta satuin ite nyt koodaamaan samaa juttua ja muistin tän kysymyksen. Eli alkuun:
#include <shellapi.h> // Lisää ikonin trayhin BOOL AddToTray(HWND hWnd, UINT uMsg, UINT uID, HICON hIcon, const char* tip) { if (!hWnd || !uMsg) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // Ikkuna joka vastaanottaa viestit nid.uCallbackMessage= uMsg; // Lähetettävä viesti // Sekä viesti, ikoni, että ohjeteksti määritelty nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.hIcon = hIcon; // Ikoni nid.uID = uID; // Tunniste if (tip) strncpy(nid.szTip, tip, sizeof(nid.szTip)); else nid.szTip[0] = '\0'; return (BOOL)Shell_NotifyIcon(NIM_ADD, &nid); } // Poistaa ikonin traysta BOOL DeleteFromTray(HWND hWnd, UINT uID) { if (!hWnd) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = uID; return (BOOL)Shell_NotifyIcon(NIM_DELETE, &nid); }
Ja sitten sun ikkunan viestinkäsittelijään:
case WM_CREATE: if (!AddToTray(hWnd, WM_MY_MESSAGE, IDI_MY_APP, LoadIcon(NULL, IDI_APPLICATION), "Apina")) MessageBox(NULL, "Virhe statusikonin luonnissa", "Virhe!", MB_OK | MB_ICONERROR); break; case WM_MY_MESSAGE: // Tutkitaan onko viesti meidän ikonilta if ((UINT)wParam == IDI_MY_APP) { // Tutkitaan mitä tapahtui switch ((UINT)lParam) { case WM_LBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia vasemmalla painikkeella!", "Tray", MB_OK); break; case WM_RBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia oikealle painikkeella!", "Tray", MB_OK); break; } } break; case WM_DESTROY: if (!DeleteFromTray(hWnd, IDI_MY_APP)) MessageBox(NULL, "Virhe statusikonin poistamisessa", "Virhe!", MB_OK | MB_ICONERROR); PostQuitMessage(0); break;
Kyllä lähtee!
Hei helmee! toihan voi vaikka toimia, kunhan pääsen koieilemaan!
Hetkine. Minne päin koodia noi funktioalustukset voi laittaa. Kääntäjä valittaa kokoajan. Mun koodi on tämmöne:
#include <windows.h> #include <shellapi.h> /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof(WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use light-gray as the background of the window */ wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); /* Register the window class, if fail quit the program */ if(!RegisterClassEx(&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow(hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage( ) returns 0 */ while(GetMessage(&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage( ) gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage( ) */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: // Lisää ikonin trayhin BOOL AddToTray(HWND hWnd, UINT uMsg, UINT uID, HICON hIcon, const char* tip) { if (!hWnd || !uMsg) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // Ikkuna joka vastaanottaa viestit nid.uCallbackMessage= uMsg; // Lähetettävä viesti // Sekä viesti, ikoni, että ohjeteksti määritelty nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.hIcon = hIcon; // Ikoni nid.uID = uID; // Tunniste if (tip) strncpy(nid.szTip, tip, sizeof(nid.szTip)); else nid.szTip[0] = '\0'; return (BOOL)Shell_NotifyIcon(NIM_ADD, &nid); } // Poistaa ikonin traysta BOOL DeleteFromTray(HWND hWnd, UINT uID) { if (!hWnd) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = uID; return (BOOL)Shell_NotifyIcon(NIM_DELETE, &nid); } if (!AddToTray(hWnd, WM_MY_MESSAGE, IDI_MY_APP, LoadIcon(NULL, IDI_APPLICATION), "Apina")) MessageBox(NULL, "Virhe statusikonin luonnissa", "Virhe!", MB_OK | MB_ICONERROR); break; case WM_MY_MESSAGE: // Tutkitaan onko viesti meidän ikonilta if ((UINT)wParam == IDI_MY_APP) { // Tutkitaan mitä tapahtui switch ((UINT)lParam) { case WM_LBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia vasemmalla painikkeella!", "Tray", MB_OK); break; case WM_RBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia oikealle painikkeella!", "Tray", MB_OK); break; } } break; case WM_DESTROY: if (!DeleteFromTray(hWnd, IDI_MY_APP)) MessageBox(NULL, "Virhe statusikonin poistamisessa", "Virhe!", MB_OK | MB_ICONERROR); PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Sain toimimaan, mutta se kuvake häviää kun vie hiiren sen päälle ja sitten toi valittaa että kuvakkeen poistaminene ei onnistu. Mitä mä laitan mihinkin WM:mmään että toimsi oikein?
Mitä hittoa... tossa sun koodinpätkässä on noi funktioalustukset WindowProcedure():n sisällä... laita ne ihan heti #includien jälkeen. Ja mitä mä unohdin: Laita koodin alkuun nämä definet:
#define WM_MY_MESSAGE WM_USER+1 #define IDI_MY_APP 101
Nyt vois vaikka toimia.. En kyllä tajua miten oot saannu koodisi edes käännettyä, kun näitä ei ole määritelty ja niitä kuitenkin käytetään;)
Koko koodi:
#include <windows.h> #include <shellapi.h> #define WM_MY_MESSAGE WM_USER+1 #define IDI_MY_APP 101 // Lisää ikonin trayhin BOOL AddToTray(HWND hWnd, UINT uMsg, UINT uID, HICON hIcon, const char* tip) { if (!hWnd || !uMsg) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // Ikkuna joka vastaanottaa viestit nid.uCallbackMessage= uMsg; // Lähetettävä viesti // Sekä viesti, ikoni, että ohjeteksti määritelty nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.hIcon = hIcon; // Ikoni nid.uID = uID; // Tunniste if (tip) strncpy(nid.szTip, tip, sizeof(nid.szTip)); else nid.szTip[0] = '\0'; return (BOOL)Shell_NotifyIcon(NIM_ADD, &nid); } // Poistaa ikonin traysta BOOL DeleteFromTray(HWND hWnd, UINT uID) { if (!hWnd) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = uID; return (BOOL)Shell_NotifyIcon(NIM_DELETE, &nid); } /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof(WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use light-gray as the background of the window */ wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); /* Register the window class, if fail quit the program */ if(!RegisterClassEx(&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow(hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage( ) returns 0 */ while(GetMessage(&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage( ) gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage( ) */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: if (!AddToTray(hwnd, WM_MY_MESSAGE, IDI_MY_APP, LoadIcon(NULL, IDI_APPLICATION), "Apina")) MessageBox(NULL, "Virhe statusikonin luonnissa", "Virhe!", MB_OK | MB_ICONERROR); break; case WM_MY_MESSAGE: // Tutkitaan onko viesti meidän ikonilta if ((UINT)wParam == IDI_MY_APP) { // Tutkitaan mitä tapahtui switch ((UINT)lParam) { case WM_LBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia vasemmalla painikkeella!", "Tray", MB_OK); break; case WM_RBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia oikealle painikkeella!", "Tray", MB_OK); break; } } break; case WM_DESTROY: if (!DeleteFromTray(hwnd, IDI_MY_APP)) MessageBox(NULL, "Virhe statusikonin poistamisessa", "Virhe!", MB_OK | MB_ICONERROR); PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Mulla on sitten VC++ 6.0. En tiedä miten toi Dev-c++:ssa toimii.
Hei nyt alko wörkkiin. Thnx lot!
Toimi äsken mutta kun vaihdan kuvakkeen niin valittaa että hThisInstance not declared. Boldattuna paikka missä valittaa:
#include <windows.h> #include <shellapi.h> #define WM_MY_MESSAGE WM_USER+1 #define IDI_MY_APP 101 // Lisää ikonin trayhin BOOL AddToTray(HWND hWnd, UINT uMsg, UINT uID, HICON hIcon, const char* tip) { if (!hWnd || !uMsg) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // Ikkuna joka vastaanottaa viestit nid.uCallbackMessage= uMsg; // Lähetettävä viesti // Sekä viesti, ikoni, että ohjeteksti määritelty nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.hIcon = hIcon; // Ikoni nid.uID = uID; // Tunniste if (tip) strncpy(nid.szTip, tip, sizeof(nid.szTip)); else nid.szTip[0] = '\0'; return (BOOL)Shell_NotifyIcon(NIM_ADD, &nid); } // Poistaa ikonin traysta BOOL DeleteFromTray(HWND hWnd, UINT uID) { if (!hWnd) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = uID; return (BOOL)Shell_NotifyIcon(NIM_DELETE, &nid); } /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof(WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use light-gray as the background of the window */ wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); /* Register the window class, if fail quit the program */ if(!RegisterClassEx(&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow(hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage( ) returns 0 */ while(GetMessage(&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage( ) gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage( ) */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: if (!AddToTray(hwnd, WM_MY_MESSAGE, IDI_MY_APP, LoadIcon([b]hThisInstance[/b], MAKEINTRESOURCE(1234567)), "NakkiMakkara")) MessageBox(NULL, "Virhe statusikonin luonnissa", "Virhe!", MB_OK | MB_ICONERROR); break; case WM_MY_MESSAGE: // Tutkitaan onko viesti meidän ikonilta if ((UINT)wParam == IDI_MY_APP) { // Tutkitaan mitä tapahtui switch ((UINT)lParam) { case WM_LBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia vasemmalla painikkeella!", "Tray", MB_OK); break; case WM_RBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia oikealle painikkeella!", "Tray", MB_OK); break; } } break; case WM_DESTROY: if (!DeleteFromTray(hwnd, IDI_MY_APP)) MessageBox(NULL, "Virhe statusikonin poistamisessa", "Virhe!", MB_OK | MB_ICONERROR); PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Se ei boldannut sitä mutta se on tossa WM_CREATE kohdasssa.
Ihan koodin alkuun:
HINSTANCE hThisInstance;
Sitten tohon sun WinMain():in alkuun:
hThisInstance = hInstance;
Ei vieläkään toimi:
#include <windows.h> #include <shellapi.h> #define WM_MY_MESSAGE WM_USER+1 #define IDI_MY_APP 101 HINSTANCE hThisInstance; // Lisää ikonin trayhin BOOL AddToTray(HWND hWnd, UINT uMsg, UINT uID, HICON hIcon, const char* tip) { if (!hWnd || !uMsg) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // Ikkuna joka vastaanottaa viestit nid.uCallbackMessage= uMsg; // Lähetettävä viesti // Sekä viesti, ikoni, että ohjeteksti määritelty nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.hIcon = hIcon; // Ikoni nid.uID = uID; // Tunniste if (tip) strncpy(nid.szTip, tip, sizeof(nid.szTip)); else nid.szTip[0] = '\0'; return (BOOL)Shell_NotifyIcon(NIM_ADD, &nid); } // Poistaa ikonin traysta BOOL DeleteFromTray(HWND hWnd, UINT uID) { if (!hWnd) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = uID; return (BOOL)Shell_NotifyIcon(NIM_DELETE, &nid); } /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { hThisInstance = hInstance; HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof(WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use light-gray as the background of the window */ wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); /* Register the window class, if fail quit the program */ if(!RegisterClassEx(&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow(hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage( ) returns 0 */ while(GetMessage(&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage( ) gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage( ) */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: if (!AddToTray(hwnd, WM_MY_MESSAGE, IDI_MY_APP, LoadIcon(hThisInstance, MAKEINTRESOURCE(1234567)), "KoodiPädi")) MessageBox(NULL, "Virhe statusikonin luonnissa", "Virhe!", MB_OK | MB_ICONERROR); break; case WM_MY_MESSAGE: // Tutkitaan onko viesti meidän ikonilta if ((UINT)wParam == IDI_MY_APP) { // Tutkitaan mitä tapahtui switch ((UINT)lParam) { case WM_LBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia vasemmalla painikkeella!", "Tray", MB_OK); break; case WM_RBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia oikealle painikkeella!", "Tray", MB_OK); break; } } break; case WM_DESTROY: if (!DeleteFromTray(hwnd, IDI_MY_APP)) MessageBox(NULL, "Virhe statusikonin poistamisessa", "Virhe!", MB_OK | MB_ICONERROR); PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Miten muuten ton kuvakkeen vihjetekstiä saa muutettua lennosa ja miten saa avattua semmoisen pikkuvalikon kun sitä klikkaa oikeella napilla?
EDIT: Ja miten siihen valikkoon saa kuvan. Siis tähän tyyliin:
______________________________ | [KUVA] valikkoteksti | | [KUVA] toinen valikkoteksti| | [KUVA] lisää tekstii | |____________________________|
Eih. Lue jotain Windows-ohjelmointiopastusta. Ihan asiallisia kysymyksiä sulla on, mutten mä nyt ihan hurjaa oppikoulua jaksa tässä alkaa pitämään. Suomenkielistä jelppiä:
http://cpp.mureakuha.com/
Tai googlaa hakusanoilla 'windows-ohjelmointi', 'programming windows in c++', tms.
Mulla oli winohjelmointikirja, mutta sillä oli kirjastos niinpaljo varauksii että piti palauttaa se. Kaikenlisäks se oli vc++ssalle. Täytyy ettiä msdnästä
Juu, kannattais ne perusteet opetella ensin kunnolla niin sitten voi kyllä suhteellisen helposti www:stä kaivella haluamansa tiedon aina tarvittaessa. Tämä meni taas tällaiseksi koodia->ei toimi->koodia->ei toimi->koodia->ei toimi pommitukseksi.
Joo. mä oon tällane c++nyyppi et tulee kyseltyä kaikkee ihan yksinkertastakin.
No nyt mä kässäsin miten sen hThisInstance jutun saa toimiin. Voi että mä olen ollu tyhmä kun en ole tajunnut.
No nyt lakkasi taas toimimasta. Olen kopipastettanut jo monta kertaa saman koodn mutta valittaa aina että exeni on vioittunut.
#include <windows.h> #include <shellapi.h> #define WM_MY_MESSAGE WM_USER+1 #define IDI_MY_APP 101 // Lisää ikonin trayhin BOOL AddToTray(HWND hWnd, UINT uMsg, UINT uID, HICON hIcon, const char* tip) { if (!hWnd || !uMsg) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // Ikkuna joka vastaanottaa viestit nid.uCallbackMessage= uMsg; // Lähetettävä viesti // Sekä viesti, ikoni, että ohjeteksti määritelty nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.hIcon = hIcon; // Ikoni nid.uID = uID; // Tunniste if (tip) strncpy(nid.szTip, tip, sizeof(nid.szTip)); else nid.szTip[0] = '\0'; return (BOOL)Shell_NotifyIcon(NIM_ADD, &nid); } // Poistaa ikonin traysta BOOL DeleteFromTray(HWND hWnd, UINT uID) { if (!hWnd) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = uID; return (BOOL)Shell_NotifyIcon(NIM_DELETE, &nid); } /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof(WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use light-gray as the background of the window */ wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); /* Register the window class, if fail quit the program */ if(!RegisterClassEx(&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow(hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage( ) returns 0 */ while(GetMessage(&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage( ) gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage( ) */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: if (!AddToTray(hwnd, WM_MY_MESSAGE, IDI_MY_APP, LoadIcon(NULL, IDI_APPLICATION), "Apina")) MessageBox(NULL, "Virhe statusikonin luonnissa", "Virhe!", MB_OK | MB_ICONERROR); break; case WM_MY_MESSAGE: // Tutkitaan onko viesti meidän ikonilta if ((UINT)wParam == IDI_MY_APP) { // Tutkitaan mitä tapahtui switch ((UINT)lParam) { case WM_LBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia vasemmalla painikkeella!", "Tray", MB_OK); break; case WM_RBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia oikealle painikkeella!", "Tray", MB_OK); break; } } break; case WM_DESTROY: if (!DeleteFromTray(hwnd, IDI_MY_APP)) MessageBox(NULL, "Virhe statusikonin poistamisessa", "Virhe!", MB_OK | MB_ICONERROR); PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Sorry. Wäärä hälyytys. Sain toimiin. En oikeen käsää mikä oli vikana. Täyty vaan kopipastettaa sun kooodi uudelleeen.
Eipä toimi. Kun vaihdan ikonijn niin se laittaa sinne trayhin vaan tyhjän kohdan eikä mun ikonia.
#include <windows.h> #include <shellapi.h> #define WM_MY_MESSAGE WM_USER+1 #define IDI_MY_APP 101 HINSTANCE hThisInstance; // Lisää ikonin trayhin BOOL AddToTray(HWND hWnd, UINT uMsg, UINT uID, HICON hIcon, const char* tip) { if (!hWnd || !uMsg) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // Ikkuna joka vastaanottaa viestit nid.uCallbackMessage= uMsg; // Lähetettävä viesti // Sekä viesti, ikoni, että ohjeteksti määritelty nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.hIcon = hIcon; // Ikoni nid.uID = uID; // Tunniste if (tip) strncpy(nid.szTip, tip, sizeof(nid.szTip)); else nid.szTip[0] = '\0'; return (BOOL)Shell_NotifyIcon(NIM_ADD, &nid); } // Poistaa ikonin traysta BOOL DeleteFromTray(HWND hWnd, UINT uID) { if (!hWnd) return FALSE; NOTIFYICONDATA nid; memset(&nid, 0, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = uID; return (BOOL)Shell_NotifyIcon(NIM_DELETE, &nid); } /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof(WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(hThisInstance, MAKEINTRESOURCE(20)); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use light-gray as the background of the window */ wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); /* Register the window class, if fail quit the program */ if(!RegisterClassEx(&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow(hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage( ) returns 0 */ while(GetMessage(&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage( ) gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage( ) */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: if (!AddToTray(hwnd, WM_MY_MESSAGE, IDI_MY_APP, LoadIcon(hThisInstance, MAKEINTRESOURCE(20)), "Tää kuvake on outo...")) MessageBox(NULL, "Virhe statusikonin luonnissa", "Virhe!", MB_OK | MB_ICONERROR); break; case WM_MY_MESSAGE: // Tutkitaan onko viesti meidän ikonilta if ((UINT)wParam == IDI_MY_APP) { // Tutkitaan mitä tapahtui switch ((UINT)lParam) { case WM_LBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia vasemmalla painikkeella!", "Tray", MB_OK); break; case WM_RBUTTONDBLCLK: MessageBox(NULL, "Tuplaklikkasit ikonia oikealle painikkeella!", "Tray", MB_OK); break; } } break; case WM_DESTROY: if (!DeleteFromTray(hwnd, IDI_MY_APP)) MessageBox(NULL, "Virhe statusikonin poistamisessa", "Virhe!", MB_OK | MB_ICONERROR); PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Resurssifilu on kunnossa
Niin voiskos joku neuvoo miksei kuvake ala wörkkiä?
Aihe on jo aika vanha, joten et voi enää vastata siihen.