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

📄 mainfrm.cpp

📁 UHF RFID Reader Program
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "RFRM.h"

#include "MainFrm.h"

#include "RFRMDoc.h"
#include "RFRMView.h"
#include "MessageView.h"

#include "SplashWnd.h"

#include "RFIDRadioManager.h"

#include "ReaderSetSheet.h"
#include "GeneralSetPage.h"
#include "AntennaSetPage.h"
#include "SelectCriteriaSetPage.h"
#include "AlgorithmSetPage.h"
#include "PostSingulationSetPage.h"
#include "EngineeringSetPage.h"
#include "FrequencyBandPage.h"

#include "ReadTagAccessDlg.h"
#include "WriteTagAccessDlg.h"
#include "LockTagAccessDlg.h"
#include "KillTagAccessDlg.h"

#include "InterfaceDlg.h"
#include "FirmwareUpdateOptionDlg.h"
#include "FirmwareUpdateStatusDlg.h"

#include "Util.h"

#ifdef LARGE_COUNT
#include "CountDlg.h"
#endif

#ifdef _WIN32_WCE
#include <pkfuncs.h> //傈盔包府
#include <msgqueue.h>		// 皋矫瘤 钮 包访
#include <pm.h>				// 傈盔包府 包访
#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#ifdef WIN32_PLATFORM_PSPC
#define TOOLBAR_HEIGHT 24
#endif // WIN32_PLATFORM_PSPC

#ifdef _WIN32_WCE
#define QUEUE_ENTRIES   3
#define MAX_NAMELEN     200
#define QUEUE_SIZE      (QUEUE_ENTRIES * (sizeof(POWER_BROADCAST) + MAX_NAMELEN))

const DWORD dwAdornmentFlags = 0; // exit button

#endif
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_WM_CLOSE()
#ifdef WINCE
	ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, &CMainFrame::OnToolbarDropDown)
#elif WIN32
	ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, &CMainFrame::OnToolbarDropDown)
#endif
	ON_WM_NCDESTROY()
	ON_CBN_SELCHANGE(ID_LEAK_TIME, &CMainFrame::OnCbnSelchangeLeakTime)
	ON_CBN_EDITCHANGE(ID_LEAK_TIME, &CMainFrame::OnCbnEditchangeLeakTime)
	ON_BN_CLICKED(ID_LEAK_CHECK, &CMainFrame::OnBnClickedLeakEnable)
	ON_WM_TIMER()
	ON_WM_KEYDOWN()
	ON_MESSAGE(WM_RADIO_RESET, &CMainFrame::OnReset)
	ON_MESSAGE(WM_TAG_ACCESS, &CMainFrame::OnTagAccess)
	ON_COMMAND(ID_RFID_CONNECTION, &CMainFrame::OnRfidConnection)
	ON_COMMAND(ID_RFID_DISCONNECTION, &CMainFrame::OnRfidDisconnection)
	ON_COMMAND(ID_RFID_RUN_INVENTORY, &CMainFrame::OnRfidRunInventory)
	ON_COMMAND(ID_RFID_STOP_INVENTORY, &CMainFrame::OnRfidStopInventory)
	ON_COMMAND(ID_RFID_MACVERSION, &CMainFrame::OnRfidMacversion)
	ON_COMMAND(ID_VIEW_LIST, &CMainFrame::OnViewList)
	ON_COMMAND(ID_RFID_POWER_ON_OFF, &CMainFrame::OnRfidPowerOnOff)
	ON_COMMAND(ID_RFID_READER_SET, &CMainFrame::OnRfidReaderSet)
	ON_COMMAND(ID_RFID_RESET, &CMainFrame::OnRfidReset)
	ON_COMMAND(ID_RFID_INTERFACECONFIGURATION, &CMainFrame::OnRfidInterfaceconfiguration)
	ON_COMMAND(ID_RFID_INVENTORY_ONCE, &CMainFrame::OnRfidInventoryOnce)
	ON_COMMAND(ID_FIRMWARE_UPDATEOPTION, &CMainFrame::OnFirmwareUpdateoption)
	ON_COMMAND(ID_FIRMWARE_UPDATE, &CMainFrame::OnFirmwareUpdate)
	ON_COMMAND(ID_TAG_READ, &CMainFrame::OnTagRead)
	ON_COMMAND(ID_TAG_WRITE, &CMainFrame::OnTagWrite)
	ON_COMMAND(ID_TAG_LOCK, &CMainFrame::OnTagLock)
	ON_COMMAND(ID_TAG_KILL, &CMainFrame::OnTagKill)
	ON_UPDATE_COMMAND_UI(ID_RFID_CONNECTION, &CMainFrame::OnUpdateRfidConnection)
	ON_UPDATE_COMMAND_UI(ID_RFID_DISCONNECTION, &CMainFrame::OnUpdateRfidDisconnection)
	ON_UPDATE_COMMAND_UI(ID_RFID_RUN_INVENTORY, &CMainFrame::OnUpdateRfidRunInventory)
	ON_UPDATE_COMMAND_UI(ID_RFID_STOP_INVENTORY, &CMainFrame::OnUpdateRfidStopInventory)
	ON_UPDATE_COMMAND_UI(ID_RFID_POWER_ON_OFF, &CMainFrame::OnUpdateRfidPowerOnOff)
	ON_UPDATE_COMMAND_UI(ID_RFID_RESET, &CMainFrame::OnUpdateRfidReset)
	ON_UPDATE_COMMAND_UI(ID_RFID_INTERFACECONFIGURATION, &CMainFrame::OnUpdateRfidInterfaceconfiguration)
	ON_UPDATE_COMMAND_UI(ID_RFID_INVENTORY_ONCE, &CMainFrame::OnUpdateRfidInventoryOnce)
	ON_UPDATE_COMMAND_UI(ID_FIRMWARE_UPDATE, &CMainFrame::OnUpdateFirmwareUpdate)
	ON_UPDATE_COMMAND_UI(ID_TAG_LOCK, &CMainFrame::OnUpdateTagLock)
	ON_UPDATE_COMMAND_UI(ID_TAG_KILL, &CMainFrame::OnUpdateTagKill)
	ON_UPDATE_COMMAND_UI(ID_TAG_READ, &CMainFrame::OnUpdateTagRead)
	ON_UPDATE_COMMAND_UI(ID_TAG_WRITE, &CMainFrame::OnUpdateTagWrite)
	ON_UPDATE_COMMAND_UI(ID_RFID_READER_SET, &CMainFrame::OnUpdateRfidReaderSet)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
};

// CMainFrame construction/destruction

CMainFrame::CMainFrame()
: m_pRFIDRadioManager(NULL)
, m_bPowerState(FALSE)
, m_pWndEdit(NULL)
, m_pWndSliderCtrl(NULL)
, m_pWndButton(NULL)
, m_pWndProgressCtrl(NULL)
, m_pFirmwareStatusDlg(NULL)
{
	CSplashWnd::ShowSplashScreen(1500, IDB_BITMAP_SPLASH, this);

	m_pRFIDRadioManager = new CRFIDRadioManager();
}

CMainFrame::~CMainFrame()
{
	m_pRFIDRadioManager->Disconnect();
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	CString strClear;

#ifdef WIN32_PLATFORM_PSPC
	if (!m_wndCommandBar.Create(this) ||
	    !m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
	    !m_wndCommandBar.AddAdornments(dwAdornmentFlags) ||
	    !m_wndCommandBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create CommandBar\n");
		return -1;      // fail to create
	}

	m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() | CBRS_SIZE_FIXED);
#elif WIN32_PLATFORM_WFSP
	if (!m_wndCommandBar.Create(this) ||
	    !m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
	    !m_wndCommandBar.AddAdornments(dwAdornmentFlags)||
		!m_wndCommandBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create CommandBar\n");
		return -1;      // fail to create
	}

	m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() | CBRS_SIZE_FIXED);

	CWnd* pWnd = CWnd::FromHandlePermanent(m_wndCommandBar.m_hWnd);

	RECT rect, rectDesktop;
	pWnd->GetWindowRect(&rect);
	pWnd->GetDesktopWindow()->GetWindowRect(&rectDesktop);

	int cx = rectDesktop.right - rectDesktop.left;
	int cy = (rectDesktop.bottom - rectDesktop.top) - (rect.bottom - rect.top);
	this->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER);
#elif defined(WINCE) && !defined(WIN32_PLATFORM_PSPC) && !defined(WIN32_PLATFORM_WFSP)

	if (!m_wndCommandBar.Create(this) ||
	    !m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
		!m_wndCommandBar.AddAdornments(dwAdornmentFlags))
	{
		TRACE0("Failed to create CommandBar\n");
		return -1;      // fail to create
	}
	m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);

	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Toolbar Setting
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	// 捞固瘤府胶飘 备己
	CBitmap bmpHot, bmpCold;
	CImageList imgHot, imgCold;

	bmpHot.LoadBitmap(IDB_BITMAP_TOOLBAR_COLOR_16);
	imgHot.Create(16, 16, ILC_COLOR24 |ILC_MASK, 6, 0);    // 8俺 窜眠
	imgHot.Add(&bmpHot, RGB(255,255,255));
	m_wndToolBar.GetToolBarCtrl().SetImageList(&imgHot);
	imgHot.Detach();    // 馆靛矫 盒府茄促
	bmpHot.Detach();

	bmpCold.LoadBitmap(IDB_BITMAP_TOOLBAR_GRAY_16);
	imgCold.Create(16, 16, ILC_COLOR24 |ILC_MASK, 6, 0);    // 8俺 窜眠
	imgCold.Add(&bmpCold, RGB(255,255,255));
	m_wndToolBar.GetToolBarCtrl().SetDisabledImageList(&imgCold);
	imgCold.Detach();    // 馆靛矫 盒府茄促
	bmpCold.Detach();

	CRect temp;
	m_wndToolBar.GetItemRect(0,&temp);
	m_wndToolBar.SetSizes(CSize(temp.Width(), temp.Height()), CSize(16,16));


	DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_VIEW_LIST));
	dwStyle |= TBSTYLE_DROPDOWN;
	m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_VIEW_LIST), dwStyle);

	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Toolbar Setting
	if (!m_wndInfoToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndInfoToolBar.LoadToolBar(IDR_INFO_TOOLBAR))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	// 捞固瘤府胶飘 备己
	CBitmap bmpHot2, bmpCold2;
	CImageList imgHot2, imgCold2;

	bmpHot2.LoadBitmap(IDB_BITMAP_INFO_TOOLBAR_COLOR_16);
	imgHot2.Create(16, 16, ILC_COLOR24 |ILC_MASK, 2, 0);    // 8俺 窜眠
	imgHot2.Add(&bmpHot2, RGB(255,255,255));
	m_wndInfoToolBar.GetToolBarCtrl().SetImageList(&imgHot2);
	imgHot2.Detach();    // 馆靛矫 盒府茄促
	bmpHot2.Detach();

	bmpCold2.LoadBitmap(IDB_BITMAP_INFO_TOOLBAR_GRAY_16);
	imgCold2.Create(16, 16, ILC_COLOR24 |ILC_MASK, 2, 0);    // 8俺 窜眠
	imgCold2.Add(&bmpCold2, RGB(255,255,255));
	m_wndInfoToolBar.GetToolBarCtrl().SetDisabledImageList(&imgCold2);
	imgCold2.Detach();    // 馆靛矫 盒府茄促
	bmpCold2.Detach();

	m_wndInfoToolBar.GetItemRect(0,&temp);
	m_wndInfoToolBar.SetSizes(CSize(temp.Width(), temp.Height()), CSize(16,16));

	if(!m_wndInfoToolBar.CreateEdit(m_wndTotalReadCount, 
		4, 
		ID_READ_TOTAL_COUNT, 50))
	{
		TRACE0("Failed to create Info toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndInfoToolBar.CreateCheckButton(m_wndLeakCheckButton, 5, ID_LEAK_CHECK, 30))
	{
		TRACE0("Failed to create toolbar's combo box\n");
		return -1;      // fail to create
	}

	if (!m_wndInfoToolBar.CreateComboBox(m_wndComboLeakTime, 6, ID_LEAK_TIME, 40, 50))
	{
		TRACE0("Failed to create toolbar's combo box\n");
		return -1;      // fail to create
	}

	m_wndComboLeakTime.AddString(_T("1"));
	m_wndComboLeakTime.AddString(_T("2"));
	m_wndComboLeakTime.AddString(_T("3"));
	m_wndComboLeakTime.AddString(_T("4"));
	m_wndComboLeakTime.AddString(_T("5"));
	m_wndComboLeakTime.AddString(_T("6"));
	m_wndComboLeakTime.AddString(_T("7"));
	m_wndComboLeakTime.AddString(_T("8"));
	m_wndComboLeakTime.AddString(_T("9"));
	m_wndComboLeakTime.AddString(_T("10"));

	m_wndTotalReadCount.SetWindowText(_T("0"));

	m_wndComboLeakTime.SetCurSel(0);
	m_wndComboLeakTime.EnableWindow(FALSE);

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	if(!m_wndReBar.Create(this) ||
		!m_wndReBar.AddBar(&m_wndToolBar) ||
		!m_wndReBar.AddBar(&m_wndInfoToolBar))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	if (!m_bOneExcuteThread) 
	{
		DWORD ThreadID;
		HANDLE hThread = CreateThread(NULL, 0, WakeUpThreadFunc, this, 0, &ThreadID);
		CloseHandle(hThread);

		m_bOneExcuteThread = TRUE;
	} 

#elif WIN32
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	// 捞固瘤府胶飘 备己
	CBitmap bmpHot, bmpCold;
	CImageList imgHot, imgCold;

	bmpHot.LoadBitmap(IDB_BITMAP_TOOLBAR_COLOR_32);
	imgHot.Create(32, 32, ILC_COLOR24 |ILC_MASK, 7, 0);    // 8俺 窜眠
	imgHot.Add(&bmpHot, RGB(255,255,255));
	m_wndToolBar.GetToolBarCtrl().SetImageList(&imgHot);
	imgHot.Detach();    // 馆靛矫 盒府茄促
	bmpHot.Detach();

	bmpCold.LoadBitmap(IDB_BITMAP_TOOLBAR_GRAY_32);
	imgCold.Create(32, 32, ILC_COLOR24 |ILC_MASK, 7, 0);    // 8俺 窜眠
	imgCold.Add(&bmpCold, RGB(255,255,255));
	m_wndToolBar.GetToolBarCtrl().SetDisabledImageList(&imgCold);
	imgCold.Detach();    // 馆靛矫 盒府茄促
	bmpCold.Detach();

	CRect temp;
	m_wndToolBar.GetItemRect(0,&temp);
	m_wndToolBar.SetSizes(CSize(temp.Width(), temp.Height()), CSize(32,32));

	DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_VIEW_LIST));
	dwStyle |= TBSTYLE_DROPDOWN;
	m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_VIEW_LIST), dwStyle);

	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Toolbar Setting
	if (!m_wndInfoToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndInfoToolBar.LoadToolBar(IDR_INFO_TOOLBAR))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	// 捞固瘤府胶飘 备己
	CBitmap bmpHot2, bmpCold2;
	CImageList imgHot2, imgCold2;

	bmpHot2.LoadBitmap(IDB_BITMAP_INFO_TOOLBAR_COLOR_32);
	imgHot2.Create(32, 32, ILC_COLOR24 |ILC_MASK, 3, 0);    // 8俺 窜眠
	imgHot2.Add(&bmpHot2, RGB(255,255,255));
	m_wndInfoToolBar.GetToolBarCtrl().SetImageList(&imgHot2);
	imgHot2.Detach();    // 馆靛矫 盒府茄促
	bmpHot2.Detach();

	bmpCold2.LoadBitmap(IDB_BITMAP_INFO_TOOLBAR_GRAY_32);
	imgCold2.Create(32, 32, ILC_COLOR24 |ILC_MASK, 3, 0);    // 8俺 窜眠
	imgCold2.Add(&bmpCold2, RGB(255,255,255));
	m_wndInfoToolBar.GetToolBarCtrl().SetDisabledImageList(&imgCold2);
	imgCold2.Detach();    // 馆靛矫 盒府茄促
	bmpCold2.Detach();

	m_wndInfoToolBar.GetItemRect(0,&temp);
	m_wndInfoToolBar.SetSizes(CSize(temp.Width(), temp.Height()), CSize(32,32));

	if(!m_wndInfoToolBar.CreateEdit(m_wndTotalReadCount, 
		5, 
		ID_READ_TOTAL_COUNT, 100))
	{
		TRACE0("Failed to create Info toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndInfoToolBar.CreateCheckButton(m_wndLeakCheckButton, 6, ID_LEAK_CHECK, 30))
	{
		TRACE0("Failed to create toolbar's combo box\n");
		return -1;      // fail to create
	}

	if (!m_wndInfoToolBar.CreateComboBox(m_wndComboLeakTime, 7, ID_LEAK_TIME, 40, 50))
	{
		TRACE0("Failed to create toolbar's combo box\n");
		return -1;      // fail to create
	}

	m_wndComboLeakTime.AddString(_T("1"));
	m_wndComboLeakTime.AddString(_T("2"));
	m_wndComboLeakTime.AddString(_T("3"));
	m_wndComboLeakTime.AddString(_T("4"));
	m_wndComboLeakTime.AddString(_T("5"));
	m_wndComboLeakTime.AddString(_T("6"));
	m_wndComboLeakTime.AddString(_T("7"));
	m_wndComboLeakTime.AddString(_T("8"));
	m_wndComboLeakTime.AddString(_T("9"));
	m_wndComboLeakTime.AddString(_T("10"));

	m_wndTotalReadCount.SetWindowText(_T("0"));

	m_wndComboLeakTime.SetCurSel(0);
	m_wndComboLeakTime.EnableWindow(FALSE);
	
	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}


	if (!m_wndTagAccessToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndTagAccessToolBar.LoadToolBar(IDR_TOOLBAR_TAGACCESS))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	// 捞固瘤府胶飘 备己
	CBitmap bmpHot3, bmpCold3;
	CImageList imgHot3, imgCold3;

	bmpHot3.LoadBitmap(IDB_BITMAP_TAG_ACCESS_COLOR_32);
	imgHot3.Create(32, 32, ILC_COLOR24 |ILC_MASK, 4, 0);    // 3俺 窜眠
	imgHot3.Add(&bmpHot3, RGB(255,255,255));
	m_wndTagAccessToolBar.GetToolBarCtrl().SetImageList(&imgHot3);
	imgHot3.Detach();    // 馆靛矫 盒府茄促
	bmpHot3.Detach();

	bmpCold3.LoadBitmap(IDB_BITMAP_TAG_ACCESS_GRAY_32);
	imgCold3.Create(32, 32, ILC_COLOR24 |ILC_MASK, 4, 0);    // 3俺 窜眠
	imgCold3.Add(&bmpCold3, RGB(255,255,255));
	m_wndTagAccessToolBar.GetToolBarCtrl().SetDisabledImageList(&imgCold3);
	imgCold3.Detach();    // 馆靛矫 盒府茄促
	bmpCold3.Detach();

	m_wndTagAccessToolBar.GetItemRect(0,&temp);
	m_wndTagAccessToolBar.SetSizes(CSize(temp.Width(), temp.Height()), CSize(32,32));

	// TODO: Delete these three lines if you don't want the toolbar to be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndInfoToolBar.EnableDocking(CBRS_ALIGN_ANY);

⌨️ 快捷键说明

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