⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 magicframe.cpp

📁 一个邮件客户端源代码,包括收发邮件,安排日程等很多内容
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -