📄 dominominderdlg2.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 + -