www.pudn.com > 智能内码识别,支持屏幕取词翻译的程序.zip > MENUBUTT.CPP


// menubutt.cpp : implementation file 
// 
 
#include "stdafx.h" 
 
#include	"resource.h" 
#include	"cspublic.h" 
#include	"cskernel.h" 
 
#include	"basicwin.h" 
#include	"basicbut.h" 
#include	"systemse.h" 
#include "menubutt.h" 
#include	"activebu.h" 
#include	"cswin.h" 
#include	"exitcs.h" 
#include	"inputbar.h" 
#include	"hintwin.h" 
#include	"cs.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char BASED_CODE THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMenuButton 
 
CMenuButton::CMenuButton() 
{ 
	m_pSystemSetSheet	=NULL ; 
} 
 
CMenuButton::~CMenuButton() 
{ 
//	m_Menu.DestroyMenu() ;	//破坏菜单 
} 
 
BOOL	CMenuButton::InitButton(  
							LPCSTR 	lpcsName , 	//窗口名称 
							const RECT &rect ,	//窗口大小 
							CWnd 	*pParent ,	//父窗口 
							UINT	uWinID ,	//窗口ID 
							UINT	uBitmapID , 	//位图ID 
							UINT	uMenuID )	//菜单ID		 
{ 
	if( !m_Bitmap.LoadBitmap( uBitmapID ) )	//装入位图资源 
		return	0 ; 
//	if( !m_Menu.LoadMenu( uMenuID ) )	//装入菜单资源 
//		return	0 ; 
 
	m_bMenuStatus	=0 ;	//菜单初始状态	 
 
/*	m_pSystemSetSheet	=(CSystemSetSheet*)new CSystemSetSheet( this ) ; 
	if( !m_pSystemSetSheet ) 
		return	0 ; 
*/		 
	//创建窗口							 
	return 	CBasicButton::InitButton( lpcsName , rect , pParent , uWinID ) ; 
} 
 
BEGIN_MESSAGE_MAP(CMenuButton, CBasicButton) 
	//{{AFX_MSG_MAP(CMenuButton) 
	ON_WM_LBUTTONDOWN() 
	ON_WM_PAINT() 
	ON_COMMAND(ID_SYSTEM_SET, OnSystemSet) 
	ON_COMMAND(ID_EXIT_CS, OnExitCs) 
	ON_COMMAND(ID_VERSION, OnVersion) 
	ON_COMMAND(ID_FRIENDS, OnFriends) 
	ON_COMMAND(ID_OUTPUT_GB, OnOutputGb) 
	ON_COMMAND(ID_OUTPUT_BIG5, OnOutputBig5) 
	ON_COMMAND(ID_OUTPUT_SHIFTJIS, OnOutputShiftjis) 
	ON_COMMAND(ID_OUTPUT_EUCJIS, OnOutputEucjis) 
	ON_COMMAND(ID_OUTPUT_KSC5601, OnOutputKsc5601) 
	ON_COMMAND(ID_OUPUT_ENGLISH, OnOuputEnglish) 
	ON_COMMAND(ID_SYSTEM_TRANSLATION, OnSystemTranslation) 
	ON_COMMAND(ID_SYSTEM_INPUT, OnSystemInput) 
	ON_WM_LBUTTONDBLCLK() 
	ON_WM_MENUCHAR() 
	ON_WM_MENUSELECT() 
	ON_WM_RBUTTONDOWN() 
	ON_WM_RBUTTONDBLCLK() 
	ON_COMMAND(ID_SYSTEM_HELP, OnSystemHelp) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMenuButton message handlers 
 
void CMenuButton::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
	// TODO: Add your message handler code here and/or call default 
	CBasicButton::OnLButtonDown(nFlags, point); 
 
	if( !m_bMenuStatus )	//没有显示菜单,显示菜单                 
	{ 
		m_bMenuStatus	=1 ;		//标记显示菜单 
		SetLineSwitch( 0 ) ;	//设上退化显示开关,不允许退化显示 
	} 
	else 
	{ 
		m_bMenuStatus	=0 ;		//标记没有显示菜单 
		SetLineSwitch( 1 ) ;	//打开退化显示开关,允许退化显示 
		ActiveOldWin() ;	//激活以前的窗口 
	} 
	//改变按钮显示状态						 
	Invalidate() ; 
	UpdateWindow() ;		 
 
	if( m_bMenuStatus )	//以前没有显示菜单,显示菜单 
	{ 
		RECT	rect ; 
		GetClientRect( &rect ) ; 
		CPoint	point( 0 , rect.bottom ) ; 
		ClientToScreen( &point ) ;	//转换成系统坐标,这是菜单的位置 
 
		m_Menu.DestroyMenu() ;	//破坏菜单 
		int	n	=GetOutputCode() ;	//得到当前输出内码 
		CMenu	*pMenu ; 
		switch( n )	//判断输出代码 
		{ 
			case	0:	//GB		 
				if( !m_Menu.LoadMenu( IDR_MENU1 ) )	//装入菜单资源 
					return ; 
				pMenu	=m_Menu.GetSubMenu( 0 ) ; 
//				pMenu->ModifyMenu( 0 , MF_BYPOSITION|MF_BITMAP , 
//					0 , &m_Bitmap ) ; 
//				pMenu->SetMenuItemBitmaps( 0 , MF_BYPOSITION , 
//					&m_Bitmap , &m_Bitmap ) ; 
 
				if( GetFingerTranslate() )	//当前是可以进行指取翻译的 
					pMenu->ModifyMenu( ID_SYSTEM_TRANSLATION , 
						MF_BYCOMMAND , ID_SYSTEM_TRANSLATION , 
						"禁止指取翻译(&T)" ) ; 
				else 
					pMenu->ModifyMenu( ID_SYSTEM_TRANSLATION , 
						MF_BYCOMMAND , ID_SYSTEM_TRANSLATION , 
						"启动指取翻译(&T)" ) ; 
						 
				if( GetInputBarStatus()!=2 )	//当前是可以进行中文输入的 
					pMenu->ModifyMenu( ID_SYSTEM_INPUT , 
						MF_BYCOMMAND , ID_SYSTEM_INPUT , 
						"禁止中文输入(&I)" ) ; 
				else 
					pMenu->ModifyMenu( ID_SYSTEM_INPUT , 
						MF_BYCOMMAND , ID_SYSTEM_INPUT , 
						"启动中文输入(&I)" ) ; 
				break ; 
			case	1:	//BIG5 
				if( !m_Menu.LoadMenu( IDR_MENU1_1 ) ) 
					return ; 
				pMenu	=m_Menu.GetSubMenu( 0 ) ; 
 
				if( GetFingerTranslate() )	//当前是可以进行指取翻译的 
					pMenu->ModifyMenu( ID_SYSTEM_TRANSLATION , 
						MF_BYCOMMAND , ID_SYSTEM_TRANSLATION , 
						"窽ゎ陆亩(&T)" ) ; 
				else 
					pMenu->ModifyMenu( ID_SYSTEM_TRANSLATION , 
						MF_BYCOMMAND , ID_SYSTEM_TRANSLATION , 
						"币笆陆亩(&T)" ) ; 
 
				if( GetInputBarStatus()!=2 )	//当前是可以进行中文输入的 
					pMenu->ModifyMenu( ID_SYSTEM_INPUT , 
						MF_BYCOMMAND , ID_SYSTEM_INPUT , 
						"窽ゎいゅ块(&I)" ) ; 
				else 
					pMenu->ModifyMenu( ID_SYSTEM_INPUT , 
						MF_BYCOMMAND , ID_SYSTEM_INPUT , 
						"币笆いゅ块(&I)" ) ; 
				break ; 
			default:	//其它输出内码 
				if( !m_Menu.LoadMenu( IDR_MENU1_2 ) )	//装入菜单资源 
					return ; 
				pMenu	=m_Menu.GetSubMenu( 0 ) ; 
 
				if( GetFingerTranslate() )	//当前是可以进行指取翻译的 
					pMenu->ModifyMenu( ID_SYSTEM_TRANSLATION , 
						MF_BYCOMMAND , ID_SYSTEM_TRANSLATION , 
						"Abandon Finger &Translation" ) ; 
				else 
					pMenu->ModifyMenu( ID_SYSTEM_TRANSLATION , 
						MF_BYCOMMAND , ID_SYSTEM_TRANSLATION , 
						"Start Finger &Translation" ) ; 
 
				if( GetInputBarStatus()!=2 )	//当前是可以进行中文输入的 
					pMenu->ModifyMenu( ID_SYSTEM_INPUT , 
						MF_BYCOMMAND , ID_SYSTEM_INPUT , 
						"Abandon Chinese &Input" ) ; 
				else 
					pMenu->ModifyMenu( ID_SYSTEM_INPUT , 
						MF_BYCOMMAND , ID_SYSTEM_INPUT , 
						"Start Chinese &Input" ) ; 
		} 
			 
		//将该菜单项打上标记,并且无效		 
		pMenu->CheckMenuItem( n , 
						MF_BYPOSITION|MF_CHECKED ) ; 
		pMenu->EnableMenuItem( n , 
						MF_BYPOSITION|MF_DISABLED ) ; 
//		BOOL b=::GetWindowRect( (HWND)(pMenu->m_hMenu) , &rect ) ;						 
 
		ClientToScreen( &rect ) ; 
		SetMenuCharFlag( 0 ) ;	//标记不是按键消失鼠标的 
		pMenu->TrackPopupMenu( TPM_LEFTBUTTON|TPM_LEFTALIGN ,  
			point.x , point.y , this , &rect ) ; 
	} 
	 
//	CBasicButton::OnLButtonDown(nFlags, point); 
} 
 
void CMenuButton::OnPaint() 
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
	RECT	rect ; 
	GetClientRect( &rect ) ;	//得到大小 
	rect.right-- ; 
	rect.bottom-- ; 
	DrawOneLineBox( dc.m_hDC , rect , !m_bMenuStatus , 
		RGB(255,255,255),RGB(128,128,128),RGB(192,192,192)) ;	//画上底色 
	 
	CDC	MemDC ; 
	MemDC.CreateCompatibleDC( &dc ) ; 
	CBitmap *pOldBitmap	=(CBitmap*)(MemDC.SelectObject(  
											&m_Bitmap ) ) ; 
 
	dc.BitBlt( (rect.right-16)/2 , 1 ,  
					16 , 16 ,  
				&MemDC , 0 , 0 , SRCCOPY ) ; 
 
	MemDC.SelectObject( pOldBitmap ) ;															 
 
	// Do not call CBasicButton::OnPaint() for painting messages 
} 
 
void CMenuButton::OnSystemSet() 
{ 
	// TODO: Add your command handler code here 
	char	sTitle[50] ; 
	CChinesePage	*pChinesePage ;	//中文系统参数页 
	CHotKey				*pHotKeyPage ;		//系统热键参数页 
	CToolBox          *pToolBoxPage ;		//工具箱参数页 
	CSystem				*pSystemPage ;	//系统参数页 
 
	switch( GetOutputCode() ) 
	{ 
		case	0: 
			strcpy( sTitle , "中文大观系统设置" ) ; 
			pChinesePage	=new	CChinesePage( IDD_DIALOG2 ) ; 
			pHotKeyPage	=new CHotKey( IDD_DIALOG3 ) ; 
			pToolBoxPage	=new CToolBox( IDD_DIALOG1 ) ; 
			pSystemPage	=new CSystem( IDD_DIALOG4 ) ; 
			break;  
		case	1: 
			strcpy( sTitle , "いゅ芠╰参砞竚" ) ; 
			pChinesePage	=new	CChinesePage( IDD_DIALOG2_1 ) ; 
			pHotKeyPage	=new CHotKey( IDD_DIALOG3_1 ) ; 
			pToolBoxPage	=new CToolBox( IDD_DIALOG1_1 ) ; 
			pSystemPage	=new CSystem( IDD_DIALOG4_1 ) ; 
			break;  
		default:    
			strcpy( sTitle , "ChineseScape System Set" ) ; 
			pChinesePage	=new	CChinesePage( IDD_DIALOG2_2 ) ; 
			pHotKeyPage	=new CHotKey( IDD_DIALOG3_2 ) ; 
			pToolBoxPage	=new CToolBox( IDD_DIALOG1_2 ) ; 
			pSystemPage	=new CSystem( IDD_DIALOG4_2 ) ; 
	} 
 
	m_pSystemSetSheet	=(CSystemSetSheet*)new CSystemSetSheet( 
		sTitle , AfxGetMainWnd() , 
		GetPrivateProfileInt( "系统设置" , "当前页" , 0 , INI_FILE_NAME ) ) ; 
	if( !m_pSystemSetSheet ) 
	{ 
		AfxMessageBox( "Create pages dialog error!" ) ; 
		return ; 
	} 
 
	m_pSystemSetSheet->AddPage( pChinesePage ) ; 
	m_pSystemSetSheet->AddPage( pHotKeyPage ) ; 
	m_pSystemSetSheet->AddPage( pToolBoxPage ) ; 
	m_pSystemSetSheet->AddPage( pSystemPage ) ; 
 
	//保存浮动条参数,以备恢复用		 
	AfxGetMainWnd()->SendMessage( WM_USER_CHANGE_ACTION_BUTTON , 3 , 0 ) ; 
	SetLineSwitch( 0 ) ;	//设上退化显示开关,禁止退化显示 
	if( m_pSystemSetSheet->DoModal()==IDOK )		//运行 
	{ 
/*		char	sBuff[10] ; 
		wsprintf( sBuff , "%d" , m_pSystemSetSheet->GetActivePageNum() ) ; 
		WritePrivateProfileString( "系统设置" , "当前页" , sBuff ,  
				INI_FILE_NAME ) ; 
*/	} 
	SetLineSwitch( 1 ) ;	//打开退化显示开关,允许退化显示 
	ActiveOldWin() ;	//激活以前的窗口 
 
	delete	pChinesePage ; 
	delete	pHotKeyPage ; 
	delete	pToolBoxPage ; 
	delete	pSystemPage ; 
	delete	m_pSystemSetSheet ; 
	m_pSystemSetSheet	=NULL ; 
} 
 
void CMenuButton::OnExitCs() 
{ 
	// TODO: Add your command handler code here 
	//判断是否需要提示 
	if( !GetPrompt() )	//不需要 
		GetParent()->PostMessage( WM_CLOSE ) ; 
	else	//需要 
	{ 
		CExitCs	*dialog ; 
		switch( GetOutputCode() ) 
		{ 
			case	0:	//GB 
				dialog	=new	CExitCs(IDD_EXIT_CS) ; 
				break ; 
			case	1:	//BIG5 
				dialog	=new	CExitCs(IDD_EXIT_CS_1) ; 
				break;  
			default: 
				dialog	=new	CExitCs(IDD_EXIT_CS_2) ; 
		} 
		SetLineSwitch( 0 ) ;	//设上退化显示开关,禁止退化显示 
		if( dialog->DoModal() == IDOK ) 
		{ 
			delete	dialog ; 
			GetParent()->PostMessage( WM_CLOSE ) ; 
		} 
		else 
		{ 
			delete	dialog ; 
			SetLineSwitch( 1 ) ;	//打开退化显示开关,允许退化显示 
			ActiveOldWin() ;	//激活以前的窗口 
		} 
	} 
} 
 
void CMenuButton::OnVersion() 
{ 
	// TODO: Add your command handler code here 
	CVersion	*pDialog ; 
	switch( GetOutputCode() ) 
	{ 
		case	0: 
			pDialog	=new CVersion( IDD_ABOUT_CS ) ; 
			break;  
		case	1: 
			pDialog	=new CVersion( IDD_ABOUT_CS_1 ) ; 
			break;  
		default: 
			pDialog	=new CVersion( IDD_ABOUT_CS_2 ) ; 
	} 
	SetLineSwitch( 0 ) ;	//设上退化显示开关,禁止退化显示 
	pDialog->DoModal() ;	 
	delete	pDialog ; 
	SetLineSwitch( 1 ) ;	//打开退化显示开关,允许退化显示 
	ActiveOldWin() ;	//激活以前的窗口 
} 
 
void CMenuButton::OnFriends() 
{ 
	// TODO: Add your command handler code here 
	CVersion	*pDialog ; 
	switch( GetOutputCode() ) 
	{ 
		case	0: 
			pDialog	=new CVersion( IDD_FRIENDS ) ; 
			break ;  
		case	1: 
			pDialog	=new	CVersion( IDD_FRIENDS_1 ) ; 
			break;  
		default: 
			pDialog	=new	CVersion( IDD_FRIENDS_2 ) ; 
	} 
			 
	SetLineSwitch( 0 ) ;	//设上退化显示开关,禁止退化显示 
	pDialog->DoModal() ;	 
	delete	pDialog ; 
	SetLineSwitch( 1 ) ;	//打开退化显示开关,允许退化显示 
	ActiveOldWin() ;	//激活以前的窗口 
} 
 
//改变输出内码 
void CMenuButton::ChangeCodeMenu( int m ) 
{ 
	int	n	=GetOutputCode() ;	//得到当前输入内码 
	if( n==m )	//两码相同,不用改变了 
		return ; 
 
	CMenu	*pMenu ; 
	pMenu	=m_Menu.GetSubMenu( 0 ) ;	//得到菜单 
	//将该菜单项打上标记,并且无效		 
	pMenu->CheckMenuItem( m , 
								MF_BYPOSITION|MF_CHECKED ) ; 
	pMenu->EnableMenuItem( m , 
								MF_BYPOSITION|MF_DISABLED ) ; 
	 
	//将以前的当前菜单项消除标记,并且有效 
	pMenu->CheckMenuItem( n , 
								MF_BYPOSITION|MF_UNCHECKED ) ; 
	pMenu->EnableMenuItem( n , 
								MF_BYPOSITION|MF_ENABLED ) ; 
 
	SetOutputCode( m ) ;	//改变当前显示内码  
	if( m==5 )	//不显示汉字 
	{ 
		if( !GetFingerTranslate() )	//不需要指取翻译 
			ToEnglish() ;	//卸掉汉字系统 
		else	//需要指取翻译 
			UnloadZk( 0 ) ;	//卸掉部分显示字库 
	} 
	else 
	{ 
		if( n==5 &&	//刚才不需要显示汉字 
		     !GetFingerTranslate() )	//不需要指取翻译 
			ToChinese() ;	//挂上汉字系统 
		else 
			LoadZk() ;	//重新装入显示字库 
			 
		switch( m )	//设置输入内码 
		{ 
			case	0: 
			case	1: 
				SetInputCode( m ) ; 
				break ; 
			case	2: 
			case	3: 
			case	4: 
				if( !GetInputMethod() )	//是内码输入法 
					SetInputCode( m+1 ) ; 
				break ;  
		} 
	} 
 
	UpdateScreen() ;	 
} 
 
void CMenuButton::OnOutputGb() 
{ 
	// TODO: Add your command handler code here 
	ChangeCodeMenu( 0 ) ;	 
} 
 
void CMenuButton::OnOutputBig5() 
{ 
	// TODO: Add your command handler code here 
	ChangeCodeMenu( 1 ) ;	 
} 
 
void CMenuButton::OnOutputShiftjis() 
{ 
	// TODO: Add your command handler code here 
	ChangeCodeMenu( 2 ) ;	 
} 
 
void CMenuButton::OnOutputEucjis() 
{ 
	// TODO: Add your command handler code here 
	ChangeCodeMenu( 3 ) ;		 
} 
 
void CMenuButton::OnOutputKsc5601() 
{ 
	// TODO: Add your command handler code here 
	ChangeCodeMenu( 4 ) ;		 
} 
 
void CMenuButton::OnOuputEnglish() 
{ 
	// TODO: Add your command handler code here 
	ChangeCodeMenu( 5 ) ;		 
} 
 
//切换是否进行指取翻译 
void CMenuButton::OnSystemTranslation() 
{ 
	// TODO: Add your command handler code here 
	SwitchFinger() ; 
} 
 
void CMenuButton::OnSystemInput() 
{ 
	// TODO: Add your command handler code here 
	CCsApp	*pApp	=(CCsApp*)AfxGetApp() ; 
	if( GetInputBarStatus()!=2 )	//当前是可以进行中文输入的	 
	{ 
		SetInputBarStatus( 2 ) ;	//设成不可以 
		//卸掉输入法库 
		pApp->HookOffInput() ; 
	} 
	else 
	{ 
		SetInputBarStatus( 1 ) ;	//设成可以 
		//挂上中文输入模块 
		pApp->HookOnInput() ; 
	} 
} 
 
void CMenuButton::OnLButtonDblClk(UINT nFlags, CPoint point) 
{ 
	// TODO: Add your message handler code here and/or call default 
	if( !m_bMenuStatus )		//菜单没有显示 
		OnLButtonDown( nFlags , point ) ; 
		 
	CBasicButton::OnLButtonDblClk(nFlags, point); 
} 
 
LRESULT CMenuButton::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) 
{ 
	// TODO: Add your message handler code here and/or call default 
	SetMenuCharFlag( 0 ) ;	//标记不是按键消失鼠标的 
		 
	return CBasicButton::OnMenuChar(nChar, nFlags, pMenu); 
} 
 
void CMenuButton::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) 
{ 
	static	BOOL	bFlag=0 ; 
	if( nItemID==ID_SYSTEM_SET|| 
		nItemID==ID_SYSTEM_HELP|| 
		nItemID==ID_VERSION|| 
		nItemID==ID_FRIENDS|| 
		nItemID==ID_EXIT_CS ) 
		bFlag	=1 ; 
 
	CBasicButton::OnMenuSelect(nItemID, nFlags, hSysMenu); 
	 
	// TODO: Add your message handler code here 
	if( nFlags == (UINT)0xffff && !hSysMenu )	//关闭菜单 
	{ 
		CRect	rect ;	//用户窗口区 
		GetClientRect( &rect ) ; 
		POINT	point ; 
		GetCursorPos( &point ) ;	//得到当前鼠标点 
		ScreenToClient( &point ) ;	//转成用户坐标 
		if( GetMenuCharFlag() ||	//是按键消失鼠标的 
			!rect.PtInRect( point ) )	//点不在该窗口内 
		{ 
			m_bMenuStatus	=0 ;	//标记菜单被关闭 
			Invalidate() ; 
			UpdateWindow() ; 
			SetLineSwitch( 1 ) ;	//打开退化显示开关,允许退化显示 
		} 
 
		if(!bFlag) 
			ActiveOldWin() ;	//激活以前的窗口 
		else 
			bFlag	=0 ; 
	} 
} 
 
void CMenuButton::OnRButtonDown(UINT nFlags, CPoint point) 
{ 
	// TODO: Add your message handler code here and/or call default 
	SetMenuCharFlag( 1 ) ;	//标记是按键消失鼠标的 
	ActiveOldWin() ;	//激活以前的窗口 
 
	if( m_bMenuStatus )	//有菜单 	 
		CWnd::OnRButtonDown(nFlags, point); 
	else 
		CBasicButton::OnRButtonDown(nFlags, point); 
} 
 
void CMenuButton::OnRButtonDblClk(UINT nFlags, CPoint point) 
{ 
	// TODO: Add your message handler code here and/or call default 
	SetMenuCharFlag( 1 ) ;	//标记是按键消失鼠标的 
	ActiveOldWin() ;	//激活以前的窗口 
	 
	CBasicButton::OnRButtonDblClk(nFlags, point); 
} 
 
void CMenuButton::OnSystemHelp() 
{ 
	// TODO: Add your command handler code here 
	MessageBox( "Welcome to ChineseScape." , "Hello" ) ;  
		 
	ActiveOldWin() ;	//激活以前的窗口 
}