318 lines
6.3 KiB
C++
318 lines
6.3 KiB
C++
// MainTray.cpp : implementation of the CMainTray class
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "MainTray.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainTray
|
|
|
|
IMPLEMENT_DYNCREATE(CMainTray, CFrameWnd)
|
|
|
|
BEGIN_MESSAGE_MAP(CMainTray, CFrameWnd)
|
|
//{{AFX_MSG_MAP(CMainTray)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
// DO NOT EDIT what you see in these blocks of generated code !
|
|
ON_WM_CREATE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_MEASUREITEM()
|
|
//}}AFX_MSG_MAP
|
|
ON_MESSAGE(WM_TRAY_ICON_NOTIFY_MESSAGE,OnTrayNotify)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainTray construction/destruction
|
|
|
|
CMainTray::CMainTray()
|
|
{
|
|
m_nidIconData.cbSize = sizeof(NOTIFYICONDATA);
|
|
m_nidIconData.hWnd = 0;
|
|
m_nidIconData.uID = 1;
|
|
m_nidIconData.uCallbackMessage = WM_TRAY_ICON_NOTIFY_MESSAGE;
|
|
m_nidIconData.hIcon = 0;
|
|
m_nidIconData.szTip[0] = 0;
|
|
m_nidIconData.uFlags = NIF_MESSAGE;
|
|
|
|
m_bTrayIconVisible = FALSE;
|
|
m_nDefaultMenuItem = 0;
|
|
m_bMinimizeToTray = TRUE;
|
|
}
|
|
|
|
CMainTray::~CMainTray()
|
|
{
|
|
}
|
|
|
|
int CMainTray::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
m_nidIconData.hWnd = this->m_hWnd;
|
|
m_nidIconData.uID = 1;
|
|
BCMenu::SetMenuDrawMode(BCMENU_DRAWMODE_XP);
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL CMainTray::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
if( !CFrameWnd::PreCreateWindow(cs) )
|
|
return FALSE;
|
|
// TODO: Modify the Window class or styles here by modifying
|
|
// the CREATESTRUCT cs
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainTray diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CMainTray::AssertValid() const
|
|
{
|
|
CFrameWnd::AssertValid();
|
|
}
|
|
|
|
void CMainTray::Dump(CDumpContext& dc) const
|
|
{
|
|
CFrameWnd::Dump(dc);
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainTray message handlers
|
|
void CMainTray::OnDestroy()
|
|
{
|
|
CFrameWnd::OnDestroy();
|
|
|
|
if(m_nidIconData.hWnd && m_nidIconData.uID>0 && TrayIsVisible())
|
|
{
|
|
Shell_NotifyIcon(NIM_DELETE,&m_nidIconData);
|
|
}
|
|
}
|
|
|
|
BOOL CMainTray::TrayIsVisible()
|
|
{
|
|
return m_bTrayIconVisible;
|
|
}
|
|
|
|
void CMainTray::TraySetIcon(HICON hIcon)
|
|
{
|
|
if (!hIcon)
|
|
return;
|
|
|
|
HICON hOldIcon = m_nidIconData.hIcon;
|
|
|
|
m_nidIconData.hIcon = hIcon;
|
|
m_nidIconData.uFlags |= NIF_ICON;
|
|
TrayUpdate();
|
|
DestroyIcon( hOldIcon );
|
|
}
|
|
|
|
void CMainTray::TraySetIcon(UINT nResourceID)
|
|
{
|
|
ASSERT(nResourceID>0);
|
|
TraySetIcon(AfxGetApp()->LoadIcon(nResourceID));
|
|
}
|
|
|
|
void CMainTray::TraySetToolTip(LPCTSTR lpszToolTip)
|
|
{
|
|
ASSERT(strlen(lpszToolTip) > 0 && strlen(lpszToolTip) < 64);
|
|
|
|
strcpy(m_nidIconData.szTip,lpszToolTip);
|
|
m_nidIconData.uFlags |= NIF_TIP;
|
|
TrayUpdate();
|
|
}
|
|
|
|
BOOL CMainTray::TrayShow()
|
|
{
|
|
BOOL bSuccess = FALSE;
|
|
if(!m_bTrayIconVisible)
|
|
{
|
|
bSuccess = Shell_NotifyIcon(NIM_ADD,&m_nidIconData);
|
|
if(bSuccess)
|
|
m_bTrayIconVisible = TRUE;
|
|
}
|
|
else
|
|
{
|
|
TRACE0("ICON ALREADY VISIBLE\n");
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
BOOL CMainTray::TrayHide()
|
|
{
|
|
BOOL bSuccess = FALSE;
|
|
if(m_bTrayIconVisible)
|
|
{
|
|
bSuccess = Shell_NotifyIcon(NIM_DELETE,&m_nidIconData);
|
|
if(bSuccess)
|
|
m_bTrayIconVisible= FALSE;
|
|
}
|
|
else
|
|
{
|
|
TRACE0("ICON ALREADY HIDDEN\n");
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
BOOL CMainTray::TrayUpdate()
|
|
{
|
|
BOOL bSuccess = FALSE;
|
|
if(m_bTrayIconVisible)
|
|
{
|
|
bSuccess = Shell_NotifyIcon(NIM_MODIFY,&m_nidIconData);
|
|
}
|
|
else
|
|
{
|
|
TRACE0("ICON NOT VISIBLE\n");
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
|
|
BOOL CMainTray::TraySetMenu(UINT nResourceID, UINT nToolbarID,UINT nDefaultPos)
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
bSuccess = m_mnuTrayMenu.DestroyMenu();
|
|
bSuccess |= m_mnuTrayMenu.LoadMenu(nResourceID);
|
|
bSuccess |= m_mnuTrayMenu.LoadToolbar(nToolbarID);
|
|
return bSuccess;
|
|
}
|
|
|
|
|
|
|
|
void CMainTray::OnTrayNotify(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
UINT uID;
|
|
UINT uMsg;
|
|
|
|
uID = (UINT) wParam;
|
|
uMsg = (UINT) lParam;
|
|
|
|
if (uID != 1)
|
|
return;
|
|
|
|
CPoint pt;
|
|
|
|
switch (uMsg )
|
|
{
|
|
case WM_MOUSEMOVE:
|
|
GetCursorPos(&pt);
|
|
ClientToScreen(&pt);
|
|
OnTrayMouseMove(pt);
|
|
break;
|
|
case WM_LBUTTONDOWN:
|
|
GetCursorPos(&pt);
|
|
ClientToScreen(&pt);
|
|
OnTrayLButtonDown(pt);
|
|
break;
|
|
case WM_LBUTTONDBLCLK:
|
|
GetCursorPos(&pt);
|
|
ClientToScreen(&pt);
|
|
OnTrayLButtonDblClk(pt);
|
|
break;
|
|
|
|
case WM_RBUTTONDOWN:
|
|
case WM_CONTEXTMENU:
|
|
GetCursorPos(&pt);
|
|
//ClientToScreen(&pt);
|
|
OnTrayRButtonDown(pt);
|
|
break;
|
|
case WM_RBUTTONDBLCLK:
|
|
GetCursorPos(&pt);
|
|
ClientToScreen(&pt);
|
|
OnTrayRButtonDblClk(pt);
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void CMainTray::OnSysCommand(UINT nID, LPARAM lParam)
|
|
{
|
|
if(m_bMinimizeToTray)
|
|
{
|
|
if ((nID & 0xFFF0) == SC_MINIMIZE)
|
|
{
|
|
|
|
TrayShow();
|
|
this->ShowWindow(SW_HIDE);
|
|
}
|
|
else
|
|
CFrameWnd::OnSysCommand(nID, lParam);
|
|
}
|
|
else
|
|
CFrameWnd::OnSysCommand(nID, lParam);
|
|
}
|
|
void CMainTray::TraySetMinimizeToTray(BOOL bMinimizeToTray)
|
|
{
|
|
m_bMinimizeToTray = bMinimizeToTray;
|
|
}
|
|
|
|
void CMainTray::TraySetMenuCaption(UINT nID, LPCTSTR lpsz)
|
|
{
|
|
m_mnuTrayMenu.SetMenuText(nID, lpsz, MF_BYCOMMAND);
|
|
}
|
|
|
|
void CMainTray::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
|
|
{
|
|
BOOL setflag=FALSE;
|
|
if(lpMeasureItemStruct->CtlType==ODT_MENU)
|
|
{
|
|
if(IsMenu((HMENU)lpMeasureItemStruct->itemID))
|
|
{
|
|
CMenu* cmenu=CMenu::FromHandle((HMENU)lpMeasureItemStruct->itemID);
|
|
if(BCMenu::IsMenu(cmenu)){
|
|
cmenu->MeasureItem(lpMeasureItemStruct);
|
|
setflag=TRUE;
|
|
}
|
|
}
|
|
}
|
|
if(!setflag)CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
|
|
|
|
}
|
|
|
|
|
|
void CMainTray::OnTrayRButtonDown(CPoint pt)
|
|
{
|
|
|
|
m_mnuTrayMenu.GetSubMenu(0)->TrackPopupMenu(TPM_BOTTOMALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,this);
|
|
m_mnuTrayMenu.GetSubMenu(0)->SetDefaultItem(m_nDefaultMenuItem,TRUE);
|
|
}
|
|
|
|
void CMainTray::OnTrayLButtonDown(CPoint pt)
|
|
{
|
|
|
|
}
|
|
|
|
void CMainTray::OnTrayLButtonDblClk(CPoint pt)
|
|
{
|
|
TrayShowMainWindow();
|
|
}
|
|
|
|
void CMainTray::OnTrayRButtonDblClk(CPoint pt)
|
|
{
|
|
}
|
|
|
|
void CMainTray::OnTrayMouseMove(CPoint pt)
|
|
{
|
|
}
|
|
|
|
void CMainTray::TrayShowMainWindow()
|
|
{
|
|
if(m_bMinimizeToTray) {
|
|
this->ShowWindow(SW_SHOW);
|
|
TrayHide();
|
|
}
|
|
}
|