ClientDlg.cpp.svn-base
上传用户:szjkjd
上传日期:2022-06-27
资源大小:8968k
文件大小:47k
源码类别:

浏览器

开发平台:

Visual C++

  1. /*! @ClientDlg.cpp
  2. ********************************************************************************
  3. <PRE>
  4. 模块名         : 主界面对话框
  5. 文件名         : ClientDlg.cpp
  6. 相关文件       : ClientDlg.h
  7. 文件实现功能   : 打开WEB,并在后台检查相关下载并进行下载,启动游戏
  8. 作者           : 刘俊
  9. 版本           : 1.0
  10. --------------------------------------------------------------------------------
  11. 备注           : -
  12. --------------------------------------------------------------------------------
  13. 修改记录 : 
  14. 日  期          版本            修改人          修改内容 
  15. 2010/02/08      1.0             刘俊            创建
  16. 2010/02/10 1.0             王小静 改进窗体,增加任务栏文字显示,圆角窗体
  17. 2010/03/01      1.1             王小静 增加任务栏右键菜单,主要操作是注释掉oninitdialog中的去掉菜单
  18. 2010/03/01      1.1             王小静     修改onNcHitTest函数,只相应鼠标任务栏拖动
  19. 2010/03/01      1.1             王小静 修改Oncommand,添加任务栏关闭消息
  20. </PRE>
  21. ********************************************************************************
  22. * 版权所有(c) 2010, 17JAGO, 保留所有权利
  23. *******************************************************************************/
  24. #include "stdafx.h"
  25. #include "Client.h"
  26. #include "ClientDlg.h"
  27. #include ".clientdlg.h"
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #endif
  31. // CClientDlg 对话框
  32. CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)
  33. : CDialog(CClientDlg::IDD, pParent)
  34. {
  35. // 更改图标
  36. m_hIcon = AfxGetApp()->LoadIcon(IDI_17JAGO);
  37. }
  38. void CClientDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialog::DoDataExchange(pDX);
  41. DDX_Control(pDX, IDC_EXPLORER1, m_explorer);
  42. }
  43. BEGIN_MESSAGE_MAP(CClientDlg, CDialog)
  44. ON_WM_PAINT()
  45. ON_WM_QUERYDRAGICON()
  46. // add by liujun
  47. // 自定义消息
  48. ON_MESSAGE(WM_SHOWTASK, onShowTask)
  49. ON_WM_TIMER()
  50. // 重画界面消息
  51. ON_WM_NCLBUTTONDOWN()
  52. ON_WM_NCMOUSEMOVE()
  53. // end add
  54. //}}AFX_MSG_MAP
  55. ON_WM_NCHITTEST()
  56. END_MESSAGE_MAP()
  57. // CClientDlg 消息处理程序
  58. BOOL CClientDlg::OnInitDialog()
  59. {
  60. CDialog::OnInitDialog();
  61. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  62. //  执行此操作
  63. SetIcon(m_hIcon, TRUE); // 设置大图标
  64. SetIcon(m_hIcon, FALSE); // 设置小图标
  65. // TODO: 在此添加额外的初始化代码
  66. // ADD BY LIUJUN
  67. ///////////////////////注释掉该部分,目的是任务栏右键菜单/////////////////////
  68. // wangxiaojing add 去掉关闭按钮
  69. //DWORD   dwStyle   =   GetWindowLong(m_hWnd,   GWL_STYLE);   
  70. //dwStyle   &=   ~WS_SYSMENU;
  71. //SetWindowLong(m_hWnd,GWL_STYLE,dwStyle);
  72. //SendMessage(SC_MAXIMIZE);
  73. // end add
  74. // FTPsocket初始化
  75. this->m_Ftp.SOCKETINIT();
  76. // 读取配置文件,完成设置
  77. this->ReadLocalConfig();
  78. // 如果是网吧用户
  79. if ("0" == this->m_strUserType) 
  80. {
  81. // 读取端点服务器上的程序版本号
  82. this->m_strAppVersion = this->ReadFTPfile((LPSTR)(LPCTSTR)this->m_strServerIP, "Clientconfigversion.cfg", "VERSION");
  83. //判断是否要升级
  84. if (g_strAppVersion < this->m_strAppVersion) 
  85. {
  86. // 启动升级程序
  87. WinExec(".\JAGOupdate.exe",SW_SHOW);
  88. // 自退出
  89. PostQuitMessage(0);
  90. }
  91. }
  92. // 如果处于网吧
  93. if ("0" == this->m_strUserType) 
  94. {
  95. // 发送系统信息
  96. CSysinfo sysInfo;
  97. char *pchSend;
  98. // 获取本机系统信息
  99. sysInfo.SendSysInfo();
  100. pchSend = sysInfo.c_send;
  101. // 发送接口
  102. CSendInfo mysend;
  103. // 发送到端点服务器
  104. mysend.SendInfo((LPSTR)(LPCTSTR)this->m_strServerIP, 80,2,pchSend);
  105. // 读取网吧NetBarId
  106. this->m_strNetcafeNO = this->ReadFTPfile((LPSTR)(LPCTSTR)this->m_strServerIP, "userinfo.conf", "NetBarID");
  107. }
  108. // 托盘结构体初始化
  109. this->TrayInit();
  110. // 托盘状态设为没有加载
  111. this->m_TrayStat = false;
  112. //打开WEB页面
  113. this->OpenWEB();
  114. // 如果普通客户端,非商户 是有盘,非映射方式 在网吧开启的客户端
  115. if (("0" == this->m_strUser) && ("1" == this->m_strDisk) && ("0" == this->m_strUserType)) 
  116. {
  117. // 打开检查文件下载计时器
  118. SetTimer(g_uTimercheckfiledown, g_uTimercheckfiledownElapse, NULL);
  119. }
  120. ////////////////////////添加任务栏文字显示,窗体圆角//////////////////////////////////////////////////
  121. //任务栏显示
  122. SetWindowText("17架构娱乐平台");
  123. //圆角类
  124. CRgn rgn;
  125. //矩形类
  126. CRect rect;
  127. //获得矩形区域
  128. GetClientRect(rect);
  129.     //设计圆角
  130. rgn.CreateRoundRectRgn(rect.left,rect.top,rect.right,rect.bottom,5,5);
  131. //显示窗体
  132. SetWindowRgn((HRGN)rgn,true);
  133. return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
  134. }
  135. // 如果向对话框添加最小化按钮,则需要下面的代码
  136. //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  137. //  这将由框架自动完成。
  138. void CClientDlg::OnPaint() 
  139. {
  140. if (IsIconic())
  141. {
  142. CPaintDC dc(this); // 用于绘制的设备上下文
  143. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  144. // 使图标在工作矩形中居中
  145. int cxIcon = GetSystemMetrics(SM_CXICON);
  146. int cyIcon = GetSystemMetrics(SM_CYICON);
  147. CRect rect;
  148. GetClientRect(&rect);
  149. int x = (rect.Width() - cxIcon + 1) / 2;
  150. int y = (rect.Height() - cyIcon + 1) / 2;
  151. // 绘制图标
  152. dc.DrawIcon(x, y, m_hIcon);
  153. }
  154. else
  155. {
  156. CDialog::OnPaint();
  157. }
  158. }
  159. //当用户拖动最小化窗口时系统调用此函数取得光标显示。
  160. HCURSOR CClientDlg::OnQueryDragIcon()
  161. {
  162. return static_cast<HCURSOR>(m_hIcon);
  163. }
  164. /*! @TrayInit
  165. ********************************************************************************
  166. <PRE>
  167. 函数名   : TrayInit
  168. 功能     : 托盘结构体初始化
  169. 参数     : -
  170. 返回值   : -
  171. 抛出异常 : -
  172. --------------------------------------------------------------------------------
  173. 备注     : -
  174. 典型用法 : -
  175. --------------------------------------------------------------------------------
  176. 作者     : 刘俊
  177. </PRE>
  178. *******************************************************************************/
  179. void CClientDlg::TrayInit()
  180. {
  181. // 设置结构体信息
  182. m_Nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
  183. m_Nid.hWnd = this->m_hWnd;
  184. m_Nid.uID = IDI_17JAGO;
  185. m_Nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  186. // 设置托盘消息
  187. m_Nid.uCallbackMessage = WM_SHOWTASK;
  188. m_Nid.hIcon = this->m_hIcon;
  189. strcpy(m_Nid.szTip, "17架构科技");
  190. }
  191. /*! @AddtoTray
  192. ********************************************************************************
  193. <PRE>
  194. 函数名   : AddtoTray
  195. 功能     : 添加图标到托盘
  196. 参数     : -
  197. 返回值   : 成功返回TRUE,否则返回FALSE
  198. 抛出异常 : -
  199. --------------------------------------------------------------------------------
  200. 备注     : -
  201. 典型用法 : -
  202. --------------------------------------------------------------------------------
  203. 作者     : 刘俊
  204. </PRE>
  205. *******************************************************************************/
  206. BOOL CClientDlg::AddtoTray()
  207. {
  208. BOOL bStat;
  209. // 添加图标到托盘处
  210. bStat = Shell_NotifyIcon(NIM_ADD, &m_Nid);
  211. return bStat;
  212. }
  213. /*! @RemovefromTray
  214. ********************************************************************************
  215. <PRE>
  216. 函数名   : RemovefromTray
  217. 功能     : 从托盘删除图标
  218. 参数     : -
  219. 返回值   : 成功返回TRUE,否则返回FALSE
  220. 抛出异常 : -
  221. --------------------------------------------------------------------------------
  222. 备注     : -
  223. 典型用法 : -
  224. --------------------------------------------------------------------------------
  225. 作者     : 刘俊
  226. </PRE>
  227. *******************************************************************************/
  228. BOOL CClientDlg::RemovefromTray()
  229. {
  230. BOOL bStat;
  231. // 移除托盘图标
  232. bStat = Shell_NotifyIcon(NIM_DELETE, &m_Nid);
  233. return bStat;
  234. }
  235. /*! @onShowTask
  236. ********************************************************************************
  237. <PRE>
  238. 函数名   : onShowTask
  239. 功能     : 响应托盘事件
  240. 参数     : [IN]  wParam : 托盘图标ID
  241.    [IN]  lParam : 事件ID
  242. 返回值   : 非17JAGO图标返回1,17JAGO图标事情返回0
  243. 抛出异常 : -
  244. --------------------------------------------------------------------------------
  245. 备注     : -
  246. 典型用法 : -
  247. --------------------------------------------------------------------------------
  248. 作者     : 刘俊
  249. </PRE>
  250. *******************************************************************************/
  251. LRESULT CClientDlg::onShowTask(WPARAM wParam,LPARAM lParam)
  252. {
  253. // 检查是否是本程序的图标事件
  254. if(wParam != IDI_17JAGO)
  255. {
  256. return 1;
  257. }
  258. // 事件处理
  259. switch(lParam)
  260. {
  261. // 鼠标左键双击
  262. case WM_LBUTTONDBLCLK:
  263. {
  264. // 显示主界面
  265. this->ShowWindow(SW_SHOW);
  266. this->SetFocus();
  267. break;
  268. }
  269. // 鼠标右键点击事件
  270. case WM_RBUTTONUP:
  271. {
  272. // 加载右键菜单
  273. CMenu menu;
  274. if (!menu.LoadMenu(IDR_MENUTRAY)) 
  275. {
  276. return 0;
  277. }
  278. CMenu *pSubmenu = menu.GetSubMenu(0);
  279. ASSERT(pSubmenu);
  280. ::SetMenuDefaultItem(pSubmenu->m_hMenu, 0, true);
  281. // 获取鼠标位置
  282. CPoint mouse;
  283. GetCursorPos(&mouse);
  284. // 设置快捷菜单
  285. ::SetForegroundWindow(m_Nid.hWnd);
  286. ::TrackPopupMenu(pSubmenu->m_hMenu, 0, mouse.x, mouse.y, 0, m_Nid.hWnd, NULL);
  287. }
  288. // 鼠标左键点击菜单
  289. case WM_LBUTTONUP:
  290. {
  291. break;
  292. }
  293. default:
  294. break;
  295. }
  296. return 0;
  297. }
  298. /*! @OnCommand
  299. ********************************************************************************
  300. <PRE>
  301. 函数名   : OnCommand
  302. 功能     : 托盘菜单响应函数
  303. 参数     : [IN]  wParam : 事件ID
  304.    [IN]  lParam : 系统消息
  305. 返回值   : TRUE
  306. 抛出异常 : -
  307. --------------------------------------------------------------------------------
  308. 备注     : -
  309. 典型用法 : -
  310. --------------------------------------------------------------------------------
  311. 作者     : 刘俊
  312. </PRE>
  313. *******************************************************************************/
  314. BOOL CClientDlg::OnCommand(WPARAM wParam, LPARAM lParam)
  315. {
  316. // 取得事件ID
  317. WORD eventID = LOWORD(wParam);
  318. switch(eventID) 
  319. {
  320. case ID_EXIT:
  321. {
  322. // 退出事件
  323. if(this->m_TrayStat)
  324. {
  325. // 移除托盘图标
  326. if(!this->RemovefromTray())
  327. {
  328. ::AfxMessageBox("从托盘移除失败");
  329. }
  330. }
  331. // 如果有下载,关闭下载
  332. this->m_Ftp.Stopdown();
  333. // 自退出
  334. PostQuitMessage(0);
  335. break;
  336. }
  337. case ID_SHOWDLG:
  338. {
  339. // 显示事件
  340. this->ShowWindow(SW_SHOW);
  341. this->SetFocus();
  342. break;
  343. }
  344. //增加任务栏关闭消息
  345. case WM_DESTROY:
  346. {
  347. if (!this->m_TrayStat)
  348. {
  349. // 程序关闭到托盘
  350. if (!this->AddtoTray())
  351. {
  352. ::AfxMessageBox("迁移到托盘失败");
  353. }
  354. else
  355. {
  356. this->m_TrayStat = true;
  357. }
  358. }
  359. ShowWindow(SW_HIDE);
  360. }
  361. default:
  362. break;
  363. }
  364. return true;
  365. }
  366. /*! @OpenWEB
  367. ********************************************************************************
  368. <PRE>
  369. 函数名   : OpenWEB
  370. 功能     : 显示WEB页面
  371. 参数     : -
  372. 返回值   : -
  373. 抛出异常 : -
  374. --------------------------------------------------------------------------------
  375. 备注     : -
  376. 典型用法 : -
  377. --------------------------------------------------------------------------------
  378. 作者     : 刘俊
  379. </PRE>
  380. *******************************************************************************/
  381. void CClientDlg::OpenWEB()
  382. {
  383. COleVariant vHeaders;
  384. VARIANT varHeaders;
  385. // NETBARID为空时
  386. if ("" == this->m_strNetcafeNO.Trim()) 
  387. {
  388. // 如果是普通终端
  389. if ("0" == this->m_strUser) 
  390. {
  391. // 打开用户主页
  392. this->m_explorer.Navigate(this->m_strURL, NULL, NULL, NULL, NULL);
  393. }
  394. // 如果是商户终端
  395. else if ("1" == this->m_strUser) 
  396. {
  397. // 打开商户主页
  398. this->m_explorer.Navigate(this->m_strMasterURL, NULL, NULL, NULL, NULL);
  399. }
  400. }
  401. // 网吧有NETBARID时
  402. else
  403. {
  404. // 设置HTTP头,写入NetBarid信息
  405. CString strHttphead = "NetBarID:";
  406. strHttphead.Append(this->m_strNetcafeNO);
  407. vHeaders = strHttphead;
  408. varHeaders = vHeaders;
  409. // 如果是普通终端
  410. if ("0" == this->m_strUser) 
  411. {
  412. // 打开用户主页
  413. this->m_explorer.Navigate(this->m_strURL, NULL, NULL, NULL, &varHeaders);
  414. }
  415. // 如果是商户终端
  416. else if ("1" == this->m_strUser) 
  417. {
  418. // 打开商户主页
  419. this->m_explorer.Navigate(this->m_strMasterURL, NULL, NULL, NULL, &varHeaders);
  420. }
  421. // 释放资源
  422. ::VariantClear(&vHeaders);
  423. ::VariantClear(&varHeaders);
  424. }
  425. }
  426. BEGIN_EVENTSINK_MAP(CClientDlg, CDialog)
  427. ON_EVENT(CClientDlg, IDC_EXPLORER1, 259, DocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)
  428. ON_EVENT(CClientDlg, IDC_EXPLORER1, 250, BeforeNavigate2Explorer1, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
  429. END_EVENTSINK_MAP()
  430. /*! @DocumentCompleteExplorer1
  431. ********************************************************************************
  432. <PRE>
  433. 函数名   : DocumentCompleteExplorer1
  434. 功能     : 网页打开完成事件,用于读取HTTP SERVER返回HTTP头信息
  435. 参数     : [IN]  pDisp : COM指针
  436.    [IN]  URL : 网页URL
  437. 返回值   : -
  438. 抛出异常 : -
  439. --------------------------------------------------------------------------------
  440. 备注     : -
  441. 典型用法 : -
  442. --------------------------------------------------------------------------------
  443. 作者     : 刘俊
  444. </PRE>
  445. *******************************************************************************/
  446. void CClientDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
  447. {
  448. // 获取HTTP头信息
  449. IHTMLDocument2 *pHTMLDocument = NULL;
  450. BSTR bstr; 
  451. // 开始位置
  452. short nStartpos = 0;
  453. // 结束位置
  454. short nEndpos = 0;
  455. // 字符串长度
  456. short nLen = 0;
  457. // 取得WEB内容
  458. if (!(pHTMLDocument = (IHTMLDocument2*)this->m_explorer.get_Document()))
  459. {
  460. return;
  461. }
  462. // 读取COOKIE
  463. pHTMLDocument->get_cookie(&bstr);
  464. CString strCookie(bstr);
  465. // COOKIE样式: JSESSIONID=1xr23sfmyfbig; jago_account_login_name=user001; jago_account_login_pwd=4297f44b13955235245b2497399d7a93
  466. // strcookie末尾填";"
  467. CString strEnd = strCookie.Right(1);
  468. if (strEnd != ";") 
  469. {
  470. strCookie.Append(";");
  471. }
  472. // 计算网吧标识位置
  473. nStartpos = 0;
  474. nEndpos = 0;
  475. nLen = 0;
  476. nStartpos = strCookie.Find("NetBarId=", 0);
  477. if (1 < nStartpos) 
  478. {
  479. nEndpos = strCookie.Find(";", nStartpos);
  480. nLen = nEndpos - nStartpos - 8 - 1;
  481. // 取得网吧标识
  482. CString strNetbarid = strCookie.Mid(nStartpos + 9, nLen);
  483. if (strNetbarid != this->m_strNetcafeNO) 
  484. {
  485. CString strSend = "NetBarID=";
  486. strSend.Append(strNetbarid);
  487. strSend.Append(";");
  488. CSendInfo mysend;
  489. // 发送网吧标识
  490. mysend.SendInfo((LPSTR)(LPCTSTR)this->m_strServerIP, 80, 1,(LPSTR)(LPCTSTR)strSend);
  491. // 重新赋值
  492. this->m_strNetcafeNO = strNetbarid;
  493. }
  494. }
  495. // 释放资源
  496. ::SysFreeString(bstr);
  497. }
  498. /*! @BeforeNavigate2Explorer1
  499. ********************************************************************************
  500. <PRE>
  501. 函数名   : BeforeNavigate2Explorer1
  502. 功能     : 截取用户点击的URL链接,用于判断是否用于启动游戏
  503. 参数     : [IN]  URL : 网页URL
  504. 返回值   : -
  505. 抛出异常 : -
  506. --------------------------------------------------------------------------------
  507. 备注     : -
  508. 典型用法 : -
  509. --------------------------------------------------------------------------------
  510. 作者     : 刘俊
  511. </PRE>
  512. *******************************************************************************/
  513. void CClientDlg::BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
  514. {
  515. // 取得用户点击的URL
  516. CString strURL(URL->bstrVal);
  517. //测试用URL strURL = "game://relativePath=/games/暇月战歌&regPath= SOFTWARE@@@Object Software (Beijing) Co., Ltd.@@@XYZG&exeFile=play.exe&exeParams=zzz&downloadUrl=http://xyzg.17jago.com&fileName=风云暇月战歌v701.exe";
  518. // 判断是否是启动游戏链接
  519. if (strURL.Mid(0, 7) == "game://") 
  520. {
  521. // 去掉最后的“/”
  522. if ("/" == strURL.Right(1)) 
  523. {
  524. strURL = strURL.Left(strURL.GetLength() - 1);
  525. }
  526. // 读取游戏信息
  527. this->GetGameInfo(strURL);
  528. }
  529. }
  530. /*! @GetGameInfo
  531. ********************************************************************************
  532. <PRE>
  533. 函数名   : GetGameInfo
  534. 功能     : 通过链接分析取得游戏信息
  535. 参数     : [IN]  strUrl : 网页的URL
  536. 返回值   : -
  537. 抛出异常 : -
  538. --------------------------------------------------------------------------------
  539. 备注     : -
  540. 典型用法 : -
  541. --------------------------------------------------------------------------------
  542. 作者     : 刘俊
  543. </PRE>
  544. *******************************************************************************/
  545. void CClientDlg::GetGameInfo(CString strUrl)
  546. {
  547. // game://gameId=1001&regPath= HKEY_LOCAL_MACHINESOFTWAREObject Software (Beijing) Co., Ltd.XYZG&exeFile=play.exe&downloadUrl=http://xyzg.17jago.com
  548. /*
  549. * 链接后内容为:name=value键值对形式,通过&连接。
  550. 链接提交参数包括:
  551. 游戏相对客户端目录名称:relativePath;
  552. 游戏安装目录的注册表路径:regPath;
  553. 游戏启动可执行文件相对路径名称:exeFile;
  554. 游戏启动参数:exeParams;
  555. 游戏下载URL:downloadUrl;
  556. 游戏在分发系统中的文件名称:fileName
  557. 链接格式如下,其中红色部分根据不同游戏有所不同:
  558. game://relativePath=/games/xyzg&regPath= HKEY_LOCAL_MACHINE@@@SOFTWARE@@@Object Software (Beijing) Co., Ltd.@@@XYZG
  559. &exeFile=play.exe&exeParams=zzz&downloadUrl=http://xyzg.17jago.com&fileName=风云暇月战歌v701.exe */
  560. // 网吧环境下游戏路径
  561. CString strRelativePath;
  562. // 家庭环境下游戏路径
  563. CString strHomeGamePath;
  564. // 注册表储存路径的键值
  565. CString strRegKey;
  566. // 游戏进程名
  567. CString strExeName;
  568. // 游戏进程启动参数
  569. CString strGameParam;
  570. // 游戏网站地址
  571. CString strGameUrl;
  572. // 端点服务器上的游戏名
  573. CString strServerGameName;
  574. char chCurPath[1024] = {0};
  575. //  添加分隔符,方便处理
  576.     strUrl.Append("&");
  577. // 取得 网吧环境下游戏路径
  578. strRelativePath = this->GetSubString("relativePath=", "&", strUrl);
  579. // 取得 注册表储存路径的键值
  580. strRegKey = this->GetSubString("regPath=", "&", strUrl);
  581. // 取得 游戏进程名
  582. strExeName = this->GetSubString("exeFile=", "&", strUrl);
  583. // 取得 游戏进程启动参数
  584. strGameParam = this->GetSubString("exeParams=", "&", strUrl);
  585. // 取得 游戏网站地址
  586. strGameUrl = this->GetSubString("downloadUrl=", "&", strUrl);
  587. // 取得 端点服务器上的游戏名
  588. strServerGameName = this->GetSubString("fileName=", "&", strUrl);
  589. // 获取程序当前目录
  590. GetCurrentDirectory(1024,chCurPath);
  591. CString strCurPath = CString(chCurPath);
  592. // 组合游戏路径
  593. strCurPath.Append(strRelativePath);
  594. strCurPath.Append("\");
  595. strCurPath.Append(strExeName);
  596. strCurPath.Replace("/", "\");
  597. CFileFind fileFind;
  598. // 检查平台客户端下,游戏文件是否存在
  599. if (fileFind.FindFile(strCurPath)) 
  600. {
  601. // 运行GAME目录下的对应游戏
  602. this->RunGame(strCurPath, strGameParam);
  603. return;
  604. }
  605. // 检查注册表里是否有记录
  606. HKEY hKey;
  607. strRegKey.Trim();
  608. strRegKey.Replace("@@@", "\");
  609. LONG lRe = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPSTR)(LPCTSTR)strRegKey, 0 , KEY_READ, &hKey);
  610. if (lRe == ERROR_SUCCESS) 
  611. {
  612. LPBYTE pPath = new BYTE[502];
  613. ZeroMemory(pPath, 502);
  614. DWORD type_2 = REG_SZ;
  615. char chKey[] = "Path";
  616. DWORD cbData_2 = 512;
  617. // 读取注册表内的信息
  618. lRe = RegQueryValueEx(hKey, chKey, NULL, &type_2, pPath, &cbData_2);
  619. if (lRe == ERROR_SUCCESS) 
  620. {
  621. CString strRegPath = CString(pPath);
  622. strRegPath.Append(strExeName);
  623. // 运行注册表里取到到地址
  624. this->RunGame(strRegPath, strGameParam);
  625. delete [] pPath;
  626. ::RegCloseKey(hKey);
  627. return;
  628. }
  629. // 释放内存
  630. delete [] pPath;
  631. }
  632. // 读取端点服务器服务器端内的游戏
  633. // TODO
  634. // 没有找到,启动IE到指定网页
  635. CString strMsg = "没有找到该游戏,请确认游戏是否处于 ";
  636. strMsg.Append(strCurPath);
  637. strMsg.Append(" ,或者到重新官网下载!");
  638. AfxMessageBox(strMsg);
  639. // 打开游戏主页
  640. ShellExecute(GetSafeHwnd(), NULL, strGameUrl, NULL, NULL, SW_SHOWNORMAL); 
  641. }
  642. /*! @RunGame
  643. ********************************************************************************
  644. <PRE>
  645. 函数名   : RunGame
  646. 功能     : 启动游戏,并传入参数
  647. 参数     : [IN]  strPath : 游戏启动程序的绝对路径
  648.    [IN]  strParam : 要传给启动程序的参数
  649. 返回值   : 启动成功返回TRUE,否则返回FALSE
  650. 抛出异常 : -
  651. --------------------------------------------------------------------------------
  652. 备注     : -
  653. 典型用法 : -
  654. --------------------------------------------------------------------------------
  655. 作者     : 刘俊
  656. </PRE>
  657. *******************************************************************************/
  658. bool CClientDlg::RunGame(const CString strPath, const CString strParam)
  659. {
  660. // WINDOWS 启动API 参数
  661. STARTUPINFO si;
  662. PROCESS_INFORMATION pi;
  663. int iRes= -1;
  664. ZeroMemory( &si, sizeof(si) );
  665. si.cb = sizeof(si);
  666. //启动游戏
  667. iRes = CreateProcess(strPath, (LPSTR)(LPCTSTR)strParam, NULL, NULL, TRUE, CREATE_NEW_CONSOLE|HIGH_PRIORITY_CLASS, NULL, NULL, &si, &pi);
  668. if(iRes)
  669. {
  670. return true;
  671. }
  672. else
  673. {
  674. int nErrCode =GetLastError();
  675. char szInfo[255];
  676. sprintf(szInfo,"启动游戏失败: %d",nErrCode);
  677. AfxMessageBox(szInfo);
  678. return false;
  679. }
  680. }
  681. /*! @ReadLocalConfig
  682. ********************************************************************************
  683. <PRE>
  684. 函数名   : ReadLocalConfig
  685. 功能     : 读取本地配置文件,完成设置配置工作
  686. 参数     : -
  687. 返回值   : -
  688. 抛出异常 : -
  689. --------------------------------------------------------------------------------
  690. 备注     : -
  691. 典型用法 : -
  692. --------------------------------------------------------------------------------
  693. 作者     : 刘俊
  694. </PRE>
  695. *******************************************************************************/
  696. void CClientDlg::ReadLocalConfig()
  697. {
  698. // 记录程序路径
  699. char chLocalPath[1024] = {0};
  700. // 记录配置文件键值内容
  701. char chINIContent[1024] = {0};
  702. // 取得当前目录路径
  703. GetCurrentDirectory(1024, chLocalPath);
  704. // 取得CONFIG文件路径
  705. strcat(chLocalPath, "\config.ini");
  706. CString strContent;
  707. // 读取当前CONFG文件的版本号
  708. GetPrivateProfileString("Version", "ConfigVersion","", chINIContent, 1024,chLocalPath);
  709. this->m_strLocalConfigVersion = CString(chINIContent);
  710. this->m_strLocalConfigVersion.Trim();
  711. // 读取端点服务器IP地址
  712. ZeroMemory(chINIContent, 1024);
  713. GetPrivateProfileString("ApplicationSet", "ServerIP","", chINIContent, 1024,chLocalPath);
  714. this->m_strServerIP = CString(chINIContent);
  715. this->m_strServerIP.Trim();
  716. // 读取默认主页地址
  717. ZeroMemory(chINIContent, 1024);
  718. GetPrivateProfileString("ApplicationSet", "MainWEB","", chINIContent, 1024,chLocalPath);
  719. this->m_strURL = CString(chINIContent);
  720. this->m_strURL.Trim();
  721. // 读取商户默认主页地址
  722. ZeroMemory(chINIContent, 1024);
  723. GetPrivateProfileString("ApplicationSet", "MasterMainWEB","", chINIContent, 1024,chLocalPath);
  724. this->m_strMasterURL = CString(chINIContent);
  725. this->m_strMasterURL.Trim();
  726. // 读取用户类型
  727. ZeroMemory(chINIContent, 1024);
  728. GetPrivateProfileString("ApplicationSet", "Master","", chINIContent, 1024,chLocalPath);
  729. this->m_strUser = CString(chINIContent);
  730. this->m_strUser.Trim();
  731. // 读取用户环境
  732. ZeroMemory(chINIContent, 1024);
  733. GetPrivateProfileString("ApplicationSet", "UserType","", chINIContent, 1024,chLocalPath);
  734. this->m_strUserType = CString(chINIContent);
  735. this->m_strUserType.Trim();
  736. // 读取网吧硬盘环境
  737. ZeroMemory(chINIContent, 1024);
  738. GetPrivateProfileString("ApplicationSet", "HaveDisk","", chINIContent, 1024,chLocalPath);
  739. this->m_strDisk = CString(chINIContent);
  740. this->m_strDisk.Trim();
  741. }
  742. /*! @ReadFTPfile
  743. ********************************************************************************
  744. <PRE>
  745. 函数名   : ReadFTPfile
  746. 功能     : 读取某FTP文件内容,,第一个参数为FTP的IP地址,第二个参数为文件名,第三个为键值
  747. 参数     : [IN]  pIP : FTP的IP地址
  748.    [IN]  pFilename : 文件名
  749.    [IN]  pKey : 键值
  750. 返回值   : 读取出的内容
  751. 抛出异常 : -
  752. --------------------------------------------------------------------------------
  753. 备注     : 文件统一采用“;”(分号)结束
  754. 典型用法 : -
  755. --------------------------------------------------------------------------------
  756. 作者     : 刘俊
  757. </PRE>
  758. *******************************************************************************/
  759. CString CClientDlg::ReadFTPfile(char *pIP, char *pFilename, char *pKey)
  760. {
  761. // 参数检查
  762. if (pIP == NULL || pFilename == NULL || pKey == NULL) 
  763. {
  764. return "";
  765. }
  766. CInternetSession * pNetSession = NULL;
  767. CFtpConnection  * pFtpCnt = NULL;
  768. CInternetFile* pCINTFile = NULL;
  769. CString strTemp;
  770. char *pch = NULL;
  771. // 设定打开参数及超时
  772. pNetSession = new CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
  773. pNetSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,3000);
  774. pNetSession->SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,2000);
  775. pNetSession->SetOption(INTERNET_OPTION_SEND_TIMEOUT,2000);
  776. try
  777. {
  778. pFtpCnt = pNetSession->GetFtpConnection(pIP, NULL, NULL, 21);
  779. pCINTFile = pFtpCnt->OpenFile(pFilename, GENERIC_READ,FTP_TRANSFER_TYPE_BINARY,1);
  780. // 取得文件长度
  781. short nSize = pCINTFile->GetLength();
  782. pch = new char[nSize];
  783. ZeroMemory(pch, nSize);
  784. // 取得文件内容
  785. pCINTFile->Read(pch, nSize);
  786. }
  787. catch (CInternetException *e) 
  788. {
  789. // 异常,释放资源,关闭连接
  790. delete [] pch;
  791. if (pCINTFile) 
  792. {
  793. pCINTFile->Close();
  794. }
  795. if (pFtpCnt) 
  796. {
  797. pFtpCnt->Close();
  798. }
  799. if (pNetSession) 
  800. {
  801. pNetSession->Close();
  802. }
  803. return "";
  804. }
  805. strTemp = CString(pch);
  806. CString strKey = CString(pKey);
  807. // 加“=”号
  808. strKey.Append("=");
  809. short nStart = strTemp.Find(strKey, 0);
  810. if (nStart < 0) 
  811. {
  812. return "";
  813. }
  814. // 文件统一采用“;”(分号)结束
  815. short nEnd = strTemp.Find(";", nStart);
  816. CString strResult;
  817. // 取得键值
  818. if ((0 <= nStart) && (nStart < nEnd)) 
  819. {
  820. short nS = nStart + strKey.GetLength();
  821. short nCount = nEnd - nS;
  822. strResult = strTemp.Mid(nS, nCount);
  823. }
  824. //释放资源
  825. delete [] pch;
  826. pCINTFile->Close();
  827. pFtpCnt->Close();
  828. pNetSession->Close();
  829. return strResult;
  830. }
  831. /*! @OnTimer
  832. ********************************************************************************
  833. <PRE>
  834. 函数名   : OnTimer
  835. 功能     : TIMER计时器响应方法
  836. 参数     : [IN]  nIDEvent : 计时器编号
  837. 返回值   : -
  838. 抛出异常 : -
  839. --------------------------------------------------------------------------------
  840. 备注     : -
  841. 典型用法 : -
  842. --------------------------------------------------------------------------------
  843. 作者     : 刘俊
  844. </PRE>
  845. *******************************************************************************/
  846. void CClientDlg::OnTimer(UINT nIDEvent)
  847. {
  848. // 储存程序路径
  849. char chLocalPath[1024] = {0};
  850. // 端点服务器上的filelist.xml下载到本地后的路径及文件名
  851. char chFilelistdown[1024] = {0};
  852. // XML操作类
  853. CMangeXml ServerXML;
  854. CMangeXml LocalXML;
  855. TXML *txml = NULL;
  856. // 服务器端filelist.XML文件下载个数
  857. int iFiledowncountServer = 0;
  858. // 本地filelist.XML文件下载个数
  859. int iFiledowncountLocal = 0;
  860. // 服务器端下载列表节点结构
  861. CFileDownInfo FileinfoServer;
  862. // 本地下载列表节点结构
  863. CFileDownInfo FileinfoLocal;
  864. // 记录是否有下载列表是否有重名
  865. bool bSamename = false;
  866. ZeroMemory(&FileinfoServer, sizeof(FileinfoServer));
  867. ZeroMemory(&FileinfoLocal, sizeof(FileinfoLocal));
  868. // 取得当前目录路径
  869. GetCurrentDirectory(1024, chLocalPath);
  870. strcpy(chFilelistdown, chLocalPath);
  871. // 设定从端点服务器下载后的filelist.xml文件名和路径
  872. strcat(chFilelistdown, "\filelist_server.xml");
  873. // 设定本地filelist.xml文件路径
  874. strcat(chLocalPath, "\filelist.xml");
  875. if(nIDEvent==(UINT)g_uTimercheckfiledown) 
  876. {
  877. // 先暂停该计时器
  878. KillTimer(g_uTimercheckfiledown);
  879. // 下载端点服务器上的文件更新列表filelist.xml
  880. try
  881. {
  882. this->m_Ftp.SetFTPinfo(this->m_strServerIP, 21, NULL, NULL);
  883. if(!this->m_Ftp.ConectFTPCOMMAND())
  884. {
  885. return;
  886. }
  887. this->m_Ftp.SendUsername();
  888. this->m_Ftp.SendPWD();
  889. this->m_Ftp.Startdown("filelist.xml", chFilelistdown, true);
  890. }
  891. catch (CException *e) 
  892. {
  893. this->m_Ftp.CloseCommandConect();
  894. // 重新打开该计时器
  895. SetTimer(g_uTimercheckfiledown, g_uTimercheckfiledownElapse, NULL);
  896. return;
  897. }
  898. this->m_Ftp.CloseCommandConect();
  899. // 打开下载的XML,获得文件个数
  900. iFiledowncountServer = ServerXML.SumXmlNodes(chFilelistdown, "/filelist/file");
  901. // 打开本地存在的XML,获得文件个数
  902. iFiledowncountLocal = ServerXML.SumXmlNodes(chLocalPath, "/filelist/file");
  903. // 存在文件更新
  904. if (0 < iFiledowncountServer) 
  905. {
  906. // 遍历服务器端的filelist.xml
  907. for(int i = 0; i < iFiledowncountServer; i++)
  908. {
  909. // 重置状态
  910. bSamename = false;
  911. ZeroMemory(&FileinfoServer, sizeof(FileinfoServer));
  912. // 取得下载文件信息
  913. txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/file_name", i);
  914. strcpy(FileinfoServer.chFilename, ServerXML.p_con);
  915. ServerXML.CloseXml(txml);
  916. txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/server_file_path", i);
  917. strcpy(FileinfoServer.chFileserverpath, ServerXML.p_con);
  918. ServerXML.CloseXml(txml);
  919. txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/win_local_file_path", i);
  920. strcpy(FileinfoServer.chDownlocalpath, ServerXML.p_con);
  921. ServerXML.CloseXml(txml);
  922. txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/file_setup", i);
  923. strcpy(&FileinfoServer.cSetup, ServerXML.p_con);
  924. ServerXML.CloseXml(txml);
  925. txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/file_type", i);
  926. strcpy(FileinfoServer.chFiletype, ServerXML.p_con);
  927. ServerXML.CloseXml(txml);
  928. txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/update_date", i);
  929. strcpy(FileinfoServer.chLastupdate, ServerXML.p_con);
  930. ServerXML.CloseXml(txml);
  931. // 遍历本地的filelist.xml
  932. if (0 < iFiledowncountLocal) 
  933. {
  934. for(int j = 0; j < iFiledowncountLocal; j++)
  935. {
  936. ZeroMemory(&FileinfoLocal, sizeof(FileinfoLocal));
  937. // 取得本地列表文件信息
  938. txml = LocalXML.ReadXml(chLocalPath, "/filelist/file/file_name", j);
  939. strcpy(FileinfoLocal.chFilename, LocalXML.p_con);
  940. LocalXML.CloseXml(txml);
  941. txml = LocalXML.ReadXml(chLocalPath, "/filelist/file/update_date", j);
  942. strcpy(FileinfoLocal.chLastupdate, LocalXML.p_con);
  943. LocalXML.CloseXml(txml);
  944. // 进行比较,文件名相同
  945. if (0 == strcmp(FileinfoServer.chFilename, FileinfoLocal.chFilename))
  946. {
  947. // 记录文件本地列表存在
  948. bSamename = true;
  949. // 本地更新日期比服务器上的更新日期小,则进行更新工作
  950. if (0 < strcmp(FileinfoServer.chLastupdate, FileinfoLocal.chLastupdate))
  951. {
  952. // 下载文件
  953. this->Downfile(&FileinfoServer);
  954. break;
  955. }
  956. }
  957. // 如果遍历到最后,且没有文件重名,则需要下载
  958. if ((j == (iFiledowncountLocal -1)) && (false == bSamename)) 
  959. {
  960. // 下载文件
  961. this->Downfile(&FileinfoServer);
  962. }
  963. }
  964. }
  965. // 如果本地列表问空,则全部都要下载
  966. else
  967. {
  968. // 下载文件
  969. this->Downfile(&FileinfoServer);
  970. }
  971. }
  972. }
  973. // 重新打开该计时器
  974. SetTimer(g_uTimercheckfiledown, g_uTimercheckfiledownElapse, NULL);
  975. }
  976. CDialog::OnTimer(nIDEvent);
  977. }
  978. /*! @Downfile
  979. ********************************************************************************
  980. <PRE>
  981. 函数名   : Downfile
  982. 功能     : 下载文件
  983. 参数     : [IN]  pfiledowninfo : 文件下载结构体
  984. 返回值   : -
  985. 抛出异常 : -
  986. --------------------------------------------------------------------------------
  987. 备注     : -
  988. 典型用法 : -
  989. --------------------------------------------------------------------------------
  990. 作者     : 刘俊
  991. </PRE>
  992. *******************************************************************************/
  993. void CClientDlg::Downfile(const CFileDownInfo *pfiledowninfo)
  994. {
  995. // 下载时的FTP文件名,包含路径
  996. char chFtpfilename[1024] = {0};
  997. // 下载到本地的文件名,包含路径
  998. char chLocalfilename[1024] = {0};
  999. // 初始化
  1000. ZeroMemory(chFtpfilename, 1024);
  1001. ZeroMemory(chLocalfilename, 1024);
  1002. // 组合FTP端的路径
  1003. strcat(chFtpfilename, pfiledowninfo->chFileserverpath);
  1004. strcat(chFtpfilename, "/");
  1005. strcat(chFtpfilename, pfiledowninfo->chFilename);
  1006. // 组合本地下载文件路径
  1007. strcat(chLocalfilename, pfiledowninfo->chDownlocalpath);
  1008. strcat(chLocalfilename, pfiledowninfo->chFilename);
  1009. // 开始下载
  1010. try
  1011. {
  1012. this->m_Ftp.SetFTPinfo(this->m_strServerIP, 21, NULL, NULL);
  1013. if(!this->m_Ftp.ConectFTPCOMMAND())
  1014. {
  1015. return;
  1016. }
  1017. this->m_Ftp.SendUsername();
  1018. this->m_Ftp.SendPWD();
  1019. this->m_Ftp.Startdown(chFtpfilename, chLocalfilename, false);
  1020. // 检查是否运行程序
  1021. if ('1' == pfiledowninfo->cSetup) 
  1022. {
  1023. CString strExe = CString(chLocalfilename);
  1024. strExe = strExe.Right(3);
  1025. // 如果是EXE文件,则启动该文件
  1026. if ("exe" == strExe || "EXE" == strExe) 
  1027. {
  1028. // 启动该程序
  1029. WinExec(chLocalfilename, SW_SHOW);
  1030. }
  1031. }
  1032. }
  1033. catch (CException *e) 
  1034. {
  1035. this->m_Ftp.CloseCommandConect();
  1036. // 重新打开该计时器
  1037. SetTimer(g_uTimercheckfiledown, g_uTimercheckfiledownElapse, NULL);
  1038. return;
  1039. }
  1040. this->m_Ftp.CloseCommandConect();
  1041. // 写入本地的filelist.xml文件记录
  1042.   this->WriteToLocalXML(pfiledowninfo);
  1043. }
  1044. /*! @Downfile
  1045. ********************************************************************************
  1046. <PRE>
  1047. 函数名   : Downfile
  1048. 功能     : 写入本地的filelist.xml文件记录
  1049. 参数     : [IN]  pfiledowninfo : 文件下载结构体
  1050. 返回值   : -
  1051. 抛出异常 : -
  1052. --------------------------------------------------------------------------------
  1053. 备注     : -
  1054. 典型用法 : -
  1055. --------------------------------------------------------------------------------
  1056. 作者     : 刘俊
  1057. </PRE>
  1058. *******************************************************************************/
  1059. void CClientDlg::WriteToLocalXML(const CFileDownInfo *pfiledowninfo)
  1060. {
  1061. // 记录程序路径
  1062. char chLocalPath[1024] = {0};
  1063. // 记录文件名
  1064. char chName[500] = {0};
  1065. // XML操作类
  1066. CMangeXml LocalXML;
  1067. // 记录XML该文件的总数
  1068. short nCount = 0;
  1069. // 记录当前序号
  1070. short nIndex = 0;
  1071. // 取得当前目录路径
  1072. GetCurrentDirectory(1024, chLocalPath);
  1073. // 设定本地filelist.xml文件路径
  1074. strcat(chLocalPath, "\filelist.xml");
  1075. //取得总数
  1076. nCount = LocalXML.SumXmlNodes(chLocalPath, "/filelist/file");
  1077. // 记录当前遍历到哪一个记录
  1078. int iCur = 0;
  1079. // 记录是否存在同名
  1080. bool bSameName = false;
  1081. TXML *txml = NULL;
  1082. // 遍历本地记录,看是否存在
  1083. for(iCur = 0; iCur < nCount; iCur++)
  1084. {
  1085. // 重置文件名
  1086. ZeroMemory(chName, 500);
  1087. txml = LocalXML.ReadXml(chLocalPath, "/filelist/file/file_name", iCur);
  1088. // 获得文件名
  1089. strcpy(chName, LocalXML.p_con);
  1090. LocalXML.CloseXml(txml);
  1091. // 比较文件名
  1092. if (0 == strcmp(chName, pfiledowninfo->chFilename)) 
  1093. {
  1094. bSameName = true;
  1095. // 删除该原来的节点
  1096. iCur++;
  1097. LocalXML.DeleteXml(chLocalPath, "/filelist/file", iCur);
  1098. break;
  1099. }
  1100. }
  1101. // 增加 XML记录
  1102. if (bSameName) 
  1103. {
  1104. // 如果该文件节点已存在
  1105. nIndex = nCount;
  1106. }
  1107. else 
  1108. {
  1109. // 新增一个文件节点
  1110. nIndex = nCount + 1;
  1111. }
  1112. // setup节点内容处理
  1113. char chSetup[20] = {0};
  1114. strcpy(chSetup, &pfiledowninfo->cSetup);
  1115. chSetup[1] = '';
  1116. // 增加一个节点内容操作
  1117. LocalXML.AddXml(chLocalPath, "/filelist", 1, "file", NULL);
  1118. LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_name", pfiledowninfo->chFilename);
  1119. LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "server_file_path", pfiledowninfo->chFileserverpath);
  1120. LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "win_local_file_path", pfiledowninfo->chDownlocalpath);
  1121. LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_setup", chSetup);
  1122. LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_type", pfiledowninfo->chFiletype);
  1123. LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "update_date", pfiledowninfo->chLastupdate);
  1124. //////////////////////////// 保留 /////////////////////////////
  1125. //if (bSameName) 
  1126. //{
  1127. // iCur++;
  1128. // // 修改XML记录
  1129. // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "server_file_path", pfiledowninfo->chFileserverpath);
  1130. // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "win_local_file_path", pfiledowninfo->chDownlocalpath);
  1131. // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "file_setup", &pfiledowninfo->cSetup);
  1132. // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "file_type", pfiledowninfo->chFiletype);
  1133. // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "update_date", pfiledowninfo->chLastupdate);
  1134. //}
  1135. //else
  1136. //{
  1137. // // 增加 XML记录
  1138. // nIndex = nCount + 1;
  1139. // LocalXML.AddXml(chLocalPath, "/filelist", 1, "file", NULL);
  1140. // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_name", pfiledowninfo->chFilename);
  1141. // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "server_file_path", pfiledowninfo->chFileserverpath);
  1142. // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "win_local_file_path", pfiledowninfo->chDownlocalpath);
  1143. // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_setup", &pfiledowninfo->cSetup);
  1144. // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_type", pfiledowninfo->chFiletype);
  1145. // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "update_date", pfiledowninfo->chLastupdate);
  1146. //}
  1147. }
  1148. /*! @DrawTitleBar
  1149. ********************************************************************************
  1150. <PRE>
  1151. 函数名   : DrawTitleBar
  1152. 功能     : 重画标题栏,实现只有关闭和最小化
  1153. 参数     : [IN] pDC :系统化刷
  1154. 返回值   : -
  1155. 抛出异常 : -
  1156. --------------------------------------------------------------------------------
  1157. 备注     : -
  1158. 典型用法 : -
  1159. --------------------------------------------------------------------------------
  1160. 作者     : 王小静
  1161. </PRE>
  1162. *******************************************************************************/
  1163. void CClientDlg::DrawTitleBar(CDC * pDC)
  1164. {
  1165. if (m_hWnd)
  1166. {
  1167. CBrush Brush(RGB(168,222,255));//画刷  绘制标题的颜色,现在颜色是蓝色
  1168. CBrush* pOldBrush = pDC->SelectObject(&Brush); //选择作图对象
  1169. CRect rtWnd, rtTitle, rtButtons;//创建矩形窗体
  1170. GetWindowRect(&rtWnd); //获得窗体的大小
  1171. //SM_CXFRAME 窗口边框的边缘宽度
  1172. //SM_CYFRAME 窗口边框的边缘高度
  1173. //SM_CXSIZE 窗口标题栏宽度
  1174. //SM_CYSIZE 窗口标题栏高度
  1175. //取得标题栏的位置
  1176. rtTitle.left = GetSystemMetrics(SM_CXFRAME);//获得屏幕的宽度
  1177. rtTitle.top = GetSystemMetrics(SM_CYFRAME);//获得屏幕的高度    
  1178. rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
  1179. rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
  1180. //准备画XP风格按钮
  1181. CBitmap* pBitmap = new CBitmap;
  1182. CBitmap* pOldBitmap;
  1183. CDC* pDisplayMemDC=new CDC;
  1184. pDisplayMemDC->CreateCompatibleDC(pDC);
  1185. //重画标题栏,标题栏改换成图标
  1186. pBitmap->LoadBitmap(IDB_BITMAP);
  1187. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  1188. pDC->BitBlt(0, 0, rtTitle.right+rtTitle.left, rtTitle.bottom+rtTitle.top, pDisplayMemDC, 0, 0, SRCCOPY); //设置标题栏的显示位置
  1189. //pDC->BitBlt(rtTitle.left, rtTitle.top, rtTitle.Width(), rtTitle.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
  1190. pDisplayMemDC->SelectObject(pOldBitmap);
  1191. m_rtButtMin = rtTitle;
  1192. m_rtButtMin.OffsetRect(rtWnd.TopLeft());
  1193. pBitmap->DeleteObject();
  1194. //重画图标
  1195. ::DrawIconEx(pDC->m_hDC, rtTitle.left, 0, m_hIcon, 
  1196. rtTitle.bottom, rtTitle.bottom, 1, NULL, DI_NORMAL);
  1197. m_rtIcon.OffsetRect(rtWnd.TopLeft()); //将图标移到窗体的左上角
  1198. CPoint point;
  1199. point.x =GetSystemMetrics(SM_CXFRAME);  
  1200. point.y = rtWnd.Height();
  1201. pDC->PatBlt(0,0,point.x-1,point.y,PATCOPY);
  1202. //填充底部框架
  1203. point.x = rtWnd.Width(); 
  1204. point.y = GetSystemMetrics(SM_CYFRAME) + 1;
  1205. pDC->PatBlt(0, rtWnd.Height()-point.y+1, point.x, point.y, PATCOPY);
  1206. //填充右侧框架
  1207. point.x = GetSystemMetrics(SM_CXFRAME) + 1;
  1208. point.y = rtWnd.Height();
  1209. pDC->PatBlt(rtWnd.Width()-point.x+1, 0, point.x, point.y, PATCOPY);
  1210. //重画关闭button
  1211. rtButtons.left = rtTitle.right-45;
  1212. rtButtons.top = rtTitle.top;
  1213. rtButtons.right = rtButtons.left + 30;
  1214. rtButtons.bottom = rtButtons.top + 19;
  1215. pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
  1216. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  1217. pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
  1218. pDisplayMemDC->SelectObject(pOldBitmap);
  1219. m_rtButtExit = rtButtons;
  1220. m_rtButtExit.OffsetRect(rtWnd.TopLeft()); 
  1221. pBitmap->DeleteObject();
  1222. //重画最小化button
  1223. rtButtons.right = rtButtons.left;
  1224. rtButtons.left  = rtButtons.right - 21;
  1225. rtButtons.right = rtButtons.left + 21;
  1226. rtButtons.bottom = rtButtons.top + 19;
  1227. pBitmap->LoadBitmap(IDB_MIN_NORMAL);
  1228. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  1229. pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
  1230. pDisplayMemDC->SelectObject(pOldBitmap);
  1231. m_rtButtMin = rtButtons;
  1232. m_rtButtMin.OffsetRect(rtWnd.TopLeft());
  1233. pBitmap->DeleteObject();
  1234. //重新显示标题栏的题目
  1235. int nOldMode = pDC->SetBkMode(TRANSPARENT);//设置字体背景颜色,TRANSPARENT将背景颜色设置为透明
  1236. COLORREF clOldText=pDC->SetTextColor(RGB(35,35,35 ));//设置字体的颜色
  1237. pDC->SelectStockObject(SYSTEM_FIXED_FONT);
  1238. // 标题字体设置
  1239. CFont font;
  1240. font.CreateFont(18,0,0,0,FW_NORMAL,false,false,0, ANSI_CHARSET,OUT_TT_PRECIS,   CLIP_TT_ALWAYS, DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,"宋体");
  1241. CFont*   pOldFont     =   pDC->SelectObject(&font);  
  1242. rtTitle.left +=40;
  1243. rtTitle.top += 1;
  1244. rtTitle.bottom =rtTitle.bottom-1;
  1245. CString m_strTitle;
  1246. m_strTitle.Format("17架构娱乐平台");
  1247. // 显示标题文字
  1248. pDC->DrawText(m_strTitle, &rtTitle, DT_LEFT);
  1249. pDC->SetBkMode(nOldMode);//恢复颜色
  1250. pDC->SetTextColor(clOldText);
  1251. font.DeleteObject();
  1252. ReleaseDC(pDisplayMemDC);
  1253. delete pDisplayMemDC;
  1254. delete pBitmap;
  1255. }
  1256. }
  1257. /*! @DefWindowProc
  1258. ********************************************************************************
  1259. <PRE>
  1260. 函数名   : DefWindowProc
  1261. 功能     : 添加窗体处理消息,提供函数的缺省处理
  1262. 参数     : -
  1263. 返回值   : -
  1264. 抛出异常 : -
  1265. --------------------------------------------------------------------------------
  1266. 备注     : 重载系统DefWindowProc方法实现
  1267. 典型用法 : -
  1268. --------------------------------------------------------------------------------
  1269. 作者     : 王小静
  1270. </PRE>
  1271. *******************************************************************************/
  1272. LRESULT CClientDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  1273. {
  1274. LRESULT lrst = CDialog::DefWindowProc(message, wParam, lParam);
  1275. if (!::IsWindow(m_hWnd))
  1276. return lrst;
  1277. if (message == WM_MOVE || message == WM_PAINT || message == WM_NCPAINT || message == WM_NCACTIVATE || message == WM_NOTIFY)
  1278. {
  1279. CDC* pWinDC = GetWindowDC();
  1280. if (pWinDC)
  1281. // 重画标题栏
  1282. DrawTitleBar(pWinDC);
  1283. // 释放DC
  1284. ReleaseDC(pWinDC);
  1285. }
  1286. return lrst;
  1287. }
  1288. /*! @OnNcLButtonDown
  1289. ********************************************************************************
  1290. <PRE>
  1291. 函数名   : OnNcLButtonDown
  1292. 功能     : 鼠标相应标题栏事件
  1293. 参数     : [IN] point : 鼠标位置
  1294. 返回值   : -
  1295. 抛出异常 : -
  1296. --------------------------------------------------------------------------------
  1297. 备注     : -
  1298. 典型用法 : -
  1299. --------------------------------------------------------------------------------
  1300. 作者     : 王小静
  1301. </PRE>
  1302. *******************************************************************************/
  1303. afx_msg void CClientDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
  1304. // 关闭消息
  1305. if (m_rtButtExit.PtInRect(point))
  1306. {
  1307. if (!this->m_TrayStat)
  1308. {
  1309. // 程序关闭到托盘
  1310. if (!this->AddtoTray())
  1311. {
  1312. ::AfxMessageBox("迁移到托盘失败");
  1313. }
  1314. else
  1315. {
  1316. this->m_TrayStat = true;
  1317. }
  1318. }
  1319. ShowWindow(SW_HIDE);
  1320. }
  1321. // 最小化消息
  1322. else if (m_rtButtMin.PtInRect(point))
  1323. // 最小化到任务栏
  1324. SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));
  1325. // TODO 最小化到任务栏后,没有显示文字,
  1326. else if (!IsZoomed())
  1327. Default();
  1328. CDialog::OnNcLButtonDown(nHitTest, point);
  1329. }
  1330. /*! @OnNcMouseMove
  1331. ********************************************************************************
  1332. <PRE>
  1333. 函数名   : OnNcMouseMove
  1334. 功能     : 鼠标移动到最小化,关闭的响应事件
  1335. 参数     : [IN] point : 鼠标位置
  1336. 返回值   : -
  1337. 抛出异常 : -
  1338. --------------------------------------------------------------------------------
  1339. 备注     : -
  1340. 典型用法 : -
  1341. --------------------------------------------------------------------------------
  1342. 作者     : 王小静
  1343. </PRE>
  1344. *******************************************************************************/
  1345. void CClientDlg::OnNcMouseMove(UINT nHitTest , CPoint point)
  1346. {
  1347. // 设置DC
  1348. CDC* pDC = GetWindowDC();
  1349. CDC* pDisplayMemDC=new CDC;
  1350. pDisplayMemDC->CreateCompatibleDC(pDC);
  1351. // 定义为图
  1352. CBitmap* pBitmap = new CBitmap;
  1353. CBitmap* pOldBitmap;
  1354. // 定义RECT
  1355. CRect rtWnd, rtButton;
  1356. // 如果窗体存在
  1357. if (pDC)
  1358. {
  1359. // 取得窗体的矩形区域
  1360. GetWindowRect(&rtWnd);
  1361. //关闭button
  1362. if (m_rtButtExit.PtInRect(point))
  1363. // 更改关闭图片
  1364. pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
  1365. else
  1366. // 更改关闭图片
  1367. pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
  1368. // 获得关闭按键的区域
  1369. rtButton = m_rtButtExit;
  1370. rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
  1371. // 取得图片
  1372. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  1373. // 设置图片显示区域
  1374. pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
  1375. // 显示图片
  1376. pDisplayMemDC->SelectObject(pOldBitmap);
  1377. // 释放图片
  1378. pBitmap->DeleteObject();
  1379. //最小化button
  1380. if (m_rtButtMin.PtInRect(point))
  1381. // 更改最小化位图
  1382. pBitmap->LoadBitmap(IDB_MIN_FOCUS);
  1383. else
  1384. // 更改最小化位图
  1385. pBitmap->LoadBitmap(IDB_MIN_NORMAL);
  1386. // 获得最小化按键的区域
  1387. rtButton = m_rtButtMin;
  1388. rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
  1389. // 取得图片
  1390. pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
  1391. // 设置图片显示区域
  1392. pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
  1393. // 显示图片
  1394. pDisplayMemDC->SelectObject(pOldBitmap);
  1395. // 释放图片
  1396. pBitmap->DeleteObject();
  1397. }
  1398. // 释放资源
  1399. ReleaseDC(pDisplayMemDC);
  1400. ReleaseDC(pDC);
  1401. delete pDisplayMemDC;
  1402. delete pBitmap;
  1403. CDialog::OnNcMouseMove(nHitTest, point);
  1404. }
  1405. /*! @GetSubString
  1406. ********************************************************************************
  1407. <PRE>
  1408. 函数名   : GetSubString
  1409. 功能     : 从字符串中提取出特定的字符内容
  1410. 参数     : [IN]  strStart : 开始字符串
  1411.    [IN]  strEnd : 结束字符串
  1412.    [IN]  strDest : 目标字符串
  1413. 返回值   : 提取出的内容,如果没有匹配的,返回空
  1414. 抛出异常 : -
  1415. --------------------------------------------------------------------------------
  1416. 备注     : -
  1417. 典型用法 : -
  1418. --------------------------------------------------------------------------------
  1419. 作者     : 刘俊
  1420. </PRE>
  1421. *******************************************************************************/
  1422. CString CClientDlg::GetSubString(CString strStart, CString strEnd, CString strDest)
  1423. {
  1424. // 开始,结束位置,长度初始化
  1425. short nStart = 0;
  1426. short nEnd = 0;
  1427. short nLen = 0;
  1428. // 记录长度
  1429. short nStartStringLen = strStart.GetLength();
  1430. short nStrDestLen = strDest.GetLength();
  1431. // 获得开始字符串位置
  1432. nStart = strDest.Find(strStart, 0);
  1433. if ( nStart < 0 || nStrDestLen < nStart) 
  1434. {
  1435. return "";
  1436. }
  1437. // 获得结束字符串位置
  1438. nEnd = strDest.Find(strEnd, nStart);
  1439. if (nEnd < 0 || nStrDestLen < nEnd) 
  1440. {
  1441. return "";
  1442. }
  1443. // 计算要获取的字符串位置
  1444. short nMidStart = nStart + nStartStringLen;
  1445. // 计算长度
  1446. nLen = nEnd - nMidStart;
  1447. // 截取内容
  1448. CString strRes = strDest.Mid(nMidStart, nLen);
  1449.     return strRes;
  1450. }
  1451. /*! @OnNcHitTest
  1452. ********************************************************************************
  1453. <PRE>
  1454. 函数名   : OnNcHitTest
  1455. 功能     : 自画界面鼠标拖动消息
  1456. 参数     : [IN] point : 鼠标位置
  1457. 返回值   : -
  1458. 抛出异常 : -
  1459. --------------------------------------------------------------------------------
  1460. 备注     : -
  1461. 典型用法 : -
  1462. --------------------------------------------------------------------------------
  1463. 作者     : 王小静
  1464. </PRE>
  1465. *******************************************************************************/
  1466. UINT CClientDlg::OnNcHitTest(CPoint point)
  1467. {
  1468.     CRect rc;
  1469. // 取得窗体区域
  1470. GetClientRect(&rc);
  1471. // 重画窗体
  1472.     //////////////////////增加只相应标题栏拖动///////////////////////////////
  1473. rc.left = 0 ;
  1474. rc.top = 0;
  1475. rc.bottom = 30;
  1476. ///////////////////增加结束///////////////////////////////////////////////////////
  1477. ClientToScreen(&rc);
  1478. // 响应拖动
  1479. return rc.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);
  1480. }