System Tray
От: GGoga  
Дата: 23.06.07 09:28
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

Здравствуйте, господа программисты!
Я начинающий программист и недавно начал разбираться с Visual Studio. Подскажите, пожалуйста, мне, как еще тупому пользователю, как правильно работать с помещенеием и извлечением программы в и из Sytstem Tray соответственно.
Вот, что касается помещения в трэй, то я написал кое-какой код для этого, я помещаю иконку в трэй на следующее сообщение:

//--------------------------------------------------------------------------------------
// CMainFrame message handlers
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
    CFrameWnd::OnSize(nType, cx, cy);

    CWnd* pWindow = theApp.GetWindow();
    if(nType == SIZE_MINIMIZED)
    {
        if(!TrayMessage(pWindow->GetSafeHwnd(), NIM_ADD, 0, AfxGetApp()->LoadIconW(IDI_MY_ICON), true))
            MessageBox(_T("Не возможно свернуть в трэй!"),
                _T("Внимание"), MB_OK | MB_ICONEXCLAMATION | MB_ICONWARNING);
        else
        {
            pWindow->ShowWindow(SW_MINIMIZE);
            pWindow->ShowWindow(SW_HIDE);
        }

    }
}
//--------------------------------------------------------------------------------------

Вот функция помещения в трэй:

//--------------------------------------------------------------------------------------
// Иконка в панеле индикации
BOOL CMainFrame::TrayMessage(HWND hDlg, DWORD dwMessage, UINT uID, HICON hIcon, bool pszTip)
{
    BOOL res; 
    NOTIFYICONDATA tnd; 

    tnd.cbSize = sizeof(NOTIFYICONDATA); 
    tnd.hWnd = hDlg; 
    tnd.uID = uID; 
    tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    tnd.uCallbackMessage = MYWM_NOTIFYICON; // Сообщение, которое пошлется при всяких там кликах на иконке... 
    tnd.hIcon = hIcon; 

    if (pszTip) 
        lstrcpyn(tnd.szTip, _T("Embaded Data Base"), sizeof(tnd.szTip) / sizeof(tnd.szTip[0])); 
    else 
        tnd.szTip[0] = '\0';

    res = Shell_NotifyIcon(dwMessage, &tnd);

    return res;
}
//--------------------------------------------------------------------------------------

И помещается она нормально, только вот как мне вызвать контекстное меню, щелкая правой кнопкой мыши на иконке в трэе я не знаю. Какое событие необходимо обрабатывать, и что нужно для этого сделать. И правильно ли я построил структуру для этой цели. Для развертывания всего лишь нужно снова вызвать функцию TrayMessage с другим параметром, вот только как это сделать я не знаю. Кто знает ответ на вопрос, подскажите пожалуйста, а то я сам полностью застопорился и ничего не могу сделать...

Заранее ОГРОМНОЕ СПАСИБО!!!
Re: System Tray
От: febus Германия  
Дата: 23.06.07 11:22
Оценка:
Здравствуйте, GGoga, Вы писали:

Структура заполнена по моему мнению верно. И даже указано сообщение, которое будет посылаться:


 tnd.uCallbackMessage = MYWM_NOTIFYICON; // Сообщение, которое пошлется при всяких там кликах на иконке...



Точно по тексту MSDN, имена даже те же.

Остается добавить обработчик указанного сообщения:
(Написано в текстовом редакторе, я не проверял на работоспособность!)
в мэйнфрэйме:


//добавить в карте сообщений 
ON_MESSAGE(MYWM_NOTIFYICON, On_MYWM_NOTIFYICON)

LRESULT CMainFrame::On_MYWM_NOTIFYICON(WPARAM wParam, LPARAM lParam) 
{
    UINT uID; 
    UINT uMouseMsg; 
 
    uID = (UINT) wParam; 
    if (uID != m_YourIconId) // если это не наша иконка, то уходим.
       return 0;

    uMouseMsg = (UINT) lParam; 
 
    if (uMouseMsg == WM_RBUTTONDOWN) 
    { 
       CMenu menu;
       if (!menu.LoadMenu(IDR_YOUR_MENU))
            return 0;
        
        pSubMenu = menu.GetSubMenu(0);
        if (!pSubMenu)
            return 0;

        CPoint pos;
        GetCursorPos(&pos);
        pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, pos.x, pos.y, this, NULL);
        menu.DestroyMenu();
    }
    return 0;
}



Это был учебный вариант

А боевой вариант лучше всего взять здесь
Re[2]: System Tray
От: GGoga  
Дата: 23.06.07 12:35
Оценка:
Здравствуйте, febus, Вы писали:

F>Здравствуйте, GGoga, Вы писали:


...

F>Это был учебный вариант


F>А боевой вариант лучше всего взять здесь


Ага, СПАСИБО, я уже сделал, мой вариант практически аналогичен Вашему, разве что, на совпадение иконок не проверяю Ну я думаю, что это не существенно в моей тестовой программке

Еще раз СПАСИБО!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.