Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поместить значок в трей.... средствами АПИ и как:? 
:(
    Опции темы
Doc_d0s
Дата 3.8.2006, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: нет
Всего: 3



Вопрос собственно отмечен в заголовке темы, желательно тексты программ)
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
586
Дата 3.8.2006, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Код
#include <windows.h>

NOTIFYICONDATA nid;
BYTE hidden=0;
BYTE ic=0;    // присутствие иконки

int __stdcall MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, long lParam)
{
    switch(uMsg)
    {
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case 1000:    // кнопка "создать значок"
            if(ic) break;
            nid.cbSize=sizeof(NOTIFYICONDATA);        // размер структуры
            nid.hIcon=LoadIcon(0, IDI_EXCLAMATION);    // значок
            nid.hWnd=hWnd;                            // хендл скрываемого окна
            strcpy(nid.szTip,"Hello world");        // подсказка к значку
            nid.uCallbackMessage=WM_USER+1;            // сообщение uMsg
            nid.uID=0;                                // идентификатор иконки
            nid.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;  // флаги
            Shell_NotifyIcon(NIM_ADD, &nid);
            ic=1;
            break;
        case 1001:    // кнопка "скрыть окно"
            if(ic)
            {
                ShowWindow(hWnd, 0);
                hidden=1;
            } else MessageBeep(0);
            break;
        case 1002:    // кнопка "удалить значок"
            if(!ic) break;
            Shell_NotifyIcon(NIM_DELETE, &nid);    // удаление
            ic=0;
            break;                
        }
        break;
    case WM_USER+1:    // сообщения значка
        switch(lParam)
        {
        case WM_LBUTTONDOWN:
            if(hidden)
                ShowWindow(hWnd, 5);    // показать
            else
                ShowWindow(hWnd, 0);    // скрыть
            hidden^=1;
            break;
        }
        break;
    }
    return 0;
}

int __stdcall WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, INT)
{
    DialogBoxParam(hinst, (char*)1000, 0, MainWndProc, 0);
    return 0;
}

PM   Вверх
MoZy
Дата 4.8.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: 1
Всего: 0



Вот, сам давно пользуюсь (кстати нашеля я это в МАПИ):
Код

#define WM_TRAYCLICK    17

....

BOOL DelTaskIcon(HWND hwnd, UINT uID)
{ 
    BOOL res; 
    NOTIFYICONDATA tnid; 
 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd; 
    tnid.uID = uID; 
         
    res = Shell_NotifyIcon(NIM_DELETE, &tnid); 

    return res;

}

BOOL AddTaskIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip) 
{
    BOOL res;
    NOTIFYICONDATA tnid;
    
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd; 
    tnid.uID = uID; 

    tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    tnid.uCallbackMessage = WM_TRAYCLICK;
    tnid.hIcon = hicon;
    if (lpszTip)
        lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip)); 
    else 
        tnid.szTip[0] = '\0'; 
 
    res = Shell_NotifyIcon(NIM_ADD, &tnid); 
 
    if (hicon) 
        DestroyIcon(hicon); 

    return res; 
}

BOOL ChangeTaskIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip) 
{ 
    BOOL res; 
    NOTIFYICONDATA tnid;
    
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd; 
    tnid.uID = uID; 

    tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    tnid.uCallbackMessage = WM_TRAYCLICK; 
    tnid.hIcon = hicon; 
    if (lpszTip) 
        lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip)); 
    else 
        tnid.szTip[0] = '\0'; 
 
    res = Shell_NotifyIcon(NIM_MODIFY, &tnid); 
 
    if (hicon) 
        DestroyIcon(hicon); 
 
    return res; 
}

//А это вставь в процедуру
case WM_TRAYCLICK:

     if(lParam == WM_LBUTTONDBLCLK)
     { 
         if(ShowWindow (hwndMain,0)==0)
         {
            ShowWindow (hwndMain,SW_SHOW);
            SetForegroundWindow(hwndMain);
        }
        else ShowWindow (hwndMain,SW_HIDE);

         break;
     }
     
     if( lParam == WM_LBUTTONDOWN)
     {
         SetForegroundWindow(hwndMain);
         break;
     }

     if( lParam == WM_RBUTTONUP)//Как раз как правильно попапы отображать
     {
         SetForegroundWindow(hwndMain);
         GetCursorPos(&pt);
         TrackPopupMenu(cMenu, TPM_RIGHTALIGN|TPM_RIGHTBUTTON,pt.x, pt.y, 0, hwndMain, NULL);
         break;
     }
return 0;


Это сообщение отредактировал(а) MoZy - 4.8.2006, 19:46
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
jonie
Дата 11.8.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Код

     if( lParam == WM_RBUTTONUP)//Как раз как правильно попапы отображать
     {
         SetForegroundWindow(hwndMain);
         GetCursorPos(&pt);
         TrackPopupMenu(cMenu, TPM_RIGHTALIGN|TPM_RIGHTBUTTON,pt.x, pt.y, 0, hwndMain, NULL);
         break;
     }


надобно сделать так
Код

     if( lParam == WM_RBUTTONUP)//Как раз как правильно попапы отображать
     {
         GetCursorPos(&pt);
         SetForegroundWindow(hwndMain);
         TrackPopupMenu(cMenu, TPM_RIGHTALIGN|TPM_RIGHTBUTTON,pt.x, pt.y, 0, hwndMain, NULL);
   PostMessage(hwndMain,WM_NULL,0,0);
         break;
     }

цитата из сборика Iczelion`a :
Цитата

Внимание: остерегайтесь следующих проблем, часто возникающих при pаботе со всплывающими меню. 

Когда меню отображено на экране, щелчок вне меню не приводит к его немедленному исчезновению. Это происходит потому, что окно, которое будет получать уведомления от меню, ДОЛЖНО быть на переднем плане. Просто вызовите SetForegroundWindow, чтобы исправить эту проблему. 

После вызова SetForegroundWindow вы обнаружите, что в первый раз всплывающее меню сработает нормально, но при последующем появлении оно будет отображаться, а затем тут же исчезать. Как написано в MSDN, это сделано "намеренно". Необходимо переключить задачу на программу, являющуюся владельцем иконки в system tray. Этого можно добиться, отправив любое сообщение окну вашей программы. Но только используйте PostMessage, а не SendMessage! 



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
AquilA
Дата 27.5.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.6.2005

Репутация: нет
Всего: нет



Люди, столкнулся с такой проблемой.
Добавляю иконку в трей
Код

void AddStatusIcon(HWND m_hWnd)
{
    HICON hIcon;
    hIcon = AfxGetApp()->LoadIconA(IDR_MAINFRAME);
    nf.hWnd = m_hWnd;
    nf.uID = NULL;
    nf.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
    nf.uCallbackMessage = WM_MYICONNOTIFY;
    nf.hIcon = hIcon;
    lstrcpyn(nf.szTip, "подсказка", sizeof(nf.szTip));
    Shell_NotifyIconA(NIM_ADD, &nf);
}

Потом навожу на нее мышкой и она исчезает вообще! 
как решить проблему?
PM MAIL   Вверх
Tectoder
Дата 27.5.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



AquilA, не sizeof а strlen.
Когда люди начнут читать учебники по C++? Ниужто никогда?
PM   Вверх
AquilA
Дата 27.5.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.6.2005

Репутация: нет
Всего: нет



Tectoder
в смысле strlen(nf.szTip)? в примерах везде sizeof!
Но это сути дела не поменяло. все равно исчезает иконка!
PM MAIL   Вверх
Tectoder
Дата 27.5.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



Цитата(AquilA @  27.5.2007,  18:44 Найти цитируемый пост)
в примерах везде sizeof!
Все такие примеры надо выкинуть
Вообще,
1) nf.cbsize надо то же устанавливать
2) m_hWnd точно правильный hwnd, который все время существует?
PM   Вверх
AquilA
Дата 28.5.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.6.2005

Репутация: нет
Всего: нет



m_hWnd  все таки не передается!!! :( не могу вкурить.
Можно в MESSAGE_MAP прописать загрузку данной функции? или как?
PM MAIL   Вверх
webgraf
Дата 6.7.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Столкунулся с проблемой. Код аналогичный приведенному выше, но меню создавал в ресурсах. В итоге при вызове попап оно неправильно прорисовывается - без содержания, однако при выборе подменю(а его можно выбрать если прицелиться) подменю отображается коректно.
Собственно вот так вот:
user posted image

А если навести курсор на примерное место пункта - появляется нормальное submenu:
user posted image

Меню создавал так:
Код

             if( lParam == WM_RBUTTONUP)             {
                 POINT  pt;
                 GetCursorPos(&pt);
                 SetForegroundWindow(hWnd);
                 TrackPopupMenu(LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1)), TPM_RIGHTALIGN|TPM_RIGHTBUTTON,pt.x, pt.y, 0, hWnd, NULL);
                 PostMessage(hWnd,WM_NULL,0,0);
                 break;
             }


Само меню содержит всего два пункта, один из них содержит два подпункта.
Кому-нибудь знакома такая ситуация?

Это сообщение отредактировал(а) webgraf - 6.7.2007, 16:39
PM MAIL   Вверх
586
Дата 6.7.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



PM   Вверх
webgraf
Дата 6.7.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Спасибо!  smile 

Получается в данном случае нужно обязательно  применять submenu.
Код

TrackPopupMenu(GetSubMenu(LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1)),0), TPM_RIGHTALIGN|TPM_RIGHTBUTTON,pt.x, pt.y, 0, hWnd, NULL);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.