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

📄 dominominderdlg2.cpp

📁 基于domino系统邮件数据库编写的邮件助手程序
💻 CPP
字号:
#include "stdafx.h"
#include "DominoMinder.h"
#include "DominoMinderDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////
// 配置窗口事件
/////////////////////////////////////////////////////////
//显示配置窗口时,装载配置
void CDominoMinderDlg::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);

	//清空服务列表
	CListBox* pListEnabled  = (CListBox*) m_oDlgConfigServer.GetDlgItem( IDC_LIST_SERVICE_ENABLED  );
	pListEnabled->ResetContent();
	CListBox* pListDisabled = (CListBox*) m_oDlgConfigServer.GetDlgItem( IDC_LIST_SERVICE_DISABLED );
	pListDisabled->ResetContent();
	
	//装载配置
	if ( bShow == TRUE ) {
		LoadConfig();
	}
}
//最小化到系统图标栏
void CDominoMinderDlg::OnMinToTray() 
{
	MinimizeToTray();
}

void CDominoMinderDlg::OnOK() 
{
	if ( SaveConfig() ) {
		MinimizeToTray();
	}
	//CDialog::OnOK();
}
void CDominoMinderDlg::OnCancel() 
{
	ExitApp();
	//CDialog::OnCancel();
}

//事件计时器:获取并显示消息
void CDominoMinderDlg::OnTimer(UINT nIDEvent) 
{
	//获取并显示消息
	ShowMsg();

	//重设计时器以应用可能的新的时间间隔
	KillTimer(nIDEvent);
	SetTimer( nIDEvent, m_pCfg->GetCheckServiceInterval() * 60000, NULL );

	CDialog::OnTimer(nIDEvent);
}


/////////////////////////////////////////////////////////
// 托盘栏事件
/////////////////////////////////////////////////////////
void CDominoMinderDlg::OnMenuitemTrayExit() 
{
	ExitApp();
}
void CDominoMinderDlg::OnMenuitemTraySetup() 
{
	BringToFront();
}
void CDominoMinderDlg::OnMenuitemTrayLogin() 
{
	UserLogin( false );
}
void CDominoMinderDlg::OnMenuitemTrayAbout() 
{
	ShowAboutDlg();
}
void CDominoMinderDlg::OnMenuitemTrayViewMsgHistory() 
{
	ShowMsgHistory();
}
//立即监测-重设ReqCnt,并立即获取消息
void CDominoMinderDlg::OnMenuitemTrayRefresh() 
{
	if ( (this->m_pCfg->GetUserName() != "") && (this->m_pCfg->GetPassword() != "" ) ) {
		this->m_pDominoMsg->ResetRequest();
		ShowMsg();
	} else {
		UserLogin( false );
	}
}

//系统托盘栏事件--空
#ifdef  NIN_BALLOONSHOW
#define NIN_BALLOONFIRST NIN_BALLOONSHOW
#define NIN_BALLOONLAST  NIN_BALLOONUSERCLICK
#endif
LRESULT CDominoMinderDlg::OnTrayNotification(WPARAM uID, LPARAM lEvent)
{
	char sz[100]; memset(sz,0,sizeof(sz));
	if ( WM_MOUSEFIRST<=lEvent && lEvent<=WM_MOUSELAST ) {
	} else if (NIN_BALLOONFIRST<=lEvent && lEvent<=NIN_BALLOONLAST) {
		//TODO: try under wxp, from msdn, it's for wxp only.
		sprintf( sz,"tray balloon: %d  %d \0", uID, lEvent );
		CLog::WriteLine(sz);
	} else {
		sprintf( sz,"tray unknown: %d  %d \0", uID, lEvent );
		CLog::WriteLine(sz);
	}

	//托盘提示信息
	//TODO: 一定时间后不再显示服务消息
	CString strTip;
	strTip.LoadString(IDS_APP_NAME);
	if ( m_pDominoMsg->GetMsgSimple() != "" ) {
		strTip += "\n" + m_pDominoMsg->GetMsgSimple();
	}

	//鼠标事件
	switch ( lEvent )
	{
	case WM_LBUTTONUP:
		//MessageBox( "WM_LBUTTONUP", sID, MB_OK );
		break;
	case WM_RBUTTONUP:
		//m_oTrayIcon.OnTrayNotify( uID, lEvent );
		break;
	case WM_MOUSEMOVE:
		//显示提示信息
		//HICON hIcon = m_oTrayIcon.m_nid.hIcon;	//需要把TrayIcon的protected成员便利m_nid设为public
		m_oTrayIcon.SetIcon( m_oTrayIcon.m_nid.hIcon, strTip );
		break;
	case NIN_BALLOONUSERCLICK:
		//MessageBox("ballon");
		break;
	}
	/*
	static LPCSTR MouseMessages[] = { "WM_MOUSEMOVE",
		"WM_LBUTTONDOWN", "WM_LBUTTONUP", "WM_LBUTTONDBLCLK",
		"WM_RBUTTONDOWN", "WM_RBUTTONUP", "WM_RBUTTONDBLCLK",
		"WM_MBUTTONDOWN", "WM_MBUTTONUP", "WM_MBUTTONDBLCLK"
	};
	CString s;
	s.Format("托盘通知消息: ID=%d, lEvent=0x%04x %s\r\n", 
		uID, lEvent, WM_MOUSEFIRST<=lEvent && lEvent<=WM_MOUSELAST ? 
		MouseMessages[lEvent-WM_MOUSEFIRST] : "(未知消息)"
	);
	MessageBox( s, "", MB_OK );
	*/
	return 0;
}

/////////////////////////////////////////////////////////
// 初始化
/////////////////////////////////////////////////////////
void CDominoMinderDlg::InitInstance()
{
	//初始化配置和DominoMsg队列
	m_pCfg       = CConfig::GetInstance();
	m_pDominoMsg = CDominoMessage::GetInstance();
	LoadConfig();
	//初始化设置标签
	InitTabSheet();
	//窗口居中
	CenterWindow();
	//初始化系统图标对象	-- 参考“系统托盘编程完全指南”
	m_oTrayIcon.SetNotificationWnd(this, WM_TRAYICON_NOTIFY);
	m_oTrayIcon.SetIcon( IDI_TRAYICON_NORMAL );
	//用户登陆
	if ( UserLogin( true ) ) {
		//登陆后第一次从服务器读取并显示消息
		ShowMsg();
		//隐藏配置主窗口
		PostMessage(WM_SYSCOMMAND,SC_MINIMIZE,FALSE);
	}
}

//初始化设置标签
void CDominoMinderDlg::InitTabSheet()
{
	//基本配置
	char szTabTitleUser[50]; memset(szTabTitleUser,0,sizeof(szTabTitleUser));
	::LoadString( NULL, IDS_CFGDLG_TITLE_USER, szTabTitleUser, sizeof(szTabTitleUser) );
	m_oTabSheet.AddPage( szTabTitleUser, &m_oDlgConfigUser, IDD_CONFIG_USER );

	//服务配置
	char szTabTitleServer[50]; memset(szTabTitleServer,0,sizeof(szTabTitleServer));
	::LoadString( NULL, IDS_CFGDLG_TITLE_SERVER, szTabTitleServer, sizeof(szTabTitleServer) );
	m_oTabSheet.AddPage( szTabTitleServer, &m_oDlgConfigServer, IDD_CONFIG_SERVER );

	m_oTabSheet.Show();
}

/////////////////////////////////////////////////////////
// 函数
/////////////////////////////////////////////////////////

//最小化隐藏到系统托盘栏
void CDominoMinderDlg::MinimizeToTray()
{
	ShowWindow(SW_HIDE);
}
//显示设置窗口到前台
void CDominoMinderDlg::BringToFront()
{
	//PostMessage(WM_SYSCOMMAND,SC_MAXIMIZE,FALSE);
	ShowWindow(SW_NORMAL);
}
//退出
void CDominoMinderDlg::ExitApp()
{
	//delete &m_oDMsg; //TODO: 错误?

	if ( m_oDlgUserLogin.m_hWnd != NULL ) {
		m_oDlgUserLogin.PostMessage( WM_CLOSE );
	}

	m_pDominoMsg->Logout();

	//PostMessage(WM_CLOSE);  //好像会导致程序挂起?!!
	CDialog::OnCancel();
}

//用户登陆
bool CDominoMinderDlg::UserLogin( bool bStartup )
{
	if ( m_oDlgUserLogin ) return true;	//已显示,正在登录中

	int nResponse = m_oDlgUserLogin.DoModal();
	if ( (nResponse == IDCANCEL) && bStartup ) {
		//程序刚运行,且取消登陆,则退出
		ExitApp();
		return false;
	} else if ( nResponse == IDC_SETUP ) {
		//设置
		BringToFront();
		return false;
	} else if ( nResponse == IDOK ) {
		//登陆...
		CString strLoginMsg = m_pDominoMsg->Login();
		if ( strLoginMsg != "" ) {
			//显示登陆失败消息
			ShowMsg( strLoginMsg, strLoginMsg, SHOW_MODE_VISUAL );
		}
		//开始计时器
		SetTimer( 1, m_pCfg->GetCheckServiceInterval() * 60000, NULL );
		//重新登录的话,获取并显示消息
		if ( !bStartup ) {
			ShowMsg();
		}
	}
	return true;
}
//装载并显示配置
bool CDominoMinderDlg::LoadConfig()
{
	//从本地配置文档中装载
	m_pCfg->LoadConfigUser( &m_oDlgConfigUser );

	//
	m_pCfg->LoadConfigServer( &m_oDlgConfigServer );
	/*
	if ( m_pDominoMsg->GetCount() == 0 ) {
		m_pCfg->LoadConfigServer( &m_oDlgConfigServer );
	} else {
		m_pDominoMsg->LoadConfigServer( &m_oDlgConfigServer );
	}
	*/
	return true;
}
//保存配置
bool CDominoMinderDlg::SaveConfig()
{
	m_pCfg->SaveConfigUser( &m_oDlgConfigUser );
	m_pCfg->SaveConfigServer( &m_oDlgConfigServer );
	return true;
}

//获取并显示消息
void CDominoMinderDlg::ShowMsg()
{
	//完整的消息
	CString strMsg = this->m_pDominoMsg->GetMsg();
	
	//简单的服务消息,用于托盘栏
	CString strMsgSimple = this->m_pDominoMsg->GetMsgSimple();

	//显示
	if ( strMsg!="" && strMsgSimple!="" ) {
		this->ShowMsg( strMsg, strMsgSimple );
	}

	//SetTimer( 1, 15000, NULL );
}

//显示消息
void CDominoMinderDlg::ShowMsg( CString strMsg, CString strMsgSimple, int nShowMode )
{
	if ( strMsg == "" ) return;
	int nShowModeCfg = (nShowMode==0) ? m_pCfg->GetShowMode() : nShowMode;

	//nShowModeCfg = nShowModeCfg | SHOW_MODE_TRAYBALLOON; //TEST - 都加上tray balloon

	//托盘栏气球提示
	if ( (nShowModeCfg & SHOW_MODE_TRAYBALLOON) != 0 ) {
		//TODO: 如果显示不下,但没有视觉提示的话,需要增加点击气球事件打开窗口显示所有消息。
		//TODO: 默认情况下,增加单击托盘栏事件-气球显示上次消息(只支持WinXP及以上:()。增加上次消息显示右键菜单
		char sz[50]; memset(sz,0,sizeof(sz));
		::LoadString(NULL,IDS_APP_NAME,sz,sizeof(sz));
		this->m_oTrayIcon.ShowBalloonTip( strMsgSimple, sz, 10000 );
	}
	//声音提示
	if ( (nShowModeCfg & SHOW_MODE_ACOUSTICAL) != 0 ) {
		sndPlaySound( m_pCfg->GetWavFile(), SND_ASYNC );
	}
	//弹出窗口
	if ( (nShowModeCfg & SHOW_MODE_VISUAL) != 0 ) {
		//计算窗口标题
		CString strMsgCaption;
		strMsgCaption.LoadString( IDS_APP_NAME );
		strMsgCaption += "...  ";
		//关闭老的消息窗口
		KillMsgWindow( strMsgCaption );
		//弹出
		MessageBox( strMsg, strMsgCaption, MB_ICONINFORMATION | MB_OK );
	}
}
//建新窗口显示历史消息
void CDominoMinderDlg::ShowMsgHistory()
{
	m_pDlgMsgHistory->DoModal();
}
//显示关于窗口
void CDominoMinderDlg::ShowAboutDlg()
{	
	m_pDlgAbout->DoModal();
}

//关闭消息窗口,以显示新消息
bool CDominoMinderDlg::KillMsgWindow( CString strWinCaption )
{
	CWnd *pWnd = CWnd::FindWindow( NULL, strWinCaption );
	if ( pWnd ) {
		pWnd ->PostMessage( WM_CLOSE );
	}
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -