📄 magicframe.cpp
字号:
// Copyright (C) 1997-2002 Valeriy Ovechkin
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// MagicFrame.cpp : implementation of the CMagicFrame class
//
/////////////////////////////////////////////////////////////////////
//
// File : MagicFrame.cpp
// Description : Main frame
//
// Modification history ( date, name, description ) :
// 1. 17.12.2002 Igor Green, mmm3@grigsoft.com
// Fixed toolbar problem
//
//HISTORY_ENTRY_END:1!17.12.2002
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Magic.h"
#include "Mailbox.h"
#include "Excerpt.h"
#include "MagicDoc.h"
#include "MailboxView.h"
#include "ExcerptView.h"
#include "OptionsPage.h"
#include "CommandPage.h"
#include "PlaybackPage.h"
#include "MagicFrame.h"
#include "resrc1.h"
#include "getwinver.h"
#include "tools.h"
#include "advoptionspage.h"
#include "enbitmap.h"
#include "actppage.h"
#include "cregexp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMagicFrame
IMPLEMENT_DYNCREATE(CMagicFrame, CFrameWnd)
const UINT WM_TASKBARCREATED =
::RegisterWindowMessage(_T("TaskbarCreated"));
BEGIN_MESSAGE_MAP(CMagicFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMagicFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_COMMAND(ID_RESTORE, OnRestore)
ON_UPDATE_COMMAND_UI(ID_RESTORE, OnUpdateRestore)
ON_COMMAND(ID_PREFERENCES, OnPreferences)
ON_WM_ENTERIDLE()
ON_COMMAND(ID_QUICK_SEND, OnQuickSend)
ON_COMMAND(ID_SUSPEND, OnSuspend)
ON_UPDATE_COMMAND_UI(ID_SUSPEND, OnUpdateSuspend)
ON_WM_ENDSESSION()
ON_UPDATE_COMMAND_UI(IDC_FIRST_LANGUAGE, OnUpdateFirstLanguage)
ON_COMMAND(ID_FILE_APPLYFILTERS, OnFileApplyfilters)
ON_COMMAND(ID_FRIENDS, OnFriends)
ON_WM_CLOSE()
ON_WM_INITMENUPOPUP()
ON_COMMAND(ID_VIEW_DEL_LOG, OnViewDelLog)
ON_COMMAND(ID_KILL_SPAM, OnKillSpam)
ON_COMMAND(ID_TEST_RE, OnTestRe)
ON_COMMAND(ID_FILTERS, OnFilters)
ON_WM_COPYDATA()
ON_WM_QUERYENDSESSION()
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(IDC_FIRST_LANGUAGE, IDC_LAST_LANGUAGE, OnLanguageSelect)
ON_COMMAND_EX(ID_VIEW_STATUS_BAR, OnMyBarCheck)
ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnMyBarCheck)
ON_WM_SYSCOMMAND()
ON_WM_ENTERMENULOOP()
ON_WM_EXITMENULOOP()
ON_WM_ACTIVATE()
ON_MESSAGE( VM_TASKBAR_NOTIFICATION, OnTaskbarNotification )
ON_MESSAGE( VM_END_RESOLVE_HOST_BY_NAME, OnEndResolveHostByName )
ON_MESSAGE( VM_START_COMMAND, OnStartCommand )
ON_MESSAGE( VM_START_PLAYBACK, OnStartPlayback )
ON_MESSAGE( VM_START_MESSAGE, OnStartMessage )
ON_MESSAGE( VM_UPDATEITEM, OnUpdateItem )
ON_MESSAGE( MM_MCINOTIFY, OnMciNotify )
ON_COMMAND( ID_HELP_FINDER, CFrameWnd::OnHelpFinder )
ON_COMMAND( ID_HELP, CFrameWnd::OnHelp )
ON_COMMAND( ID_CONTEXT_HELP, CFrameWnd::OnContextHelp )
ON_COMMAND( ID_DEFAULT_HELP, CFrameWnd::OnHelpFinder )
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
ON_REGISTERED_MESSAGE( WM_TASKBARCREATED, OnTaskBarCreated )
END_MESSAGE_MAP()
static UINT indicators_when_menu[] =
{
ID_SEPARATOR, // status line indicator
};
static UINT indicators_when_no_menu[] =
{
ID_INDICATOR_OBJECTS,
ID_INDICATOR_CONTENTS,
};
/////////////////////////////////////////////////////////////////////////////
// CMagicFrame construction/destruction
CMagicFrame::CMagicFrame()
: m_bIsAlternativeIcon( true ),
m_uintTimer( 0 ),
m_bFlashNewMail( false )
{
m_bListReady = FALSE;
}
CMagicFrame::~CMagicFrame()
{
}
LRESULT CMagicFrame::OnTaskBarCreated( WPARAM, LPARAM )
{
// install the taskbar icon
m_nidA.cbSize = sizeof( NOTIFYICONDATA );
m_nidA.hWnd = m_hWnd;
m_nidA.uID = 1;
m_nidA.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_nidA.uCallbackMessage = VM_TASKBAR_NOTIFICATION;
m_nidA.hIcon = m_hMailboxEmpty16;
m_nidA.szTip[0] = 0;
VERIFY( Shell_NotifyIcon( NIM_ADD, &m_nidA ) );
return 0;
}
void CMagicFrame::SetIndicators( BOOL bMenuIsOn )
{
UINT nID, nStyle;
int cxWidth;
if( bMenuIsOn )
{
m_wndStatusBar.SetIndicators( indicators_when_menu, sizeof(indicators_when_menu)/sizeof(UINT) );
m_wndStatusBar.GetPaneInfo( 0, nID, nStyle, cxWidth );
m_wndStatusBar.SetPaneInfo( 0, nID, SBPS_STRETCH | SBPS_NOBORDERS, cxWidth );
}
else
{
m_wndStatusBar.SetIndicators( indicators_when_no_menu, sizeof(indicators_when_no_menu)/sizeof(UINT));
m_wndStatusBar.GetPaneInfo( 0, nID, nStyle, cxWidth );
m_wndStatusBar.SetPaneInfo( 0, nID, SBPS_NORMAL, 128 );
m_wndStatusBar.GetPaneInfo( 1, nID, nStyle, cxWidth );
m_wndStatusBar.SetPaneInfo( 1, nID, SBPS_STRETCH | SBPS_NORMAL, 128 );
}
}
CImageList ToolbarImages;
CBitmap bmToolbar;
CImageList ToolbarImagesD;
int CMagicFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if ( -1 == CFrameWnd::OnCreate(lpCreateStruct) ) return -1;
m_hMailboxFull = theApp.LoadIcon( IDI_MAILBOX_FULL );
m_hMailboxEmpty = theApp.LoadIcon( IDI_MAILBOX_EMPTY );
if (theApp.m_nWindowsVersion == WXP)
{
m_hMailboxFull16 = theApp.LoadIcon( IDI_MAILBOX_FULL );
m_hMailboxEmpty16 = theApp.LoadIcon( IDI_MAILBOX_EMPTY );
}
else
{
m_hMailboxFull16 = theApp.LoadIcon( IDI_MAILBOX_FULL_16 );
m_hMailboxEmpty16 = theApp.LoadIcon( IDI_MAILBOX_EMPTY_16 );
}
m_hMailboxSuspended = theApp.LoadIcon( IDR_OVERLAYSUSPENDED );
if( theApp.rcWnd.right ) MoveWindow( &theApp.rcWnd );
// status bar
m_wndStatusBar.Create( this );
SetIndicators( FALSE );
// tool bar
VERIFY( m_wndToolBar.Create( this ) );
long lStyles = ::GetWindowLong(m_wndToolBar.m_hWnd,GWL_STYLE);
::SetWindowLong( m_wndToolBar.m_hWnd, GWL_STYLE,
lStyles | TBSTYLE_FLAT/* | TBSTYLE_LIST*/ );
m_wndToolBar.LoadToolBar( IDR_TOOLBAR );
CWindowDC SDC(NULL); // screen device context
int nRasterCaps= SDC.GetDeviceCaps(BITSPIXEL);
if (nRasterCaps>=16)
{
// try loading another picture
CString sBmpFile;
BOOL bExtFile = FindLocalFile("mmm3glyphs.bmp", sBmpFile, FALSE);
HANDLE hBitmap = NULL;
if (bExtFile)
{
hBitmap = ::LoadImage(NULL, sBmpFile, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
if (!hBitmap)
bExtFile = FALSE;
}
ToolbarImages.Create(16, 15, ILC_COLOR24|ILC_MASK, 18, 1);
CEnBitmap bmp;
if (bExtFile)
{
bmp.Attach(CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
bmToolbar.Attach(hBitmap);
}
else
{
bmToolbar.LoadBitmap(IDB_FULLCOLORTB);
bmp.LoadBitmap(IDB_FULLCOLORTB);
}
ToolbarImages.Add(&bmToolbar, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&ToolbarImages);
// disabled images
bmp.MakeDisabled(RGB(255, 0, 255), 16);
ToolbarImagesD.Create(16, 15, ILC_COLOR24|ILC_MASK, 18, 1);
ToolbarImagesD.Add(&bmp, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetDisabledImageList(&ToolbarImagesD);
}
m_wndToolBar.SetBarStyle( m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS);
if (theApp.m_dwFlags & MMF_NO_STATUS)
m_wndStatusBar.ShowWindow(FALSE);
if (theApp.m_dwFlags & MMF_NO_TOOLBAR)
m_wndToolBar.ShowWindow(FALSE);
// install the taskbar icon
OnTaskBarCreated( 0, 0 );
m_uintTimer = SetTimer( 1, 60000, NULL );
if( !m_uintTimer )
{
AfxMessageBox( IDP_TIMER_CREATE_FAILED );
}
// kick off the icon animation
if( theApp.bIsSuspended )
{
CreateWatchDog( 1 );
}
MenuTranslate(GetMenu()->m_hMenu);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CMagicFrame diagnostics
#ifdef _DEBUG
void CMagicFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMagicFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMagicFrame message handlers
void CMagicFrame::SaveSettings()
{
WINDOWPLACEMENT wndplMain;
GetWindowPlacement( &wndplMain );
theApp.rcWnd = wndplMain.rcNormalPosition;
RECT rc;
m_wndSplitter.GetPane( 0, 0 )->GetClientRect( &rc );
theApp.intSplitterPos = rc.bottom;
// Save/LoadBarState is not compatible, if list of bar is changed
// Done in OnMyBarCheck
}
BOOL CMagicFrame::DestroyWindow()
{
VERIFY( Shell_NotifyIcon( NIM_DELETE, &m_nidA ) );
KillTimer( m_uintTimer );
//SaveSettings();
return CFrameWnd::DestroyWindow();
}
void CMagicFrame::OnTimer(UINT nIDEvent)
{
if( m_uintTimer != nIDEvent ) CFrameWnd::OnTimer( nIDEvent );
else PostMessage( WM_COMMAND, ID_TIMER_CHECK );
}
LRESULT CMagicFrame::OnTaskbarNotification( WPARAM /*wParam*/, LPARAM lParam )
{
//UINT uID = (UINT) wParam;
UINT uMouMsg = (UINT) lParam;
switch( uMouMsg )
{
case WM_RBUTTONDOWN:
{
SetForegroundWindow();
}
break;
case WM_RBUTTONUP: // activate IDR_NOTIFY_MENU
{
CMenu menuPopup;
VERIFY( menuPopup.LoadMenu( IDR_NOTIFY_MENU ) );
POINT ptCur;
VERIFY( GetCursorPos( &ptCur ) );
MENUITEMINFO info;
info.cbSize = sizeof( info );
info.fMask = MIIM_STATE;
info.fState = MFS_DEFAULT;
VERIFY( SetMenuItemInfo( menuPopup.m_hMenu, ID_RESTORE, FALSE, &info ) );
MenuTranslate(menuPopup.GetSubMenu(0)->m_hMenu);
menuPopup.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTALIGN | TPM_LEFTBUTTON, ptCur.x, ptCur.y, this, NULL );
}
break;
case WM_LBUTTONDBLCLK: // invoke ID_RESTORE command
{
SetForegroundWindow();
PostMessage( WM_COMMAND, ID_RESTORE );
}
break;
}
return TRUE;
}
void CMagicFrame::UpdateMailCount( int intTotalMailCount, int intNewMailCount )
{
if( intNewMailCount > 0 )
{
if( GetActiveWindow() == NULL )
{
m_bFlashNewMail = true;
}
}
HICON hIcon = intTotalMailCount ? m_hMailboxFull16 : m_hMailboxEmpty16;
m_nidA.hIcon = hIcon;
CString strTmp;
strTmp.LoadString( ( intTotalMailCount - 1 ) ? IDP_MESSAGES : IDP_MESSAGE );
StrTranslate(strTmp);
_sntprintf( m_nidA.szTip, sizeof( m_nidA.szTip ), _T("%d %s"), intTotalMailCount, strTmp );
if( !IsWatchdogOn() )
{
CreateWatchDog( 1 );
}
if( intNewMailCount )
{
if( theApp.intPopUpMainWindow )
{
OnRestore();
}
}
}
void CMagicFrame::OnRestore()
{
if (IsIconic())
SendMessage( WM_SYSCOMMAND, SC_RESTORE );
else
ShowWindow(SW_SHOW);
}
void CMagicFrame::OnActivate( UINT nState, CWnd* /*pWndOther*/, BOOL /*bMinimized*/ )
{
if( nState == WA_ACTIVE || nState == WA_CLICKACTIVE )
{
m_bFlashNewMail = false;
}
}
void CMagicFrame::OnUpdateRestore(CCmdUI* pCmdUI)
{
pCmdUI->Enable( ( !IsWindowVisible() || IsIconic() || IsZoomed() ) );
}
LRESULT CMagicFrame::OnEndResolveHostByName( WPARAM wParam, LPARAM lParam )
{
CMagicDoc *doc = static_cast< CMagicDoc* >( GetActiveDocument() );
ASSERT( doc );
if( doc )
{
doc->EndResolveHostByName( wParam, lParam );
}
return 0;
}
void CMagicFrame::OnPreferences()
{
COptionsPage pageO;
CAdvOptionsPage pageA;
CActPPage pageB;
CCommandPage pageC;
CPlaybackPage pageP;
CPropertySheet sheet( IDP_PREFERENCES_TITLE, this );
sheet.AddPage( &pageO );
sheet.AddPage( &pageA );
sheet.AddPage( &pageB );
sheet.AddPage( &pageC );
sheet.AddPage( &pageP );
sheet.DoModal();
// this would fire even on Cancel,
// but Apply could have been pressed before, so that's fine
theApp.SaveSettings();
}
LRESULT CMagicFrame::OnStartPlayback( WPARAM , LPARAM lParam )
{
int intPlayback = theApp.intPlayback;;
int intPlaybackDevice = theApp.intPlaybackDevice;
CString strPlayback = theApp.strPlayback;
UINT *puMciID = &theApp.m_uMciID;
if( lParam )
{
CMailbox &mbox = *( (CMailbox*) lParam );
ASSERT( mbox.IsKindOf( RUNTIME_CLASS( CMailbox ) ) );
if( ACTION_DEFAULT != mbox.m_intPlayback )
{
intPlayback = mbox.m_intPlayback;
intPlaybackDevice = mbox.m_intPlaybackDevice;
strPlayback = mbox.m_strPlayback;
puMciID = &mbox.m_uMciID;
}
}
if( ACTION_NONE == intPlayback )
{
return 0;
}
if( *puMciID ) return 0;
MCI_OPEN_PARMS mciOpenParams;
DWORD dwFlags = 0;
mciOpenParams.lpstrElementName = strPlayback;
switch( intPlaybackDevice )
{
case PLAYBACK_DEVICE_FILE:
dwFlags = MCI_OPEN_ELEMENT;
break;
case PLAYBACK_DEVICE_CDA:
dwFlags = MCI_OPEN_TYPE;
mciOpenParams.lpstrDeviceType = "cdaudio";
break;
}
if( mciSendCommand( NULL, MCI_OPEN, dwFlags, (DWORD) &mciOpenParams ) )
{
MessageBeep( MB_ICONEXCLAMATION );
return 0;
}
*puMciID = mciOpenParams.wDeviceID;
MCI_PLAY_PARMS mciPlayParams;
mciPlayParams.dwCallback = (DWORD) m_hWnd;
if( mciSendCommand( *puMciID, MCI_PLAY, MCI_NOTIFY, (DWORD) &mciPlayParams ) )
{
MessageBeep( MB_ICONEXCLAMATION );
*puMciID = 0;
}
return 1;
}
LRESULT CMagicFrame::OnStartMessage( WPARAM wParam, LPARAM lParam )
{
ASSERT( lParam );
CMailbox &mbox = *( (CMailbox*) lParam );
ASSERT( mbox.IsKindOf( RUNTIME_CLASS( CMailbox ) ) );
if( ACTION_NONE == mbox.m_intMessage ) return 0;
CString strTmp1, strTmp2, strMessage;
strTmp1.Format( _T("%d"), (int) wParam ); // number of
strTmp2.LoadString( (wParam-1) ? IDP_MESSAGES : IDP_MESSAGE ); // single/plural
StrTranslate(strTmp2);
//AfxFormatString2( strMessage, IDP_YOU_HAVE_NEW_2, strTmp1, strTmp2 );
// result of AfxFormatString2 is not translatable, so:
MAKE_STRING(strTmp3, IDP_YOU_HAVE_NEW_2);
strTmp3.Replace("%1","%s");
strTmp3.Replace("%2","%s");
strMessage.Format(strTmp3, strTmp1, strTmp2);
CString strCaption;
strTmp1.LoadString( AFX_IDS_APP_TITLE );
StrTranslate(strTmp1);
strCaption.Format( _T("%s - %s"), mbox.m_strAlias, strTmp1 );
SetForegroundWindow();
MessageBox( strMessage, strCaption, MB_ICONINFORMATION );
return 1;
}
void CMagicFrame::OnSysCommand( UINT nID, LPARAM lParam )
{
if( SC_CLOSE == nID )
{
if (theApp.intMarkRead == READ_MINIM ||
theApp.intMarkRead == READ_BOTH)
m_wndSplitter.SendMessageToDescendants(WM_COMMAND, IDC_ALL_READ, 0, FALSE, FALSE);
ShowWindow( SW_HIDE );
}
else
CFrameWnd::OnSysCommand( nID, lParam );
}
LRESULT CMagicFrame::OnStartCommand( WPARAM , LPARAM lParam )
{
( (CMagicDoc*) GetActiveDocument() )->OnUpdateStopCommandAll( NULL );
int intCommand = theApp.intCommand;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -