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

📄 filechildwndproc.cpp

📁 文件管理系统
💻 CPP
字号:
// fileName: fileChildWndProc.cpp
// by:       zhnyong@21cn.com

// 该程序为子窗口的各种处理子过程,主要为消息处理过程,是实现子窗口功能自定义的过程

// 包括自定义头文件
#include  "myFileManagement.h"

// 外部定义的全局变量引用
extern  HINSTANCE  hInst;

// 定义全局消息ID号与子窗口消息处理过程指针查找表
const  MessageProc  fileChildMessages[]=
{
	WM_CREATE,      goCreateFileChildWnd,
	WM_PAINT,       goPaintFileChildWnd,
	MYWM_MENUCLICK, goMenuclickChildWnd,
	WM_COMMAND,     goMenuclickChildWnd,
};

// 定义命令ID号与其对应的处理过程指针查找表
const  CommandProc  fileChildCommands[]=
{
	IDM_OPENTEXTFILE,       goOpenTextFileChildCmd,
	IDC_OPENFILEATCHILDWND, goOpenTextFileChildCmd,
	IDM_SAVETEXTFILE,       goSaveTextFileChildCmd,
	IDC_SAVEFILEATCHILDWND, goSaveTextFileChildCmd,
	IDM_ABOUT,              goAboutFileChildCmd,
    IDM_COPYFILE,           goCopyFileChildCmd,
    IDM_MOVEFILE,           goMoveFileChildCmd,
	IDC_CLEARDISPLAY,       goClearDisplayChildCmd,
};

// 定义要创建的四个控件:一个编辑钮,三个下压按钮的创建属性
CONTROLSTRUCT  controlWnd[]=
{
	{TEXT(""),       IDC_FILECONTENTEDIT,    TEXT("EDIT"),    ES_LEFT |ES_MULTILINE| WS_BORDER | ES_AUTOVSCROLL | WS_VSCROLL, 10,10,220,190  },
	{TEXT("打开文件"),IDC_OPENFILEATCHILDWND, TEXT("BUTTON"),  BS_PUSHBUTTON,  10, 210, 64, 20},
	{TEXT("保存文件"),IDC_SAVEFILEATCHILDWND, TEXT("BUTTON"),  BS_PUSHBUTTON,  88, 210, 64, 20},
	{TEXT("清空显示"),IDC_CLEARDISPLAY,       TEXT("BUTTON"),  BS_PUSHBUTTON,  166, 210, 64, 20},
};

// 注册子窗口类
int  registerFileChildWnd(HINSTANCE hInstance)
{
	// 定义窗口类结构体对象
	WNDCLASS  wc;
	// 填充结构体中的各元素
	wc.hInstance = hInstance;
	wc.lpszClassName = strFileChildClassName;
	wc.lpfnWndProc = fileChildWndProc;
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.style = CS_DBLCLKS;
	wc.hIcon = NULL;
	wc.hCursor = NULL;
	wc.lpszMenuName = NULL;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;

	// 注册窗口类
	if(!RegisterClass(&wc))
		return 0;

	return 1;
}

// 子窗口过程体,必须为回调函数,当窗口收到消息后,会告知Windows CE系统执行对应的消息处理过程
LRESULT CALLBACK  fileChildWndProc(HWND  hWnd,UINT  msgCode,WPARAM  wParam,LPARAM  lParam)
{
	INT i;
	// 查找对应的消息ID号,并执行相应的消息处理过程
	for(i=0; i<dim(fileChildMessages);i++)
	{
		if(msgCode==fileChildMessages[i].uCode)
			return (*fileChildMessages[i].functionName)(hWnd,msgCode,wParam,lParam);
	}
	// 对于不在消息查找表中的消息,调用Windows CE的缺省窗口过程
	return  DefWindowProc(hWnd, msgCode, wParam, lParam);
}

// 子窗口收到WM_CREATE消息后的处理过程体
LRESULT  goCreateFileChildWnd(HWND  hWnd, UINT  msgCode,WPARAM  wParam,LPARAM  lParam)
{
	int  i;
	// 在子窗口中创建四个控件:一个编辑框,三个下压按钮
	for(i=0;i<dim(controlWnd);i++)
	{
		CreateWindow(controlWnd[i].szClass,controlWnd[i].szTitle,
			controlWnd[i].dwStyle | WS_VISIBLE | WS_CHILD,
			controlWnd[i].x,
			controlWnd[i].y,
			controlWnd[i].xw,
			controlWnd[i].yh,
			hWnd,
			(HMENU)controlWnd[i].nID,
			hInst,
			NULL);
	}
	return 0;
}

// 子窗口收到WM_PAINT消息后的处理过程体
LRESULT  goPaintFileChildWnd(HWND  hWnd,UINT  msgCode,WPARAM  wParam,LPARAM  lParam)
{
	// 定义画板结构体对象
	PAINTSTRUCT  ps;
	// 定义矩形结构体对象
	RECT  rect;
	// 定义设备环境句柄
	HDC  hdc;
	// 获得客户区矩形大小
	GetClientRect(hWnd,&rect);
	// 获得设备环境,必须与EndPaint配对使用
	hdc=BeginPaint(hWnd,&ps);
	
	// 释放设备环境资源
	EndPaint(hWnd,&ps);
	return 0;
}

// fileChildWnd子窗口收到MYWM_MENUCLICK自定义消息后的处理过程体
LRESULT  goMenuclickChildWnd(HWND  hWnd,UINT  msgCode,WPARAM  wParam,LPARAM  lParam)
{
	// 定义字型变量菜单ID号和通知码
	WORD   menuID, notifyCode;
	// 定义窗口句柄
	HWND  wndCtrl;
	
	int i;

	// 从消息参数中提取菜单ID、通知码和发出消息控件
	menuID = (WORD)LOWORD(wParam);
	notifyCode = (WORD)HIWORD(wParam);
	wndCtrl = (HWND)lParam;

	// 从命令消息与处理过程查找表中找对应的消息处理过程
	for(i=0; i<dim(fileChildCommands);i++)
	{
		if(menuID == fileChildCommands[i].uCode)
			return  (*fileChildCommands[i].functionName)(hWnd,wndCtrl,menuID,notifyCode);
	}
	return 0;
}

// 菜单号IDM_OPENTEXTFILE被点击后的处理过程体
LRESULT  goOpenTextFileChildCmd(HWND  hWnd,HWND  wndCtrl, WORD  menuID, WORD  notifyCode)
{
	// 定义打开文件名结构体、文件名及文件过滤特性
	OPENFILENAME   of;
	TCHAR   strFileName[MAX_PATH]={0};
	const   LPTSTR  strOpenFilter = TEXT("Text Files(*.txt) \0  *.txt \0 All Documents(*.*)  \0 *.* \0\0");
	BOOL    res;
	// 定义文件句柄
	HANDLE  fileHandle=0;
	// 定义文件大小
	LONG    fileSize;
	// 定义文件内容指针
	LONG    filePointer;
	// 定义字节缓冲区指针
	PBYTE   pFileBuf;
	// 定义显示用缓冲区
	LPTSTR  lpTcharBuf=NULL;
	// 显示字符或汉字暂存区
	TCHAR   strDispBuf[4];
	// 读取文件字节数
	DWORD   dwBytes;

	int i;
	// 存放二个8位字节GB2312码汉字
	char cH[8];
	// 存放转换后的Unicode码汉字
	WCHAR  strUC[4];

	// 初始化文件名
	strFileName[0]='\0';
	//strName[0]='\0';
	// 初始化打开文件名结构体
	memset(&of, 0, sizeof(of));
	of.lStructSize = sizeof(of);
	of.hwndOwner = hWnd;
	of.lpstrFile = strFileName;
	of.nMaxFile = dim(strFileName);
	of.lpstrFilter = strOpenFilter;
	of.Flags = 0;

	// 打开文件对话框
	res = GetOpenFileName(&of);
	// 如果打开文件对话框成功,则把文件内容显示在编辑文本框中
	if(res)
	{
		// 文件名存放在字符串变量strFileName中
		lstrcpy(strFileName, of.lpstrFile);
		// 打开只读文件方式的文件
		fileHandle = CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
		if(fileHandle == INVALID_HANDLE_VALUE)
		{
			fileHandle=0;
			return 0;
		}
		// 获得文件大小
		fileSize = GetFileSize(fileHandle,NULL);
		// 将文件内容指移动到文件头
		filePointer = SetFilePointer(fileHandle,0,NULL,FILE_BEGIN);
		// 分配空间存放文件内容
		pFileBuf =(PBYTE) LocalAlloc(LPTR,fileSize+32);
		// 下面语句中的加64表示预留出一部分空间
		lpTcharBuf =(LPTSTR) LocalAlloc(LPTR,fileSize*sizeof(TCHAR)+64);
		// 读取文件内容
		if(ReadFile(fileHandle,pFileBuf,fileSize,&dwBytes,NULL))
		{
			// 循环文件大小,将全部内容显示出来
			for(i=0; i<fileSize; i++) //for(i=0;i<(INT)dwBytes;i++)  
			{
				// 当字节数据显示为区码时,表示相邻二个字节为一个GB2312汉字
				if((*pFileBuf>=0xA1) && (*pFileBuf<=0xF7))
				{
					// 获得汉字的GB2312编码
					cH[0]=*pFileBuf++;
					cH[1]=*pFileBuf++;
					i++;
					// 转换为Unicode编码
					MultiByteToWideChar( CP_ACP, 0, cH, 2,strUC,1);
					// 汉字送入显示暂存缓冲区
					wsprintf(strDispBuf,TEXT("%c"),strUC[0]);
				}
				else
				{
					// 显示为ASCII字符
					wsprintf(strDispBuf,TEXT("%c"),*pFileBuf++);
				}
				// 将显示字符合并到显示总缓冲区中
				lstrcat(lpTcharBuf,strDispBuf);
			}
			// 显示从文件中读到的所有信息
			SetDlgItemText(hWnd,IDC_FILECONTENTEDIT,lpTcharBuf);
		}
	}
	// 关闭文件,释放堆
	if(fileHandle)
	{
		CloseHandle(fileHandle);
		fileHandle = 0;
	}
	if(pFileBuf)
		LocalFree(pFileBuf);
	if(lpTcharBuf)
		LocalFree(lpTcharBuf);
	// 刷新并显示其父窗口,即主窗口mainWnd,而不是子窗口fileChildWnd
	ShowWindow(GetParent(hWnd),SW_SHOW);
	UpdateWindow(GetParent(hWnd));

	// 刷新并显示子窗口本身,即子窗口fileChildWnd
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
	return 0;
}
// 菜单号IDM_SAVETEXTFILE被点击后的处理过程体
LRESULT  goSaveTextFileChildCmd(HWND  hWnd,HWND  wndCtrl, WORD  menuID, WORD  notifyCode)
{
	// 定义打开文件名结构体、文件名及文件过滤特性
	OPENFILENAME   of;
	TCHAR   strFileName[MAX_PATH]={0};
	const   LPTSTR  strOpenFilter = TEXT("Text Files(*.txt) \0  *.txt \0 All Documents(*.*)  \0 *.* \0\0");
	BOOL    res;
	// 定义文件句柄
	HANDLE  fileHandle=0;
	// 定义文件大小
	LONG    fileSize;
	// 定义字节缓冲区指针
	PBYTE   pFileBuf;
	// 定义显示用缓冲区
	LPTSTR  lpTcharBuf=NULL;
	// 读取文件字节数
	DWORD   dwBytes;
	// 存放文件存盘OK信息
	TCHAR   strSaveOK[128];
	int i,j;
	// 存放二个8位字节GB2312码汉字
	char cH[16];
	// 存放转换后的Unicode码汉字
	WCHAR  strUC[8];

	// 初始化文件名
	strFileName[0]=0;
	//strName[0]='\0';
	// 初始化打开文件名结构体
	memset(&of, 0, sizeof(of));
	of.lStructSize = sizeof(of);
	of.hwndOwner = hWnd;
	of.lpstrFile = strFileName;
	of.nMaxFile = dim(strFileName);
	of.lpstrFilter = strOpenFilter;
	of.Flags = 0;

	// 保存文件对话框
	res = GetSaveFileName(&of);
	// 如果保存文件对话框打开成功,则把编辑文本框中的内容存入该文件中,输入文件名时,不需要扩展名
	if(res)
	{
		// 文件名存放在字符串变量strFileName中
		lstrcpy(strFileName, of.lpstrFile);
		// 打开只写文件方式的文件
		fileHandle = CreateFile(strFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
		if(fileHandle == INVALID_HANDLE_VALUE)
		{
			fileHandle=0;
			MessageBox(hWnd,TEXT("Save File Error!"),TEXT("Error"),MB_OK);
			return 0;
		}
		// 获得文本框中的TCHAR型字符长度,不包括结尾的空字符
		fileSize = SendDlgItemMessage(hWnd,IDC_FILECONTENTEDIT,WM_GETTEXTLENGTH,0,0);
		

		// 开辟写入文件的char字符缓冲区,预留出来了64个字节的空间,避免内存溢出
		pFileBuf = (PBYTE) LocalAlloc(LPTR,fileSize*sizeof(TCHAR)+64);
	    
		// 读取编辑框中的文本
		lpTcharBuf =(LPTSTR) LocalAlloc(LPTR,fileSize*sizeof(TCHAR) + 32);
		GetDlgItemText(hWnd,IDC_FILECONTENTEDIT,lpTcharBuf,fileSize+32);

		// 将pFileBuf的内容写入文件
		j=0; // j记录实际写入文件中的字符数
		for(i=0;i<fileSize;i++,j++)
		{
			// 是汉字时,将Unicode转化为GB2312编码形式,用二个字节表示
			if(HIBYTE(lpTcharBuf[i])>=1)
			{
				strUC[0]=lpTcharBuf[i];
				WideCharToMultiByte( CP_ACP, 0, strUC, 1, cH, 2, NULL, NULL );
				pFileBuf[j]=cH[0];
				j++;
				pFileBuf[j]=cH[1];
			}
			else
			{  // Unicode兼容ASCII
				pFileBuf[j]=LOBYTE(lpTcharBuf[i]);
			}
		}
		WriteFile(fileHandle,pFileBuf,j,&dwBytes,NULL);
		// 显示保存成功消息对话框
		lstrcpy(strSaveOK,TEXT("编辑的内容已经保存到文件"));
		lstrcat(strSaveOK,strFileName);
		lstrcat(strSaveOK,TEXT("中了!"));
		MessageBox(hWnd,strSaveOK,TEXT("保存文件"),MB_OK | MB_ICONINFORMATION);
	}

	// 关闭文件,释放堆
	if(fileHandle)
	{
		CloseHandle(fileHandle);
		fileHandle = 0;
	}
	if(pFileBuf)
		LocalFree(pFileBuf);
	if(lpTcharBuf)
		LocalFree(lpTcharBuf);
	// 刷新并显示其父窗口,即主窗口mainWnd,而不是子窗口fileChildWnd
	ShowWindow(GetParent(hWnd),SW_SHOW);
	UpdateWindow(GetParent(hWnd));

	// 刷新并显示子窗口本身,即子窗口fileChildWnd
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
	return 0;
}

// 菜单号IDM_ABOUT被点击后的处理过程体
LRESULT  goAboutFileChildCmd(HWND  hWnd,HWND  wndCtrl, WORD  menuID, WORD  notifyCode)
{
	// 通过模式对话框“关于”对话框,显示制作组与版本信盵
	DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTDLG),hWnd,aboutDlgProc);
	return 0;
}
// 菜单号IDM_COPYFILE被点击后的处理过程原型
LRESULT  goCopyFileChildCmd(HWND  hWnd,HWND  wndCtrl, WORD  menuID, WORD  notifyCode)
{
	// 打开“复制文件”模式对话框
	DialogBox(hInst,MAKEINTRESOURCE(IDD_COPYFILE),hWnd,copytoDlgProc);
	return 0;
}
// 菜单号IDM_MOVEFILE被点击后的处理过程原型
LRESULT  goMoveFileChildCmd(HWND  hWnd,HWND  wndCtrl, WORD  menuID, WORD  notifyCode)
{
	// 打开“移动文件”模式对话框
	DialogBox(hInst,MAKEINTRESOURCE(IDD_MOVEFILE),hWnd,movetoDlgProc);
	return 0;
}

// 清空显示控件IDC_CLEARDISPLAY的处理过程原型
LRESULT  goClearDisplayChildCmd(HWND  hWnd,HWND  wndCtrl, WORD  menuID, WORD  notifyCode)
{
	int i;
	// 询问是否清空显示区内容
	i=MessageBox(hWnd,TEXT("清空当前显示区的内容吗?"),TEXT("清屏"),MB_YESNO | MB_ICONINFORMATION);
	if(i==IDNO)
		return 0;
	// 设置编辑控件内容为空字符串
	SetDlgItemText(hWnd,IDC_FILECONTENTEDIT,TEXT(""));
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -