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 ;
}