?? stepcali.cpp
字號:
/ 靜態(tài)增益校正參數(shù)及效果參數(shù)寫入fp文件 /
/==============================================*/
void Gain_Disp(CString Cali_Title,FILE *fp)
{
//從上傳效果參數(shù)中提取底層實際使用的靜態(tài)增益參數(shù)
for (int i=0;i<32;i++)
Def_Stp_Para[i+150+64]=Stp_Cai_XGP[i+64]; //以上傳值更新保存參數(shù)值
int JZP,XGP; //對應(yīng)校正步號返回的校正參數(shù)及效果參數(shù)的位置
fprintf(fp," \n");
fprintf(fp," \n");
fprintf(fp,"========================================================== %s ======================================================\n",Cali_Title);
fprintf(fp," \n");
fprintf(fp," 增益目標(biāo)碼: %d 偏色系數(shù)下限: %d 偏色系數(shù)上限: %d\n",((Def_Stp_Para[152]<<8) | (Def_Stp_Para[153])),(Def_Stp_Para[274]-100),(Def_Stp_Para[273]-100));
fprintf(fp," \n");
fprintf(fp," ==偏色調(diào)整系數(shù)==\n");
fprintf(fp," R通道 G通道 B通道\n");
i=150+120; //
fprintf(fp," 整體:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+96;
fprintf(fp," CCD1:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+99;
fprintf(fp," CCD2:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+102;
fprintf(fp," CCD3:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+105;
fprintf(fp," CCD4:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+108;
fprintf(fp," CCD5:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
/* i=150+111;
fprintf(fp," CCD6:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+114;
fprintf(fp," CCD7:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
i=150+117;
fprintf(fp," CCD8:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
*/
JZP=214; //CCD頭靜態(tài)增益校正參數(shù)在Def_Stp_Para緩沖區(qū)中的起始位置=214
XGP=150+720; //CCD頭靜態(tài)增益校正效果參數(shù)在Stp_Cai_XGP緩沖區(qū)中的起始位置=150+720
fprintf(fp," \n");
fprintf(fp," ==靜態(tài)增益校正參數(shù)及校正效果參數(shù)==\n");
Cali_Disp(JZP,XGP,fp); //靜態(tài)增益校正參數(shù)及校正效果參數(shù)格式化寫入
JZP=1; //CCD頭動態(tài)偏移參數(shù)沒有上傳,設(shè)置JZP=1,決定在寫入時單另處理。
XGP=150+960; //CCD頭動態(tài)偏移狀況參數(shù)在Stp_Cai_XGP緩沖區(qū)中的起始位置=150+960
fprintf(fp," \n");
fprintf(fp," ==動態(tài)偏移狀況參數(shù)==\n");
Cali_Disp(JZP,XGP,fp); //動態(tài)偏移狀況參數(shù)格式化寫入
JZP=1; //CCD頭動態(tài)增益參數(shù)沒有上傳,設(shè)置JZP=1,決定在寫入時單另處理。
XGP=150+1200; //CCD頭動態(tài)增益校正效果參數(shù)在Stp_Cai_XGP緩沖區(qū)中的起始位置=150+1200
fprintf(fp," \n");
fprintf(fp," ==動態(tài)增益校正效果參數(shù)==\n");
Cali_Disp(JZP,XGP,fp); //動態(tài)增益校正參數(shù)及校正效果參數(shù)格式化寫入
JZP=150+88; //CCD頭增益范圍參數(shù)在Def_Stp_Para緩沖區(qū)中的起始位置=150+88
XGP=150+1440; //CCD頭動態(tài)增益校正狀況參數(shù)在Stp_Cai_XGP緩沖區(qū)中的起始位置=150+1440
fprintf(fp," \n");
fprintf(fp," ==動態(tài)增益校正狀況參數(shù)==\n");
Cali_DGain_Dsp(JZP,XGP,fp); //動態(tài)增益校正狀況參數(shù)格式化寫入
}
/*==========================================================================/
/ *****動態(tài)增益校正狀況參數(shù)顯示格式行寫入***** /
/ 將Def_Stp_Para數(shù)組JZP開始的校正參數(shù)及Stp_Cai_XGP數(shù)組XGP開始的 /
/ 效果參數(shù)寫入fp文件 /
/==========================================================================*/
void Cali_DGain_Dsp(int JZP,int XGP,FILE *fp)
{
int HEADnum=5; //掃描頭的個數(shù)
//狀況參數(shù)值在Stp_Cai_XGP緩沖區(qū)為每頭14字節(jié),2字節(jié)總數(shù)+3通道各4字節(jié)狀況值。顯示時先將2字節(jié)的參數(shù)轉(zhuǎn)換成1個字。
int XGbuf[56]; //5個頭共35個字。
//寫入顯示格式行
fprintf(fp," ---------- R通道 --------- ---------- G通道 --------- ---------- B通道 --------- \n");
fprintf(fp,"增益范圍 有效像點總數(shù) 校正不足的像點數(shù) 校正過量的像點數(shù) 校正不足的象點數(shù) 校正過量的象點數(shù) 校正不足的象點數(shù) 校正過量的象點數(shù) \n");
int i;
double Range;
for(i=0;i<7*HEADnum;i++) //將上傳的2字節(jié)效果參數(shù)值轉(zhuǎn)換成1個字
XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);
for(i=0;i<HEADnum;i++) //將HEADnum個頭的校正參數(shù)和效果參數(shù)寫入fp文件
{
if (Def_Stp_Para[JZP]==1) Range=1.5;
if (Def_Stp_Para[JZP]==2) Range=2.0;
if (Def_Stp_Para[JZP]==3) Range=3.0;
if ((Def_Stp_Para[JZP]<1) || (Def_Stp_Para[JZP]>3)) Range=9.9;
fprintf(fp,"%6.1f%12d%16d%18d%18d%18d%18d%18d\n",Range,XGbuf[7*i+0],XGbuf[7*i+1],XGbuf[7*i+2],XGbuf[7*i+3],XGbuf[7*i+4],XGbuf[7*i+5],XGbuf[7*i+6]);
JZP=JZP+1;
}
}
/*==========================================================================/
/ *****分步校正效果參數(shù)顯示格式行寫入***** /
/ 將Def_Stp_Para數(shù)組JZP開始的校正參數(shù)及Stp_Cai_XGP數(shù)組XGP開始的 /
/ 效果參數(shù)寫入fp文件 /
/==========================================================================*/
void Cali_Disp(int JZP,int XGP,FILE *fp)
{
int HEADnum=5; //掃描頭的個數(shù)
//效果參數(shù)值在Stp_Cai_XGP緩沖區(qū)為每通道10字節(jié),每個頭為3*10字節(jié)。顯示時先將2字節(jié)的效果參數(shù)轉(zhuǎn)換成1個字。
int XGbuf[120]; //5個頭的效果參數(shù)值緩沖區(qū),每通道5個字,每頭3*5個字,5個頭共75個字。
//寫入顯示格式行
fprintf(fp," --------------- R通道 ---------------- ----------------- G通道 ----------------- ----------------- B通道 ----------------- \n");
fprintf(fp,"參數(shù)值 最大值 象點數(shù) 最小值 象點數(shù) 平均值 大÷小 參數(shù)值 最大值 象點數(shù) 最小值 象點數(shù) 平均值 大÷小 參數(shù)值 最大值 象點數(shù) 最小值 象點數(shù) 平均值 大÷小\n");
int i;
double Max_div_Min;
for(i=0;i<15*HEADnum;i++) //將上傳的2字節(jié)效果參數(shù)值轉(zhuǎn)換成1個字
XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);
if (JZP==1) //校正效果參數(shù)寫入fp文件
{
for(i=0;i<HEADnum;i++) //將HEADnum個頭的校正參數(shù)和效果參數(shù)寫入fp文件
{
Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
fprintf(fp,"%11d%7d%7d%7d%7d%8.2f",XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min); //R
Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
fprintf(fp,"%14d%7d%7d%7d%7d%8.2f",XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min); //G
Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
fprintf(fp,"%14d%7d%7d%7d%7d%8.2f\n",XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min); //B
}
}
else
for(i=0;i<HEADnum;i++) //將HEADnum個頭的校正參數(shù)和效果參數(shù)寫入fp文件
{
Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
fprintf(fp,"%4d%7d%7d%7d%7d%7d%8.2f",Def_Stp_Para[JZP],XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min);
JZP=JZP+1; //指向G通道
Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f",Def_Stp_Para[JZP],XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min);
JZP=JZP+1; //指向B通道
Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f\n",Def_Stp_Para[JZP],XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min);
JZP=JZP+1; //指向下一頭的R通道
}
}
/*==========================================================================/
/ *****靜態(tài)偏移分步校正效果參數(shù)顯示格式行寫入***** /
/ 將Def_Stp_Para數(shù)組JZP開始的校正參數(shù)及Stp_Cai_XGP數(shù)組XGP開始的 /
/ 效果參數(shù)寫入fp文件 /
/==========================================================================*/
void Cali_OFF_Dsp(int JZP,int XGP,FILE *fp)
{
int HEADnum=5; //掃描頭的個數(shù)
//效果參數(shù)值在Stp_Cai_XGP緩沖區(qū)為每通道10字節(jié),每個頭為3*10字節(jié)。顯示時先將2字節(jié)的效果參數(shù)轉(zhuǎn)換成1個字。
int XGbuf[120]; //5個頭的效果參數(shù)值緩沖區(qū),每通道5個字,每頭3*5個字,5個頭共75個字。
//寫入顯示格式行
fprintf(fp," --------------- R通道 ---------------- ----------------- G通道 ----------------- ----------------- B通道 ----------------- \n");
fprintf(fp,"參數(shù)值 最大值 象點數(shù) 最小值 象點數(shù) 平均值 大÷小 參數(shù)值 最大值 象點數(shù) 最小值 象點數(shù) 平均值 大÷小 參數(shù)值 最大值 象點數(shù) 最小值 象點數(shù) 平均值 大÷小\n");
int i;
double Max_div_Min;
for(i=0;i<15*HEADnum;i++) //將上傳的2字節(jié)效果參數(shù)值轉(zhuǎn)換成1個字
XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);
int R,G,B;
for(i=0;i<HEADnum;i++) //將HEADnum個頭的校正參數(shù)和效果參數(shù)寫入fp文件
{
R=Def_Stp_Para[JZP];
G=Def_Stp_Para[JZP+1];
B=Def_Stp_Para[JZP+2];
JZP=JZP+3; //指向下一頭的R通道
if (R>31) R=32-R;
if (G>31) G=32-G;
if (B>31) B=32-B;
Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
fprintf(fp,"%4d%7d%7d%7d%7d%7d%8.2f",R,XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min);
Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f",G,XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min);
Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f\n",B,XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min);
}
}
/*---------------------------兩整數(shù)相除-------------------------------------/
/ 若除數(shù)為零,則結(jié)果=99.99 /
/--------------------------------------------------------------------------*/
double M_Div_N(int A,int B)
{
double C;
if (B==0) C=99.99;
else C=1.0*A/(B*1.0);
return(C);
}
/*=====================2004年2月18日增加====================================/
/ *****初始化Def_Stp_Para數(shù)組內(nèi)的缺省參數(shù)及分步參數(shù)***** /
/ 從jiaose.ini中讀取并初始化Def_Stp_Para數(shù)組內(nèi)的300字節(jié)下傳參數(shù) /
/ 在校正設(shè)置界面打開及每次掃描前調(diào)用 /
/==========================================================================*/
void Stp_Para_INI()
{
Stp_DefuP_INI(); //讀取jiaose.ini文件內(nèi)的缺省參數(shù)初始化Def_Stp_Para緩沖區(qū)中下傳參數(shù)包的前150字節(jié)
Stp_GanG_INI(); //初始化Def_Stp_Para數(shù)組后150字節(jié)中的感光參數(shù)
Stp_Offset_INI(); //初始化Def_Stp_Para數(shù)組后150字節(jié)中的靜態(tài)偏移參數(shù)
Stp_GanPs_INI(); //初始化Def_Stp_Para數(shù)組后150字節(jié)中的靜態(tài)增益及偏色系數(shù)參數(shù)
Stp_Cai_CtrP_INI(); //初始化分步校正控制參數(shù)及動態(tài)增益均值濾波控制參數(shù)
}
//---------------- 2004.3.24 初始化缺省參數(shù) ------------//
// 讀jiaose.ini文件,初始化Def_Stp_Para數(shù)組中0~149單元的150字節(jié)的缺省參數(shù) //
//----------------------------------------------------------------------------------//
void Stp_DefuP_INI()
{
int i,Tmp;
// ***CCD線陣缺省參數(shù)***
Tmp=GetPrivateProfileInt("CCD_Para","CCD_DefP_Ena",0,InitDir2);
Def_Stp_Para[0] =LOBYTE(Tmp); //CCD缺省參數(shù)有效標(biāo)志:有效=0xA5
Tmp=GetPrivateProfileInt("CCD_Para","Max_Pixel",10708,InitDir2);
Def_Stp_Para[1] =HIBYTE(Tmp); //CCD線陣象點數(shù)
Def_Stp_Para[2] =LOBYTE(Tmp);
Tmp=GetPrivateProfileInt("CCD_Para","Dmp_Pixel",46,InitDir2);
Def_Stp_Para[3] =LOBYTE(Tmp); //CCD線陣頭部啞元數(shù)
Tmp=GetPrivateProfileInt("CCD_Para","Blk_Pixel",34,InitDir2);
Def_Stp_Para[4] =LOBYTE(Tmp); //CCD線陣頭部黑點數(shù)
Tmp=GetPrivateProfileInt("CCD_Para","Add_Pixel",12,InitDir2);
Def_Stp_Para[5] =HIBYTE(Tmp); //CCD線陣的附加感光象點數(shù)
Def_Stp_Para[6] =LOBYTE(Tmp);
// ***LM9812時序缺省參數(shù)***
i=8;
int j;
char TmpStr[10];
strcpy(TmpStr,"LM98_CCD1");
for (j=1;j<=8;j++)
{
TmpStr[8]=LOBYTE(0x30+j);
Tmp=GetPrivateProfileInt(TmpStr,"Reg16",10,InitDir2);
Def_Stp_Para[i+0] =LOBYTE(Tmp); //TR脈沖的寬度
Tmp=GetPrivateProfileInt(TmpStr,"Reg18",10,InitDir2);
Def_Stp_Para[i+1] =LOBYTE(Tmp); //TR沿距Q1沿的距離
Tmp=GetPrivateProfileInt(TmpStr,"Reg19",10,InitDir2);
Def_Stp_Para[i+2] =LOBYTE(Tmp); //光學(xué)黑點鉗位的開始時刻
Tmp=GetPrivateProfileInt(TmpStr,"Reg20",22,InitDir2);
Def_Stp_Para[i+3] =LOBYTE(Tmp); //光學(xué)黑點鉗位的開始時刻
Tmp=GetPrivateProfileInt(TmpStr,"Reg21",0xad,InitDir2);
Def_Stp_Para[i+4] =LOBYTE(Tmp); //RS脈沖的寬度及位置
Tmp=GetPrivateProfileInt(TmpStr,"Reg22",10,InitDir2);
Def_Stp_Para[i+5] =LOBYTE(Tmp); //參考電平采樣的位置
Tmp=GetPrivateProfileInt(TmpStr,"Reg23",22,InitDir2);
Def_Stp_Para[i+6] =LOBYTE(Tmp); //信號電平采樣的位置
Tmp=GetPrivateProfileInt(TmpStr,"Reg27",0x40,InitDir2);
Def_Stp_Para[i+7] =LOBYTE(Tmp); //測試波形輸出(CDS/Clamp)
i=i+8;
}
// ***** 頭尾重疊下傳參數(shù) *****
int Head,End,Adj;
char HStr[10],EStr[9],AStr[9];
i=72;
strcpy(HStr,"Head_CNT1");
strcpy(EStr,"End_CNT1");
strcpy(AStr,"END1_Adj");
for (j=1;j<=8;j++)
{
HStr[8]=LOBYTE(0x30+j);
EStr[7]=LOBYTE(0x30+j);
AStr[3]=LOBYTE(0x30+j);
Head=GetPrivateProfileInt("CCD_Pj",HStr,10,InitDir2);
End=GetPrivateProfileInt("CCD_Pj",EStr,10,InitDir2);
Adj=GetPrivateProfileInt("CCD_Adjust",AStr,0,InitDir2);
Def_Stp_Para[i+0]=HIBYTE(Head); //頭部重疊區(qū)象素數(shù)
Def_Stp_Para[i+1]=LOBYTE(Head);
Def_Stp_Para[i+2]=HIBYTE(End+Adj); //尾部重疊區(qū)象素數(shù)
Def_Stp_Para[i+3]=LOBYTE(End+Adj);
i=i+4;
}
//修改第一頭的頭部重疊數(shù):將頭部剪切量加進去
Head=GetPrivateProfileInt("CCD_Pj","Head_CNT1",10,InitDir2);
Adj=GetPrivateProfileInt("CCD_Adjust","Head_Adj",10,InitDir2);
Def_Stp_Para[72]=HIBYTE(Head+Adj); //頭部重疊區(qū)象素數(shù)+頭部剪切量
Def_Stp_Para[73]=LOBYTE(Head+Adj);
//A0掃描儀:將尾部修改剪切量加到第五頭的尾部剪切值中去
//A1掃描儀:將尾部修改剪切量加到第三頭的尾部剪切值中去
End=GetPrivateProfileInt("CCD_Pj","End_CNT5",10,InitDir2);
Adj=GetPrivateProfileInt("CCD_Adjust","END5_Adj",10,InitDir2);
Def_Stp_Para[90]=HIBYTE(End+Adj); //第5頭尾部重疊區(qū)象素數(shù)+尾部剪切量
Def_Stp_Para[91]=LOBYTE(End+Adj);
//***分步校正缺省參數(shù)***
i=104;
Tmp=GetPrivateProfileInt("Step_JZ","Beg_CCD",1,InitDir2);
Def_Stp_Para[i+0] =LOBYTE(Tmp); //開始的CCD號
Tmp=GetPrivateProfileInt("Step_JZ","End_CCD",3,InitDir2);
Def_Stp_Para[i+1] =LOBYTE(Tmp); //結(jié)束的CCD號
Tmp=GetPrivateProfileInt("Step_JZ","Exp_ContFLG",0,InitDir2);
Def_Stp_Para[i+2] =LOBYTE(Tmp); //強制感光控制標(biāo)志:=0xA5-->關(guān)閉感光;=其它-->掃描儀控制
Tmp=GetPrivateProfileInt("Step_JZ","Lin_Num",8,InitDir2);
Def_Stp_Para[i+3] =LOBYTE(Tmp); //校正掃描行
Tmp=GetPrivateProfileInt("Step_JZ","Lin_Num_Mi",3,InitDir2);
Def_Stp_Para[i+4] =LOBYTE(Tmp); //校正掃描行數(shù)的冪
Tmp=GetPrivateProfileInt("Step_JZ","Step_Vec",30000,InitDir2);
Def_Stp_Para[i+5] =HIBYTE(Tmp); //校正步進速度
Def_Stp_Para[i+6] =LOBYTE(Tmp);
//***電機速度控制缺省參數(shù)***
/*
i=114; //零位搜索
Tmp=GetPrivateProfileInt("Motor_Zero","Start_Vec",25000,InitDir2);
Def_Stp_Para[i+0] =HIBYTE(Tmp); //啟動速度
Def_Stp_Para[i+1] =LOBYTE(Tmp);
Tmp=GetPrivateProfileInt("Motor_Zero","Max_Vec",2500,InitDir2);
Def_Stp_Para[i+2] =HIBYTE(Tmp); //最高速度
Def_Stp_Para[i+3] =LOBYTE(Tmp);
Tmp=GetPrivateProfileInt("Motor_Zero","Max_Acc",100,InitDir2);
Def_Stp_Para[i+4] =HIBYTE(Tmp); //加速度最大值
Def_Stp_Para[i+5] =LOBYTE(Tmp);
Tmp=GetPrivateProfileInt("Motor_Zero","Max_Acc_Stp",500,InitDir2);
Def_Stp_Para[i+6] =HIBYTE(Tmp); //最大加速步數(shù)
Def_Stp_Para[i+7] =LOBYTE(Tmp);
*/
i=122; //移動定位
Tmp=GetPrivateProfileInt("Motor_Move","Start_Vec",25000,InitDir2);
Def_Stp_Para[i+0] =HIBYTE(Tmp); //啟動速度
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -