- 保存文件
这个内容真的非常难, 我刚刚差点还以为我会死在这里了...
winmain.c
char strFilename[400], strFiletitle[144];
char sztitle[200];
char str_saveFilename[400], str_saveFiletitle[144];
const char strFilter[] = "Text File(*.txt)\0*.txt\0All Files\0*.*\0\0";
const char str_saveFilter[] = "All Files\0*.*\0\0";
char *filebuf;
在这里, 我设置了str_saveFilename和str_saveFiletitle两个数组, 与原有的strFilename和strFiletitle相分隔.
winmain.c
int save_filename(void)
{
//INIT OPENFILENAME
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(OPENFILENAME));
//MODE
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWinMain;
//FILTER
ofn.lpstrFilter = str_saveFilter;
ofn.nFilterIndex = 1;
//FILE AND FILETITLE
ofn.lpstrFile = str_saveFilename;
ofn.nMaxFile = 399;
ofn.lpstrFileTitle = str_saveFiletitle;
ofn.nMaxFileTitle = 143;
//STYLE
ofn.lpstrTitle = "iNotepad SaveFile";
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
return GetSaveFileName(&ofn);
}
这个是打开保存文件对话框的函数. 显示效果如下:
主体部分与open_filename区别不大, 使用的是一个结构体. style属性中的OFN_OVERWRITEPROMPT是指当选择文件已经存在时弹出的小对话框, 如下:
最后使用的函数是GetSaveFileName, 与GetOpenFileName不同, 在后者中一些属性(比如OFN_OVERWRITEPROMPT)会失效.
winmain.c
int save_fileset(void)
{
FILE *fp1;
unsigned int nEditTextLen;
if(str_saveFilename[0] == 0x00) {
return 2;
}
fp1 = fopen(str_saveFilename, "wb"); //OPEN FILE
if(fp1 == NULL) {
MessageBox(hWinMain, "File Write Error.", "Error", MB_ICONERROR);
return 1;
}
nEditTextLen = GetWindowTextLength(hEdit);
if(nEditTextLen == 0) {
//ZERO
filebuf = malloc(1);
filebuf[0] = 0x00;
} else {
//SET MEMORY
filebuf = malloc(nEditTextLen+1);
if(filebuf == NULL) {
MessageBox(hWinMain, "Memory Error .", "Error", MB_ICONERROR);
fclose(fp1);
return 3;
}
memset(filebuf, 0, nEditTextLen+1);
GetWindowText(hEdit, filebuf, nEditTextLen+1);
}
fwrite(filebuf, 1, nEditTextLen, fp1);
inpstatu[1] = 0; //SAVEED
inpstatu[0] = 1;
//SAVE INFO
strcat(strFilename, str_saveFilename);
strcat(strFiletitle, str_saveFiletitle);
init_changetitle(str_saveFiletitle);
free(filebuf);
fclose(fp1);
return 0;
}
这个函数是保存文件的主体, 修改自open_fileset. 内容非常多. 基本都是在做打开文件的反操作.
GetWindowTextLenght用于获得空间文本的长度. 在这里可能会出现长度为0(即什么也不写入)的情况, 此时为了保险(fwrite时filebuf为一个可用的值), 将filebuf设置为1字节长的数组, 并将值设置为0. 实际上文件内并没有写入任何内容.
如果Edit存在内容, 继续操作.