📄 codecwizarddlg.cpp
字号:
CRect r;
wnd->GetWindowRect(r);
int w = r.right - r.left;
int h = r.bottom - r.top;
r.bottom = rc.bottom - 4;
r.right = rc.right - 5;
r.left = r.right - w;
r.top = r.bottom - h;
wnd->MoveWindow(r);
wnd = GetDlgItem(IDC_FILE);
r.top -= h + 1;
r.bottom -= h + 1;
wnd->MoveWindow(r);
wnd = GetDlgItem(IDC_DECODE);
r.top -= h + 1;
r.bottom -= h + 1;
wnd->MoveWindow(r);
r.left -= w + 1;
r.right -= w + 1;
wnd = GetDlgItem(IDOK);
wnd->MoveWindow(r);
wnd = GetDlgItem(IDC_PASTE);
r.top += h + 1;
r.bottom += h + 1;
wnd->MoveWindow(r);
wnd = GetDlgItem(IDC_COPY);
r.top += h + 1;
r.bottom += h + 1;
int nBtnL = r.left;
wnd->MoveWindow(r);
wnd = GetDlgItem(IDC_FLAG);
wnd->GetWindowRect(r);
w = r.right - r.left;
h = r.bottom - r.top;
GetClientRect(r);
int nHalfWidth = (r.right - r.left) / 2;
r.bottom = rc.bottom - 22;
r.top = r.bottom - h;
r.left = nHalfWidth + (nHalfWidth - (rc.right - nBtnL)) / 2 - 4;
r.right = r.left + w;
wnd->MoveWindow(r);
wnd = GetDlgItem(IDC_METHODS);
wnd->GetWindowRect(r);
h = r.bottom - r.top;
r.left = rc.left + 3;
r.right = r.left + nHalfWidth - 4;
r.bottom = rc.bottom - 3;
r.top = r.bottom - h;
wnd->MoveWindow(r);
//borrow w to store bottom
w = r.top - 4;
wnd = GetDlgItem(LB_METHODS);
wnd->GetWindowRect(r);
h = r.bottom - r.top;
r.left = rc.left + 3;
r.right = r.left + nHalfWidth - 4;
r.bottom = w;
r.top = r.bottom - h;
wnd->MoveWindow(r);
w = r.top - 4;
wnd = GetDlgItem(LB_OUTPUT);
wnd->GetWindowRect(r);
h = r.bottom - r.top;
r.left = rc.left + nHalfWidth + 4;
r.top = rc.top + 4;
r.right = rc.right - 4;
r.bottom = r.top + h;
wnd->MoveWindow(r);
wnd = GetDlgItem(IDC_INPUT);
r.top = r.bottom + 4;
r.bottom = w;
r.left = rc.left + 3;
r.right = r.left + nHalfWidth - 4;
wnd->MoveWindow(r);
wnd = GetDlgItem(IDC_OUTPUT);
r.left = rc.left + nHalfWidth +4;
r.right = rc.right - 4;
wnd->MoveWindow(r);
Invalidate();
}
void CCodecWizardDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
if(m_bInitOK)
{
CRect rc;
GetClientRect(rc);
CRect r;
GetWindowRect(r);
int w = r.right - r.left - rc.right;
int h = r.bottom - r.top - rc.bottom;
if(pRect->bottom - pRect->top - h< m_nMinHeight)
{
switch(fwSide)
{
case WMSZ_TOP:
case WMSZ_TOPLEFT:
case WMSZ_TOPRIGHT:
pRect->top = pRect->bottom - m_nMinHeight - h;
break;
case WMSZ_BOTTOM:
case WMSZ_BOTTOMLEFT:
case WMSZ_BOTTOMRIGHT:
default:
pRect->bottom = pRect->top + m_nMinHeight + h;
}
}
if(pRect->right - pRect->left - w < m_nMinWidth)
{
switch(fwSide)
{
case WMSZ_LEFT:
case WMSZ_TOPLEFT:
case WMSZ_BOTTOMLEFT:
pRect->left = pRect->right - m_nMinWidth - w;
break;
case WMSZ_RIGHT:
case WMSZ_TOPRIGHT:
case WMSZ_BOTTOMRIGHT:
default:
pRect->right = pRect->left + m_nMinWidth + w;
}
}
}
CDialog::OnSizing(fwSide, pRect);
}
void CCodecWizardDlg::OnAlldone()
{
OnPaste();
OnDecode();
}
void CCodecWizardDlg::OnAllundo()
{
OnPaste();
OnOK();
OnCopy();
}
void CCodecWizardDlg::OnShow()
{
if(m_hotKey.IsRegistered())
{
if(IsWindowVisible()) ShowWindow(SW_HIDE);
else ShowWindow(SW_SHOW);
}
}
void CCodecWizardDlg::OnHotkey(ATOM hAtom,DWORD dwKey)
{
//BringWindowToTop();
if(m_hotKey.ProcessCmd(hAtom)) return;
ClearAll();
if(!m_Encode.ProcessCmd(hAtom)) m_Decode.ProcessCmd(hAtom);
OnCopy();
}
void CCodecWizardDlg::OnFile()
{
CFileDialog dlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,"所有文件|*.*||");
if(dlg.DoModal()!=IDOK) return;
CString strInput = dlg.GetPathName();
DiskFile df;
if(!df.Open(strInput,GENERIC_READ,OPEN_EXISTING))
{
MessageBox("打开输入文件失败!","错误",MB_OK|MB_ICONSTOP);
return;
}
DWORD dwFileSize = df.GetSize();
if(!dwFileSize)
{
MessageBox("输入文件为空!","提示",MB_OK|MB_ICONINFORMATION);
return;
}
GMemory<char>gm(dwFileSize + 4);
ZEROP(gm.m_pT,dwFileSize + 4);
if(df.Read(gm.m_pT,dwFileSize)!=dwFileSize)
{
MessageBox("读输入文件出错!","错误",MB_OK|MB_ICONSTOP);
return;
}
int nChoice = MessageBox("要编码请选择“是”,要解码请选择“否”,要取消本次操作请选择“取消”。","请选择处理方式",MB_YESNOCANCEL|MB_ICONQUESTION);
if(nChoice==IDCANCEL) return;
CListBox *method = (CListBox *)GetDlgItem(IDC_METHODS);
int nMethod = method->GetCurSel();
if(nMethod==CODEC_UTF7 && nChoice==IDNO)
{
for(PSTR p=gm.m_pT;(p=strstr(p,"\r\n"))!=NULL;strcpy(p,p+2));
dwFileSize = strlen(gm.m_pT);
}
#ifdef CSLCS_TRACE_CODEC
TraceFile.Open(nChoice==IDYES ? "Encode.txt" : "Decode.txt",GENERIC_WRITE,CREATE_ALWAYS);
#endif
Destructor<MIMECodec>c(*AllocCodec(nMethod));
ByteArray byOut;
if(dwFileSize>1024*10) byOut.SetGrowSize(64*1024);
#ifdef CSLCS_TRACE_CODEC
TraceFile.Write(nChoice==IDYES ? "开始编码\n" : "开始解码\n");
#endif
int nLen = (nChoice==IDYES) ? c->Encode(gm.m_pT,dwFileSize,byOut) :
c->Decode(gm.m_pT,dwFileSize,byOut);
#ifdef CSLCS_TRACE_CODEC
TraceFile.Write(nChoice==IDYES ? "编码结束\n" : "解码结束\n");
#endif
if(nLen<=0)
{
MessageBox("操作失败!","提示",MB_OK|MB_ICONINFORMATION);
return;
}
strInput += ".out";
if(!df.Open(strInput,GENERIC_WRITE,CREATE_ALWAYS))
{
MessageBox("打开输出文件失败!","错误",MB_OK|MB_ICONINFORMATION);
return;
}
df.Empty();
if((int)df.Write(byOut.GetDataPSTR(),byOut.GetDataSize())!=byOut.GetDataSize())
{
MessageBox("写输出文件出错!","错误",MB_OK|MB_ICONINFORMATION);
}
}
void CCodecWizardDlg::ClearAll()
{
CEdit *pe = (CEdit *)GetDlgItem(IDC_INPUT);
pe->SetSel(0,pe->GetWindowTextLength(),FALSE);
pe->ReplaceSel("");
pe = (CEdit *)GetDlgItem(IDC_OUTPUT);
pe->SetSel(0,pe->GetWindowTextLength(),FALSE);
pe->ReplaceSel("");
}
BOOL CCodecWizardDlg::TryGetText(CCSAutoMem& m)
{
CEdit *pe = (CEdit *)GetDlgItem(IDC_INPUT);
int nLen = pe->GetWindowTextLength();
/*if(nLen<=0)
{
OnPaste();
nLen = pe->GetWindowTextLength();
}*/
if(nLen<=0) return FALSE;
if(!m.Allocate(nLen + 4)) return FALSE;
pe->GetWindowText(m.m_pBuf,nLen + 4);
m.m_nSize = nLen;
return TRUE;
}
CCSAutoMem& CCodecWizardDlg::TryGetBin(CCSAutoMem& m)
{
ClearAll();
ClipperData cd;
if(!cd.Dumplicate()) return m;
delete &m;
return cd.Detach();
}
CCSAutoMem& CCodecWizardDlg::GetInput(int nMethod,BOOL bEncode)
{
Object<CCSAutoMem>m;
BOOL bTryText = TRUE;
BOOL bTryBin = TRUE;
BOOL bOK = FALSE;
if(bTryText) bOK = TryGetText(*m.m_pT);
if(!bOK && bTryBin) return TryGetBin(*m.Detach());
return *m.Detach();
}
void CCodecWizardDlg::SetOutput(ByteArray &mem,int nMethod,BOOL bEncode)
{
BOOL bSetText = TRUE;
switch(nMethod)
{
case CODEC_HEX:
case CODEC_HEX2C:
case CODEC_UTF7:
if(!bEncode)
{
mem.ZeroTerminate();
int nLen = (int)strlen(mem.GetDataPCSTR());
if(nLen==mem.GetDataSize()) bSetText = TRUE;
else bSetText = FALSE;
}
break;
case CODEC_URL:
bSetText = TRUE;
break;
}
if(bSetText)
{
CEdit *pe = (CEdit *)GetDlgItem(IDC_OUTPUT);
pe->SetWindowText(mem.GetDataPCSTR());
}
else
{
//char buf[32];
//sprintf(buf,"CSCODEC%d",nMethod);
//ClipperData cd;
//cd.SetClipData(mem.m_pBuf,mem.m_nSize,buf);
CFileDialog dlg(TRUE);
if(dlg.DoModal()!=IDOK) return;
DiskFile df;
if(!df.Open(dlg.GetPathName(),GENERIC_WRITE,CREATE_ALWAYS))
{
MessageBox("打不开输出文件!","错误",MB_OK|MB_ICONINFORMATION);
return;
}
if(MessageBox("要清空文件选择“是”,否则选择“否”","请选择文件操作方法",MB_YESNO|MB_ICONQUESTION)==IDYES) df.Empty();
else df.Seek(0,FILE_END);
df.Write(mem.GetDataPSTR(),mem.GetDataSize());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -