📄 infohidedoc.cpp
字号:
// InfoHideDoc.cpp : implementation of the CInfoHideDoc class
//
#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "InfoHide.h"
#include "InfoHideDoc.h"
#include "typechoice.h"
#include "input_mw.h"
#include "jm_pic.h"
#include "bmptojpeg2k.h"
#include "video_par.h"
//yuhuan 2008-10-13 add new dialog
#include "Arnold.h"
#include "Lorenz.h"
#include "Liu.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc
IMPLEMENT_DYNCREATE(CInfoHideDoc, CDocument)
BEGIN_MESSAGE_MAP(CInfoHideDoc, CDocument)
//{{AFX_MSG_MAP(CInfoHideDoc)
ON_COMMAND(ID_ARNOLD_Z, OnArnoldZ)
ON_COMMAND(ID_ARNOLD_N, OnArnoldN)
ON_COMMAND(ID_HILBERT_Z, OnHilbertZ)
ON_COMMAND(ID_HILBERT_N, OnHilbertN)
ON_COMMAND(ID_DCT_Z, OnDctZ)
ON_COMMAND(ID_DCT_N, OnDctN)
ON_COMMAND(ID_LSB_E, OnLsbE)
ON_COMMAND(ID_LSB_D, OnLsbD)
ON_COMMAND(ID_BMP2JPEG, OnBmp2jpeg)
ON_COMMAND(ID_RGBTOGRAY, OnRgbtogray)
ON_COMMAND(ID_RGBTO2, OnRgbto2)
ON_COMMAND(ID_RGBTO256, OnRgbto256)
ON_COMMAND(ID_VIDEO_PAR, OnVideoPar)
ON_COMMAND(ID_ROBERT, OnRobert)
ON_COMMAND(ID_SOBE, OnSobe)
ON_COMMAND(ID_LAPLACE, OnLaplace)
ON_COMMAND(ID_LORENZ_DECODE, OnLorenzDecode)
ON_COMMAND(ID_LORENZ_ENCODE, OnLorenzEncode)
ON_COMMAND(ID_LIU_ENCODE, OnLiuEncode)
ON_COMMAND(ID_LIU_DECODE, OnLiuDecode)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc construction/destruction
CInfoHideDoc::CInfoHideDoc()
{
// TODO: add one-time construction code here
lpbits=NULL;
lpbmi=NULL;
mm_lpbits=NULL;
trans=0;
pic_save=0;
}
CInfoHideDoc::~CInfoHideDoc()
{
free(DataR);
free(Datas);
}
BOOL CInfoHideDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc serialization
void CInfoHideDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc diagnostics
#ifdef _DEBUG
void CInfoHideDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CInfoHideDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc commands
void CInfoHideDoc::OnDraw(CDC *pDC)//在客户区DC上面画出位图
{
if(!trans){
::StretchDIBits(pDC->GetSafeHdc(),0,0,m_size.cx,m_size.cy,0,0,m_size.cx,m_size.cy,lpbits,lpbmi,DIB_RGB_COLORS,SRCCOPY);
pic_save=0;
}
else{
::StretchDIBits(pDC->GetSafeHdc(),0,0,mm_m_size.cx,mm_m_size.cy,0,0,mm_m_size.cx,mm_m_size.cy,mm_lpbits,mm_lpbmi,DIB_RGB_COLORS,SRCCOPY);
trans=0;
pic_save=1;
}
}
BOOL CInfoHideDoc::OnOpenDocument(LPCTSTR lpszPathName)//打开位图并判断是否为24位位图
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;//判断路径是否合法
CFile fp;//指定的位图文件
fp.Open(lpszPathName,CFile::modeRead);
fp.Read((LPSTR)&bmh,sizeof(BITMAPFILEHEADER));
if(bmh.bfType!=0x4D42)//判断文件是否为位图
{
AfxMessageBox("不是合法的文件!");
fp.Close();
return FALSE;
}
mm_bmh=bmh;
DWORD dwBitsSize=bmh.bfSize;
lpbmi=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-sizeof(BITMAPFILEHEADER));
fp.Read(lpbmi,dwBitsSize-sizeof(BITMAPFILEHEADER));
mm_lpbmi=lpbmi;
if((lpbmi->bmiHeader.biBitCount!=24)||(lpbmi->bmiHeader.biCompression!=BI_RGB))
{//判断该位图是否为24位非压缩位图
AfxMessageBox("该位图不是我们需要的24位位图!");
GlobalFreePtr(lpbmi);
lpbmi=NULL;
fp.Close();
return FALSE;
}
lpbits=(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER);
m_size.cx=lpbmi->bmiHeader.biWidth;//得到位图宽度
m_size.cy=lpbmi->bmiHeader.biHeight;//得到位图高度
fp.Close();//关闭文件
return TRUE;
}
BOOL CInfoHideDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
// TODO: Add your specialized code here and/or call the base class
CFile fp;//指定文件
fp.Open(lpszPathName,CFile::modeWrite|CFile::modeCreate);
if(!pic_save)
{
fp.Write((LPSTR)&bmh,sizeof(BITMAPFILEHEADER));//写位图头信息
fp.Write(lpbmi,bmh.bfSize-sizeof(BITMAPFILEHEADER));//写位图数据信息
}
else
{
fp.Write((LPSTR)&mm_bmh,sizeof(BITMAPFILEHEADER));//写位图头信息
fp.Write(mm_lpbmi,mm_bmh.bfSize-sizeof(BITMAPFILEHEADER));//写位图数据信息
}
fp.Close();
SetModifiedFlag(false);
return true;
}
//响应菜单项上的各种具体的算法
/***************************************************************
*ProcessName:二维混沌系统猫映射正变换
***************************************************************/
void CInfoHideDoc::OnArnoldZ()
{
CArnold dlg;
//默认值
dlg.m_npara1=1;//参数1
dlg.m_npara2=1;//参数2
dlg.m_npara3=1;//变换次数
dlg.DoModal();
int a,b;
int n;
a=dlg.m_npara1;//参数1
b=dlg.m_npara2;//参数2
n=dlg.m_npara3;//变换次数
// TODO: Add your command handler code here
int i,j,*pbuffer;
pbuffer=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER
for (int k=1;k<=n;k++)
{for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
pbuffer[(i*m_size.cx+j)*3]=lpbits[(i*m_size.cx+j)*3];
pbuffer[(i*m_size.cx+j)*3+1]=lpbits[(i*m_size.cx+j)*3+1];
pbuffer[(i*m_size.cx+j)*3+2]=lpbits[(i*m_size.cx+j)*3+2];
}//保存原始图像数据
//猫映射的原理见笔记,其中的m_size.cy就是N
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
lpbits[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3]
=pbuffer[(i*m_size.cx+j)*3];
lpbits[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3+1]
=pbuffer[(i*m_size.cx+j)*3+1];
lpbits[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3+2]
=pbuffer[(i*m_size.cx+j)*3+2];
}
}
//进行ARNOLD正变换,并将变换后的数据还原为位图数据
free(pbuffer);
pbuffer=NULL;
UpdateAllViews(NULL);
SetModifiedFlag();
}
/***************************************************************
*ProcessName:二维混沌系统猫映射逆变换
***************************************************************/
void CInfoHideDoc::OnArnoldN()
{
// TODO: Add your command handler code here
CArnold dlg;
//默认值
dlg.m_npara1=1;//参数1
dlg.m_npara2=1;//参数2
dlg.m_npara3=1;//变换次数
dlg.DoModal();
int a,b;
int n;
a=dlg.m_npara1;
b=dlg.m_npara2;
n=dlg.m_npara3;
int i,j,*pbuffer;
pbuffer=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER
for (int l=1;l<=n;l++)
{for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
pbuffer[(i*m_size.cx+j)*3]=lpbits[(i*m_size.cx+j)*3];
pbuffer[(i*m_size.cx+j)*3+1]=lpbits[(i*m_size.cx+j)*3+1];
pbuffer[(i*m_size.cx+j)*3+2]=lpbits[(i*m_size.cx+j)*3+2];
}//保存原始图像数据
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
lpbits[(i*m_size.cx+j)*3]
=pbuffer[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3];
lpbits[(i*m_size.cx+j)*3+1]
=pbuffer[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3+1];
lpbits[(i*m_size.cx+j)*3+2]
=pbuffer[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3+2];
}//进行ARNOLD逆变换,
}
//进行ARNOLD逆变换,并将变换后的数据还原为位图数据
free(pbuffer);
pbuffer=NULL;
UpdateAllViews(NULL);
SetModifiedFlag();
}
/***************************************************************
*ProcessName:希尔伯特正变换
***************************************************************/
void CInfoHideDoc::OnHilbertZ()
{
// TODO: Add your command handler code here
ah=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER
bh=new int[m_size.cx*m_size.cy*3];
th=0;
nh=m_size.cx;
for(ih=0;ih<m_size.cy;ih++)
for(jh=0;jh<m_size.cx;jh++)
{
ah[(ih*m_size.cx+jh)*3]=lpbits[(ih*m_size.cx+jh)*3];
ah[(ih*m_size.cx+jh)*3+1]=lpbits[(ih*m_size.cx+jh)*3+1];
ah[(ih*m_size.cx+jh)*3+2]=lpbits[(ih*m_size.cx+jh)*3+2];
}//存储位图数据
ih=nh-1;jh=0;//初始化正变换数据
h2(nh);
for(ih=0;ih<m_size.cy;ih++)
for(jh=0;jh<m_size.cx;jh++)
{
lpbits[(ih*m_size.cx+jh)*3]=bh[(ih*m_size.cx+jh)*3];
lpbits[(ih*m_size.cx+jh)*3+1]=bh[(ih*m_size.cx+jh)*3+1];
lpbits[(ih*m_size.cx+jh)*3+2]=bh[(ih*m_size.cx+jh)*3+2];
}//进行HILBERT正变换
th=0;//还原变换初始位置
free(ah);
free(bh);
ah=NULL;
bh=NULL;
UpdateAllViews(NULL);
SetModifiedFlag();
}
/***************************************************************
*ProcessName:希尔伯特逆变换
***************************************************************/
void CInfoHideDoc::OnHilbertN()
{
// TODO: Add your command handler code here
ah=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER
bh=new int[m_size.cx*m_size.cy*3];
th=0;
nh=m_size.cx;
for(ih=0;ih<m_size.cy;ih++)
for(jh=0;jh<m_size.cx;jh++)
{
ah[(ih*m_size.cx+jh)*3]=lpbits[(ih*m_size.cx+jh)*3];
ah[(ih*m_size.cx+jh)*3+1]=lpbits[(ih*m_size.cx+jh)*3+1];
ah[(ih*m_size.cx+jh)*3+2]=lpbits[(ih*m_size.cx+jh)*3+2];
}//存储位图数据
ih=nh-1;jh=0;//初始化逆变换数据
fh2(nh);
for(ih=0;ih<m_size.cy;ih++)
for(jh=0;jh<m_size.cx;jh++)
{
lpbits[(ih*m_size.cx+jh)*3]=bh[(ih*m_size.cx+jh)*3];
lpbits[(ih*m_size.cx+jh)*3+1]=bh[(ih*m_size.cx+jh)*3+1];
lpbits[(ih*m_size.cx+jh)*3+2]=bh[(ih*m_size.cx+jh)*3+2];
}//进行HILBERT逆变换
th=0;//还原变换初始位置
free(ah);
free(bh);
ah=NULL;
bh=NULL;
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CInfoHideDoc::h1(int step)//HILBERT正变换方向一
{
int var_i,var_j,var_t;
var_i=ih;var_j=jh;var_t=th;
if(step==2){
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+jh)*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(++jh))*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((--ih)*m_size.cx+jh)*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(--jh))*3];
ih=var_i;jh=var_j;th=var_t;
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+jh)*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(++jh))*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((--ih)*m_size.cx+jh)*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(--jh))*3+1];
ih=var_i;jh=var_j;th=var_t;
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+jh)*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(++jh))*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((--ih)*m_size.cx+jh)*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(--jh))*3+2];
}
else{
h2(step/2);
jh++; h1(step/2);
ih--; h1(step/2);
jh--; h3(step/2);
}
}
void CInfoHideDoc::h2(int step)//HILBERT正变换方向二
{
int var_i,var_j,var_t;
var_i=ih;var_j=jh;var_t=th;
if(step==2){
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+jh)*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((--ih)*m_size.cx+jh)*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(++jh))*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((++ih)*m_size.cx+jh)*3];
ih=var_i;jh=var_j;th=var_t;
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+jh)*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((--ih)*m_size.cx+jh)*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(++jh))*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((++ih)*m_size.cx+jh)*3+1];
ih=var_i;jh=var_j;th=var_t;
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+jh)*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((--ih)*m_size.cx+jh)*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(++jh))*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((++ih)*m_size.cx+jh)*3+2];
}
else{
h1(step/2);
ih--; h2(step/2);
jh++; h2(step/2);
ih++; h4(step/2);
}
}
void CInfoHideDoc::h3(int step)//HILBERT正变换方向三
{
int var_i,var_j,var_t;
var_i=ih;var_j=jh;var_t=th;
if(step==2){
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+jh)*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((++ih)*m_size.cx+jh)*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(--jh))*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((--ih)*m_size.cx+jh)*3];
ih=var_i;jh=var_j;th=var_t;
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+jh)*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((++ih)*m_size.cx+jh)*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(--jh))*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((--ih)*m_size.cx+jh)*3+1];
ih=var_i;jh=var_j;th=var_t;
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+jh)*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((++ih)*m_size.cx+jh)*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(--jh))*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((--ih)*m_size.cx+jh)*3+2];
}
else{
h4(step/2);
ih++; h3(step/2);
jh--; h3(step/2);
ih--; h1(step/2);
}
}
void CInfoHideDoc::h4(int step)//HILBERT正变换方向四
{
int var_i,var_j,var_t;
var_i=ih;var_j=jh;var_t=th;
if(step==2){
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+jh)*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(--jh))*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((++ih)*m_size.cx+jh)*3];
bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(++jh))*3];
ih=var_i;jh=var_j;th=var_t;
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+jh)*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(--jh))*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((++ih)*m_size.cx+jh)*3+1];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(++jh))*3+1];
ih=var_i;jh=var_j;th=var_t;
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+jh)*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(--jh))*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((++ih)*m_size.cx+jh)*3+2];
bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(++jh))*3+2];
}
else{
h3(step/2);
jh--; h4(step/2);
ih++; h4(step/2);
jh++; h2(step/2);
}
}
void CInfoHideDoc::fh1(int step)//HILBERT逆变换方向一
{
int var_i,var_j,var_t;
var_i=ih;var_j=jh;var_t=th;
if(step==2){
bh[(ih*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
bh[(ih*m_size.cx+(++jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
bh[((--ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
bh[(ih*m_size.cx+(--jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
ih=var_i;jh=var_j;th=var_t;
bh[(ih*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
bh[(ih*m_size.cx+(++jh))*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
bh[((--ih)*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
bh[(ih*m_size.cx+(--jh))*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
ih=var_i;jh=var_j;th=var_t;
bh[(ih*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
bh[(ih*m_size.cx+(++jh))*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
bh[((--ih)*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
bh[(ih*m_size.cx+(--jh))*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
}
else{
fh2(step/2);
jh++; fh1(step/2);
ih--; fh1(step/2);
jh--; fh3(step/2);
}
}
void CInfoHideDoc::fh2(int step)//HILBERT逆变换方向二
{
int var_i,var_j,var_t;
var_i=ih;var_j=jh;var_t=th;
if(step==2){
bh[(ih*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
bh[((--ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
bh[(ih*m_size.cx+(++jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
bh[((++ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -