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

📄 hint.cpp

📁 支持Windows 3.x、Windows 9x平台上的中文(GB、Big5)、日文(Shift JIS、EUC JIS)、韩文(KS C 5601)、HZ码的显示与输入,智能内码识别
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	int			nHintLineNum	=0 ;	//hint行数
	int			nHintCharNum	=0 ;	//HINT中一行的字节数
	int			nMaxWidth	=0 ;		//HINT窗口中内容的最大宽度
	
	//得到原单词的内容
	int	nLineWidth ;	//一行宽度
	int	nSourceWordFlag=1 ;		//原来单词标记
	for( int i=0 ; i<nLen ; )
	{
		nLineWidth	=LOWORD( 		//该行宽度
			GetHzTextExtent( dc , sHintBuff[nHintLineNum] , nHintCharNum ) ) ;		
		if( i<nLen-1 )	//至少还有一个字符
		{
			if( (BYTE)lpsStr[i] & 0x80 )	//是一个汉字
			{
				if( nHintCharNum > MAX_HINT_CHAR-2 ||//至少能放两字节
					nLineWidth+LOWORD( GetHzTextExtent( dc , lpsStr+i , 2 ) ) +
					TIP_WIDTH+TIP_WIDTH+SHADOW_WIDTH>=
						rectOfDesktop.right/2 )	//宽度不超过屏幕宽度一半
				{	//一行结束,另起一行
					if( nLineWidth > nMaxWidth )	//宽度超过最大宽度
						nMaxWidth	=nLineWidth ;	//记录最大宽度

					sHintBuff[nHintLineNum][nHintCharNum]	='\0' ;	//结束标记						
					nHintLineNum++ ;
					if( nHintLineNum >= MAX_HINT_LINE ||	//行数到头了
						 (nHintLineNum+1)*nLineHeight+TIP_HEIGHT+
						 3*SHADOW_HEIGHT>=rectOfDesktop.bottom/2 )	//高度超过屏幕高度一半
						break ;

					nHintCharNum	=0 ;	//该行字符数为0
				}
				//记录该汉字
				sHintBuff[nHintLineNum][nHintCharNum++]	=lpsStr[i++] ;
				sHintBuff[nHintLineNum][nHintCharNum++]	=lpsStr[i++] ;
				
				continue ;
			}
			
			if( (lpsStr[i]=='\r' && lpsStr[i+1]=='\n') ||	//一行结束
				 (lpsStr[i]==';' && lpsStr[i+1]==' ' ) )
			{
				if( nLineWidth > nMaxWidth )	//宽度超过最大宽度
					nMaxWidth	=nLineWidth ;	//记录最大宽度

				sHintBuff[nHintLineNum][nHintCharNum]	='\0' ;	//结束标记
				nHintLineNum++ ;	//增加行数
				if( nHintLineNum >= MAX_HINT_LINE ||	//行数到头了
					 (nHintLineNum+1)*nLineHeight+TIP_HEIGHT+
					 3*SHADOW_HEIGHT>=rectOfDesktop.bottom/2 )	//高度超过屏幕高度一半
					break ;

				nHintCharNum	=0 ;	//该行字符数为0
				i++ ;		//去掉这两个行结束符
				i++ ;
				
				continue ;
			}
		}
											
		if( (lpsStr[i] == ':' && nSourceWordFlag ) ||	//是原单词结束符
			 lpsStr[i] ==';' )
		{
			if( lpsStr[i] == ':' )
				nSourceWordFlag	=0 ;	//取消标记
			if( nLineWidth > nMaxWidth )	//宽度超过最大宽度
				nMaxWidth	=nLineWidth ;	//记录最大宽度

			sHintBuff[nHintLineNum][nHintCharNum]	='\0' ;	//结束标记
			nHintLineNum++ ;	//增加行数
			if( nHintLineNum >= MAX_HINT_LINE ||	//行数到头了
				 (nHintLineNum+1)*nLineHeight+TIP_HEIGHT+
				 3*SHADOW_HEIGHT>=rectOfDesktop.bottom/2 )	//高度超过屏幕高度一半
				break ;

			nHintCharNum	=0 ;	//该行字符数为0
			i++ ;		//去掉该字符
				
			continue ;
		}

        //是普通西文字符
		if( nHintCharNum > MAX_HINT_CHAR-1 ||//至少能放一字节
			nLineWidth+LOWORD( GetHzTextExtent( dc , lpsStr+i , 2 ) ) +
			TIP_WIDTH+TIP_WIDTH+SHADOW_WIDTH>=
			rectOfDesktop.right/2 )	//宽度不超过屏幕宽度一半
		{	//一行结束,另起一行
			if( nLineWidth > nMaxWidth )	//宽度超过最大宽度
				nMaxWidth	=nLineWidth ;	//记录最大宽度

			sHintBuff[nHintLineNum][nHintCharNum]	='\0' ;	//结束标记						
			nHintLineNum++ ;	//增加行数
			if( nHintLineNum >= MAX_HINT_LINE ||	//行数到头了
				 (nHintLineNum+1)*nLineHeight+TIP_HEIGHT+
				 3*SHADOW_HEIGHT>=rectOfDesktop.bottom/2 )	//高度超过屏幕高度一半
				break ;

			nHintCharNum	=0 ;	//该行字符数为0
		}
		//记录该字符
		sHintBuff[nHintLineNum][nHintCharNum++]	=lpsStr[i++] ;
	}
	if( i==nLen )	//扫遍所有字符
	{
		nLineWidth	=LOWORD( 		//该行宽度
			GetHzTextExtent( dc , sHintBuff[nHintLineNum] , nHintCharNum ) ) ;
		if( nLineWidth > nMaxWidth )	//宽度超过最大宽度
			nMaxWidth	=nLineWidth ;	//记录最大宽度

		sHintBuff[nHintLineNum][nHintCharNum]	='\0' ;	//结束标记						
		nHintLineNum++ ;	//加上最后一行
	}
//-------------------------------------------------------------------------------//
	//计算显示窗口的宽度与高度,包括阴影
	int		nWidth	=nMaxWidth+TIP_WIDTH*2+SHADOW_WIDTH ;
	int		nHeight	=nHintLineNum*nLineHeight+TIP_HEIGHT+
							SHADOW_HEIGHT*3 ;
	
	//计算显示位置
	int	nXFlag	=0 ;
	int	nYFlag	=0 ;
	if( nXStart > rectOfDesktop.right-nWidth )	//超过屏幕了
	{
		nXStart	-=nWidth ;	//X反向
		nXFlag	=1 ;
	}
	if( nYStart > rectOfDesktop.bottom-nHeight )
	{
		POINT	cursorPos ;	//鼠标位置
		GetCursorPos( &cursorPos ) ;

		nYStart	=cursorPos.y - nHeight - 
						GetSystemMetrics( SM_CYCURSOR )/3  ;	//光标高度一半
		nYFlag	=1 ;
	}
		
	//设置窗口大小与位置
	SetWindowPos( p_hHintWnd , HWND_TOPMOST , nXStart , nYStart , 
								nWidth , nHeight , 
	                            SWP_NOACTIVATE | SWP_SHOWWINDOW ) ;
//---------------------------------------------------------------------------------//	                            
	//设置笔与画刷
	HPEN	hBlackPen	=CreatePen( PS_SOLID , 0 , RGB( 0 , 0 , 0 ) ) ;	//黑笔 ;
	HBRUSH	hYellowBrush	=CreateSolidBrush( RGB( 255 , 255 , 150 ) ) ;	//黄刷
	HBRUSH	hShadowBrush	=CreateSolidBrush( RGB( 128,128,128));//165,165,165));//111,111,0 ) ) ;	//阴影刷子
	HPEN	pOldPen ;
	HBRUSH	pOldBrush ;
				
	//设置笔与画刷
	pOldPen		=(HPEN)::SelectObject( dc , hBlackPen ) ;
	pOldBrush	=(HBRUSH)::SelectObject( dc , hShadowBrush ) ;	//阴影刷子
	//画一个矩形阴影
	int	nX , nY , nX1 , nY1 ;
	if( nXFlag )	//X反向了
	{
		nX	=0 ;
		nX1	=nWidth-SHADOW_WIDTH ;
	}
	else
	{
		nX	=SHADOW_WIDTH ;
		nX1	=nWidth ;
	}
	if( nYFlag )	//Y反向了
	{
		nY	=0 ;
		nY1	=nHeight-TIP_HEIGHT-SHADOW_HEIGHT ;
	}
	else
	{
		nY	=TIP_HEIGHT+SHADOW_HEIGHT ;
		nY1	=nHeight ;
	}
	Rectangle( dc , nX , nY , nX1 , nY1 ) ;

	POINT	points[5] ;	//HINT窗口的五个顶点
	if( nXFlag )	//X反向了
	{
		points[0].x	=nWidth-1 ;
		points[1].x	=nWidth-TIP_WIDTH ;
		points[2].x	=SHADOW_WIDTH ;
		points[3].x	=SHADOW_WIDTH ;
		points[4].x	=nWidth-1 ;
	}
	else
	{
		points[0].x	=0 ;
		points[1].x	=TIP_WIDTH ;
		points[2].x	=nWidth-SHADOW_WIDTH ;
		points[3].x	=nWidth-SHADOW_WIDTH ;
		points[4].x	=0 ;
	}
	if( nYFlag )	//Y反向了
	{
		points[0].y	=nHeight ;
		points[1].y	=nHeight-TIP_HEIGHT ;
		points[2].y	=nHeight-TIP_HEIGHT ;
		points[3].y	=SHADOW_HEIGHT ;
		points[4].y	=SHADOW_HEIGHT ;
	}
	else
	{
		points[0].y	=0 ;
		points[1].y	=TIP_HEIGHT ;
		points[2].y	=TIP_HEIGHT ;
		points[3].y	=nHeight-SHADOW_HEIGHT ;
		points[4].y	=nHeight-SHADOW_HEIGHT ;
	}
	::SelectObject( dc , hYellowBrush ) ;	//HINT窗口刷子
	Polygon( dc , points , 5 ) ;	//HINT窗口

	//显示翻译结果
	int	nOldBkMode	=SetBkMode( dc , TRANSPARENT ) ;	
	COLORREF	oldColor	=SetTextColor( dc , RGB( 0 , 0 , 0 ) ) ;
	if( nXFlag )	//X反向了
		nX	=SHADOW_WIDTH+TIP_WIDTH ;
	else
		nX	=TIP_WIDTH ;
	if( nYFlag )	//Y反向了
		nY	=SHADOW_HEIGHT*2 ;
	else
		nY	=TIP_HEIGHT+SHADOW_HEIGHT ;
    
    HFONT	hOldFont1 ;
	for( i=0 ; i<nHintLineNum ; i++ )
	{
		nLineWidth	=_fstrlen( sHintBuff[i] ) ;
		if( sHintBuff[i][0]=='[' && sHintBuff[i][nLineWidth-1]==']' )
		{
			//是音标
			hOldFont1	=(HFONT)::SelectObject( dc , hFont1 ) ;
			TextOutString( dc , nX , nY , sHintBuff[i] , nLineWidth ) ;
			SelectObject( dc , hOldFont1 ) ;
		}
		else
			TextOutString( dc , nX , nY , sHintBuff[i] , nLineWidth ) ;

		nY	+=nLineHeight ;
	}
	
	SetTextColor( dc , oldColor ) ;
	SetBkMode( dc , nOldBkMode ) ;

	//恢复笔与画刷   
	SelectObject( dc , pOldPen ) ;
	SelectObject( dc , pOldBrush ) ;
	DeleteObject( hBlackPen ) ;
	DeleteObject( hShadowBrush ) ;
	DeleteObject( hYellowBrush ) ;

	SelectObject( dc , hOldFont2 ) ;
	DeleteObject( hFont1 ) ;
	DeleteObject( hFont2 ) ;
	
	ReleaseDC( p_hHintWnd , dc ) ;
}

⌨️ 快捷键说明

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