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

📄 codecwizarddlg.cpp

📁 多种编解码的小程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -