关于实现文件的拖拽二进制和非二进制文本文件的显示(WM_DROPFILES)消息函数,以及复制,粘贴,全选,时间日期的添加,删除,剪切功能的实现。
以下展示部分关键代码:
void CjishibenDlg::ReadAnsi(CFile& file)//读取方式1:ANSI //传对象传引用
{
file.Seek(0, CFile::begin);//回到头开始
char buff[1024];
UINT nRet = 0;//三种文件:ANSI:窄字符集 Unicode:宽字符集也叫UTF-16 UTF-8:窄字符集:属于Unicode
CString str;
while (nRet = file.Read(buff, sizeof(buff) - 1))//nRet != 0
{
buff[nRet] = _T('\0');
str += buff;
}
SetDlgItemText(IDC_TEXT, str);
}
void CjishibenDlg::ReadUTF8(CFile& file)//UTF-8文件编码读取
{
file.Seek(3, CFile::begin);//向后移动三个字节
LONGLONG nLen = file.GetLength();//64位操作系统
char* p = new char[nLen + 1];
nLen = file.Read(p, nLen);
p[nLen] = '\0';
TCHAR* pText = new TCHAR[nLen / 2 + 2];//防止不够 + 2
nLen = MultiByteToWideChar(CP_UTF8, NULL, p, -1, pText, nLen / 2 + 2);//代入p 传出 pText
SetDlgItemText(IDC_TEXT, pText);
delete[] p;
delete[] pText;
}
void CjishibenDlg::ReadUnicode(CFile& file)//Unicode文件编码获取
{
file.Seek(2, CFile::begin);//向后移动三个字节
LONGLONG nLen = file.GetLength();//64位操作系统
TCHAR* pText = new TCHAR[nLen / 2 + 1];//防止不够 + 1
nLen = file.Read(pText, nLen);
pText[nLen / 2] = _T('\0');
SetDlgItemText(IDC_TEXT, pText);
delete[] pText;
}
void CjishibenDlg::OnDropFiles(HDROP hDropInfo) //WM_DROPFILES
{
CDialogEx::OnDropFiles(hDropInfo);
TCHAR sFile[256];
int nCount = DragQueryFile(hDropInfo, 0, sFile, _countof(sFile));
CFile file;
if (!file.Open(sFile, CFile::modeRead))
{//文件在拖动过程被删除了,或者文件被占用
AfxMessageBox(_T("打开文件时失败!请检查文件名称是否正确!"));
return;
}
if (file.Read(sFile,2) == 2)
{
switch (sFile[0])
{
case 0xBBEF:
ReadUTF8(file);
return;
case 0xFFFE:
ReadUnicode(file);
return;
}
}
ReadAnsi(file);
/*file.Close();*/
//int i = 0;
//while (i < nCount)
//{
// DragQueryFile(hDropInfo, i, sFile, _countof(sFile));
// ++i;
//}
}
void CjishibenDlg::OnSize(UINT nType, int cx, int cy)//改变窗口大小//WM_SIZE
{
CDialogEx::OnSize(nType, cx, cy);
CWnd* p = GetDlgItem(IDC_TEXT);//IDOK//IDCANCEL
if (p)
{
CRect rect;
GetClientRect(rect);
p->MoveWindow(rect);
}
}
void CjishibenDlg::OnEditPaste()//粘贴 ID_EDIT_PASTE
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
pEdit->Paste();
}
void CjishibenDlg::OnEditClear()//删除
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
pEdit->Clear();
}
void CjishibenDlg::OnEditSelect()//全选
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
pEdit->SetSel(0, -1);
}
void CjishibenDlg::OnEditCopy()//复制
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
pEdit->Copy();
}
void CjishibenDlg::OnEditCut()//剪切
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
pEdit->Cut();
}
void CjishibenDlg::OnEditDate()//时间
{
COleDateTime time = COleDateTime::GetCurrentTime();
CString str = time.Format(_T("%H:%M %Y/%m/%d %W"));
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
pEdit->ReplaceSel(str);//选中插入
}