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


// InputBar.cpp : implementation file 
// 
 
#include "stdafx.h"	 
#include	"resource.h" 
 
#include	"cspublic.h" 
#include	"cskernel.h" 
 
#include	"basicwin.h" 
#include 	"inputbar.h" 
#include	"iniinput.h" 
#include	"csinput.h" 
 
extern	CInputInit	OInputInit ;	//输入菜单初始化对象 
extern	HINSTANCE	hInstance ; 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char BASED_CODE THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CInputBar 
//初始化输入板 
void	CInputBar::InitInputBar( void ) 
{ 
	//宽度与高度 
	m_nMainWidth	=300 ; 
	m_nMainHeight	=38 ; 
	//设置输入窗口的初始位置 
	m_OLeftTopPos.x	=GetPrivateProfileInt( "输入板参数" ,  
		"左上角x值" , 300 , INI_FILE_NAME ) ; 
	if( m_OLeftTopPos.x<0 ||  
	     m_OLeftTopPos.x>GetSystemMetrics(SM_CXSCREEN)-m_nMainWidth ) 
		m_OLeftTopPos.x	=300 ; 
	m_OLeftTopPos.y	=GetPrivateProfileInt( "输入板参数" ,  
		"左上角y值" , 400 , INI_FILE_NAME ) ; 
	if( m_OLeftTopPos.y<0 ||  
	     m_OLeftTopPos.y>GetSystemMetrics(SM_CYSCREEN)-m_nMainHeight ) 
		m_OLeftTopPos.x	=400 ; 
										   
	m_bIsDown	=0 ;	//初始表示鼠标没有按下										   
 
	m_nScrollButtonStatus	=4 ;	//初始没有翻页按钮 
	 
	//初始化按钮子窗口	 
	m_nButtonNum	=MAX_BUTTON ;	//按钮数 
	CPoint	tempPoint( 225 , 4 ) ; 
	//功能菜单 
	tempPoint.x	=m_nMainWidth-4-4*(12-2)/2 ; 
	m_OButton[3]	=CInButton( tempPoint , 
								"设置" , IDR_MENU2 ) ; 
	m_OButton[3].SetHint( "设置输入法" , 
		"砞竚块猭" , "Setup Input Methods" ) ; 
	m_OButton[3].SetActiveMode( 0 ) ;	 
 
	tempPoint.x	-=(4+3*12) ; 
	m_OButton[0]	=CInButton( tempPoint ,  
								IDB_BITMAP2 , IDB_BITMAP3 ) ;	//中文标点 
	m_OButton[0].SetHint( "切换西文/中文标点" , 
		"ち传﹁ゅ/いゅ夹翴" , "Switch English/Chinese BiaoDian" ) ; 
	tempPoint.x	+=12 ; 
	m_OButton[1]	=CInButton( tempPoint , 
								IDB_BITMAP4 , IDB_BITMAP5 ) ;		//是否加空格 
	m_OButton[1].SetHint( "切换是否在汉字前加空格" , 
		"ち传琌簙玡" , "Switch Add Blank or Not" ) ; 
	tempPoint.x	+=12 ;														 
	m_OButton[2]	=CInButton( tempPoint , 
								IDB_BITMAP6 , IDB_BITMAP7 ) ;	//全角、半角 
	m_OButton[2].SetHint( "切换半角/全角字符" , 
		"ち传à/à才" , "Switch English/Chinese Symbol" ) ; 
 
	//输入法菜单 
	OInputInit.InitInputMenu() ;	//初始化输入菜单 
	char	sInputName[100] ; 
	char	sInputFileName[100] ; 
	//得到当前输入法名与文件名 
	OInputInit.GetCurrentInputMethod( sInputName , 100 ,  
				sInputFileName , 100 ) ; 
	tempPoint.x	=m_nMainWidth-4-_fstrlen( sInputName )*(12-2)/2 ; 
	tempPoint.y	=m_nMainHeight/2 + 3 ; 
	m_OButton[4]	=CInButton( tempPoint ,  
			sInputName , OInputInit.GetInputMenu() ) ; 
	m_OButton[4].SetHint( "切换输入法" , 
		"ち传块猭" , "Switch Input Method" ) ; 
	m_OButton[4].SetActiveMode( 0 ) ;	 
 
	//翻页动作按钮 
	tempPoint.x	=m_nMainWidth-4-2*12 ; 
	m_OButton[5]	=CInButton( tempPoint ,												 
							  IDB_BITMAP8 , IDB_BITMAP8 , 
							3 ) ;	 
	m_OButton[5].SetHint( "向前翻页" , 
		"玡陆" , "Prior Page" ) ; 
	tempPoint.x	+=12 ; 
	m_OButton[6]	=CInButton( tempPoint ,												 
							  IDB_BITMAP9 , IDB_BITMAP9 , 
							  4 ) ; 
	m_OButton[6].SetHint( "向后翻页" , 
		"陆" , "Next Page" ) ; 
													   
	//关于输入英文及其中文的参数 
	m_nInputLen	=0 ;	//已经输入的长度 
	m_nInputCursorPos	=0 ;	//初始输入光标位置 
	m_bCursorStatus	=1 ;		//初始光标状态 
	m_uTimerID	=0 ; 
	m_nShowHzLen	=0 ;	//初始显示汉字串长度 
	m_nHzItemNum	=0 ;	//返回的汉字数 
 
	//创建主输入窗口 
	CreateInputBar() ; 
	//判断输入板的初始状态 
	JudgeInitStatus() ; 
	//将输入板窗口句柄放到公用DLL中 
	SetInputBarHandle( m_hWnd ) ; 
} 
 
//创建主输入窗口 
BOOL CInputBar::CreateInputBar( void ) 
{ 
	//创建主窗口 
	if( !CreateEx(	WS_EX_TOPMOST ,  
							AfxRegisterWndClass( CS_SAVEBITS ) , 
							"梦笔生花" , WS_POPUP , 
							m_OLeftTopPos.x , 
							m_OLeftTopPos.y , 
							m_nMainWidth , 
							m_nMainHeight , 
							AfxGetMainWnd()->GetSafeHwnd() , NULL ) ) 
	{ 
		AfxMessageBox( "Create input bar error" ) ;							 
		return	FALSE ; 
	} 
 
	//创建按钮子窗口 
	char	sBuff[10] ; 
	for( int i=0 ; iGetClientRect( &rect ) ; 
 
		//重新计算左上角的位置 
		m_OLeftTopPos.x	+=( point.x - m_OOldMousePos.x ) ;  
		m_OLeftTopPos.y	+=( point.y - m_OOldMousePos.y ) ; 
		if( m_OLeftTopPos.x > rect.right-m_nMainWidth ) 
			m_OLeftTopPos.x	=rect.right - m_nMainWidth ; 
		if( m_OLeftTopPos.x < 0 ) 
			m_OLeftTopPos.x	=0 ; 
		if( m_OLeftTopPos.y > rect.bottom-m_nMainHeight ) 
			m_OLeftTopPos.y	=rect.bottom - m_nMainHeight ; 
		if( m_OLeftTopPos.y < 0 ) 
			m_OLeftTopPos.y	=0 ; 
		 
		//记录鼠标位置 
		m_OOldMousePos	=point ; 
		 
		//重新设置窗口的位置 
		SetWindowPos( (CWnd*)&wndTop , 
									m_OLeftTopPos.x , 
									m_OLeftTopPos.y , 
									0 , 0 , 
                  SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOSIZE ) ; 
	} 
	 
	CBasicWin::OnMouseMove(nFlags, point); 
} 
 
//处理输入结果 
void	CInputBar::ShowInput( void ) 
{ 
/*	CDC	*pDC	=GetDC() ; 
 
	//创建所需要的字体	 
	CFont	font ; 
	font.CreateFont( m_nMainHeight/2-3 ,			//高度 
					0 , 0 , 0 , 						//宽度等 
					FW_NORMAL , 
					FALSE , FALSE , 0 , 
					ANSI_CHARSET , 
					OUT_DEFAULT_PRECIS , 
					CLIP_DEFAULT_PRECIS , 
					DEFAULT_QUALITY  , 
				 	DEFAULT_PITCH , NULL ) ; 
	CFont	*pOldFont	=(CFont*)pDC->SelectObject( &font ) ;								  
*/ 
	CRect	rect ;		//无效矩形 
	//设置英文串无效区 
	rect.left	=4 ; 
	rect.top	=2 ; 
//	rect.right	=rect.left+pDC->GetTextExtent( m_sInputBuff , 
//					m_nInputLen ).cx ; 
	rect.right	=(m_nMainWidth-4-4*(12-2)/2)-(4+3*12)-1 ; 
	rect.bottom	=m_nMainHeight/2-1 ; 
	InvalidateRect( &rect , FALSE ) ; 
	 
	//设置汉字无效区 
	rect.top	=m_nMainHeight/2+1 ; 
//	rect.right	=rect.left+pDC->GetTextExtent( m_sShowHzBuff , 
//					m_nShowHzLen ).cx ; 
	rect.right	=(m_nMainWidth-4-8*(12-2)/2)-1 ; 
	rect.bottom	=m_nMainHeight - 1 ; 
	InvalidateRect( &rect , FALSE ) ; 
 
	SendMessage( WM_PAINT ) ; 
 
//	pDC->SelectObject( pOldFont ) ;	 
//	ReleaseDC( pDC ) ; 
} 
 
//根据输入的英文串,得到汉字,或者进行翻页 
BOOL	CInputBar::GetHz( int nFlag ) 
{ 
	if( m_nInputLen < 1 ) 
	{ 
		m_nHzItemNum	=0 ; 
		return 0 ; 
	} 
	 
	//得到编码结果 
	int	nResult ; 
	if( GetInputMethod() )	//当前输入法不是内码输入法 
		nResult	=GetOutputHz( m_sInputBuff , m_nInputLen ,  
							m_sShowHzBuff , MAX_HZ_BUFF_LEN ,  
							(LPINT)&m_nShowHzLen , nFlag ) ; 
	else	//是内码输入法 
		//得到该输入串所对应的中文等 
		nResult	=GetHzOfCode( m_sInputBuff , m_nInputLen , 
							m_sShowHzBuff , (LPINT)&m_nShowHzLen , nFlag ) ; 
 
//返回0:出错或输入字符不合法 
//返回1:只可以向下翻页 
//返回2:只可以向上翻页 
//返回3:可以向下也可以向上翻页 
//返回4:不能进行翻页 
	if( !nResult ) 
		return 0 ;	//出错了 
 
   	if( m_nScrollButtonStatus != nResult ) 
		ShowScrollPage( nResult ) ;		//改变翻页按钮 
									 
	//分析结果							  
	m_nHzItemNum	=0 ; 
	int	nFirst	=1 ;	//指向一个串的开始,将数字去掉 
	for( int i=0 ; i= MAX_HZ_ITEM )	//汉字项数已经最多了 
				goto l100 ; 
				 
			nFirst	=i+2 ;	//修正串开始指针 
		} 
 
	if( i > nFirst ) 
	{ 
		//加入最后一个串		 
		_fstrncpy( m_sHzBuff[m_nHzItemNum] , m_sShowHzBuff+nFirst , 
					i-nFirst ) ; 
		m_sHzBuff[m_nHzItemNum][i-nFirst]	='\0' ;	//结束标记 
		m_nHzItemNum++ ;	//汉字项数增加 
	} 
	 
l100: 
	if( GetInputMethod() )	//当前输入法不是内码输入法 
	{ 
		switch( GetInputCode() )	//判断输入内码 
		{ 
			case	1:	//BIG5 
				for( i=0 ; i=m_nHzItemNum ) 
		return ; 
 
	//输出结果 
	SendHz( m_sHzBuff[n] ) ;	 
 
	//清空输入板 
	ClearChars() ; 
}		 
 
//改变翻页按钮 
void	CInputBar::ShowScrollPage( int nStatus ) 
{ 
	m_nScrollButtonStatus	=nStatus ; 
	switch( m_nScrollButtonStatus ) 
	{ 
		case	1:		//只可以向右翻页 
			//隐藏输入法菜单 
			m_OButton[4].ShowWindow( SW_HIDE ) ; 
			//隐藏向左翻页按钮 
			m_OButton[5].ShowWindow( SW_HIDE ) ;	 
			//显示向右翻页按钮 
			m_OButton[6].ShowWindow( SW_SHOWNOACTIVATE ) ; 
			m_OButton[6].UpdateWindow() ; 
			 
			//设置翻页按钮的有效性 
			SetScrollPageKeysStatus( 0 , 1 ) ; 
			break ; 
		case	2:	//只可以向左翻页			 
			//隐藏输入法菜单 
			m_OButton[4].ShowWindow( SW_HIDE ) ; 
			//隐藏向右翻页按钮 
			m_OButton[6].ShowWindow( SW_HIDE ) ;	 
			//显示向左翻页按钮 
			m_OButton[5].ShowWindow( SW_SHOWNOACTIVATE ) ; 
			m_OButton[5].UpdateWindow() ; 
 
			//设置翻页按钮的有效性 
			SetScrollPageKeysStatus( 1 , 0 ) ; 
			break ; 
		case	3:	//可以向左也可以向右翻页 
			//隐藏输入法菜单 
			m_OButton[4].ShowWindow( SW_HIDE ) ; 
			//显示向左翻页按钮 
			m_OButton[5].ShowWindow( SW_SHOWNOACTIVATE ) ; 
			m_OButton[5].UpdateWindow() ; 
			//显示向右翻页按钮 
			m_OButton[6].ShowWindow( SW_SHOWNOACTIVATE ) ;	 
			m_OButton[6].UpdateWindow() ; 
 
			//设置翻页按钮的有效性 
			SetScrollPageKeysStatus( 1 , 1 ) ; 
			break ; 
		default:	//不可以翻页 
			//显示输入法菜单 
			m_OButton[4].ShowWindow( SW_SHOWNOACTIVATE ) ; 
			m_OButton[4].UpdateWindow() ; 
			//隐藏向左翻页按钮 
			m_OButton[5].ShowWindow( SW_HIDE ) ; 
			//隐藏向右翻页按钮 
			m_OButton[6].ShowWindow( SW_HIDE ) ;	 
 
			//设置翻页按钮的有效性 
			SetScrollPageKeysStatus( 0 , 0 ) ; 
	} 
} 
 
//响应自定义消息函数,响应输入板上的字符操作 
//返回,0不是操作,1是操作并且放弃这条消息 
LONG CInputBar::OnInputChar( WPARAM wParam , LPARAM lParam ) 
{ 
	int		nFlag =0 ;		//标记是否是从头查询 
 
	switch( wParam ) 
	{ 
		case	VK_BACK:	//删除光标左边字符 
			if( !DelOneChar( 1 ) )	//删除左边字符不成功 
				return	0 ; 
			if( m_nInputLen )	//还有 
			{ 
				m_sInputBuff[m_nInputLen]	='\0' ; 
				GetHz( nFlag ) ; 
			} 
			else 
			{ 
				m_nHzItemNum	=0 ; 
				m_nShowHzLen	=0 ; 
				ShowScrollPage( 4 ) ;	//显示输入法按钮,隐藏翻页按钮 
			} 
 
			ShowInput() ; 
			ShowInputCursor() ;	//显示光标 
			return	1 ; 
		case	VK_DELETE:	//删除当前字符 
			if( !DelOneChar( 0 ) ) 
				return	0 ; 
			if( m_nInputLen )	//还有 
			{ 
				m_sInputBuff[m_nInputLen]	='\0' ; 
				GetHz( nFlag ) ; 
			} 
			else 
			{ 
				m_nHzItemNum	=0 ; 
				m_nShowHzLen	=0 ; 
				ShowScrollPage( 4 ) ;	//显示输入法按钮,隐藏翻页按钮 
			} 
 
			ShowInput() ; 
			ShowInputCursor() ;	//显示光标 
			return	1 ; 
		case	VK_ESCAPE:	//清空字符串 
			if( !ClearChars() ) 
				return	0 ; 
 
			ShowInput() ; 
			ShowInputCursor() ;	//显示光标 
			return	1 ; 
		case	VK_LEFT:	//光标左键 
			HideInputCursor() ;	//隐藏光标 
			if( !CursorLeft() ) 
				return	0 ; 
				 
			ShowInputCursor() ;	//显示光标 
			return	1 ; 
		case	VK_RIGHT:	//光标右键 
			HideInputCursor() ;	//隐藏光标 
			if( !CursorRight() ) 
				return	0 ; 
 
			ShowInputCursor() ;	//显示光标 
			return	1 ; 
		case	VK_HOME:	//到行首 
			HideInputCursor() ;	//隐藏光标 
			if( !CursorHome() ) 
				return	0 ; 
 
			ShowInputCursor() ;	//显示光标 
			return	1 ; 
		case	VK_END:	//到行尾 
			HideInputCursor() ;	//隐藏光标 
			if( !CursorEnd() ) 
				return	0 ; 
				 
			ShowInputCursor() ;	//显示光标 
			return	1 ; 
		case	VK_SPACE:	//SPACEBAR 
			if( m_nHzItemNum )		//有汉字 
			{ 
				SendOutHz( 0 ) ;		//发送第一个汉字 
				ShowInput() ; 
				ShowInputCursor() ;	//显示光标 
				return	1 ; 
			} 
			return	0 ; 
		default: 
			//将虚拟键转换成ASC码 
			BYTE	b	=VKeyToAscii( wParam , 1 ) ; 
			if( !b ||	//不是ASCII码 
				(b>='A' && b<='Z') )	//是大写字母,一律无效 
				return	0 ; 
 
			if( GetInputMethod() )	//当前输入法不是内码输入法 
			{ 
				//是数字键 
				if( b > '0' && (int)(b-'1') < m_nHzItemNum ) 
				{ 
					SendOutHz( b-(int)'1' ) ; 
					ShowInput() ; 
					return	1 ; 
				} 
 
				if( !CheckInput( (LPCSTR)&b , 1 ) )		//不合格 
					return	0 ; 
 
				if( m_nInputLen==GetInputMethodMaxLen() )	//输入长度已经超出 
				{ 
					if( !m_nHzItemNum )	//没有结果	 
						ClearChars() ;	//清空输入板 
					else 
						SendOutHz( 0 ) ;	//送出第一个汉字 
 
					ShowInput() ;		//显示输入结果 
				} 
				 
				if( !m_nInputLen )		//还没有输入 
					nFlag	=0 ;	//从头查 
				else 
					nFlag	=1 ;	//继续查 
 
				if( !AddOneChar( (char)b ) )	//增加一个字符不成功 
					return	0 ; 
 
				GetHz( nFlag ) ;		//得到已经输入串的中文 
 
				//满了,并且只有一个结果 
				if( m_nInputLen == GetInputMethodMaxLen() &&  
					m_nHzItemNum==1 ) 
					SendOutHz( 0 ) ;			//送出第一个汉字 
			} 
			else	//当前输入法是内码输入法 
			{ 
				AddOneChar( (char)b ) ;	//增加一个字符 
				if( !GetHz( nFlag ) )	//该输入字符不合法 
				{ 
					//是数字键 
					if( b >= '0' && 
						(int)(b-'0') < m_nHzItemNum ) 
					{ 
						SendOutHz( (int)(b-'0') ) ; 
						ShowInput() ; 
						return	1 ; 
					} 
					 
					DelOneChar( 1 ) ; 
					return	0 ; 
				} 
				else	//输入字符合法 
					if( m_nInputLen == 4 )	//满了 
						SendOutHz( 0 ) ;			//送出第一个汉字 
			} 
			 
			ShowInput() ;	//显示输入结果 
			ShowInputCursor() ;	//显示光标 
			return	1 ;		//抛弃这条消息 
	} 
	 
	return	0 ;		//让系统处理这条消息 
} 
 
BOOL CInputBar::AddOneChar( char c ) 
{ 
	if( m_nInputLen>=MAX_INPUT_LEN )	//长度超出 
		return	0 ; 
		 
	//空出一个位置 
	for( int i=m_nInputLen ; i>m_nInputCursorPos ; i-- ) 
		m_sInputBuff[i]	=m_sInputBuff[i-1] ; 
    //加入该字符 
    m_sInputBuff[m_nInputCursorPos++]	=c ; 
    //增加字符长度 
    m_nInputLen++ ; 
     
    return	1 ; 
} 
                                           
//bFlag为1删除光标左边字符,0删除当前字符 
BOOL CInputBar::DelOneChar( BOOL bFlag ) 
{ 
	if( bFlag )	//删除光标左边的字符 
	{ 
		if( !m_nInputCursorPos )	//光标已经到最左边 
			return	0 ;	//忽略 
		m_nInputCursorPos-- ;	//光标位置左移 
	} 
	else	//删除光标下的字符 
	{ 
		if( m_nInputCursorPos==m_nInputLen )	//光标在最右边 
			return	0 ; 
	} 
	 
	m_nInputLen-- ;		//减少长度 
	//删除光标左边的字符 
	for( int i=m_nInputCursorPos ; iSelectObject( &font ) ;								  
 
	RECT	rect ; 
	rect.left	=pDC->GetTextExtent( m_sInputBuff ,  
								m_nInputCursorPos ).cx + 4 ; 
	rect.top	=2 ; 
	rect.right	=rect.left+2 ; 
	rect.bottom	=m_nMainHeight/2-1 ; 
 
	CBrush	tempBrush( RGB( 255 , 0 , 0 ) ) ; 
	pDC->FillRect( &rect , &tempBrush ) ; 
	m_bCursorStatus	=0 ; 
 
	pDC->SelectObject( pOldFont ) ;	 
 
	ReleaseDC( pDC ) ; 
}		 
 
//隐藏光标 
void CInputBar::HideInputCursor( void ) 
{ 
	CDC	*pDC	=GetDC() ; 
 
	//创建所需要的字体	 
	CFont	font ; 
	font.CreateFont( m_nMainHeight/2-3 ,			//高度 
					0 , 0 , 0 , 						//宽度等 
					FW_NORMAL , 
					FALSE , FALSE , 0 , 
					ANSI_CHARSET , 
					OUT_DEFAULT_PRECIS , 
					CLIP_DEFAULT_PRECIS , 
					DEFAULT_QUALITY  , 
				 	DEFAULT_PITCH , NULL ) ; 
	CFont	*pOldFont	=(CFont*)pDC->SelectObject( &font ) ;								  
 
	RECT	rect ; 
	rect.left	=pDC->GetTextExtent( m_sInputBuff ,  
							m_nInputCursorPos ).cx + 4 ; 
	rect.top	=2 ; 
	rect.right	=rect.left+2 ; 
	rect.bottom	=m_nMainHeight/2-1 ; 
 
	InvalidateRect( &rect ) ; 
	m_bCursorStatus	=1 ; 
 
	pDC->SelectObject( pOldFont ) ;	 
 
	ReleaseDC( pDC ) ; 
} 
 
//响应自定义消息函数,响应改变输入板上的按钮状态 
LONG CInputBar::OnChangeButtonStatus( WPARAM wParam , LPARAM lParam ) 
{ 
	if( wParam<0 || wParam>m_nButtonNum-1 ) 
		return 0 ; 
		 
	m_OButton[wParam].ChangeButtonStatus() ; 
	return	1 ;    
} 
 
//响应自定义消息函数,进行翻页 
LONG CInputBar::OnScrollPage( WPARAM wParam , LPARAM lParam ) 
{ 
	if( GetHz( (int)wParam ) ) 
	{ 
		ShowInput() ;		//显示结果 
		return	1 ; 
	} 
	 
	return	0 ; 
}