📄 filechildwndproc.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 + -