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

📄 stockgraph.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
			pDC->MoveTo( xMedium, m_rectKLineCenter.bottom );
			pDC->LineTo( xMedium, m_rectKLineCenter.top );
		}
	}

	pDC->SetROP2( nOldDrawMode );
	pDC->SelectObject( pOldPen );
}

void CStockGraph::DrawSelectionRect( CDC * pDC, CPoint ptBegin, CPoint ptEnd, BOOL bAddOrRemove )
{
	ASSERT( m_pParent && ::IsWindow( m_pParent->GetSafeHwnd() ) );
	if( !m_pParent || !::IsWindow(m_pParent->GetSafeHwnd()) )
		return;

	CClientDC	dc(m_pParent);
	if( NULL == pDC )
		pDC		=	&dc;

	CPen	penVLine( PS_SOLID, 1, AfxGetProfile().GetColor( CColorClass::clrLine2 ) );
	CPen * pOldPen = pDC->SelectObject( &penVLine );
	int nOldDrawMode = pDC->SetROP2( R2_XORPEN );

	CRect	rect;
	rect.left	=	min(ptBegin.x,ptEnd.x);
	rect.right	=	max(ptBegin.x,ptEnd.x);
	rect.top	=	min(ptBegin.y,ptEnd.y);
	rect.bottom	=	max(ptBegin.y,ptEnd.y);

	pDC->MoveTo( rect.left, rect.top );
	pDC->LineTo( rect.right, rect.top );
	pDC->LineTo( rect.right, rect.bottom );
	pDC->LineTo( rect.left, rect.bottom );
	pDC->LineTo( rect.left, rect.top );

	pDC->SetROP2( nOldDrawMode );
	pDC->SelectObject( pOldPen );
}

void CStockGraph::DrawKData( )
{
	if( !::IsWindow( m_wndKData.GetSafeHwnd() ) )
	{
		if( !m_wndKData.Create( NULL, "", WS_CHILD, m_rectKData, m_pParent, 0 ) )
		{
			TRACE( "Failed to create m_wndKData!\n" );
			return;
		}
		m_wndKData.SetWindowPos( NULL, m_rectKData.left, m_rectKData.top, m_rectKData.Width(), m_rectKData.Height(),
								SWP_SHOWWINDOW );
	}

	CClientDC	dc(&m_wndKData);
	CRect		rectClient;
	m_wndKData.GetClientRect( &rectClient );

	CKData	&kdata	=	m_CurStock.GetKData(m_nCurKType);
	if( m_nIndexCurrent >= 0 && m_nIndexCurrent < kdata.GetSize() )
	{
		m_wndKData.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW );
		m_wndKData.ValidateRect( &rectClient );
		DrawKData( &dc, rectClient );
		m_wndKData.ValidateRect( &rectClient );
	}
	else
		m_wndKData.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW );
}

void CStockGraph::DrawKData( CDC * pDC, CRect rect )
{
	CHECK_NODATATODRAW
	DECLARE_COLOR_DEFINATION

	CStockInfo & info	=	m_CurStock.GetStockInfo();
	CKData &kdata		=	m_CurStock.GetKData( m_nCurKType );
	CKData &kdataDown	=	m_CurStockDown.GetKData( m_nCurKType );

	// Prepare kd and fLastClose
	KDATA	kd;
	memset( &kd, 0, sizeof(kd) );
	float	fLastClose	=	0;
	double	dAmount = 0, dVolume = 0, dPriceAverage = 0, dRatioChangeHand = 0, dVolumeDown = 0;
	if( m_anIndexCurrent.GetSize() > 0 
		&& (int)m_anIndexCurrent[0] < kdata.GetSize() && (int)m_anIndexCurrent[m_anIndexCurrent.GetSize()-1] < kdata.GetSize() )
	{
		int	nStart	=	m_anIndexCurrent[0];
		int	nEnd	=	m_anIndexCurrent[m_anIndexCurrent.GetSize()-1];
		kd.m_date	=	kdata.ElementAt(nStart).m_date;
		kd.m_fOpen	=	kdata.ElementAt(nStart).m_fOpen;
		kd.m_fLow	=	kdata.ElementAt(nStart).m_fLow;
		kd.m_fClose	=	kdata.ElementAt(nEnd).m_fClose;
		for( int k=0; k<m_anIndexCurrent.GetSize() && (int)m_anIndexCurrent[k]<kdata.GetSize(); k++ )
		{
			KDATA	& kdTemp	=	kdata.ElementAt(m_anIndexCurrent[k]);
			if( (int)m_anIndexCurrent[k] < nStart )
			{
				kd.m_fOpen	=	kdTemp.m_fOpen;
				kd.m_date	=	kdTemp.m_date;
				nStart	=	m_anIndexCurrent[k];
			}
			if( (int)m_anIndexCurrent[k] > nEnd )
			{
				kd.m_fClose=	kdTemp.m_fClose;
				nEnd	=	m_anIndexCurrent[k];
			}
			if( kd.m_fHigh < kdTemp.m_fHigh )
				kd.m_fHigh	=	kdTemp.m_fHigh;
			if( kd.m_fLow > kdTemp.m_fLow )
				kd.m_fLow	=	kdTemp.m_fLow;
			dAmount	+=	kdTemp.m_fAmount;
			dVolume	+=	kdTemp.m_fVolume;
			if( (int)m_anIndexCurrent[k] < kdataDown.GetSize() )
				dVolumeDown	+=	kdataDown.ElementAt(m_anIndexCurrent[k]).m_fVolume;
		}
		fLastClose	=	kd.m_fOpen;
		if( nStart - 1 >= 0 )
			fLastClose	=	kdata.ElementAt(nStart-1).m_fClose;
	}
	else if( m_nIndexCurrent >= 0 && m_nIndexCurrent < kdata.GetSize() )
	{
		kd	=	kdata.ElementAt(m_nIndexCurrent);
		dAmount	=	kd.m_fAmount;
		dVolume	=	kd.m_fVolume;
		if( m_nIndexCurrent < kdataDown.GetSize() )
			dVolumeDown	+=	kdataDown.ElementAt(m_nIndexCurrent).m_fVolume;
		fLastClose	=	kd.m_fOpen;
		if( m_nIndexCurrent - 1 >= 0 )
			fLastClose	=	kdata.ElementAt(m_nIndexCurrent-1).m_fClose;
	}
	else
		return;

	if( dVolume >= 1 )
		dPriceAverage	=	dAmount / dVolume;
	m_CurStockDown.GetStockInfo().GetRatioChangeHand( &dRatioChangeHand, dVolumeDown );

	// 相对换手率
	double	dMainChangeHand = CHSL::GetMainChangeHand( m_CurStockDown.GetStockInfo().GetMarket(), kdataDown, m_nIndexCurrent );
	double	dRelativeChangeHand = 1.0;
	if( dMainChangeHand > 1e-6 )
		dRelativeChangeHand	=	dRatioChangeHand / dMainChangeHand;

	// Fill Background
	pDC->FillSolidRect( &rect, clrBK );
	pDC->Draw3dRect( &rect, clrBorder, clrBorder );
	pDC->SetBkColor( clrBK );

	CString	strTemp;
	CFont	* pOldFont	=	AfxSelectDCFont( pDC, 14 );

	int	x	=	rect.left + 1;
	int	y	=	rect.top;
	pDC->SetTextColor( clrText );
	strTemp.LoadString( IDS_STOCKGRAPH_TIME );
	pDC->TextOut( x, y+2,   strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_OPEN );
	pDC->TextOut( x, y+37,  strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_HIGH );
	pDC->TextOut( x, y+71,  strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_LOW );
	pDC->TextOut( x, y+105, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_CLOSE );
	pDC->TextOut( x, y+139, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_VOLUME );
	pDC->TextOut( x, y+173, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_AMOUNT );
	pDC->TextOut( x, y+207, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_PRICEAVERAGE );
	pDC->TextOut( x, y+241, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_RELATIVECHANGEHAND );
	pDC->TextOut( x, y+275, strTemp );

	x	=	rect.right - 3;
	UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
	CSPTime	sptime;
	if( CKData::IsDayOrMin( m_nCurKType ) )
	{
		sptime.FromStockTimeDay( kd.m_date );
		strTemp	=	sptime.Format( "%y-%m-%d" );
	}
	else
	{
		sptime.FromStockTimeMin( kd.m_date );
		strTemp	=	sptime.Format( "%m%d%H%M" );
	}
	pDC->SetTextColor( clrPlane );
	pDC->TextOut( x, y+18, strTemp );

	// 价格小数位数格式串
	CString strPriceFmt;
	strPriceFmt.Format( "%%.%df", info.DigitBit() );

	strTemp.Format( strPriceFmt, kd.m_fOpen );
	pDC->SetTextColor( kd.m_fOpen > fLastClose ? clrRise : (kd.m_fOpen<fLastClose?clrFall:clrPlane) );
	pDC->TextOut( x, y+53, strTemp );
	
	strTemp.Format( strPriceFmt, kd.m_fHigh );
	pDC->SetTextColor( kd.m_fHigh > fLastClose ? clrRise : (kd.m_fHigh<fLastClose?clrFall:clrPlane) );
	pDC->TextOut( x, y+87, strTemp );
	
	strTemp.Format( strPriceFmt, kd.m_fLow );
	pDC->SetTextColor( kd.m_fLow > fLastClose ? clrRise : (kd.m_fLow<fLastClose?clrFall:clrPlane) );
	pDC->TextOut( x, y+121, strTemp );

	strTemp.Format( strPriceFmt, kd.m_fClose );
	pDC->SetTextColor( kd.m_fClose > fLastClose ? clrRise : (kd.m_fClose<fLastClose?clrFall:clrPlane) );
	pDC->TextOut( x, y+155, strTemp );

	strTemp.Format( "%.0f", dVolume/100 );
	pDC->SetTextColor( clrTitle );
	pDC->TextOut( x, y+189, strTemp );

	strTemp.Format( "%.0f", dAmount/1000 );
	pDC->SetTextColor( clrTitle );
	pDC->TextOut( x, y+223, strTemp );

	strTemp.Format( strPriceFmt, dPriceAverage );
	pDC->SetTextColor( clrTitle );
	pDC->TextOut( x, y+257, strTemp );

	strTemp.Format( "%.2f", dRelativeChangeHand );
	pDC->SetTextColor( clrTitle );
	pDC->TextOut( x, y+291, strTemp );

	pDC->SetTextAlign( nOldAlign );
	pDC->SelectObject( pOldFont );
}

void CStockGraph::DrawTechLine(CDC * pDC )
{
	CSPDWordArray	& anShow	=	AfxGetProfile().GetGraphTechsShow( );
	for( int k=0; k<m_arcTech.GetSize(); k++ )
	{
		CRect	rect	=	m_arcTech.ElementAt(k);
		if( k < anShow.GetSize() )
		{
			DrawTechLine( pDC, anShow[k], rect, FALSE );
			DrawTechLine( pDC, anShow[k], rect, TRUE );
		}
	}
}

void CStockGraph::DrawKLineAttribute(CDC * pDC, UINT nTech, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
	switch( nTech )
	{
	case STT_MA:		DrawTechMA( pDC, rect, bDrawTitle, dMin, dMax );		break;
	case STT_BBI:		DrawTechBBI( pDC, rect, bDrawTitle, dMin, dMax );		break;
	case STT_BOLL:		DrawTechBOLL( pDC, rect, bDrawTitle, dMin, dMax );		break;
	case STT_PV:		DrawTechPV( pDC, rect, bDrawTitle, dMin, dMax );		break;
	case STT_SAR:		DrawTechSAR( pDC, rect, bDrawTitle, dMin, dMax );		break;
	case STT_DJ:		DrawTechDJ( pDC, rect, bDrawTitle, dMin, dMax );		break;
	case STT_CW:		DrawTechCW( pDC, rect, bDrawTitle, dMin, dMax );		break;
	default:;
		ASSERT( FALSE );
	}
}

void CStockGraph::DrawTechLine(CDC * pDC, UINT nTech, CRect rect, BOOL bDrawTitle )
{
	DECLARE_COLOR_DEFINATION

	if( !bDrawTitle )
	{
		pDC->FillSolidRect( &rect, clrBK );
		pDC->FillSolidRect( CRect(m_rectAll.left,rect.top,rect.left-1,rect.bottom), clrBK );
		pDC->Draw3dRect( &rect, clrBorder, clrBorder );
	}

	switch( nTech )
	{
	case STT_MACD:		DrawTechMACD( pDC, rect, bDrawTitle );		break;
	case STT_MIKE:		DrawTechMIKE( pDC, rect, bDrawTitle );		break;
	case STT_PSY:		DrawTechPSY( pDC, rect, bDrawTitle );		break;

	case STT_VOLUME:	DrawTechVOLUME( pDC, rect, bDrawTitle );	break;
	case STT_NVI:		DrawTechNVI( pDC, rect, bDrawTitle );		break;
	case STT_PVI:		DrawTechPVI( pDC, rect, bDrawTitle );		break;
	case STT_VR:		DrawTechVR( pDC, rect, bDrawTitle );		break;
	case STT_VROC:		DrawTechVROC( pDC, rect, bDrawTitle );		break;
	case STT_OBV:		DrawTechOBV( pDC, rect, bDrawTitle );		break;
	case STT_MOBV:		DrawTechMOBV( pDC, rect, bDrawTitle );		break;
	case STT_MFI:		DrawTechMFI( pDC, rect, bDrawTitle );		break;
	case STT_VMACD:		DrawTechVMACD( pDC, rect, bDrawTitle );		break;
	case STT_WVAD:		DrawTechWVAD( pDC, rect, bDrawTitle );		break;
	case STT_EMV:		DrawTechEMV( pDC, rect, bDrawTitle );		break;
	case STT_VRSI:		DrawTechVRSI( pDC, rect, bDrawTitle );		break;
	case STT_NVRSI:		DrawTechNVRSI( pDC, rect, bDrawTitle );		break;
	case STT_AD:		DrawTechAD( pDC, rect, bDrawTitle );		break;
	case STT_CI:		DrawTechCI( pDC, rect, bDrawTitle );		break;

	case STT_KDJ:		DrawTechKDJ( pDC, rect, bDrawTitle );		break;
	case STT_R:			DrawTechR( pDC, rect, bDrawTitle );			break;
	case STT_RSI:		DrawTechRSI( pDC, rect, bDrawTitle );		break;
	case STT_BIAS:		DrawTechBIAS( pDC, rect, bDrawTitle );		break;
	case STT_MTM:		DrawTechMTM( pDC, rect, bDrawTitle );		break;
	case STT_DMI:		DrawTechDMI( pDC, rect, bDrawTitle );		break;
	case STT_ROC:		DrawTechROC( pDC, rect, bDrawTitle );		break;
	case STT_CCI:		DrawTechCCI( pDC, rect, bDrawTitle );		break;
	case STT_CV:		DrawTechCV( pDC, rect, bDrawTitle );		break;
	case STT_ARBR:		DrawTechARBR( pDC, rect, bDrawTitle );		break;
	case STT_CR:		DrawTechCR( pDC, rect, bDrawTitle );		break;
	case STT_OSC:		DrawTechOSC( pDC, rect, bDrawTitle );		break;
	case STT_UOS:		DrawTechUOS( pDC, rect, bDrawTitle );		break;
	case STT_MAOSC:		DrawTechMAOSC( pDC, rect, bDrawTitle );		break;
	case STT_36BIAS:	DrawTech3_6BIAS( pDC, rect, bDrawTitle );	break;
	case STT_DPO:		DrawTechDPO( pDC, rect, bDrawTitle );		break;
	case STT_KST:		DrawTechKST( pDC, rect, bDrawTitle );		break;

	case STT_REI:		DrawTechREI( pDC, rect, bDrawTitle );		break;
	case STT_DMKI:		DrawTechDMKI( pDC, rect, bDrawTitle );		break;
	case STT_PCNT:		DrawTechPCNT( pDC, rect, bDrawTitle );		break;
	case STT_HLC:		DrawTechHLC( pDC, rect, bDrawTitle );		break;
	case STT_CDP:		DrawTechCDP( pDC, rect, bDrawTitle );		break;
	case STT_ASI:		DrawTechASI( pDC, rect, bDrawTitle );		break;
	case STT_ATR:		DrawTechATR( pDC, rect, bDrawTitle );		break;

	case STT_CYO:		DrawTechCYO( pDC, rect, bDrawTitle );		break;
	case STT_DCYO:		DrawTechDCYO( pDC, rect, bDrawTitle );		break;
	case STT_HSL:		DrawTechHSL( pDC, rect, bDrawTitle );		break;
	case STT_DPER:		DrawTechDPER( pDC, rect, bDrawTitle );		break;

	default:
		{
			UINT nTechUserCount = CTechUser::GetTechUserCount();
			if( nTech >= STT_USER_MIN && nTech <= STT_USER_MIN+nTechUserCount-1 )
				DrawTechUser( nTech, pDC, rect, bDrawTitle );
			else
				ASSERT( FALSE );
		}
	}
}

void CStockGraph::DrawReportParam( CDC * pDC )
{
	DECLARE_COLOR_DEFINATION

	// Prepare Data
/* Old Version
	m_CurStock.PrepareData( CStock::dataK, CKData::ktypeDay );
	m_CurStock.PrepareData( CStock::dataDR );
	m_CurStock.PrepareData( CStock::dataK, m_nCurKType );
	CStockInfo	& info	=	m_CurStock.GetStockInfo();
	CKData	& kday	=	m_CurStock.GetKDataDay();
	CKData	& kdata	=	m_CurStock.GetKData(m_nCurKType);
	CKData	& kdayMain	=	AfxGetStockMain().GetKDataDay();
	kday.SetDRData( m_CurStock.GetDRData() );
	if( kday.GetCurFormat() < CKData::formatMin
		|| kday.GetCurFormat() > CKData::formatMax )
		return ;
	kday.FullFillKData( kdayMain, FALSE );
	if( CKData::formatXDRup != kday.GetCurFormat() && CKData::formatXDRdown != kday.GetCurFormat() )
		kday.ChangeCurFormat( CKData::formatXDRdown, AfxGetProfile().GetAutoResumeDRBegin(), AfxGetProfile().GetAutoResumeDRLimit() );
*/
	CStockInfo	& info	=	m_CurStock.GetStockInfo();
	CKData	& kday	=	m_CurStockDown.GetKDataDay();
	CKData	& kdata =	m_CurStockDown.GetKData(m_nCurKType);
	CKData	& kdayMain	=	AfxGetStockMain().GetKDataDay();

	double		dValue	=	0.;
	DWORD	dateCurrent	=	kdata.GetDate(m_nIndexCurrent);
	DWORD	dateDayCurrent	=	kdata.GetDateDay( m_nIndexCurrent );
	int		nIndexDay		=	kday.GetIndexByDate( dateDayCurrent );
	int		nIndexDayMain	=	kdayMain.GetIndexByDate( dateDayCurrent );

	// Draw Rect
	pDC->FillSolidRect( &m_rectReport, clrBK );
	pDC->Draw3dRect( &m_rectReport, clrBorder, clrBorder );
	pDC->SetBkColor( clrBK );

	// Select Name And Code Font
	CString	strTemp, strFont, strTempFmt, strDay;
	strDay.LoadString( IDS_STOCKGRAPH_DAY );
	CFont	* pOldFont	=	AfxSelectDCFont( pDC, 18 );

	// Draw Name And Code
	pDC->SetTextColor( clrTitle );
	pDC->TextOut( m_rectReport.left+1, m_rectAll.top+3, m_CurStock.GetStockInfo().GetStockName() );
	pDC->SetTextColor( clrText );
	pDC->TextOut( m_rectReport.left+96, m_rectAll.top+3, m_CurStock.GetStockInfo().GetStockCode() );

	// Select Param Font
	AfxSelectDCFont( pDC, 14 );
	
	// Draw Param Names
	int	x	=	m_rectReport.left + 6;
	int	y	=	m_rectReport.top;
	pDC->SetTextColor( clrText );
	strTemp.LoadString( IDS_STOCKGRAPH_TIME2 );
	pDC->TextOut( x, y+5,   strTemp );
#ifdef CLKLAN_ENGLISH_US
	strTempFmt.Format( "(%d)", AfxGetProfile().GetYieldAverageDays() );
#else
	strTempFmt.Format( "-%d%s-", AfxGetProfile().GetYieldAverageDays(), strDay );
#endif
	strTemp.LoadString( IDS_STOCKGRAPH_YIELDAVERAGE );
	pDC->TextOut( x, y+30,  strTemp+strTempFmt );
	strTemp.LoadString( IDS_STOCKGRAPH_YIELDSTDDEV );
	pDC->TextOut( x, y+55,  strTemp+strTempFmt );
	strTemp.LoadString( IDS_STOCKGRAPH_BEITE );
	pDC->TextOut( x, y+80,  strTemp+strTempFmt );
	strTemp.LoadString( IDS_STOCKGRAPH_XIAPU );
	pDC->TextOut( x, y+105, strTemp+strTempFmt );

	DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+126, m_rectReport.right, y+126 );
	strTempFmt.LoadString( IDS_STOCKGRAPH_CHANGEHAND );
	strTemp.Format( "%s-%d", strTempFmt, 1 );
	pDC->TextOut( x, y+130, strTemp );
	strTemp.Format( "%s-%d", strTempFmt, 5 );
	pDC->TextOut( x, y+155, strTemp );
	strTemp.Format( "%s-%d", strTempFmt, 10 );
	pDC->TextOut( x, y+180, strTemp );
	strTemp.Format( "%s-%d", strTempFmt, 20 );
	pDC->TextOut( x, y+205, strTemp );

	DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+226, m_rectReport.right, y+226 );
	strTempFmt.LoadString( IDS_STOCKGRAPH_RATIOVOLUME );
	strTemp.Format( "%s-%d", strTempFmt, 5 );
	pDC->TextOut( x, y+230, strTemp );
	strTemp.Format( "%s-%d", strTempFmt, 10 );
	pDC->TextOut( x, y+255, strTemp );
	strTemp.Format( "%s-%d", strTempFmt, 20 );
	pDC->TextOut( x, y+280, strTemp );

	DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+301, m_rectReport.right, y+301 );
	strTempFmt.LoadString( IDS_STOCKGRAPH_RS );
	strTemp.Format( "%s-%d", strTempFmt, 5 );
	pDC->TextOut( x, y+305, strTemp );
	strTemp.Format( "%s-%d", strTempFmt, 10 );
	pDC->TextOut( x, y+330, strTemp );
	strTemp.Format( "%s-%d", strTempFmt, 20 );
	pDC->TextOut( x, y+355, strTemp );

	DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+376, m_rectReport.right, y+376 );
	strTemp.LoadString( IDS_STOCKGRAPH_SHARETOTAL );
	pDC->TextOut( x, y+380, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_SHARECURRENCY );
	pDC->TextOut( x, y+405, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_NETASSETPS );
	pDC->TextOut( x, y+430, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_EPS );
	pDC->TextOut( x, y+455, strTemp );
	strTemp.LoadString( IDS_STOCKGRAPH_PE );
	pDC->TextOut( x, y+480, strTemp );

	// Draw Param Values
	// Time
	UINT nOldAlign = pDC->SetTextA

⌨️ 快捷键说明

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