📄 hint.cpp
字号:
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 + -