/* 最后修改:2020-09-21 14:04 《C 编程示例大全 作者:张国鹏
本例功能:C 纯WIN32 API编程 悦读器实战示例 软件下载:http://lovegp.cn/gpbook.exe
本书写整理:张国鹏: 2020年6月22日
c win32程序编译环境
使用语言:C 11 编辑工具:Notepad v7.8.5 下载地址:https://notepad-plus-plus.org/downloads/ 编译工具:tdm-gcc-5.1.0-3(32位)下载地址:https://jmeubank.github.io/tdm-gcc/
安装上述软件即完成!
注:本书所载代码均为ANSI格式,不要转换UTF-8格式,否则可能造成不可预料的结果!
Notepad 快速运行代码:按F5.输入以下指令编译和操作C WIN32程序: 方式一:cmd /k cd /d "$(CURRENT_DIRECTORY)" & g -std=gnu 11 "$(FILE_NAME)" -o "$(NAME_PART)" & "$(NAME_PART).exe 方式二:cmd /k cd /d "$(CURRENT_DIRECTORY)" & g -std=gnu 11 "$(FILE_NAME)" -o "$(NAME_PART)" -static-libgcc -lgdi32 -lcomdlg32 -lgdiplus -lwininet -lwinmm -lwinspool & "$(NAME_PART).exe
若包含程序windows.h以外的库,可以用方法二编译。 如果不需要CMD窗口出现,编译指令加上这句:-mwindows
加上这句话:编译指令:-std=gnu 11,即采用c 11编译
声明:书中所有的例子都是我自己编码的,有些是从网上收集整理的。如果涉及版权,请联系作者。Email:lovegp@139.com。 修改日志: 2020-09-21 22:03 增加了ftp上传下载文件时显示进度条,采用线程技术显示进度条; */
/* 最后修改:2020-09-21 14:04 《C 编程示例大全 作者:张国鹏 本例功能:C 纯WIN32 API编程 悦读器实战示例 软件下载:http://lovegp.cn/gpbook.exe 本书写整理:张国鹏: 2020年6月22日 c win32程序编译环境 使用语言:C 11 编辑工具:Notepad v7.8.5 下载地址:https://notepad-plus-plus.org/downloads/ 编译工具:tdm-gcc-5.1.0-3(32位)下载地址:https://jmeubank.github.io/tdm-gcc/ 安装上述软件即完成! 注:本书所载代码均为ANSI格式,不要转换UTF-8格式,否则可能会导致不可预测的结果! Notepad 快速运行代码:按F输入以下指令,可编译和操作C WIN32程序: 方式一:cmd /k cd /d "$(CURRENT_DIRECTORY)" & g -std=gnu 11 "$(FILE_NAME)" -o "$(NAME_PART)" & "$(NAME_PART).exe 方式二:cmd /k cd /d "$(CURRENT_DIRECTORY)" & g -std=gnu 11 "$(FILE_NAME)" -o "$(NAME_PART)" -static-libgcc -lgdi32 -lcomdlg32 -lgdiplus -lwininet -lwinmm -lwinspool & "$(NAME_PART).exe 若包含程序windows.h以外的库,然后用方法二编译。 如果不需要CMD窗口出现了,编译指令加上这句话:-mwindows 加上这句话:编译指令:-std=gnu 11,即采用c 11编译 声明:书中所有的例子都是我自己编码的,有些是从网上收集整理的。如果涉及版权,请联系作者。Email:lovegp@139.com。 修改日志: 2020-09-21 22:03 增加了ftp上传下载文件时显示进度条,采用线程技术显示进度条; */ #include <windows.h> //GetModuleFileName, GetCurrentDirectory,GetWindowsDirectory, GetSystemDirectory #include <string> #include <vector> #include <wininet.h>//wininet.lib ftp http等待使用的头文件,同时在GCC这样的链接:gcc -o a a.o resource.o -static-libgcc -lgdi32 -lcomdlg32 -lwininet,编译前要将wininet.lib找到文件并复制GCC\LIB只有在目录下才能正常编译! #include <Commdlg.h>///不需要这个头文件哦哦 Commdlg.h 包装在文件中 Windows 公共对话框(如打开文件、保存文件、打印相关对话框等) API,公共对话框相关函数和结构定义可以在单元中包含此头文件。 #include <Mmsystem.h>//winmm.lib-PlaySound使用播放声音 不用这个头文件也行噢 #include "resource.h" #include <stdio.h>//wprintf, printf,sprintf #include <winspool.h>//这是支持打印的第一个文件,库文件是:winspool.lib,复制此文件d:\gcc\lib,编译时:gcc -o a a.o resource.o -static-libgcc -lgdi32 -lcomdlg32 -lwininet -lwinspool #include <ctime> #include <fstream> #include <iostream> #include <tlhelp32.h>//进程操作 #include <sqlext.h> //MSSQL数据库操作 这应该是必要的, 链结时需要odbc32.lib #include <algorithm> #include <cctype> /*这是VC在GCC不能用在里面 #pragma comment(lib, "wininet.lib") #pragma comment(lib, "winmm.lib") #pragma comment(lib, "comdlg32.lib") */ using namespace std;//注意写这句话 //控件ID #define ID_TIMER1 10011 #define ID_TIMER2 10012 #define IDD_TEXT1 1002 #define IDD_TEXT2 1003 #define IDD_TEXT3 1004 #define IDD_TEXT4 1005 #define IDD_TEXT5 10051 #define IDD_TEXT6 10052 #define IDD_TEXT7 10053 #define IDD_TEXT8 10054 #define IDD_TEXT9 10055 #define IDD_TEXT10 10056 #define IDD_TEXT11 10057 #define IDD_TEXT12 10058 #define IDD_TEXT13 10058 #define IDD_EDIT1 1006 #define IDD_EDIT2 1007 #define IDD_EDIT3 10071 #define IDD_EDIT4 10072 #define IDD_EDIT5 10073 #define IDD_EDIT7 10074 #define IDD_EDIT8 10075 #define IDD_EDIT9 10076 #define IDD_EDIT10 10077 #define IDD_EDIT11 10078 #define IDD_LISTBOX1 1008 #define IDD_LISTBOX2 1009 #define IDD_BUTTON1 10091 #define IDD_BUTTON2 1010 #define IDD_BUTTON3 1011 #define IDD_BUTTON4 1012 #define IDD_BUTTON5 1013 #define IDD_BUTTON6 1014 #define IDD_BUTTON7 1015 #define IDD_BUTTON8 1016 #define IDD_BUTTON9 1017 #define IDD_BUTTON10 1018 #define IDD_TALK2_BROUPBOX1 2001 #define IDD_TALK2_BROUPBOX2 20011 #define IDD_TALK2_LISTBOX1 2002 #define IDD_TALK2_LISTBOX2 20021 #define IDD_TALK2_TEXT1 2003 #define IDD_TALK2_TEXT2 20031 #define IDD_TALK2_BUTTON1 2004 #define IDD_TALK2_BUTTON2 2005 #define IDD_TALK2_EDIT1 2006 #define IDD_TALK3_MEMO1 2007 #define IDD_TALK3_BUTTON1 2008 #define IDD_TALK4_BROUPBOX1 2009 #define IDD_TALK4_TEXT1 2010 #define IDD_TALK4_TEXT2 2011 #define IDD_TALK4_EDIT1 2012 #define IDD_TALK4_EDIT2 2013 #define IDD_TALK4_BUTTON1 2014 #define IDD_TALK4_BUTTON2 2015 #define IDD_TALK4_BUTTON3 2016 #define IDD_TALK5_LISTBOX1 2017 #define IDD_TALK6_MEMO1 2018 #define IDD_TALK7_LISTBOX1 2019 #define DD_TALK7_TEXT1 2020
#define IDD_TALK7_EDIT1 2021
/托盘程序所用参数定义///
#define WM_TRAY (WM_USER + 100)//托盘消息
#define WM_TASKBAR_CREATED RegisterWindowMessage(TEXT("TaskbarCreated"))
#define IDI_TRAY 9100//ico
NOTIFYICONDATA nid; //托盘属性
HMENU hMenu; //托盘菜单
//HWND MAIN_hwnd;
/托盘程序所用参数定义///
//控件句柄
HWND KJ_EDIT1;
HWND KJ_EDIT2;
HWND KJ_EDIT3;
HWND KJ_EDIT4;
HWND KJ_EDIT5;
HWND KJ_EDIT6;
HWND KJ_EDIT7;
HWND KJ_EDIT8;
HWND KJ_EDIT9;
HWND KJ_EDIT10;
HWND KJ_EDIT11;
HWND KJ_LISTBOX1;
HWND KJ_LISTBOX2;
HWND KJ_TEXT1;
HWND KJ_TEXT2;
HWND KJ_TEXT3;
HWND KJ_TEXT4;
HWND KJ_TEXT5;
HWND KJ_TEXT6;
HWND KJ_TEXT7;
HWND KJ_TEXT8;
HWND KJ_TEXT9;
HWND KJ_TEXT10;
HWND KJ_TEXT11;
HWND KJ_TEXT12;
HWND KJ_TEXT13;
HWND KJ_BUTTON1;
HWND KJ_BUTTON2;
HWND KJ_BUTTON3;
HWND KJ_BUTTON4;
HWND KJ_BUTTON5;
HWND KJ_BUTTON6;
HWND KJ_BUTTON7;
HWND KJ_BUTTON8;
HWND KJ_BUTTON9;
HWND KJ_BUTTON10;
HWND KJ_TALK2_BROUPBOX1;
HWND KJ_TALK2_BROUPBOX2;
HWND KJ_TALK2_LISTBOX1;
HWND KJ_TALK2_LISTBOX2;
HWND KJ_TALK2_TEXT1;
HWND KJ_TALK2_TEXT2;
HWND KJ_TALK2_BUTTON1;
HWND KJ_TALK2_BUTTON2;
HWND KJ_TALK2_EDIT1;
HWND KJ_TALK3_MEMO1;
HWND KJ_TALK3_BUTTON1;
HWND KJ_TALK4_BROUPBOX1;
HWND KJ_TALK4_TEXT1;
HWND KJ_TALK4_TEXT2;
HWND KJ_TALK4_EDIT1;
HWND KJ_TALK4_EDIT2;
HWND KJ_TALK4_BUTTON1;
HWND KJ_TALK4_BUTTON2;
HWND KJ_TALK4_BUTTON3;
HWND KJ_TALK5_LISTBOX1;
HWND KJ_TALK6_MEMO1;
HWND KJ_TALK7_LISTBOX1;
HWND KJ_TALK7_TEXT1;
HWND KJ_TALK7_EDIT1;
//全局变量//.
HWND MAIN_hwnd,talk1,talk2,talk3,talk4,talk5,talk6,talk7,talk8,talk9,talk10,about; //定义窗口类句柄
RECT r;
LOGFONT LogFont;//字体变量
static HFONT hFont,hOldFont,hFont1,hFont2;
static int cxChar,cyChar,cxChar1,cyChar1;//字符的宽度和高度
static int cxClient; //得到客户区宽度
static int cyClient; //得到客户区高度
bool canedit=false;
int CaretPosx=0, CaretPosy=0;//光标显示的坐标
int CaretPoshang=0, CaretPoslie=0;//光标在文本的行与列位置
int showx1=0,showx2=0,showy=0;//文本显示的的左上角坐标初始值
wstring bookstr;//调入内存的电子书内容
string FileName="";//电子书全称
vector<string> showstr;//当前屏幕正在显示的字符串数组
vector<string> printstr;//当前为打印准备的字符串数组
vector<string> booklist;//保存书本清单
char IniFullPath[MAX_PATH];//用于存放INI文件全路径
char ztname[20];//字体名称
int beginwz,endwz,currentwz;//一页中开始位置beginwz及结束位置endwz,当前光标的位置currentwz
int Lie=0,Hang=0,HJJ=20,wz=0;//列、行、行间距、阅读位置
int ztdx=20; //字体大小
int ll=1;//显示模式,1=一栏式,2=两栏模式,3=两栏背景图模式
DWORD bjs=0,zts=12632256;//16777215白色;
char inputstr[MAX_PATH];//查找书籍里内容
LONG Oldtalk2editProc,Oldtalk4editProc,oldtalk4buttonproc,Oldtalk6memoProc;
string booknr;//读取网上书籍存临时放在这里
string bookname;//临时书籍名
string bookid="-1";//当前书本ID
string urlpage="1";//书籍清单第几页
string username,password;//用户名及密码
char searchstr[50];
string bjtpath;//背景图路径
char hz[2];int hzi=0;
int workcx=500;//工作区宽度
int workcy=500;//工作区高度
bool havemove=false;//编辑状态下,保存有没有选择文字的移动
int selbhang,selblie,selehang,selelie;//被选中的文本开始行、列及结束行、列
bool haveedit=false;
int BookPreview=1;
int zbj=50;//左右边距
int sbj=50;//上下边距
float sfbl=1;//缩放比例
int printztdx=26;
//线程用的参数
int yx1=0;
DWORD jdtzs=0,jdtss=0;
RECT mrect_one,mrect_two,mrect_tree;//上中下,左中右部份坐标
HINSTANCE hinst;
//自定义函数
// 将指定尺寸的窗口居中显示
void ZGP_windowstoclient(HWND hwnd,int FORMx,int FORMy)
{
// 将指定尺寸的窗口居中显示
//使用示例:ZGP_windowstoclient(hwnd,500,500);
//int cx = GetSystemMetrics(SM_CXSCREEN); //获取屏幕宽度
//int cy = GetSystemMetrics(SM_CYSCREEN); //获取屏幕高度
RECT rt;
SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0); // 获得桌面工作区大小
int cx=rt.right-rt.left;
int cy=rt.bottom-rt.top;
int FORMleft = cx - FORMx;
int FORMtop = cy - FORMy;
FORMleft = FORMleft / 2; //新建窗口居中显示
FORMtop = FORMtop /2;
MoveWindow(hwnd,FORMleft,FORMtop,FORMx,FORMy,TRUE);
}
//判断目录是否存在
bool dirExists(string dirName_in)
{
DWORD ftyp = GetFileAttributesA(dirName_in.c_str());
if (ftyp == INVALID_FILE_ATTRIBUTES)
return false; //something is wrong with your path!
if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
return true; // this is a directory!
return false; // this is not a directory!
}
//结束指定ID的进程
BOOL KillProcessById(DWORD pID)
{
HANDLE Hwnd;
bool ret = FALSE;
Hwnd = OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE,0,pID);
if (Hwnd)
{
if (TerminateProcess(Hwnd, 0))
{
ret = true;
}
}
return ret;
}
//结束指定进程
void EndProcess(string processstr)
{
int pid;
string exefile;
PROCESSENTRY32 pe32;
//再使用这个结构体前先定义它的大小
pe32.dwSize=sizeof(pe32);
//给系统内的所有进程拍一个快照
HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("Create ToolHelp32Snaphhot调用失败!\n");
return;
}
BOOL bMore=::Process32First(hProcessSnap,&pe32);
while(bMore)
{
bMore=::Process32Next(hProcessSnap,&pe32);
exefile=pe32.szExeFile;
if (processstr.find(exefile)!=-1)
pid =pe32.th32ProcessID;
KillProcessById(pid);
}
::CloseHandle(hProcessSnap);
}
//根据文件路径获取文件名称
string getFileNameByFilePath(string filePath){
int pos = filePath.find_last_of('\\');
return filePath.substr(pos + 1);
}
void createStringReg(HKEY hRoot,char *szSubKey,char* valueName,char *Data)
{
HKEY hKey;
//打开注册表键,不存在则创建它
long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL); //KEY_ALL_ACCESS
if (lRet!=ERROR_SUCCESS)
{
MessageBox(NULL,"操作注册表失败!-打开注册表键","提示",0);
return ;
}
//修改注册表键值,没有则创建它
lRet=RegSetValueEx(hKey,valueName,0,REG_SZ,(BYTE*)Data,strlen(Data));
if (lRet!=ERROR_SUCCESS)
{
MessageBox(NULL,"操作注册表失败!-修改注册表键值","提示",0);
return ;
}
RegCloseKey(hKey);
}
//添加开机启动到注册表
void addToAutoRun(string filePath){
string name = getFileNameByFilePath(filePath);
createStringReg(HKEY_LOCAL_MACHINE, (char *)"Software\\Microsoft\\Windows\\CurrentVersion\\Run", (char *)name.c_str(), (char *)filePath.c_str());
}
//判断字符是否是ASCII码字符
bool isAscll(string str)
{
char *pszStr=(char *)str.c_str();
if ((pszStr[0] & 0x80 ) == 0x80)
{
return false;
}else
{
return true;
}
}
void movechinese()
{
string s=showstr[CaretPoshang];
int fz1=0;
int i=0;
while (s.find(" ")!=-1)
{
i++;
fz1=s.find(" ");
s.erase(fz1,1);
}
showstr[CaretPoshang]=s;
string s1;
/* s1=s[CaretPoslie];
if (isAscll(s1))
{
printf("isAscll:%s\n",s1.c_str());
}else
{
s1=s1+s[CaretPoslie+1];
printf("not isAscll:%s\n",s1.c_str());
printf("s:%s\n",s.substr(CaretPoslie).c_str());
} */
if (CaretPoslie>0 && CaretPoslie<=s.length()-1)
{
int count=0;
int i=0;
while (i<s.length()-1)//必须用这种算法才能准确统计出Ascll的字数
{
s1=s[i];
if (isAscll(s1) and i<CaretPoslie)
{
count++;
i++;
//printf("我操:%s,i:%d\n",s1.c_str(),i);
}else
{
i++;
i++;
}
}
//printf("CaretPoslie:%d,count:%d,%d\n",CaretPoslie,count,(CaretPoslie-count)%2);
if ((CaretPoslie-count)%2!=0)
{
CaretPoslie--;
if (CaretPoshang<Hang)
{
CaretPosx=showx1+CaretPoslie*cxChar;
}
else
{
CaretPosx=showx2+CaretPoslie*cxChar;
}
}
}
}
// 判断是否是Win10系统
BOOL IsWin10System()
{
//string与CString转换
//string sPath = (LPCSTR)(CStringA)(strPath);
std::string vname;
// 先判断是否为win8.1或win10
typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*);
HINSTANCE hinst = LoadLibrary("ntdll.dll");
DWORD dwMajor, dwMinor, dwBuildNumber;
NTPROC proc = (NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers");
proc(&dwMajor, &dwMinor, &dwBuildNumber);
if (dwMajor == 10 && dwMinor == 0)
{
return TRUE;
}
return FALSE;
}
//将字符串以16进制形式显示出来
string hzto16(char * str)
{
//"人物传记"=〉%C8%CB%CE%EF%B4%AB%BC%C7
int i;
char res[300];
char *jg;
for (i = 0; i < strlen(str); i++)
{
sprintf(res+i*3, "%%%02X ", (unsigned char)str[i]);
}
jg=res;
return jg;
}
bool checkfile(string filename)
{
//判断文件是否存在
char* str=(char*)filename.c_str();
HANDLE pfile;
pfile = ::CreateFile(str,//要打开的文件名;
GENERIC_READ,//如果是GENERIC_READ表示允许对设备进行读访问;如果是GENERIC_WRITE表示允许对设备进行写访问(可以组合使用);如果是0,表示只允许获取与一个设备有关的信息;
0,//定义共享模式。如果是0表示不共享;是FILE_SHARE_READ和/或FILE_SHARE_WRITE表示允许对文件进行共享;
NULL,//指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性;
OPEN_EXISTING,//指定当文件存在或不存在时的操作。常见的操作有5种:CREATE_NEW:创建文件,如果文件存在会出错;CREATE_ALWAYS:创建文件,会修改前一个文件;OPEN_EXISTING:文件已经存在;OPEN_ALWAYS:如果不存在就创建;TRUNCATE_EXISTING:将现有的文件缩短为零长度;
FILE_ATTRIBUTE_NORMAL,//表示新创建文件的属性。文件的常见属性有5种:FILE_ATTRIBUTE_ARCHIVE:标记为归档属性;FILE_ATTRIBUTE_NORMAL:默认属性;FILE_ATTRIBUTE_HIDDEN:隐藏文件或目录;FILE_ATTRIBUTE_READONLY:文件为只读;FILE_ATTRIBUTE_SYSTEM:文件为系统文件;
NULL//指向用于存储的文件句柄;如果不为0,则指定一个文件句柄,新的文件将从这个文件中复制扩展属性;
); // 用这个函数比OpenFile好
// HANDLE hCreateFile = CreateFile((char *)bookname.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if ( pfile == INVALID_HANDLE_VALUE)
{
CloseHandle(pfile); // 一定注意在函数退出之前对句柄进行释放。
return false;
}else
{
CloseHandle(pfile); // 一定注意在函数退出之前对句柄进行释放。
return true;
}
}
//1. ANSI to Unicode string to wstring
wstring ANSIToUnicode( const string& str )
{
int len = 0;
len = str.length();
int unicodeLen = ::MultiByteToWideChar( CP_ACP,0,str.c_str(),-1,NULL,0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,0,str.c_str(),-1,(LPWSTR)pUnicode,unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
return rt;
}
//2. Unicode to ANSI wstring to string
string UnicodeToANSI( const wstring& str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_ACP,0,str.c_str(),-1,NULL,0,NULL,NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_ACP,0,str.c_str(),-1,pElementText,iTextLen,NULL,NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
//3. UTF-8 to Unicode
wstring UTF8ToUnicode( const string& str )
{
int len = 0;
len = str.length();
int unicodeLen = ::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
return rt;
}
//4. Unicode to UTF-8
string UnicodeToUTF8( const wstring& str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_UTF8,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
//读取UNICODE编码格式文本文件
wstring readUNICODE(string fileName)
{
size_t index = 2;
wstring wstrLine;
ifstream fin;
fin.open(fileName.c_str(), ios::binary);
if(!fin.is_open())
{
string temp="打开文件错误:"+fileName;
wstrLine=ANSIToUnicode(temp);
return wstrLine;
}
//wstrLine.clear;
while (!fin.eof())
{
fin.seekg(index, ios::beg);
wchar_t wch;
fin.read((char *)(&wch), 2);
wstrLine.append(1, wch);
index += 2;
}
return wstrLine;
}
//获取当前程序路径 返回路径带“\”号
char* Get_Run_Path_ZGP()
{
/*
示例://获取当前程序路径 返回路径带“\”号
int len;
char str[80],exeFullPath[MAX_PATH];
strcpy(exeFullPath,Get_Run_Path_ZGP());//获取当前程序路径
len = strlen(exeFullPath);
strcpy(exeFullPath+len,"config.ini");
*/
char temp_RunPath[MAX_PATH];
char *p = NULL;
GetModuleFileName(NULL,temp_RunPath,MAX_PATH);//得到当前运行程序全称
p=strrchr(temp_RunPath, '\\')+1; //屏蔽掉项目名称 查找一个字符c在另一个字符串str中末次出现的位置
*p='\0';
char * Get_Run_Path = new char[strlen(temp_RunPath)+1];
strcpy(Get_Run_Path, temp_RunPath);//
return Get_Run_Path;
}
//将指定的内容写入指定的文件
void WriteToFile(string str_write,string FN)
{
DWORD dwWritten;
int i=str_write.length();
if (i==0)
{
if (MessageBox(NULL,"你确定要保存空白数据吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDNO )
{
return;
}
}
i++;
char* buff=new char[i+10]; //在使用malloc()函数申请的空间之前,最好用memset()函数把这段内存空间清理一下,
//因为用malloc()函数申请的空间仅仅保 证的是内存空间的大小,并不保证内存空间是否有数据垃圾
//char *p;
//p = (char *)malloc(10*sizeof(char));
//memset(p,0,10*sizeof(char));
//free( buff ); //用了malloc(),就一定要搭配free来使用
//char* buffer=new char[filesize+1];
//delete[] buffer;//用了new,就要搭配delete[]来使用
memset(buff,0,i*sizeof(char));//将申请的内存清零,注意,申请的内存用完后一定要释放,用delete[] buff;
buff=(char*)str_write.c_str();
HANDLE hCreateFile = CreateFile((char *)FN.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
WriteFile(hCreateFile, buff, i*sizeof(char), &dwWritten, NULL);
buff='\0';//这句很重要,不然delete[] buff会出错,不知是什么原因???
delete[] buff;
CloseHandle(hCreateFile);//关闭文件句柄
}
wstring ReadFile(string filename)
{
char* str=(char*)filename.c_str();
HANDLE pfile;
pfile = ::CreateFile(str,//要打开的文件名;P506
GENERIC_READ,//如果是GENERIC_READ表示允许对设备进行读访问;如果是GENERIC_WRITE表示允许对设备进行写访问(可以组合使用);如果是0,表示只允许获取与一个设备有关的信息;
0,//定义共享模式。如果是0表示不共享;是FILE_SHARE_READ和/或FILE_SHARE_WRITE表示允许对文件进行共享;
NULL,//指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性;
OPEN_EXISTING,//OPEN_EXISTING是指打开文件,如果文件不存在,则函数调用失败;CREATE_NEW是指创建一个新文件,如果指定的文件已经存在,则函数调用失败;。常见的操作有5种:CREATE_NEW:创建文件,如果文件存在会出错;CREATE_ALWAYS:创建文件,会修改前一个文件;OPEN_EXISTING:文件已经存在;OPEN_ALWAYS:如果不存在就创建;TRUNCATE_EXISTING:将现有的文件缩短为零长度;
FILE_ATTRIBUTE_NORMAL,//表示新创建文件的属性。文件的常见属性有5种:FILE_ATTRIBUTE_ARCHIVE:标记为归档属性;FILE_ATTRIBUTE_NORMAL:默认属性;FILE_ATTRIBUTE_HIDDEN:隐藏文件或目录;FILE_ATTRIBUTE_READONLY:文件为只读;FILE_ATTRIBUTE_SYSTEM:文件为系统文件;
NULL//指向用于存储的文件句柄;如果不为0,则指定一个文件句柄,新的文件将从这个文件中复制扩展属性;
); // 用这个函数比OpenFile好
// HANDLE hCreateFile = CreateFile((char *)bookname.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if ( pfile == INVALID_HANDLE_VALUE)
{
CloseHandle(pfile); // 一定注意在函数退出之前对句柄进行释放。
char temp[300]="欢迎使用阅读器,本软件使用C++语言纯WIN API研制而成,仅为学习C++技术使用,禁止用作商业用途,本软件所使用的书籍均自网络收集,如涉无意侵犯作者权益,请联系:lovegp@139.com,本软件作者主页:http://lovegp.cn 作者:张国鹏";
return ANSIToUnicode(temp);
}
DWORD filesize=GetFileSize(pfile,NULL);//得到指定文件的字节大小
char* buffer=new char[filesize+1]; // 最后一位为 '/0',C-Style 字符串的结束符。
memset(buffer,0,filesize+1);//将申请的内存清零,注意,申请的内存用完后一定要释放,用delete[] buff;
// char *buffer;
//buffer=(char*)malloc(filesize);
DWORD readsize;
ReadFile(pfile,buffer,filesize,&readsize,NULL);
CloseHandle(pfile); // 关闭句柄。 会删除掉被读取的文件,何解?答:使用了这个参数FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
buffer[filesize]=0;
char temp[100];
sprintf(temp,"%02X%02X%02X",buffer[0],buffer[1],buffer[2]);
//MessageBox( NULL,temp ,"OK",MB_OK);
string sbm=temp;//识别码
string wjgs="ansi";//文件格式
string tempstr=buffer;
wstring tempstr1;
int n;
if ((n = sbm.find("FFFFFFEFFFFFFFBBFFFFFFBF")) != string::npos || sbm.find("3D3D3D") != string::npos) //查找 u 出现的位置
{
//如果是UTF8文件,则进行以下处理
wjgs="utf8";
tempstr = tempstr.substr(3);//如果是UTF8从第3个开始取数据
tempstr1 = UTF8ToUnicode(tempstr);
}else
if ((n = sbm.find("FFFFFFFFFFFFFFFE")) != string::npos) //查找 u 出现的位置
{
//如果是UNICODE文件,则进行以下处理
wjgs="unicode";
tempstr1=readUNICODE(filename);
}else
{
//如果是ANSI文件,则进行以下处理
tempstr1=ANSIToUnicode(tempstr);
}
// 善后工作
buffer='\0';
delete[] buffer; // 注意是delete[] 而不是 delete
return tempstr1;
}
// 建立指定大小的字体 HFONT hfont=CreateFont("宋体",25);
HFONT CreateFont(char * fontname,int fontsize)
{
//设置字体参数
LOGFONT LogFont;
memset(&LogFont,0,sizeof(LOGFONT));
lstrcpy(LogFont.lfFaceName,fontname);
LogFont.lfWidth=0;//字体宽度
LogFont.lfHeight=fontsize;//字体高度
LogFont.lfWeight=0;//粗体 取值: 0-1000
LogFont.lfCharSet=134; //字符集
LogFont.lfOutPrecision=3;//输出精度
LogFont.lfClipPrecision=2;//剪裁精度
LogFont.lfOrientation=45;//基线角度
LogFont.lfQuality=1;//输出质量
LogFont.lfPitchAndFamily=0;//间距及字族
LogFont.lfUnderline=0;//下划线
LogFont.lfItalic=0;//斜体
LogFont.lfStrikeOut=0;//删除线
LogFont.lfEscapement=0;//角度, 单位是 1/10 度,900就竖着显示
//创建字体
return CreateFontIndirect(&LogFont);
/* WinAPI: CreateFontIndirect - 根据字体结构建立逻辑字体
//声明:
CreateFontIndirect(
const p1: TLogFont {字体结构}
): HFONT; {返回新字体指针}
//TLogFont 是 tagLOGFONTA 结构的重定义:
tagLOGFONTA = packed record
lfHeight: Longint; {字体高度}
lfWidth: Longint; {字体平均宽度}
lfEscapement: Longint; {角度, 单位是 1/10 度}
lfOrientation: Longint; {基线角度}
lfWeight: Longint; {粗体, 取值: 0-1000}
lfItalic: Byte; {斜体}
lfUnderline: Byte; {下划线}
lfStrikeOut: Byte; {删除线}
lfCharSet: Byte; {字符集}
lfOutPrecision: Byte; {输出精度}
lfClipPrecision: Byte; {剪裁精度}
lfQuality: Byte; {输出质量}
lfPitchAndFamily: Byte; {间距及字族}
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar; {字样名称}
end; */
}
//将光标移动到指定位置,前提条件是要设好CaretPoshang、CaretPoslie两个全局变量
void moveCaret()
{
if (canedit)
{
if (CaretPoshang>Hang-1)
{
CaretPosy=showy+(CaretPoshang-Hang)*(cyChar+HJJ);//showy是页面的上距
CaretPosx=showx2+CaretPoslie*cxChar;//showx2是第2页的页边距-两栏模式
}else
{
CaretPosy=showy+CaretPoshang*(cyChar+HJJ);
CaretPosx=showx1+CaretPoslie*cxChar;//showx1是第1页的页边距-两栏模式
}
movechinese();//判断当前光标位置是不是在汉字的中间,如果是,则光标左移一位
//InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景
SetCaretPos (CaretPosx, CaretPosy) ; //将光标设置到指定位置
//显示行、列信息
HDC hdc=GetDC(MAIN_hwnd);
hFont1=CreateFont((char*)"宋体",15);//用于显示信息栏
HBRUSH hbrush1 = CreateSolidBrush(bjs);//画刷的着色黑色
SelectObject(hdc,hFont1);//选择字体
SelectObject( hdc, hbrush1 );//选择画刷
SetBkMode(hdc,TRANSPARENT);// 设置TextOut文本背景色模式为透明
//得到当前字体的高度和宽度
TEXTMETRIC tm ;
GetTextMetrics (hdc, &tm) ;
int cxChar1 = tm.tmAveCharWidth;
int cyChar1 = tm.tmHeight + tm.tmExternalLeading ;
SetTextColor(hdc, zts );//设置字体着色8454143
SetTextColor(hdc, zts );//设置字体着色8454143
char ls1[MAX_PATH];
double zs=(double)endwz/bookstr.length()*100;
//获取书名
char ls2[MAX_PATH];
int fz=FileName.rfind('\\');//string.rfind 从字符串右边开始找字符,返回位置
int fz1=FileName.find('.');
string zs1;
if (fz1==-1)
{
zs1=FileName.substr(fz+1); // s2 = "is i"
}
else
{
zs1=FileName.substr(fz+1,FileName.size()-fz-1-4); // s2 = "is i"
}
sprintf(ls2,"%s",(char*)zs1.c_str());//书名
if (canedit)
{
sprintf(ls1,"阅:%.2f%%《%s》行:%d,列:%d 总字数:%d 用户:%s",zs,ls2,CaretPoshang,CaretPoslie,bookstr.size(),username.c_str());
}else
{
sprintf(ls1,"阅:%.2f%%《%s》用户:%s",zs,ls2,username.c_str());
}
int js=strlen(ls1);
HRGN mrgn;
mrgn=CreateRectRgn(0,cyClient-18,cxClient,cyClient-18+cyChar1);//376创建一个矩形区域
FillRgn(hdc,mrgn,hbrush1);//用指定的画刷填充矩形区域
//显示信息
if (ll==3)
{
TextOut(hdc,40,cyClient-18,ls1,js); //输出到窗口的文本
}
if (ll==1 or ll==2)
{
TextOut(hdc,5,cyClient-18,ls1,js); //输出到窗口的文本
}
DeleteObject(hFont1) ;//必须要删除,不然内存会被吃光
DeleteObject(hbrush1) ;//必须要删除,不然内存会被吃光
ReleaseDC(MAIN_hwnd,hdc);
}
}
//编辑BOOKSTR里内容,并刷新显示;
void editbookstr()
{
wstring bookstrbegin;//变量bookstr的前面部份=bookstr.substr(0,beginwz);
wstring bookstrend;//变量bookstr的后面部份=bookstr.substr(endwz);
wstring bookstredit;//当前页面正在编辑的字符
haveedit=true;
//for 这部分代码主要是连接当前显示的所有字符,并放入变量BOOKSTREDIT中
for (int i=0;i<showstr.size();i++)
{
bookstredit=bookstredit+ANSIToUnicode(showstr[i]);
}
//当前位置处于第1页,并且总页数大于1的情况
if (beginwz==0 && endwz<bookstr.length()-1)
{
bookstrend=bookstr.substr(endwz);
bookstr=bookstredit+bookstrend;
}
//当前位置处于第1页,总页数仅有1页的情况
if (beginwz==0 && endwz>=bookstr.length()-1)
{
bookstr=bookstredit;
}
//当前位置处于于中间页的情况,总页数>2以上
if (beginwz>0 && endwz<bookstr.length()-1)
{
bookstrbegin=bookstr.substr(0,beginwz);
bookstrend=bookstr.substr(endwz);
bookstr=bookstrbegin+bookstredit+bookstrend;
}
//当前页处于最末页,总页数>2以上
if (beginwz>0 && endwz>=bookstr.length()-1)
{
bookstrbegin=bookstr.substr(0,beginwz);
bookstr=bookstrbegin+bookstredit;
}
}
//建立托盘图标
void InitTray(HINSTANCE hInstance, HWND hWnd)
{
/托盘程序所用参数定义///
/*
#define WM_TRAY (WM_USER + 100)//托盘消息
#define WM_TASKBAR_CREATED RegisterWindowMessage(TEXT("TaskbarCreated"))
#define IDI_TRAY 9100//ico
NOTIFYICONDATA nid; //托盘属性
HMENU hMenu; //托盘菜单
//HWND MAIN_hwnd;
/托盘程序所用参数定义/// */
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = IDI_TRAY;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;//这个不能用| NIF_INFO;
nid.uCallbackMessage = WM_TRAY;
nid.hIcon = (HICON) LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, LR_SHARED); //也可以用这种方法
//nid.hIcon = LoadIcon(hInstance,"IDI_ICON1"); //必须要用这种形式,不然不会显示出图标
lstrcpy(nid.szTip, "悦读器 设计:张国鹏");
hMenu = CreatePopupMenu();//生成托盘菜单
//为托盘菜单添加两个选项
AppendMenu(hMenu, MF_STRING, 20, TEXT("关于"));
AppendMenu(hMenu, MF_STRING, 21, TEXT("退出"));
Shell_NotifyIcon(NIM_ADD, &nid);
}
BOOL Ftp_SaveToFile(const char *pszFileName, BYTE *pData, DWORD dwDataSize)
{
HANDLE hFile = CreateFile(pszFileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_ARCHIVE, NULL);
if (INVALID_HANDLE_VALUE == hFile)
return FALSE;
DWORD dwRet = 0;
WriteFile(hFile, pData, dwDataSize, &dwRet, NULL);
CloseHandle(hFile);
return TRUE;
}
//运用线程,可以防止程序假死,将大量的长时间的运算工作采取这种模式较好
DWORD WINAPI xc3(LPVOID lpParamter)
{
HWND hwnd = (HWND) lpParamter; //进度条的窗口句柄
HDC hdc=GetDC(hwnd);
//创建绘画设备
HPEN hpen = CreatePen(PS_SOLID, 1, 8421504);//255,100,255
HBRUSH hbrush1 = CreateSolidBrush(255);//画刷的着色黑色
HBRUSH hbrush2 = CreateSolidBrush(16744576);//画刷的着色黑色
hFont=CreateFont((char*)"宋体",15);//用于显示信息栏
SelectObject(hdc, hpen);
SelectObject(hdc, hbrush2 );
SelectObject(hdc,hFont);//选择字体
GetClientRect (hwnd, &r);
RECT r1;
r.right=r.right-2;
r.left=r.left+2;
int cxForm=r.right-r.left;//得到界面的宽度
int cyForm=r.bottom-r.top;//得到界面的高度
r.top=r.bottom-20;
r.bottom=r.bottom-1;
r1=r;
SetTextColor(hdc, 65535);//设置字体着色
SetBkMode(hdc,TRANSPARENT);// 设置TextOut文本背景色模式为透明
DWORD old_jdtss=0;
while(yx1==1)
{
if (old_jdtss!=jdtss)
{
FillRect(hdc,&r1,hbrush2);//用背景画刷以矩形填充整个窗口
r.right=r.left+cxForm*((double)jdtss/jdtzs);
FillRect(hdc,&r,hbrush1);//用背景画刷以矩形填充整个窗口
DrawText(hdc,inputstr,strlen(inputstr),&r1,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
Sleep(10);
old_jdtss=jdtss;
}
//TextOut(hdc,10,r.bottom-20,inputstr,strlen(inputstr));
//UpdateWindow(hwnd);
}
FillRect(hdc,&r1,hbrush1);//用背景画刷以矩形填充整个窗口
DrawText(hdc,inputstr,strlen(inputstr),&r1,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
DeleteObject(hpen);//删除画笔
DeleteObject(hbrush1);//删除画笔
DeleteObject(hbrush2);//删除画笔
DeleteObject(hFont);//删除画笔
ReleaseDC(hwnd,hdc);
return 0L;
}
//ftp下载文件不带进度模式
BOOL ftp_down_file(const char *server, int port, const char *username, const char *password,
const char *szLocalFileName, const char *szFtpFileName,bool debug)
{
HINTERNET net_session = 0;
HINTERNET ftp_session = 0;
if (debug) printf("正在连接网络.....\n");
net_session = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(0 == net_session)
{
if (debug) printf("[%s]不能连接网络!\n", __FUNCTION__);
InternetCloseHandle(net_session);
return FALSE;
}
if (debug) printf("正在连接FTP服务器.....\n");
ftp_session = InternetConnect(net_session, server, port, username, password,INTERNET_SERVICE_FTP, 0, 0);//连接FTP服务器
if(0 == ftp_session)
{
if (debug) printf("[%s]不能连接FTP服务器\n", __FUNCTION__);
InternetCloseHandle(net_session);
InternetCloseHandle(ftp_session);
return FALSE;
}
if (debug) printf("开始下载文件...\n");
bool zs=FtpGetFile(ftp_session,szFtpFileName, szLocalFileName, FALSE,FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0 );//INTERNET_FLAG_TRANSFER_BINARY FTP_TRANSFER_TYPE_ASCII
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已关闭所有连接.....\n");
return zs;
/*
InternetConnect参数说明编辑
hInternetSession:由InternetOpen返回的句柄。
sServerName:连接的ip或者主机名
nServerPort:连接的端口。如0,则为默认端口。
sUsername :用户名,如无置null
sPassword :密码,如无置null。
lService:使用的服务类型,可以使用以下
INTERNET_SERVICE_FTP = 1:连接到一个 FTP 服务器上
INTERNET_SERVICE_GOPHER = 2
INTERNET_SERVICE_HTTP = 3:连接到一个 HTTP 服务器上
lFlags :文档传输形式及缓存标记。一般置0。待补充。
ftp下:134217728=被动连接,vb有说法是x8000000。
lContext:当使用回叫信号时, 用来识别应用程序的前后关系。
返回值编辑
成功返回非0。如果返回0。要InternetCloseHandle释放这个句柄。
*/
/*
BOOLAPI FtpGetFileA(
HINTERNET hConnect,//FTP句柄
LPCSTR lpszRemoteFile,//FTP上的文件
LPCSTR lpszNewFile,//本地要保存的文件
BOOL fFailIfExists,//如果TRUE,将文件存在时则下载取消,如果FALSE则直接履盖
DWORD dwFlagsAndAttributes,//FILE_ATTRIBUTE_NORMAL
DWORD dwFlags,//FTP_TRANSFER_TYPE_BINARY
DWORD_PTR dwContext//0
);
*/
//示例FtpGetFile( hConnection, szFtpFileName, szLocalFileName, FALSE,FILE_ATTRIBUTE_NORMAL, dwTransferType, 0 )
}
//ftp下载文件带进度模式
BOOL ftp_down_file1(HWND hwnd,const char *server, int port, const char *username, const char *password,
const char *szLocalFileName, const char *szFtpFileName,bool debug)
{
HINTERNET net_session = 0;
HINTERNET ftp_session = 0;
HINTERNET ftp_file = 0;
BYTE *pDownloadData = NULL;//存放下载文件的缓冲区
DWORD dwDownloadDataSize = 0;//要下载的文件大小
DWORD dwBufferSize = 4096;//下载缓冲区大小
BYTE *pBuf = NULL;//下载缓冲区
DWORD dwBytesReturn = 0;
DWORD dwOffset = 0;//偏移量
BOOL bRet = FALSE;
char temp[50];
double zs=0;
if (debug) printf("正在连接网络.....\n");
net_session = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(0 == net_session)
{
if (debug) printf("[%s]不能连接网络!\n", __FUNCTION__);
InternetCloseHandle(net_session);
return false;
}
if (debug) printf("正在连接FTP服务器.....\n");
ftp_session = InternetConnect(net_session, server, port, username, password,INTERNET_SERVICE_FTP, 0, 0);//连接FTP服务器
if(0 == ftp_session)
{
if (debug) printf("[%s]不能连接FTP服务器\n", __FUNCTION__);
InternetCloseHandle(net_session);
InternetCloseHandle(ftp_session);
return false;
}
if (debug) printf("开始下载文件...\n");
//打开FTP文件,文件操作和本地操作相似
ftp_file=FtpOpenFile(ftp_session,szFtpFileName,GENERIC_READ,FTP_TRANSFER_TYPE_BINARY | INTERNET_FLAG_RELOAD,0);
//获取文件大小
dwDownloadDataSize=FtpGetFileSize(ftp_file,NULL);
sprintf(temp,"该文件大小为:%dKB,确定要下载吗?",dwDownloadDataSize/1024);
if (MessageBox(MAIN_hwnd,temp,"提示",MB_YESNO|MB_ICONQUESTION)==IDNO )
{
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已关闭所有连接.....\n");
return false;
}
//printf("文件大小为:%d\n",dwDownloadDataSize);
// 申请动态内存
pDownloadData = new BYTE[dwDownloadDataSize];
RtlZeroMemory(pDownloadData, dwDownloadDataSize);
pBuf = new BYTE[dwBufferSize];
RtlZeroMemory(pBuf, dwBufferSize);
jdtzs=dwDownloadDataSize;
jdtss=0;
// 接收数据
//InvalidateRect(hwnd,NULL,TRUE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景
yx1=1;
memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会.......
HANDLE hThread1 = CreateThread(NULL, 0, xc3, hwnd, 0, NULL);//创建线程
// 接收数据
do
{
bRet = InternetReadFile(ftp_file, pBuf, dwBufferSize, &dwBytesReturn);
if (FALSE == bRet)
{
// 释放内存
delete[]pDownloadData;
pDownloadData = NULL;
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已关闭所有连接.....\n");
yx1=0;
return false;
}
RtlCopyMemory((pDownloadData + dwOffset), pBuf, dwBytesReturn);
dwOffset = dwOffset + dwBytesReturn;
zs=(double)dwOffset/dwDownloadDataSize*100;
sprintf(inputstr,"下载进度:%.2f%%\n",zs);
SetWindowText(hwnd,inputstr);
jdtss=dwOffset;
//printf("%s\n",inputstr);
} while (dwDownloadDataSize >dwOffset);
// 将数据保存为文件
Ftp_SaveToFile(szLocalFileName, pDownloadData, dwDownloadDataSize);
// 释放内存
delete[]pDownloadData;
pDownloadData = NULL;
//关闭句柄
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已关闭所有连接.....\n");
yx1=0;
return true;
}
//ftp上传文件不带进度模式
BOOL ftp_upload_file(const char *server, int port, const char *username, const char *password,
const char *localfile, const char *remotefile,bool debug)
{
HINTERNET net_session = 0;
HINTERNET ftp_session = 0;
if (debug) printf("正在连接网络.....\n");
net_session = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(0 == net_session)
{
if (debug) printf("[%s]不能连接网络!\n", __FUNCTION__);
InternetCloseHandle(net_session);
return FALSE;
}
if (debug) printf("正在连接FTP服务器.....\n");
ftp_session = InternetConnect(net_session, server, port, username, password,
INTERNET_SERVICE_FTP, 0, 0);//连接FTP服务器
if(0 == ftp_session)
{
if (debug) printf("[%s]不能连接FTP服务器\n", __FUNCTION__);
InternetCloseHandle(ftp_session);
return FALSE;
}
if (debug) printf("开始上传文件...\n");
bool zs=FtpPutFile(ftp_session, localfile, remotefile,INTERNET_FLAG_TRANSFER_BINARY, 0);//INTERNET_FLAG_TRANSFER_BINARY FTP_TRANSFER_TYPE_ASCII
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已上传文件%s,连接已关闭...\n",remotefile);
return zs;
/*
参数说明编辑
hInternetSession:由InternetOpen返回的句柄。
sServerName:连接的ip或者主机名
nServerPort:连接的端口。如0,则为默认端口。
sUsername :用户名,如无置null
sPassword :密码,如无置null。
lService:使用的服务类型,可以使用以下
INTERNET_SERVICE_FTP = 1:连接到一个 FTP 服务器上
INTERNET_SERVICE_GOPHER = 2
INTERNET_SERVICE_HTTP = 3:连接到一个 HTTP 服务器上
lFlags :文档传输形式及缓存标记。一般置0。待补充。
ftp下:134217728=被动连接,vb有说法是x8000000。
lContext:当使用回叫信号时, 用来识别应用程序的前后关系。
返回值编辑
成功返回非0。如果返回0。要InternetCloseHandle释放这个句柄。
*/
}
//ftp上传文件带进度模式
BOOL ftp_upload_file1(HWND hwnd,const char *server, int port, const char *username, const char *password,
const char *localfile, const char *remotefile,bool debug)
{
HINTERNET net_session = 0;
HINTERNET ftp_session = 0;
HINTERNET hFTPFile = NULL;
DWORD dwBytesReturn = 0;
DWORD UploadDataSize = 0;
BYTE *pUploadData = NULL;
DWORD dwRet, bRet = 0;
DWORD dwBufferSize = 4096;//上传缓冲区大小
BYTE *pBuf = NULL;//上传缓冲区
DWORD dwOffset = 0;//偏移量
double zs=0;
if (debug) printf("正在连接网络.....\n");
net_session = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(0 == net_session)
{
if (debug) printf("[%s]不能连接网络!\n", __FUNCTION__);
InternetCloseHandle(net_session);
return FALSE;
}
if (debug) printf("正在连接FTP服务器.....\n");
ftp_session = InternetConnect(net_session, server, port, username, password,
INTERNET_SERVICE_FTP, 0, 0);//连接FTP服务器
if(0 == ftp_session)
{
if (debug) printf("[%s]不能连接FTP服务器\n", __FUNCTION__);
InternetCloseHandle(ftp_session);
return FALSE;
}
if (debug) printf("开始上传文件...\n");
hFTPFile = FtpOpenFile(ftp_session, remotefile, GENERIC_WRITE, FTP_TRANSFER_TYPE_BINARY | INTERNET_FLAG_RELOAD, 0);
// 打开文件
HANDLE hFile = CreateFile(localfile, GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ |
FILE_SHARE_WRITE, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
return FALSE;
}
// 获取文件大小
UploadDataSize = GetFileSize(hFile, NULL);
// 读取文件数据
pUploadData = new BYTE[UploadDataSize];
ReadFile(hFile, pUploadData, UploadDataSize, &dwRet, NULL);
UploadDataSize = dwRet;
CloseHandle(hFile); // 一定注意在函数退出之前对句柄进行释放。
// 申请动态内存
pBuf = new BYTE[dwBufferSize];
RtlZeroMemory(pBuf, dwBufferSize);
DWORD dwupBufferSize = 0;//上传缓冲区大小
jdtzs=UploadDataSize;
jdtss=0;
// 接收数据
//InvalidateRect(hwnd,NULL,TRUE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景
yx1=1;
memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会.......
//inputstr
HANDLE hThread1 = CreateThread(NULL, 0, xc3, hwnd, 0, NULL);//创建线程
do
{
if ((UploadDataSize-dwOffset)>=dwBufferSize)
{
dwupBufferSize=dwBufferSize;
}else
{
dwupBufferSize=UploadDataSize-dwOffset;
}
RtlZeroMemory(pBuf, dwBufferSize);//清除缓冲区数据
RtlCopyMemory(pBuf,(pUploadData+dwOffset),dwupBufferSize);//复制缓冲区数据
// 上传数据
bRet = InternetWriteFile(hFTPFile, pBuf, dwupBufferSize, &dwBytesReturn);
if (FALSE == bRet)
{
// 释放内存
delete[]pUploadData;
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
yx1=0;
return false;
}
dwOffset = dwOffset + dwBytesReturn;
zs=(double)dwOffset/UploadDataSize*100;
sprintf(inputstr,"上传进度:%.2f%%\n",zs);
SetWindowText(hwnd,inputstr);
jdtss=dwOffset;
//InvalidateRect(hwnd,NULL,FALSE);
//TextOut(hdc,10,r.bottom-20,inputstr,strlen(inputstr));
} while (dwOffset<UploadDataSize);
delete[]pUploadData;
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已上传文件%s,连接已关闭...\n",remotefile);
yx1=0;
return TRUE;
}
BOOL ftp_delete_file(const char *server, int port, const char *username, const char *password,
const char *remotefile,bool debug)
{
HINTERNET net_session = 0;
HINTERNET ftp_session = 0;
string dirname;
if (debug) printf("正在连接网络.....\n");
net_session = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(0 == net_session)
{
if (debug) printf("[%s]不能连接网络!\n", __FUNCTION__);
InternetCloseHandle(net_session);
return FALSE;
}
if (debug) printf("正在连接FTP服务器.....\n");
ftp_session = InternetConnect(net_session, server, port, username, password,
INTERNET_SERVICE_FTP, 0, 0);//连接FTP服务器
if(0 == ftp_session)
{
if (debug) printf("[%s]不能连接FTP服务器\n", __FUNCTION__);
InternetCloseHandle(ftp_session);
return FALSE;
}
if (debug) printf("开始上传文件...\n");
dirname=remotefile;
bool zs;
if (dirname.find("[")!=string::npos && dirname.rfind("]")!=string::npos)
{
dirname=dirname.erase(dirname.find("["),1);
dirname=dirname.erase(dirname.find("]"),1);
//MessageBox(NULL,dirname.c_str(),"",0);
zs=FtpRemoveDirectory( ftp_session, dirname.c_str() );//从FTP服务器中删除一个目录
}else
{
zs=FtpDeleteFile(ftp_session, remotefile);//删除FTP文件
}
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已上传文件%s,连接已关闭...\n",remotefile);
return zs;
}
BOOL ftp_rename_Directory(const char *server, int port, const char *username, const char *password,
const char *szOldFileName, const char *szNewFileName,const char *szftppath,bool debug)
{
HINTERNET net_session = 0;
HINTERNET ftp_session = 0;
if (debug) printf("正在连接网络.....\n");
net_session = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(0 == net_session)
{
if (debug) printf("[%s]不能连接网络!\n", __FUNCTION__);
InternetCloseHandle(net_session);
return FALSE;
}
if (debug) printf("正在连接FTP服务器.....\n");
ftp_session = InternetConnect(net_session, server, port, username, password,INTERNET_SERVICE_FTP, 0, 0);//连接FTP服务器
if(0 == ftp_session)
{
if (debug) printf("[%s]不能连接FTP服务器\n", __FUNCTION__);
InternetCloseHandle(net_session);
InternetCloseHandle(ftp_session);
return FALSE;
}
if (debug) printf("开始创建目录...\n");
FtpSetCurrentDirectory( ftp_session, szftppath);//设置FTP目录为当前目录
bool zs=FtpRenameFile( ftp_session, szOldFileName, szNewFileName );
if (!zs)
MessageBox(NULL,"更名失败!可能已经存在该目录或文件.....","",0);
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已关闭所有连接.....\n");
return zs;
}
BOOL ftp_creat_Directory(const char *server, int port, const char *username, const char *password,
const char *szDirectoryName, const char *szftppath,bool debug)
{
HINTERNET net_session = 0;
HINTERNET ftp_session = 0;
if (debug) printf("正在连接网络.....\n");
net_session = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(0 == net_session)
{
if (debug) printf("[%s]不能连接网络!\n", __FUNCTION__);
InternetCloseHandle(net_session);
return FALSE;
}
if (debug) printf("正在连接FTP服务器.....\n");
ftp_session = InternetConnect(net_session, server, port, username, password,INTERNET_SERVICE_FTP, 0, 0);//连接FTP服务器
if(0 == ftp_session)
{
if (debug) printf("[%s]不能连接FTP服务器\n", __FUNCTION__);
InternetCloseHandle(net_session);
InternetCloseHandle(ftp_session);
return FALSE;
}
if (debug) printf("开始创建目录...\n");
FtpSetCurrentDirectory( ftp_session, szftppath);//设置FTP目录为当前目录
bool zs=FtpCreateDirectory( ftp_session, szDirectoryName );//FTP服务器上创建一个新目录
if (!zs)
MessageBox(NULL,"创建目录失败!可能已经存在该目录.....","",0);
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
if (debug) printf("已关闭所有连接.....\n");
return zs;
}
//枚举FTP文件清单
BOOL ftp_DisplayFtpDir(const char *server, int port, const char *username1, const char *password,
const char *ftpdir,bool debug)
{
HINTERNET net_session = 0;
HINTERNET ftp_session = 0;
WIN32_FIND_DATA dirInfo;
HINTERNET hFind;
string dirname;
int i=0;
net_session = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(0 == net_session)
{
MessageBox(NULL,"不能连接网络!","警告",MB_OK);
InternetCloseHandle(net_session);
return FALSE;
}
ftp_session = InternetConnect(net_session, server, port, username1, password,
INTERNET_SERVICE_FTP, 0, 0);//连接FTP服务器
if(0 == ftp_session)
{
MessageBox(NULL,"不能连接FTP服务器!","警告",MB_OK);
InternetCloseHandle(net_session);
InternetCloseHandle(ftp_session);
return FALSE;
}
SendMessage(KJ_TALK7_LISTBOX1,LB_RESETCONTENT ,0,0L);//清空列表框
hFind = FtpFindFirstFile( ftp_session,ftpdir,&dirInfo, INTERNET_FLAG_RELOAD, 0 );//INTERNET_FLAG_HYPERLINK
//INTERNET_FLAG_RELOAD 从原服务器强制下载所要求的文件,对象,或目录列表,而不是从缓存下载。
if ( hFind == NULL )
{
InternetCloseHandle(net_session);
InternetCloseHandle(ftp_session);
InternetCloseHandle(hFind);
return FALSE;
}
bool temp;
do
{
//if (debug) printf("文件名:%s 文件属性:%d 创建时间:%s\n", dirInfo.cFileName,dirInfo.dwFileAttributes, dirInfo.ftCreationTime);
dirname=dirInfo.cFileName;
temp=false;
if (username=="lovegp")//如果是这个用户名,则显示含有“张国鹏”的目录
{
temp=true;
}else//否则,不显示含有“张国鹏”的目录
{
if (dirname.find("张国鹏")!=string::npos)//如果含有“张国鹏”,则标志TEMP设为FALSE,就不显示
{
temp=false;
}else
{
temp=true;
}
}
if (temp==true)
{
if(dirInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
dirname="["+dirname+"]";
SendMessage(KJ_TALK7_LISTBOX1, LB_INSERTSTRING, 0,(LPARAM)dirname.c_str());//(LPARAM)dirInfo.cFileName
}else
{
SendMessage(KJ_TALK7_LISTBOX1, LB_ADDSTRING, 0,(LPARAM)dirname.c_str());//(LPARAM)dirInfo.cFileName
}
}
i++;
} while( InternetFindNextFile( hFind, (LPVOID) &dirInfo ) );
InternetCloseHandle(ftp_session);
InternetCloseHandle(net_session);
InternetCloseHandle(hFind);
if (debug) printf("已关闭所有连接...\n");
return true;
}
//得到网页内容
string geturl(string str)
{
DWORD flags;//上网方式
if (InternetGetConnectedState(&flags,0)==false)//检测连网状态
{
MessageBox(MAIN_hwnd,"提示:无网络连接,无法完成连网动作!","警告",MB_OK);
return "";
}
DWORD dwByteRead = 0;
char szDownBuffer[1024*100];
memset(szDownBuffer, 0, 1024*100);
HINTERNET hintInternetOpen = InternetOpen("Testing", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hintInternetOpen!=NULL)
{
HINTERNET hintInternetOpenUrl = InternetOpenUrl(hintInternetOpen, str.c_str(), NULL, 0, INTERNET_FLAG_RELOAD, 0);
if (hintInternetOpenUrl!=NULL)
{
BOOL bIntNetReadFile = InternetReadFile(hintInternetOpenUrl, szDownBuffer, sizeof(szDownBuffer), &dwByteRead);
string str1="";
while (bIntNetReadFile==true)
{
str1=str1+szDownBuffer;
if (!dwByteRead)//所有数据读完了
{
InternetCloseHandle(hintInternetOpenUrl);
InternetCloseHandle(hintInternetOpen);
return str1;
}
memset(szDownBuffer, 0, 1024*100);//一定要清掉内存,不然会.......
bIntNetReadFile = InternetReadFile(hintInternetOpenUrl, szDownBuffer, sizeof(szDownBuffer), &dwByteRead);
}
InternetCloseHandle(hintInternetOpenUrl);
}else
{
InternetCloseHandle(hintInternetOpen);//是不是打开成功再要关闭这个句柄?
return "";
}
InternetCloseHandle(hintInternetOpen);//是不是打开成功再要关闭这个句柄?
}else
{
return "";
}
}
//得到书籍清单
void getbooklist(string str)
{
string str1=geturl(str);//得到网页内容
if (str1=="") return;
//将str1内容按换行符截取到BOOKLIST中
booklist.clear();
string str2="";
for (int i=0;i<str1.size();i++)
{
if (str1[i]==13 || str1[i]==10)
{
if (str2!="" && str2!="0") booklist.push_back(str2);
str2="";
}else
{
str2=str2+str1[i];
}
}
//显示BOOKLIST中的内容到KJ_TALK2.LISTBOX2中
int fz;
string zs1;
SendMessage(KJ_TALK2_LISTBOX2,LB_RESETCONTENT ,0,0L);//清空列表框
for (int i=1;i<booklist.size();i++)
{
fz=booklist[i].rfind('=');//string.rfind 从字符串右边开始找字符,返回位置
zs1=booklist[i].substr(0,fz); // s2 = "is i"
SendMessage(KJ_TALK2_LISTBOX2, LB_ADDSTRING, 0,(LPARAM)zs1.c_str());
}
zs1=booklist[0];
zs1="页数:"+urlpage+"/"+zs1+" ";
SetWindowText(KJ_TALK2_TEXT1,(char *)zs1.c_str());
}
//保存文件对话框 WIN API
string GetSaveFileName()
{
OPENFILENAME ofn = { 0 };
char strFilename[MAX_PATH] = { 0 };
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrFile = strFilename;
string ml;
ml=Get_Run_Path_ZGP();
ml=ml+"gpbook";
ofn.lpstrInitialDir = ml.c_str();//初始目录为默认
if (username=="lovegp")
{
ofn.lpstrFilter = TEXT("所有文件\0*.*\0\0");//设置过滤
}else
{
ofn.lpstrFilter = TEXT("文本文件\0*.TXT;*.cpp\0\0");//设置过滤
}
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST |OFN_ENABLEHOOK;
//ofn.lpfnHook = &CbGetFileExtension; //添加回调函数
string fh;
if (GetSaveFileName(&ofn))
{
fh=strFilename;
if (fh.find(".")==string::npos)
{
fh=fh+".TXT";
}
return fh;
}
else{
return "";
}
}
//打开文件对话框 WIN API
string GetOpenFileName()
{
//loop:
OPENFILENAME ofn = { 0 };
char strFilename[MAX_PATH] = { 0 };//用于接收文件名//MessageBox(NULL, strFilename, TEXT("选择的文件"), 0);
ofn.lStructSize = sizeof(OPENFILENAME);//结构体大小
ofn.hwndOwner = NULL;//拥有着窗口句柄,为NULL表示对话框是非模态的,实际应用中一般都要有这个句柄
if (username=="lovegp")
{
ofn.lpstrFilter = TEXT("所有文件\0*.*\0\0");//设置过滤
}else
{
ofn.lpstrFilter = TEXT("文本文件\0*.TXT;*.cpp\0\0");//设置过滤
}
ofn.nFilterIndex = 1;//过滤器索引
ofn.lpstrFile = (LPTSTR)strFilename;//接收返回的文件名,注意第一个字符需要为NULL
ofn.nMaxFile = sizeof(strFilename);//缓冲区长度
string initialdir;
initialdir=Get_Run_Path_ZGP();
initialdir=initialdir+"gpbook";
ofn.lpstrInitialDir = initialdir.c_str();//初始目录为默认
ofn.lpstrTitle = TEXT("请选择一个文本文件");//使用系统默认标题留空即可
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;//文件、目录必须存在,隐藏只读选项
string fh;
if (GetOpenFileName(&ofn)) //如果用GCC编译的话,编译命令行要这样才行:gcc -o A A.cpp -static-libgcc -lgdi32 -lcomdlg32
{
fh=strFilename;
//MessageBox(NULL, strFilename, "选择的文件", 0);
//MessageBox(NULL, fh, "选择的文件", 0);
return fh;
}
else{
return "";
//MessageBox(NULL, TEXT("请选择一个文件"), NULL, MB_ICONERROR);
//goto loop;
}
}
//将字符串复制到剪切板
bool SetClipData(char *pstr)
{
if(OpenClipboard(NULL))
{
char *pBuf;
if(0==EmptyClipboard())
{
CloseClipboard();
return false;
}
HGLOBAL hClip=GlobalAlloc(GMEM_MOVEABLE,strlen(pstr)+1);
if(NULL==hClip)
{
CloseClipboard();
return false;
}
pBuf=(char*)GlobalLock(hClip);
if(NULL==pBuf)
{
CloseClipboard();
return false;
}
strcpy(pBuf,pstr);
GlobalUnlock(hClip);
if(NULL==SetClipboardData(CF_TEXT,hClip))
{
CloseClipboard();
return false;
}
CloseClipboard();
}
return true;
}
// 从剪切板中取得数据
string GetTextFromClipboard()
{
char* lpStr;
if(::OpenClipboard(NULL))
{
//获得剪贴板数据
HGLOBAL hMem = GetClipboardData(CF_TEXT);
if(NULL != hMem)
{
lpStr = (char*)::GlobalLock(hMem);
if(NULL != lpStr)
{
// MessageBox(0, lpStr, "", 0);
::GlobalUnlock(hMem);
::CloseClipboard();
string ls;
ls=lpStr;
return ls;
}
else
{
::GlobalUnlock(hMem);
::CloseClipboard();
return "";
}
}
else
{
::CloseClipboard();
return "";
}
}
else
{
return "";
}
}
//对文件进行排版
void Typesetting()
{
DWORD dwStart;
dwStart = GetTickCount();
wstring newwstr,s;
int wz=0;
wstring wstr_qjtab=ANSIToUnicode(" ");//全角tab
wstring wstr_qjkg=ANSIToUnicode(" ");//全角空格
bool hh=false;
//把文章开头的一些空格,回车符、换行符、TAB字符统统去掉
s=bookstr[wz];
while ((s==wstr_qjkg || s==wstr_qjtab || bookstr[wz]==10 || bookstr[wz]==13 || bookstr[wz]==32) && wz<bookstr.length())
{
wz++;
s=bookstr[wz];
}
//开始排版
while (wz<bookstr.length())
{
//遇到换行符
if (bookstr[wz]==0x0D || bookstr[wz]==0x0A)
{
newwstr.push_back(bookstr[wz]);//这种模式速度超级快
wz++;
if (bookstr[wz]==0x0D || bookstr[wz]==0x0A)
{
newwstr.push_back(bookstr[wz]);//这种模式速度超级快
wz++;
}
hh=true;
}else//正常字符处理
{
hh=false;
newwstr.push_back(bookstr[wz]);//这种模式速度超级快
wz++;
}
//换行后,将空格,回车符、换行符、TAB字符统统去掉
s=bookstr[wz];
if (hh==true)
{
while (s==wstr_qjkg||s==wstr_qjtab|| bookstr[wz]==0x0D || bookstr[wz]==0x0A || bookstr[wz]==0x20)
{
wz++;
s=bookstr[wz];
}
wstring wstrtemp=ANSIToUnicode(" ");
//newwstr=newwstr+wstrtemp;//尽量不要采取这种模式追加字符串
newwstr.push_back(wstrtemp[0]);//32919
newwstr.push_back(wstrtemp[1]);//32919
}
}
//排版完成
char ls1[MAX_PATH];
sprintf(ls1,"排版完成,共耗时:%d毫秒!是否打开文件:%s?",GetTickCount()-dwStart,inputstr);
string str_write=UnicodeToANSI(newwstr);
string tempname=inputstr;
WriteToFile(str_write,tempname);
if (MessageBox(MAIN_hwnd,ls1,"提示",MB_YESNO|MB_ICONQUESTION)==IDYES )
{
ShellExecute(NULL,"open",tempname.c_str(), NULL, NULL, SW_SHOWNORMAL);
}
return;
}
//对文件进行排版-去除括号内的内容,并用相应的空格去填充
void Typesetting1()
{
DWORD dwStart;
dwStart = GetTickCount();
wstring newwstr,s;
int wz=0;
wstring wstr_zkh=ANSIToUnicode("(");//全角左括号
wstring wstr_zkh1=ANSIToUnicode("(");//半角左括号
wstring wstr_ykh=ANSIToUnicode(")");//全角右括号
wstring wstr_ykh1=ANSIToUnicode(")");//半角右括号
wstring wstr_qjkg=ANSIToUnicode(" ");//全角空格
bool zkh=false;
//开始排版
while (wz<bookstr.length())
{
//遇到左括号
s=bookstr[wz];
if (s==wstr_zkh)
{
newwstr.push_back(bookstr[wz]);//这种模式速度超级快
wz++;
s=bookstr[wz];
while (s!=wstr_ykh)
{
newwstr.push_back(wstr_qjkg[0]);//这种模式速度超级快
wz++;
s=bookstr[wz];
}
newwstr.push_back(bookstr[wz]);//这种模式速度超级快
wz++;
}else
{
newwstr.push_back(bookstr[wz]);//这种模式速度超级快
wz++;
}
}
//排版完成
char ls1[MAX_PATH];
sprintf(ls1,"排版完成,共耗时:%d毫秒!是否打开文件:%s?",GetTickCount()-dwStart,inputstr);
string str_write=UnicodeToANSI(newwstr);
string tempname=inputstr;
WriteToFile(str_write,tempname);
if (MessageBox(MAIN_hwnd,ls1,"提示",MB_YESNO|MB_ICONQUESTION)==IDYES )
{
ShellExecute(NULL,"open",tempname.c_str(), NULL, NULL, SW_SHOWNORMAL);
}
return;
}
//运用线程,可以防止程序假死,将大量的长时间的运算工作采取这种模式较好
DWORD WINAPI xc1(LPVOID lpParamter)
{
Typesetting();//对文件进行排版
return 0L;
}
DWORD WINAPI xc2(LPVOID lpParamter)
{
Typesetting1();//对文件进行排版,去掉括号内的内容,并以空格填空
return 0L;
}
//从变量wstring bookstr中提取指定位置(beginwz)开始多少行的字符串,并放入Vector<string >showstr中,用于显示在窗口中
void getstr()
{
HDC hdc ; TEXTMETRIC tm ;
char temp1[30];
//函数内用到的变量统一放在前面,并赋好初值,可以减少不明错误发生!!!!
wstring linetxt;
wstring zhc,s;
string temp;
int n=0,n1=0,i=0,zs=0;
bool hh=false;
GetClientRect(MAIN_hwnd, &r);获取客户区尺寸
//创建字体
if (ll==1)
{hFont=CreateFont((char *)ztname,ztdx*sfbl);}
else
{hFont=CreateFont((char *)ztname,ztdx);}
//得到当前字体的高度和宽度
hdc = GetDC (MAIN_hwnd) ;
SelectObject(hdc,hFont);//选择字体
//得到当前字体的高度和宽度
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight + tm.tmEx