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

📄 gpsscview.cpp

📁 用VC写的监控中心后台程序。 代码全
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 // GpsSCView.cpp : implementation of the CGpsSCView class
//

#include "stdafx.h"
#include "GpsSC.h"
#include "MainFrm.h"


#include "GpsSCDoc.h"
#include "GpsSCView.h"
#include "ComUserDlg.h"
#include "FindMessageDlg.h"
#include "TreeCtrlEx.h"
#include "VehicleMessageSet.h"
#include "ClientinfoSet.h"
#include "ToolTipWnd.h"
#include "ListCtrlEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGpsSCView
extern CGpsSCApp theApp;
IMPLEMENT_DYNCREATE(CGpsSCView, CScrollView)
BEGIN_MESSAGE_MAP(CGpsSCView, CScrollView)
	//{{AFX_MSG_MAP(CGpsSCView)
	ON_MESSAGE(WM_COMMNOTIFY,OnCommNotify)
	ON_COMMAND(ID_TEST, OnTest)
	ON_UPDATE_COMMAND_UI(ID_TEST, OnUpdateTest)
	ON_UPDATE_COMMAND_UI(ID_SETJKNUMBER, OnUpdateSetjknumber)
	ON_COMMAND(ID_SINULATEDRIVER, OnSinulatedriver)
	ON_UPDATE_COMMAND_UI(ID_SINULATEDRIVER, OnUpdateSinulatedriver)
	ON_COMMAND(ID_CCONNET_COMM, OnCconnetComm)
	ON_COMMAND(ID_REFRESH, OnRefresh)
	ON_UPDATE_COMMAND_UI(ID_REFRESH, OnUpdateRefresh)
	ON_WM_MOUSEMOVE()
	ON_WM_TIMER()
	ON_COMMAND(ID_MZOOM_DOWN, OnMzoomDown)
	ON_UPDATE_COMMAND_UI(ID_MZOOM_DOWN, OnUpdateMzoomDown)
	ON_COMMAND(ID_MZOOM_UP, OnMzoomUp)
	ON_UPDATE_COMMAND_UI(ID_MZOOM_UP, OnUpdateMzoomUp)
	ON_COMMAND(ID_OPENLOCK, OnOpenlock)
	ON_COMMAND(ID_GETVEHICLEPOSITION, OnGetvehicleposition)
	ON_COMMAND(ID_SETLOCK, OnSetlock)
	ON_COMMAND(ID_SHUTOIL, OnShutoil)
	ON_COMMAND(ID_SETPASSWORD, OnSetpassword)
	ON_COMMAND(ID_SENDNORMALSM, OnSendnormalsm)
	ON_COMMAND(ID_SENDINFOTOGROUP, OnSendinfotogroup)
	ON_COMMAND(ID_SELECTTYPE, OnSelectUserType)
	ON_COMMAND(ID_AUTOMONITOR, OnAutomonitor)
	ON_COMMAND(ID_GETHELP, OnGethelp)
	ON_COMMAND(ID_MDISP_SIGN_POINT, OnMdispSignPoint)
	ON_UPDATE_COMMAND_UI(ID_MDISP_SIGN_POINT, OnUpdateMdispSignPoint)
	ON_COMMAND(ID_MSEARCH_SIGN_BY_REGION, OnMsearchSignByRegion)
	ON_UPDATE_COMMAND_UI(ID_MSEARCH_SIGN_BY_REGION, OnUpdateMsearchSignByRegion)
	ON_COMMAND(ID_MSEARCH_BEST_ROAD, OnMsearchBestRoad)
	ON_UPDATE_COMMAND_UI(ID_MSEARCH_BEST_ROAD, OnUpdateMsearchBestRoad)
	ON_COMMAND(ID_FINDMESSAGE, OnFindmessage)
	ON_UPDATE_COMMAND_UI(ID_AUTOMONITOR, OnUpdateAutomonitor)
	ON_WM_LBUTTONDOWN()
	ON_UPDATE_COMMAND_UI(ID_GETVEHICLEPOSITION, OnUpdateGetvehicleposition)
	ON_UPDATE_COMMAND_UI(ID_SETLOCK, OnUpdateSetlock)
	ON_UPDATE_COMMAND_UI(ID_SHUTOIL, OnUpdateShutoil)
	ON_UPDATE_COMMAND_UI(ID_GETHELP, OnUpdateGethelp)
	ON_UPDATE_COMMAND_UI(ID_OPENLOCK, OnUpdateOpenlock)
	ON_UPDATE_COMMAND_UI(ID_SENDNORMALSM, OnUpdateSendnormalsm)
	ON_UPDATE_COMMAND_UI(ID_SENDINFOTOGROUP, OnUpdateSendinfotogroup)
	ON_UPDATE_COMMAND_UI(ID_SELECTTYPE, OnUpdateSelecttype)
	ON_UPDATE_COMMAND_UI(ID_CHANGEUSERPASSWORD, OnUpdateChangeuserpassword)
	ON_UPDATE_COMMAND_UI(ID_SETPASSWORD, OnUpdateSetpassword)
	ON_COMMAND(ID_CDISCONNET_COMM, OnCdisconnetComm)
	ON_UPDATE_COMMAND_UI(ID_CDISCONNET_COMM, OnUpdateCdisconnetComm)
	ON_COMMAND(ID_CANCELAUTOMONITOR, OnCancelautomonitor)
	ON_UPDATE_COMMAND_UI(ID_CANCELAUTOMONITOR, OnUpdateCancelautomonitor)
	ON_WM_VSCROLL()
	ON_WM_HSCROLL()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_POP_FRESH, OnPopFresh)
	ON_UPDATE_COMMAND_UI(ID_POP_FRESH, OnUpdatePopFresh)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_MSEARCH_SIGN, OnMsearchSign)
	ON_UPDATE_COMMAND_UI(ID_MSEARCH_SIGN, OnUpdateMsearchSign)
	ON_WM_ERASEBKGND()
	ON_COMMAND(ID_CCONNECT_COM, OnCconnectCom)
	ON_UPDATE_COMMAND_UI(ID_CCONNECT_COM, OnUpdateCconnectCom)
	ON_COMMAND(ID_CANCEL_CURR_MONITOR_CAR, OnCancelCurrMonitorCar)
	ON_UPDATE_COMMAND_UI(ID_CANCEL_CURR_MONITOR_CAR, OnUpdateCancelCurrMonitorCar)
	ON_COMMAND(ID_SET_CURR_MONITOR_CAR, OnSetCurrMonitorCar)
	ON_UPDATE_COMMAND_UI(ID_SET_CURR_MONITOR_CAR, OnUpdateSetCurrMonitorCar)
	ON_UPDATE_COMMAND_UI(ID_CCONNET_COMM, OnUpdateCconnetComm)
	//}}AFX_MSG_MAP
	
	// Standard printing commands
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGpsSCView construction/destruction

CGpsSCView::CGpsSCView()
{
	// TODO: add construction code here
	m_bSocketConnect		= FALSE;
	password				= FALSE;
	flag_usertype			= TRUE;

	m_bDispSignPoint		= false;
	m_bDispSignPic			= false;
	m_bSearchBestRoad		= false;
	m_bDispBusRoad			= false;
	m_bSearchSignbyRegion	= false;

	m_bMapIsDrawed			= false;

	m_bLButtomDown			= false;
	m_bMoveFatMap			= false;
	m_pRBDownPoint.x		= 0;
	m_pRBDownPoint.y		= 0;
	m_nVMove				= 0;
	m_nHMove				= 0;

	m_DC.DeleteDC();
}

CGpsSCView::~CGpsSCView()
{
	if(m_bMapIsDrawed) {
		m_DC.DeleteDC();
	}
}

BOOL CGpsSCView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGpsSCView drawing

void CGpsSCView::OnDraw(CDC* pDC)
{
	CGpsSCDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	DrawMap(pDC);

	if(m_bDispSignPoint)		m_cDrawMap.DrawSignLib(pDC);

	if(m_bSearchBestRoad)		m_cDrawMap.DrawBetweenBRCrossLine(pDC,&m_cDrawMap.mSaveBRList);

	if(m_bSearchSignbyRegion)	m_cDrawMap.DrawOneSignPoint(pDC);

	m_cDrawMap.DrawGpsCar(pDC,0.0);
}

/////////////////////////////////////////////////////////////////////////////
// CGpsSCView diagnostics

#ifdef _DEBUG
void CGpsSCView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CGpsSCView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CGpsSCDoc* CGpsSCView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGpsSCDoc)));
	return (CGpsSCDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGpsSCView message handlers

LRESULT CGpsSCView::OnCommNotify(WPARAM wParam, LPARAM lParam)
{
	CGpsSCDoc	*pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if(!pDoc->m_bConnected || (wParam & EV_RXCHAR)!=EV_RXCHAR) 
	{
		SetEvent(pDoc->m_hPostMsgEvent);		//允许发送下一个WM_COMMNOTIFY消息
		return 0L;
	}
	CProcSM		processSM;
	processSM.ReadComPort(wParam,pDoc);

	SetEvent(pDoc->m_hPostMsgEvent);			//允许发送下一个WM_COMMNOTIFY消息
	return 0L;
}

void CGpsSCView::DrawMap(CDC *pDC)
{
//	SetScrollSizes(MM_TEXT, CSize((int)Wnd_Max_X,(int)Wnd_Max_Y));
	CRect			client; 
	CRect			rect; 

//	pDC->GetClipBox(client);						//检取无效区
//	GetClientRect(rect);							//检取整个客户区 

	if((m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_X == 0) || (m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_Y == 0)) {
		m_cDrawMap.RefreshMapWnd();
	}

	if(!m_bMapIsDrawed) {
		CBitmap			bitmap; 
		CBitmap			*pOldBitmap; 

		m_DC.DeleteDC();
		SetScrollPos(SB_HORZ,0,TRUE);
		SetScrollPos(SB_VERT,0,TRUE);

		rect.top		= 0;
		rect.left		= 0;
		rect.bottom		= m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_Y;
		rect.right		= m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_X;
		client.top		= 0;
		client.left		= 0;
		client.bottom	= m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_Y;
		client.right	= m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_X;


		if(m_DC.CreateCompatibleDC(pDC)) {				//创建一个与pDC兼容的内存设备环境 
			//创建一与pDC兼容的位图,大小为整个客户区 
			if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height())) {
				OnPrepareDC(&m_DC,NULL);					//使dc与pDC具有同样的映射关系 
				pOldBitmap=m_DC.SelectObject(&bitmap);	//将位图选入内存环境 
				m_DC.SelectClipRgn(NULL);					//使dc的整个客户区都成无效区 
				m_DC.IntersectClipRect(client);			//再"与上"检取的无效区,使内存环境与pDC检取的无效区相等 
			} 
		} 

		CBrush brush; 
		if(!brush.CreateSolidBrush(RGB(255,255,255))) {
			return; 
		}

		brush.UnrealizeObject();
		m_DC.FillRect(client,&brush);						//将dc的作图区刷新成背景色

		m_cDrawMap.DrawFatMap(&m_DC);

		bitmap.DeleteObject();
		pOldBitmap->DeleteObject();

		m_bMapIsDrawed = true;
	}
	pDC->GetClipBox(client);						//检取无效区
	GetClientRect(rect);							//检取整个客户区 

	//移动滚动条
	MoveScroll();
	//拷贝到窗口裁减区
	pDC->BitBlt(client.left,client.top,client.Width(),client.Height(),&m_DC,client.left,client.top,SRCCOPY);	//将内存裁减区的位图 
}

void CGpsSCView::OnTest() 
{
	// TODO: Add your command handler code here
	CProcSM	sm;
	CString str;

	str = "8F6653F7003A0030003700340039000D002276D163A7002263074EE45DF27ECF6267884C0021";		//监控指令已经执行!
//	str = "8F6653F7003A0030003700340039000D8F6651B5003A89E39664963276D7000D4F4D7F6E003A6DF1573357CE533A6C344E0A4E5056ED000D7ECF5EA6003A003100310034002E00300031002E00330030000D7EAC5EA6003A00320032002E00330032002E00330034000D8F66901F003A0030";		//正常信息
//	str = "8F6653F7003A0030003700340039000D8F6651B5003A89E39664963276D7000D4F4D7F6E003A6DF1573357CE533A6C344E0A4E5056ED000D7ECF5EA6003A003100310034002E00300031002E00330031000D7EAC5EA6003A00320032002E00330032002E00330034000D8F66901F003A0030";		//正常信息
//	str = "8F6653F7003A0030003700340039000D8F6651B5003A89E39664963276D7000D4F4D7F6E003A6DF1573357CE533A6C344E0A4E5056ED000D7ECF5EA6003A003100310034002E00300031002E00330031000D7EAC5EA6003A00320032002E00330032002E00330034000D8F66901F003A0037";
//	str = "8F6653F7003A0030003700340039000D8F6651B5003A89E39664963276D7000D4F4D7F6E003A6DF1573357CE533A6C344E0A4E5056ED000D7ECF5EA6003A003100310034002E00300031002E00330032000D7EAC5EA6003A00320032002E00330032002E00330034000D8F66901F003A00310031";

	AfxMessageBox(sm.UnicodeStr2AnsiStr(str));
}

void CGpsSCView::OnUpdateTest(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	BOOL	MenuEnable = FALSE;

	pCmdUI->Enable(MenuEnable);
}

///////////////////////////////////////////////////////////////////
//向汽车发监控命令
///////////////////////////////////////////////////////////////////

void CGpsSCView::OnUpdateSetjknumber(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
}

void CGpsSCView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	// TODO: Add your specialized code here and/or call the base class
	m_ToolTip.Create(this);

	m_bDrawMap = FALSE;
	CSize sizeTotal;
    sizeTotal.cx = sizeTotal.cy = 100;
    SetScrollSizes(MM_TEXT, sizeTotal);

	CGpsSCDoc *pDoc = GetDocument();
	procSM.SetDocPointer(pDoc);
	m_pDoc = pDoc;

	//开始写线程
	procSM.BeginThread();

	((CMainFrame*)AfxGetApp()->m_pMainWnd)->m_wndListCtrl.GetViewPoint(this);
	m_cDrawMap.GetView(this);

	SendGXGY("113.06.55\r\n","23.01.01\r\n","","",1);		//佛山
//	SendGXGY("114.07.25\r\n","22.33.21\r\n","","",1);		//深圳
//	SendGXGY("113.06.46\r\n","22.34.00\r\n","","",1);		//深圳

	((CMainFrame*)AfxGetApp()->m_pMainWnd)->m_wndTree1.Init(&procSM);
	((CMainFrame*)AfxGetApp()->m_pMainWnd)->m_wndTree2.Init(&procSM);

	SetTimer(1,100,NULL);
}

//设定车主电话
void CGpsSCView::OnSinulatedriver()
{
	// TODO: Add your command handler code here
	procSM.SimulatorDriver();
}

void CGpsSCView::OnUpdateSinulatedriver(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(procSM.m_bSysTemInit);
}

void CGpsSCView::OnCconnetComm()
{
	// TODO: Add your command handler code here
	m_pDoc = GetDocument();
	if(m_pDoc->OnConnetComm())
		procSM.SystermInite(this);

	CClientinfoSet		clientinfoSet;
	CVehicleMessageSet	messageSet;

	try
	{
		if(!clientinfoSet.IsOpen())
		clientinfoSet.Open();
		if(!messageSet.IsOpen())
			messageSet.Open();
	}
	catch(CDBException *Exp)
	{
		AfxMessageBox(Exp->m_strError);
	}
}


void CGpsSCView::OnRefresh() 
{
	// TODO: Add your command handler code here
	m_cDrawMap.ClearSaveInvalidRectColor();
	m_cDrawMap.ClearPointList(&m_cDrawMap.mSaveRecePointList);

	m_bSearchSignbyRegion = false;

	CGpsSCDoc *pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->UpdateAllViews(NULL);
}

void CGpsSCView::OnUpdateRefresh(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here	
}

//get the gx and gy and convert it
void CGpsSCView::SendGXGY(CString strGX,CString strGY,CString strVehicleNO,CString strTelNumber,BYTE IsSimulate)
{
	if(!procSM.CheckVehicleMonitorNow(strVehicleNO))	return;		//检测车辆是否已被监控

#if 0
	if((!procSM.m_sCurrMonitorCar.IsEmpty()) && (procSM.m_sCurrMonitorCar != strVehicleNO))	return;

//	if(procSM.m_sGetPositionCar == strVehicleNO) {
//		procSM.m_sGetPositionCar.Empty();
//	}

	double		gx,gy;
	CDC			*pDC = GetDC();

	gx = CovertStdNE(strGX);
	gy = CovertStdNE(strGY);

	if(!m_cDrawMap.SaveRecePoint(gx,gy,pDC,strVehicleNO)) {
//		pDC->DeleteDC();
		return;
	}

	if(IsSimulate) {
		m_cDrawMap.DrawGpsCar(pDC,0.0);
	}

	m_cDrawMap.GetCarXY(m_ny,m_ny);
	m_bDrawMap=TRUE;

	if(!m_cDrawMap.CheckMapIsChange(gx,gy))	{
//		pDC->DeleteDC();
		InvalidRect(gx,gy);
		return;
	}

//	pDC->DeleteDC();

	CGpsSCDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->UpdateAllViews(NULL);
#else
	CRect		MapRect;
	CDC			*pDC = GetDC();
	double		gx,gy;

	gx = CovertStdNE(strGX);
	gy = CovertStdNE(strGY);

	if(!m_cDrawMap.CheckMapIsChange(gx,gy)) {
		if(!IsSimulate) {
			if(!m_cDrawMap.SaveRecePoint(gx,gy,pDC,strVehicleNO))	return;
		}
		m_cDrawMap.DrawGpsCar(pDC,0.0);

		m_cDrawMap.GetCarXY(m_nx,m_ny);
		m_bDrawMap = TRUE;

		return;
	}
	if(!m_cDrawMap.SaveRecePoint(gx,gy,pDC,strVehicleNO))	return;
	if(IsSimulate)	return;

	GetClientRect(MapRect);
	m_cDrawMap.RefreshMapWnd();

	if(!m_cDrawMap.SaveRecePoint(gx,gy,pDC,strVehicleNO))	return;

	m_cDrawMap.DrawGpsCar(pDC,0.0);

	//获取车位置
	m_cDrawMap.GetCarXY(m_nx,m_ny);
	m_bDrawMap = TRUE;
#endif
}

void CGpsSCView::InvalidRect(double gx, double gy)
{
	long		x,y;

	if(!m_cDrawMap.CalcNE2XY(gx,gy,x,y))	return;

	CRect		lpRect;
	CPoint		point = GetScrollPosition();
	long		MidWidth = 100;

	x	-= point.x;
	y	-= point.y;

	lpRect.left		= x - MidWidth - 20;
	lpRect.right	= x + MidWidth + 20;
	lpRect.top		= y - MidWidth;
	lpRect.bottom	= y + MidWidth;

	CString		str;
	str.Format("%d,%d,%d,%d",lpRect.left,lpRect.right,lpRect.top,lpRect.bottom);
//	StatusPrompt(str,0);

//	GetClientRect(lpRect);

	InvalidateRect(lpRect);
}

double CGpsSCView::CovertStdNE(CString StrNE)
{
	CString		Str,tmp;
	double		dTmp;
	BYTE		Len,i,chr;

	StrNE.Replace("\r","");
	StrNE.Replace("\n","");
	for(i = 0; i < StrNE.GetLength(); i ++) {
		chr = StrNE.GetAt(i);
		if(((chr < '0') || (chr > '9')) && (chr != '.')) {
			tmp = chr;
			StrNE.Replace(tmp,"");
		}
	}

	Len		= StrNE.GetLength();
	Str		= StrNE.Right(2);
	StrNE	= StrNE.Left(Len - 2);
	StrNE.Replace(".","");
	dTmp	= atof(Str);
	dTmp	= dTmp / 60.0;

	return	atof(StrNE) + dTmp;
}

void CGpsSCView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	if(m_bLButtomDown) {
		SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_MOVE));
	}

	TrackDispData(point);

	CheckMousePointInList(point);

	MoveFatMap(point);

	CScrollView::OnMouseMove(nFlags, point);
}

void CGpsSCView::MoveFatMap(CPoint point)
{
	int nScale=4;
	if(!m_bMoveFatMap)	return;
	
	int		nHMove, nVMove, i;

	nHMove = (point.y - m_pRBDownPoint.y) / nScale;
	nVMove = (point.x - m_pRBDownPoint.x) / nScale;
	
	m_nVMove+=point.x - m_pRBDownPoint.x;
	m_nHMove+=point.y - m_pRBDownPoint.y;
	
	if(nHMove > 0) {
		for(i = 0; i < nHMove; i++) {
			OnVScroll(SB_LINEUP, 0 ,NULL);				//响应UP键
		}
		m_nHMove=0;
	}
	else{
		if(m_nHMove>=nScale){
//			OnVScroll(SB_LINEUP, 0 ,NULL);				//响应UP键
			m_nHMove=0;
		}
	}
	
	if(nHMove < 0) {
		nHMove = -nHMove;
		for(i = 0; i < nHMove; i++) {
			OnVScroll(SB_LINEDOWN, 0 ,NULL);			//响应DOWN键
		}
		m_nHMove=0;
	}
	else{
		if(m_nHMove<=-nScale){
//			OnVScroll(SB_LINEDOWN, 0 ,NULL);			//响应DOWN键
			m_nHMove=0;
		}
	}
	
	if(nVMove > 0) {
		for(i = 0; i < nVMove; i++) {
			OnHScroll(SB_LINELEFT, 0 ,NULL);		//响应LEFT键
		}
		m_nVMove=0;
	}
	else{
		if(m_nVMove>=nScale){
//			OnHScroll(SB_LINELEFT, 0 ,NULL);		//响应LEFT键
			m_nVMove=0;
		}
	}

	if(nVMove < 0) {
		nVMove=-nVMove;
		for(i = 0; i < nVMove; i++) {
			OnHScroll(SB_LINERIGHT, 0 ,NULL);		//响应RIGHT键
		}
		m_nVMove=0;
	}
	else{
		if(m_nVMove<=-nScale){

⌨️ 快捷键说明

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