资讯详情

C++ 纯WIN32 API编程 悦读器实战示例

/* 最后修改: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

标签: 16zs矩形连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台