⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hint.cpp

📁 支持Windows 3.x、Windows 9x平台上的中文(GB、Big5)、日文(Shift JIS、EUC JIS)、韩文(KS C 5601)、HZ码的显示与输入,智能内码识别
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// hint.cpp : implementation file
//

#include	"stdafx.h"
#include	"cskernel.h"
#include	"cspublic.h"

static int		p_nHintWndFlag	=0 ;	//0没有,1显示临时窗口,2显示解释窗口,3显示提示窗口
static HWND	p_hHintWnd=NULL ;
static	COLORREF	p_HintColor=0 ;	//hint窗口的颜色
//隐藏翻译结果
void	HideThisWin( void ) ;
//详细解释指取结果
void ShowHint1( int nXStart , int nYStart , 
				LPSTR lpsStr , int nLen ) ;	//详细显示指取结果
//简单显示解释结果
void ShowHint2( int nXStart , int nYStart , 
				LPSTR lpsStr , int nLen ) ;

#ifdef __cplusplus
extern "C" {
#endif

//设置HINT和临时显示窗口句柄
void __export FAR PASCAL SetHintHwnd( HWND hHint )
{
	p_hHintWnd	=hHint ;
}	

//显示一个临时窗口
void __export FAR PASCAL	ShowTempWin( int nXStart , int nYStart , 
										int nWidth , int nHeight )
{
	if( !p_hHintWnd )
		return ;
	if( !p_nHintWndFlag &&	//已经显示
		p_nHintWndFlag!=1 )	//不是自己在显示
		HideThisWin() ;
		
	SetWindowPos( p_hHintWnd , HWND_TOPMOST , nXStart , nYStart , 
						nWidth , nHeight , 
        			            SWP_NOACTIVATE | SWP_SHOWWINDOW ) ;
	p_nHintWndFlag	=1 ;	//标记窗口已经显示		                            
}

//隐藏临时窗口                
void __export FAR PASCAL	HideTempWin( void ) 
{
	HideThisWin() ;
}

//显示hint
static	g_nFingerStatus	=0 ;
void __export FAR PASCAL	ShowHint( int nXStart , int nYStart , 
				LPSTR lpsStr , int nLen )
{
	if( !p_hHintWnd )
		return ;
	if( !p_nHintWndFlag &&	//已经显示
		p_nHintWndFlag!=2 )	//不是自己在显示
		HideThisWin() ;

	g_nFingerStatus	=GetFingerTranslate() ;
	if( g_nFingerStatus )
	{
		HookFingerOff1() ;	//指取翻译有效
		SetFingerTranslate( 0 ) ;
	}

	p_HintColor	=RGB( 255 , 255 , 128 ) ;
	ShowHint2( nXStart , nYStart , lpsStr , nLen ) ;
	p_nHintWndFlag	=2 ;	//标记窗口已经显示		                            
}
				
//隐藏hint
void __export FAR PASCAL	HideHint( void ) 
{
	HideThisWin() ;

	if( g_nFingerStatus )
	{
		SetFingerTranslate( g_nFingerStatus ) ;
		g_nFingerStatus	=0 ;
		HookFingerOn1() ;	//指取翻译有效
	}
}

//显示翻译结果
void __export FAR PASCAL	ShowFinger( int nXStart , int nYStart , 
				LPSTR lpsStr , int nLen )
{
	if( !p_hHintWnd )
		return ;
	if( !p_nHintWndFlag &&	//已经显示
		p_nHintWndFlag!=3 )	//不是自己在显示
		HideThisWin() ;

	CPoint	CurrentPoint ;
	GetCursorPos( &CurrentPoint ) ;	//得到当前点
	//得到当前点下的窗口
	HWND	hParentWnd	=::WindowFromPoint( CurrentPoint ) ;
	if( !hParentWnd )
		return ;
	//关闭窗口
	HWND	closeWnd	=::FindWindow( NULL , "Close Program" ) ;
	if( closeWnd==hParentWnd || ::IsChild( closeWnd , hParentWnd ) )
		return ;	//不对关闭窗口及其子窗口处理
	HWND	close1Wnd	=::FindWindow( NULL , "关闭程序" ) ;
	if( close1Wnd==hParentWnd || ::IsChild( close1Wnd , hParentWnd ) )
		return ;
	//WIN切换窗口的窗口句柄
	HWND	alt_tabWnd	=::FindWindow( "#32771" , NULL ) ;
	if( alt_tabWnd==hParentWnd )	//不对切换窗口处理
		return ;
//------------------------------------------------------------------//	
	p_HintColor	=RGB( 255 , 255 , 0 ) ;
	if( GetWinOrBar() )	//详细显示解释结果
		ShowHint1( nXStart , nYStart , lpsStr , nLen ) ;
	else	//简单显示解释结果
		ShowHint2( nXStart , nYStart , lpsStr , nLen ) ;

	p_nHintWndFlag	=3 ;	//标记窗口已经显示		                            
}

//隐藏翻译结果
void __export FAR PASCAL	HideFinger( void ) 
{
	HideThisWin() ;
}

#ifdef __cplusplus
}
#endif

//隐藏翻译结果
void	HideThisWin( void )
{
	ShowWindow( p_hHintWnd , SW_HIDE ) ;
	p_nHintWndFlag	=0 ;
}

//简单显示解释结果
void ShowHint2( int nXStart , int nYStart , 
									LPSTR lpsStr , int nLen )
{
	int		nOldBkMode ;
	COLORREF	oldColor ;
	HDC		dc ;
	//得到字符串的宽度与高度
	DWORD	WidthHeight ;
	int		wWidth ;
	int		wHeight ;
	//得到桌面窗口的宽度与高度
	RECT	rectOfDesktop ;

	dc	=GetDC( p_hHintWnd ) ;
						
	//创建所需要的字体	
	HFONT	hFont	=::CreateFont( 16 ,			//高度
					0 , 0 , 0 , 						//宽度等
					FW_NORMAL ,
					FALSE , FALSE , 0 ,
					ANSI_CHARSET ,
					OUT_DEFAULT_PRECIS ,
					CLIP_DEFAULT_PRECIS ,
					DEFAULT_QUALITY  ,
				 	DEFAULT_PITCH , "Courier New" ) ;
	HFONT	hOldFont	=(HFONT)SelectObject( dc , hFont ) ;

	WidthHeight	=GetHzTextExtent( dc , lpsStr , nLen ) ;
	wWidth	=LOWORD( WidthHeight ) + 2 ;
	wHeight	=HIWORD( WidthHeight ) + 2 ;
//------------------------------------------------------------------------------//

	GetWindowRect( GetDesktopWindow() , &rectOfDesktop ) ;	
	
	//计算显示位置
	nXStart	=max( 0 , min( nXStart , rectOfDesktop.right-wWidth ) ) ;
	if( nYStart > rectOfDesktop.bottom-wHeight )
	{
		POINT	p ;
		GetCursorPos ( &p ) ;	//得到鼠标位置
		nYStart	=p.y - wHeight - wHeight/2 ;
//		nYStart	=rectOfDesktop.bottom-wHeight-wHeight ;
	}

	//设置窗口大小与位置	
	SetWindowPos( p_hHintWnd , HWND_TOPMOST , nXStart , nYStart , 
								wWidth , wHeight , 
	                            SWP_NOACTIVATE | SWP_SHOWWINDOW ) ;

	//显示框
	RECT	rect={ 0 , 0 , wWidth-1 , wHeight-1 } ;
	DrawOneLineBox( dc , rect , 1 , RGB( 192 , 192 , 192 ) ,
		RGB( 128 , 128 , 128 ) , p_HintColor ) ;

	//显示翻译结果
	nOldBkMode	=SetBkMode( dc , TRANSPARENT ) ;	
	oldColor	=SetTextColor( dc , RGB( 0 , 0 , 0 ) ) ;
	TextOutString( dc , 1 , 1 , lpsStr , nLen ) ;
	SetTextColor( dc , oldColor ) ;
	SetBkMode( dc , nOldBkMode ) ;

	SelectObject( dc , hOldFont ) ;	
	DeleteObject( hFont ) ;

	ReleaseDC( p_hHintWnd , dc ) ;
}

//详细解释指取结果
#define	MAX_HINT_CHAR	100			//一行最大字节数		
#define	MAX_HINT_LINE	15			//提示最大行数
#define	TIP_HEIGHT	20		//尖高度
#define	TIP_WIDTH	10		//尖宽度
#define	SHADOW_WIDTH	5		//阴影宽度
#define	SHADOW_HEIGHT	5		//阴影高度
static	char	sHintBuff[MAX_HINT_LINE][MAX_HINT_CHAR+1] ;
void ShowHint1( int nXStart , int nYStart , 
				LPSTR lpsStr , int nLen )	//详细显示指取结果
{
	HDC	dc	=GetDC( p_hHintWnd ) ;

	HFONT	hFont1 , hFont2 , hOldFont2 ;
	//创建显示音标所需要的字体	
	hFont1	=CreateFont( 16 ,			//高度
								0 , 0 , 0 , 						//宽度等
								FW_NORMAL ,
								FALSE , FALSE , 0 ,
								ANSI_CHARSET ,
								OUT_DEFAULT_PRECIS ,
								CLIP_DEFAULT_PRECIS ,
								DEFAULT_QUALITY  ,
							 	DEFAULT_PITCH , "liuy" ) ;
	//创建显示正文所需要的字体	
	hFont2	=::CreateFont( 16 ,			//高度
					0 , 0 , 0 , 						//宽度等
					FW_NORMAL ,
					FALSE , FALSE , 0 ,
					ANSI_CHARSET ,
					OUT_DEFAULT_PRECIS ,
					CLIP_DEFAULT_PRECIS ,
					DEFAULT_QUALITY  ,
				 	DEFAULT_PITCH , "Courier New" ) ;
	hOldFont2	=(HFONT)::SelectObject( dc , hFont2 ) ;
//-----------------------------------------------------------------------------//
	//得到桌面窗口的宽度与高度
	RECT	rectOfDesktop ;
	GetWindowRect( GetDesktopWindow() , &rectOfDesktop ) ;	

	DWORD	WidthHeight ;		//字符串的宽度与高度
	int		nLineHeight ;	//一行高度
	WidthHeight	=GetHzTextExtent( dc , lpsStr , nLen ) ;
	nLineHeight	=HIWORD( WidthHeight ) ;	//一行的高度
//--------------------------------------------------------------------------------//	

	//hint缓冲区
//	char	sHintBuff[MAX_HINT_LINE][MAX_HINT_CHAR+1] ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -