Исправлено форматирование текста. — 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 с другим параметром, вот только как это сделать я не знаю. Кто знает ответ на вопрос, подскажите пожалуйста, а то я сам полностью застопорился и ничего не могу сделать...
Заранее ОГРОМНОЕ СПАСИБО!!!
Здравствуйте, 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;
}
Это был учебный вариант
А боевой вариант лучше всего взять
здесь
Здравствуйте, febus, Вы писали:
F>Здравствуйте, GGoga, Вы писали:
...
F>Это был учебный вариант
F>А боевой вариант лучше всего взять здесь
Ага, СПАСИБО, я уже сделал, мой вариант практически аналогичен Вашему, разве что, на совпадение иконок не проверяю

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