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() ; //激活以前的窗口
}