Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: (ash)tray

Sivun loppuun

Meitsi [05.02.2004 17:24:23]

#

Mitenkä c++/wini ohjelmassa saa kuvakkeen trayhyn?

Dual [27.02.2004 19:45:48]

#

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!

Meitsi [28.02.2004 11:30:16]

#

Hei helmee! toihan voi vaikka toimia, kunhan pääsen koieilemaan!

Meitsi [28.02.2004 11:42:52]

#

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;
}

Meitsi [28.02.2004 16:02:19]

#

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?

Dual [28.02.2004 19:44:10]

#

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;
}

Dual [28.02.2004 19:48:55]

#

Mulla on sitten VC++ 6.0. En tiedä miten toi Dev-c++:ssa toimii.

Meitsi [29.02.2004 12:26:19]

#

Hei nyt alko wörkkiin. Thnx lot!

Meitsi [29.02.2004 12:31:31]

#

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;
}

Meitsi [29.02.2004 12:32:24]

#

Se ei boldannut sitä mutta se on tossa WM_CREATE kohdasssa.

Dual [01.03.2004 14:36:42]

#

Ihan koodin alkuun:

HINSTANCE hThisInstance;

Sitten tohon sun WinMain():in alkuun:

hThisInstance = hInstance;

Meitsi [01.03.2004 19:09:45]

#

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;
}

Meitsi [02.03.2004 16:54:33]

#

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       |
|____________________________|

Dual [04.03.2004 18:25:59]

#

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.

Meitsi [05.03.2004 11:48:26]

#

Mulla oli winohjelmointikirja, mutta sillä oli kirjastos niinpaljo varauksii että piti palauttaa se. Kaikenlisäks se oli vc++ssalle. Täytyy ettiä msdnästä

thefox [06.03.2004 11:57:49]

#

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.

Meitsi [06.03.2004 12:02:56]

#

Joo. mä oon tällane c++nyyppi et tulee kyseltyä kaikkee ihan yksinkertastakin.

Meitsi [26.03.2004 16:05:23]

#

No nyt mä kässäsin miten sen hThisInstance jutun saa toimiin. Voi että mä olen ollu tyhmä kun en ole tajunnut.

Meitsi [26.03.2004 16:11:35]

#

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;
}

Meitsi [26.03.2004 16:16:16]

#

Sorry. Wäärä hälyytys. Sain toimiin. En oikeen käsää mikä oli vikana. Täyty vaan kopipastettaa sun kooodi uudelleeen.

Meitsi [29.03.2004 21:46:00]

#

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;
}

Meitsi [29.03.2004 21:46:40]

#

Resurssifilu on kunnossa

Meitsi [06.04.2004 16:11:36]

#

Niin voiskos joku neuvoo miksei kuvake ala wörkkiä?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta