00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "FloatingWnd.h"
00009 #include "MainFrm.h"
00010 #include "system.h"
00011
00012 #ifdef _DEBUG
00013 #define new DEBUG_NEW
00014 #undef THIS_FILE
00015 static char THIS_FILE[] = __FILE__;
00016 #endif
00017
00018 CFloatingWnd::CFloatingWnd()
00019 {
00020 m_bTimerSet = FALSE;
00021 m_bShown = FALSE;
00022 m_bHideAlways = FALSE;
00023 }
00024
00025 CFloatingWnd::~CFloatingWnd()
00026 {
00027 }
00028
00029 BEGIN_MESSAGE_MAP(CFloatingWnd, CFrameWnd)
00030
00031 ON_WM_NCHITTEST()
00032 ON_WM_PAINT()
00033 ON_WM_NCRBUTTONUP()
00034 ON_WM_CREATE()
00035 ON_WM_NCLBUTTONDBLCLK()
00036 ON_WM_CLOSE()
00037 ON_WM_TIMER()
00038 ON_WM_MOVING()
00039
00040 END_MESSAGE_MAP()
00041
00042 BOOL CFloatingWnd::Create()
00043 {
00044 m_pMainFrame = (CMainFrame*) AfxGetApp ()->m_pMainWnd;
00045
00046 int cx = GetSystemMetrics (SM_CXSCREEN);
00047 int cy = GetSystemMetrics (SM_CYSCREEN);
00048 RECT rc = {cx - 40 - 40, cy - 40 - 40, cx - 40, cy - 40};
00049
00050 DWORD dwLStyle = fsSysGetOsMajorVersion () < 5 ? 0 : WS_EX_LAYERED;
00051
00052 if (FALSE == CFrameWnd::CreateEx (WS_EX_TOPMOST|WS_EX_TOOLWINDOW|dwLStyle,
00053 AfxRegisterWndClass (CS_DBLCLKS, LoadCursor (NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW+1), NULL),
00054 NULL,
00055 WS_POPUP|WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED,
00056 rc, NULL, 0))
00057 return FALSE;
00058
00059 m_hLogoIcon = SICOEX (IDI_LOGO2, 32, 32);
00060
00061 SetBlend (_App.DropBoxWndBlend ());
00062
00063 _App.View_ReadWndPlacement (this, "FloatingWnd", _App.View_FloatingWindow () == FALSE);
00064
00065 SetWindowPos (NULL, 0, 0, 40, 40, SWP_NOMOVE | SWP_NOZORDER);
00066
00067 Show (_App.View_FloatingWindow (), FALSE);
00068 UpdateTimer ();
00069
00070 return TRUE;
00071 }
00072
00073 UINT CFloatingWnd::OnNcHitTest(CPoint )
00074 {
00075 return HTCAPTION;
00076 }
00077
00078 void CFloatingWnd::OnPaint()
00079 {
00080 CFrameWnd::OnPaint();
00081 CDC* pdc = GetWindowDC ();
00082 CBrush br (GetSysColor (COLOR_WINDOW));
00083 CBrush *oldbr = pdc->SelectObject (&br);
00084 pdc->Rectangle (0, 0, 40, 40);
00085 pdc->SelectObject (oldbr);
00086 pdc->DrawIcon (4, 4, m_hLogoIcon);
00087 ReleaseDC (pdc);
00088 }
00089
00090 void CFloatingWnd::SaveState()
00091 {
00092 _App.View_SaveWndPlacement (this, "FloatingWnd");
00093 }
00094
00095 void CFloatingWnd::OnNcRButtonUp(UINT nHitTest, CPoint point)
00096 {
00097 m_pMainFrame->SendMessage (WM_SHOWTRAYMENU);
00098 CFrameWnd::OnNcRButtonUp(nHitTest, point);
00099 }
00100
00101 int CFloatingWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
00102 {
00103 if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
00104 return -1;
00105
00106 m_drop.Register (this);
00107
00108 return 0;
00109 }
00110
00111 void CFloatingWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
00112 {
00113 if (m_pMainFrame->IsIconic ())
00114 m_pMainFrame->OnShowmainwindow ();
00115 else
00116 m_pMainFrame->ShowWindow (SW_MINIMIZE);
00117
00118 CFrameWnd::OnNcLButtonDblClk(nHitTest, point);
00119 }
00120
00121 void CFloatingWnd::OnClose()
00122 {
00123 ShowWindow (SW_HIDE);
00124 _App.View_FloatingWindow (FALSE);
00125 if (::IsWindow (m_wndTip)) {
00126 m_wndTip.Hide ();
00127 m_wndTip.DestroyWindow ();
00128 }
00129 }
00130
00131 void CFloatingWnd::OnTimer(UINT nIDEvent)
00132 {
00133 if (m_bTimerSet == FALSE)
00134 return;
00135
00136 static BOOL _bDropBoxIntro = _App.View_DropBoxIntro () &&
00137 IS_PORTABLE_MODE == FALSE;
00138 if (_bDropBoxIntro)
00139 {
00140 _bDropBoxIntro = FALSE;
00141 ShowTip ();
00142 _App.View_DropBoxIntro (FALSE);
00143 }
00144
00145 BOOL bFS = fsIsSystemInFullScreenMode ();
00146
00147 if (bFS && m_bShown)
00148 Show (FALSE, FALSE);
00149 else if (bFS == FALSE && m_bShown == FALSE)
00150 Show (TRUE, FALSE);
00151
00152 CFrameWnd::OnTimer(nIDEvent);
00153 }
00154
00155 void CFloatingWnd::Show(BOOL bShow, BOOL bByUser)
00156 {
00157 if (bByUser == FALSE && !m_bShown == !bShow)
00158 return;
00159
00160 if (bShow == FALSE && ::IsWindow (m_wndTip)) {
00161 m_wndTip.Hide ();
00162 m_wndTip.DestroyWindow ();
00163 }
00164
00165 if (bByUser)
00166 {
00167 _App.View_FloatingWindow (bShow);
00168 UpdateTimer ();
00169 }
00170
00171 ShowWindow (bShow && m_bHideAlways == FALSE ? SW_SHOW : SW_HIDE);
00172 m_bShown = bShow && m_bHideAlways == FALSE;
00173 }
00174
00175 void CFloatingWnd::UpdateTimer()
00176 {
00177 BOOL bNeedSet = _App.View_FloatingWindow () && _App.FloatingWndsHideInFSMode ();
00178 if (bNeedSet && m_bTimerSet == FALSE)
00179 SetTimer (1, 1000, NULL);
00180 else if (bNeedSet == FALSE && m_bTimerSet)
00181 KillTimer (1);
00182 m_bTimerSet = bNeedSet;
00183
00184 if (m_bTimerSet == FALSE && _App.View_FloatingWindow () && m_bShown == FALSE && m_bHideAlways == FALSE)
00185 ShowWindow (SW_SHOW);
00186 }
00187
00188 void CFloatingWnd::ShowTip()
00189 {
00190 m_wndTip.Create (this);
00191 m_wndTip.SetIcon (LoadIcon (NULL, IDI_INFORMATION));
00192 m_wndTip.SetShowDelay (0);
00193 m_wndTip.SetAutohideDelay (10000);
00194
00195 CRect rc;
00196 GetWindowRect (&rc);
00197 CPoint pt (rc.left + rc.Width () / 2, rc.top + rc.Height () / 2);
00198 m_wndTip.Show (LS (L_FDMDROPBOX), LS (L_DROPBOXINTRO), TRUE, &pt);
00199 }
00200
00201 void CFloatingWnd::OnMoving(UINT fwSide, LPRECT pRect)
00202 {
00203 CFrameWnd::OnMoving(fwSide, pRect);
00204
00205 if (::IsWindow (m_wndTip)) {
00206 m_wndTip.Hide ();
00207 m_wndTip.DestroyWindow ();
00208 }
00209 }
00210
00211 void CFloatingWnd::SetBlend (BYTE val)
00212 {
00213 m_blend = val;
00214 if (fsSysGetOsMajorVersion () >= 5)
00215 fsSetLayeredWindowAttributes (m_hWnd, 0, m_blend, LWA_ALPHA);
00216 }
00217
00218 void CFloatingWnd::HideAlways()
00219 {
00220 m_bHideAlways = TRUE;
00221 Show (FALSE, FALSE);
00222 }