ClientDlg.cpp
资源名称:Client.rar [点击查看]
上传用户:szjkjd
上传日期:2022-06-27
资源大小:8968k
文件大小:47k
源码类别:
浏览器
开发平台:
Visual C++
- /*! @ClientDlg.cpp
- ********************************************************************************
- <PRE>
- 模块名 : 主界面对话框
- 文件名 : ClientDlg.cpp
- 相关文件 : ClientDlg.h
- 文件实现功能 : 打开WEB,并在后台检查相关下载并进行下载,启动游戏
- 作者 : 刘俊
- 版本 : 1.0
- --------------------------------------------------------------------------------
- 备注 : -
- --------------------------------------------------------------------------------
- 修改记录 :
- 日 期 版本 修改人 修改内容
- 2010/02/08 1.0 刘俊 创建
- 2010/02/10 1.0 王小静 改进窗体,增加任务栏文字显示,圆角窗体
- 2010/03/01 1.1 王小静 增加任务栏右键菜单,主要操作是注释掉oninitdialog中的去掉菜单
- 2010/03/01 1.1 王小静 修改onNcHitTest函数,只相应鼠标任务栏拖动
- 2010/03/01 1.1 王小静 修改Oncommand,添加任务栏关闭消息
- </PRE>
- ********************************************************************************
- * 版权所有(c) 2010, 17JAGO, 保留所有权利
- *******************************************************************************/
- #include "stdafx.h"
- #include "Client.h"
- #include "ClientDlg.h"
- #include ".clientdlg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- // CClientDlg 对话框
- CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CClientDlg::IDD, pParent)
- {
- // 更改图标
- m_hIcon = AfxGetApp()->LoadIcon(IDI_17JAGO);
- }
- void CClientDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- DDX_Control(pDX, IDC_EXPLORER1, m_explorer);
- }
- BEGIN_MESSAGE_MAP(CClientDlg, CDialog)
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- // add by liujun
- // 自定义消息
- ON_MESSAGE(WM_SHOWTASK, onShowTask)
- ON_WM_TIMER()
- // 重画界面消息
- ON_WM_NCLBUTTONDOWN()
- ON_WM_NCMOUSEMOVE()
- // end add
- //}}AFX_MSG_MAP
- ON_WM_NCHITTEST()
- END_MESSAGE_MAP()
- // CClientDlg 消息处理程序
- BOOL CClientDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
- // TODO: 在此添加额外的初始化代码
- // ADD BY LIUJUN
- ///////////////////////注释掉该部分,目的是任务栏右键菜单/////////////////////
- // wangxiaojing add 去掉关闭按钮
- //DWORD dwStyle = GetWindowLong(m_hWnd, GWL_STYLE);
- //dwStyle &= ~WS_SYSMENU;
- //SetWindowLong(m_hWnd,GWL_STYLE,dwStyle);
- //SendMessage(SC_MAXIMIZE);
- // end add
- // FTPsocket初始化
- this->m_Ftp.SOCKETINIT();
- // 读取配置文件,完成设置
- this->ReadLocalConfig();
- // 如果是网吧用户
- if ("0" == this->m_strUserType)
- {
- // 读取端点服务器上的程序版本号
- this->m_strAppVersion = this->ReadFTPfile((LPSTR)(LPCTSTR)this->m_strServerIP, "Clientconfigversion.cfg", "VERSION");
- //判断是否要升级
- if (g_strAppVersion < this->m_strAppVersion)
- {
- // 启动升级程序
- WinExec(".\JAGOupdate.exe",SW_SHOW);
- // 自退出
- PostQuitMessage(0);
- }
- }
- // 如果处于网吧
- if ("0" == this->m_strUserType)
- {
- // 发送系统信息
- CSysinfo sysInfo;
- char *pchSend;
- // 获取本机系统信息
- sysInfo.SendSysInfo();
- pchSend = sysInfo.c_send;
- // 发送接口
- CSendInfo mysend;
- // 发送到端点服务器
- mysend.SendInfo((LPSTR)(LPCTSTR)this->m_strServerIP, 80,2,pchSend);
- // 读取网吧NetBarId
- this->m_strNetcafeNO = this->ReadFTPfile((LPSTR)(LPCTSTR)this->m_strServerIP, "userinfo.conf", "NetBarID");
- }
- // 托盘结构体初始化
- this->TrayInit();
- // 托盘状态设为没有加载
- this->m_TrayStat = false;
- //打开WEB页面
- this->OpenWEB();
- // 如果普通客户端,非商户 是有盘,非映射方式 在网吧开启的客户端
- if (("0" == this->m_strUser) && ("1" == this->m_strDisk) && ("0" == this->m_strUserType))
- {
- // 打开检查文件下载计时器
- SetTimer(g_uTimercheckfiledown, g_uTimercheckfiledownElapse, NULL);
- }
- ////////////////////////添加任务栏文字显示,窗体圆角//////////////////////////////////////////////////
- //任务栏显示
- SetWindowText("17架构娱乐平台");
- //圆角类
- CRgn rgn;
- //矩形类
- CRect rect;
- //获得矩形区域
- GetClientRect(rect);
- //设计圆角
- rgn.CreateRoundRectRgn(rect.left,rect.top,rect.right,rect.bottom,5,5);
- //显示窗体
- SetWindowRgn((HRGN)rgn,true);
- return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
- }
- // 如果向对话框添加最小化按钮,则需要下面的代码
- // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
- // 这将由框架自动完成。
- void CClientDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // 用于绘制的设备上下文
- SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
- // 使图标在工作矩形中居中
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // 绘制图标
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
- //当用户拖动最小化窗口时系统调用此函数取得光标显示。
- HCURSOR CClientDlg::OnQueryDragIcon()
- {
- return static_cast<HCURSOR>(m_hIcon);
- }
- /*! @TrayInit
- ********************************************************************************
- <PRE>
- 函数名 : TrayInit
- 功能 : 托盘结构体初始化
- 参数 : -
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::TrayInit()
- {
- // 设置结构体信息
- m_Nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
- m_Nid.hWnd = this->m_hWnd;
- m_Nid.uID = IDI_17JAGO;
- m_Nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
- // 设置托盘消息
- m_Nid.uCallbackMessage = WM_SHOWTASK;
- m_Nid.hIcon = this->m_hIcon;
- strcpy(m_Nid.szTip, "17架构科技");
- }
- /*! @AddtoTray
- ********************************************************************************
- <PRE>
- 函数名 : AddtoTray
- 功能 : 添加图标到托盘
- 参数 : -
- 返回值 : 成功返回TRUE,否则返回FALSE
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- BOOL CClientDlg::AddtoTray()
- {
- BOOL bStat;
- // 添加图标到托盘处
- bStat = Shell_NotifyIcon(NIM_ADD, &m_Nid);
- return bStat;
- }
- /*! @RemovefromTray
- ********************************************************************************
- <PRE>
- 函数名 : RemovefromTray
- 功能 : 从托盘删除图标
- 参数 : -
- 返回值 : 成功返回TRUE,否则返回FALSE
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- BOOL CClientDlg::RemovefromTray()
- {
- BOOL bStat;
- // 移除托盘图标
- bStat = Shell_NotifyIcon(NIM_DELETE, &m_Nid);
- return bStat;
- }
- /*! @onShowTask
- ********************************************************************************
- <PRE>
- 函数名 : onShowTask
- 功能 : 响应托盘事件
- 参数 : [IN] wParam : 托盘图标ID
- [IN] lParam : 事件ID
- 返回值 : 非17JAGO图标返回1,17JAGO图标事情返回0
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- LRESULT CClientDlg::onShowTask(WPARAM wParam,LPARAM lParam)
- {
- // 检查是否是本程序的图标事件
- if(wParam != IDI_17JAGO)
- {
- return 1;
- }
- // 事件处理
- switch(lParam)
- {
- // 鼠标左键双击
- case WM_LBUTTONDBLCLK:
- {
- // 显示主界面
- this->ShowWindow(SW_SHOW);
- this->SetFocus();
- break;
- }
- // 鼠标右键点击事件
- case WM_RBUTTONUP:
- {
- // 加载右键菜单
- CMenu menu;
- if (!menu.LoadMenu(IDR_MENUTRAY))
- {
- return 0;
- }
- CMenu *pSubmenu = menu.GetSubMenu(0);
- ASSERT(pSubmenu);
- ::SetMenuDefaultItem(pSubmenu->m_hMenu, 0, true);
- // 获取鼠标位置
- CPoint mouse;
- GetCursorPos(&mouse);
- // 设置快捷菜单
- ::SetForegroundWindow(m_Nid.hWnd);
- ::TrackPopupMenu(pSubmenu->m_hMenu, 0, mouse.x, mouse.y, 0, m_Nid.hWnd, NULL);
- }
- // 鼠标左键点击菜单
- case WM_LBUTTONUP:
- {
- break;
- }
- default:
- break;
- }
- return 0;
- }
- /*! @OnCommand
- ********************************************************************************
- <PRE>
- 函数名 : OnCommand
- 功能 : 托盘菜单响应函数
- 参数 : [IN] wParam : 事件ID
- [IN] lParam : 系统消息
- 返回值 : TRUE
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- BOOL CClientDlg::OnCommand(WPARAM wParam, LPARAM lParam)
- {
- // 取得事件ID
- WORD eventID = LOWORD(wParam);
- switch(eventID)
- {
- case ID_EXIT:
- {
- // 退出事件
- if(this->m_TrayStat)
- {
- // 移除托盘图标
- if(!this->RemovefromTray())
- {
- ::AfxMessageBox("从托盘移除失败");
- }
- }
- // 如果有下载,关闭下载
- this->m_Ftp.Stopdown();
- // 自退出
- PostQuitMessage(0);
- break;
- }
- case ID_SHOWDLG:
- {
- // 显示事件
- this->ShowWindow(SW_SHOW);
- this->SetFocus();
- break;
- }
- //增加任务栏关闭消息
- case WM_DESTROY:
- {
- if (!this->m_TrayStat)
- {
- // 程序关闭到托盘
- if (!this->AddtoTray())
- {
- ::AfxMessageBox("迁移到托盘失败");
- }
- else
- {
- this->m_TrayStat = true;
- }
- }
- ShowWindow(SW_HIDE);
- }
- default:
- break;
- }
- return true;
- }
- /*! @OpenWEB
- ********************************************************************************
- <PRE>
- 函数名 : OpenWEB
- 功能 : 显示WEB页面
- 参数 : -
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::OpenWEB()
- {
- COleVariant vHeaders;
- VARIANT varHeaders;
- // NETBARID为空时
- if ("" == this->m_strNetcafeNO.Trim())
- {
- // 如果是普通终端
- if ("0" == this->m_strUser)
- {
- // 打开用户主页
- this->m_explorer.Navigate(this->m_strURL, NULL, NULL, NULL, NULL);
- }
- // 如果是商户终端
- else if ("1" == this->m_strUser)
- {
- // 打开商户主页
- this->m_explorer.Navigate(this->m_strMasterURL, NULL, NULL, NULL, NULL);
- }
- }
- // 网吧有NETBARID时
- else
- {
- // 设置HTTP头,写入NetBarid信息
- CString strHttphead = "NetBarID:";
- strHttphead.Append(this->m_strNetcafeNO);
- vHeaders = strHttphead;
- varHeaders = vHeaders;
- // 如果是普通终端
- if ("0" == this->m_strUser)
- {
- // 打开用户主页
- this->m_explorer.Navigate(this->m_strURL, NULL, NULL, NULL, &varHeaders);
- }
- // 如果是商户终端
- else if ("1" == this->m_strUser)
- {
- // 打开商户主页
- this->m_explorer.Navigate(this->m_strMasterURL, NULL, NULL, NULL, &varHeaders);
- }
- // 释放资源
- ::VariantClear(&vHeaders);
- ::VariantClear(&varHeaders);
- }
- }
- BEGIN_EVENTSINK_MAP(CClientDlg, CDialog)
- ON_EVENT(CClientDlg, IDC_EXPLORER1, 259, DocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)
- ON_EVENT(CClientDlg, IDC_EXPLORER1, 250, BeforeNavigate2Explorer1, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
- END_EVENTSINK_MAP()
- /*! @DocumentCompleteExplorer1
- ********************************************************************************
- <PRE>
- 函数名 : DocumentCompleteExplorer1
- 功能 : 网页打开完成事件,用于读取HTTP SERVER返回HTTP头信息
- 参数 : [IN] pDisp : COM指针
- [IN] URL : 网页URL
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
- {
- // 获取HTTP头信息
- IHTMLDocument2 *pHTMLDocument = NULL;
- BSTR bstr;
- // 开始位置
- short nStartpos = 0;
- // 结束位置
- short nEndpos = 0;
- // 字符串长度
- short nLen = 0;
- // 取得WEB内容
- if (!(pHTMLDocument = (IHTMLDocument2*)this->m_explorer.get_Document()))
- {
- return;
- }
- // 读取COOKIE
- pHTMLDocument->get_cookie(&bstr);
- CString strCookie(bstr);
- // COOKIE样式: JSESSIONID=1xr23sfmyfbig; jago_account_login_name=user001; jago_account_login_pwd=4297f44b13955235245b2497399d7a93
- // strcookie末尾填";"
- CString strEnd = strCookie.Right(1);
- if (strEnd != ";")
- {
- strCookie.Append(";");
- }
- // 计算网吧标识位置
- nStartpos = 0;
- nEndpos = 0;
- nLen = 0;
- nStartpos = strCookie.Find("NetBarId=", 0);
- if (1 < nStartpos)
- {
- nEndpos = strCookie.Find(";", nStartpos);
- nLen = nEndpos - nStartpos - 8 - 1;
- // 取得网吧标识
- CString strNetbarid = strCookie.Mid(nStartpos + 9, nLen);
- if (strNetbarid != this->m_strNetcafeNO)
- {
- CString strSend = "NetBarID=";
- strSend.Append(strNetbarid);
- strSend.Append(";");
- CSendInfo mysend;
- // 发送网吧标识
- mysend.SendInfo((LPSTR)(LPCTSTR)this->m_strServerIP, 80, 1,(LPSTR)(LPCTSTR)strSend);
- // 重新赋值
- this->m_strNetcafeNO = strNetbarid;
- }
- }
- // 释放资源
- ::SysFreeString(bstr);
- }
- /*! @BeforeNavigate2Explorer1
- ********************************************************************************
- <PRE>
- 函数名 : BeforeNavigate2Explorer1
- 功能 : 截取用户点击的URL链接,用于判断是否用于启动游戏
- 参数 : [IN] URL : 网页URL
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
- {
- // 取得用户点击的URL
- CString strURL(URL->bstrVal);
- //测试用URL strURL = "game://relativePath=/games/暇月战歌®Path= SOFTWARE@@@Object Software (Beijing) Co., Ltd.@@@XYZG&exeFile=play.exe&exeParams=zzz&downloadUrl=http://xyzg.17jago.com&fileName=风云暇月战歌v701.exe";
- // 判断是否是启动游戏链接
- if (strURL.Mid(0, 7) == "game://")
- {
- // 去掉最后的“/”
- if ("/" == strURL.Right(1))
- {
- strURL = strURL.Left(strURL.GetLength() - 1);
- }
- // 读取游戏信息
- this->GetGameInfo(strURL);
- }
- }
- /*! @GetGameInfo
- ********************************************************************************
- <PRE>
- 函数名 : GetGameInfo
- 功能 : 通过链接分析取得游戏信息
- 参数 : [IN] strUrl : 网页的URL
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::GetGameInfo(CString strUrl)
- {
- // game://gameId=1001®Path= HKEY_LOCAL_MACHINESOFTWAREObject Software (Beijing) Co., Ltd.XYZG&exeFile=play.exe&downloadUrl=http://xyzg.17jago.com
- /*
- * 链接后内容为:name=value键值对形式,通过&连接。
- 链接提交参数包括:
- 游戏相对客户端目录名称:relativePath;
- 游戏安装目录的注册表路径:regPath;
- 游戏启动可执行文件相对路径名称:exeFile;
- 游戏启动参数:exeParams;
- 游戏下载URL:downloadUrl;
- 游戏在分发系统中的文件名称:fileName
- 链接格式如下,其中红色部分根据不同游戏有所不同:
- game://relativePath=/games/xyzg®Path= HKEY_LOCAL_MACHINE@@@SOFTWARE@@@Object Software (Beijing) Co., Ltd.@@@XYZG
- &exeFile=play.exe&exeParams=zzz&downloadUrl=http://xyzg.17jago.com&fileName=风云暇月战歌v701.exe */
- // 网吧环境下游戏路径
- CString strRelativePath;
- // 家庭环境下游戏路径
- CString strHomeGamePath;
- // 注册表储存路径的键值
- CString strRegKey;
- // 游戏进程名
- CString strExeName;
- // 游戏进程启动参数
- CString strGameParam;
- // 游戏网站地址
- CString strGameUrl;
- // 端点服务器上的游戏名
- CString strServerGameName;
- char chCurPath[1024] = {0};
- // 添加分隔符,方便处理
- strUrl.Append("&");
- // 取得 网吧环境下游戏路径
- strRelativePath = this->GetSubString("relativePath=", "&", strUrl);
- // 取得 注册表储存路径的键值
- strRegKey = this->GetSubString("regPath=", "&", strUrl);
- // 取得 游戏进程名
- strExeName = this->GetSubString("exeFile=", "&", strUrl);
- // 取得 游戏进程启动参数
- strGameParam = this->GetSubString("exeParams=", "&", strUrl);
- // 取得 游戏网站地址
- strGameUrl = this->GetSubString("downloadUrl=", "&", strUrl);
- // 取得 端点服务器上的游戏名
- strServerGameName = this->GetSubString("fileName=", "&", strUrl);
- // 获取程序当前目录
- GetCurrentDirectory(1024,chCurPath);
- CString strCurPath = CString(chCurPath);
- // 组合游戏路径
- strCurPath.Append(strRelativePath);
- strCurPath.Append("\");
- strCurPath.Append(strExeName);
- strCurPath.Replace("/", "\");
- CFileFind fileFind;
- // 检查平台客户端下,游戏文件是否存在
- if (fileFind.FindFile(strCurPath))
- {
- // 运行GAME目录下的对应游戏
- this->RunGame(strCurPath, strGameParam);
- return;
- }
- // 检查注册表里是否有记录
- HKEY hKey;
- strRegKey.Trim();
- strRegKey.Replace("@@@", "\");
- LONG lRe = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPSTR)(LPCTSTR)strRegKey, 0 , KEY_READ, &hKey);
- if (lRe == ERROR_SUCCESS)
- {
- LPBYTE pPath = new BYTE[502];
- ZeroMemory(pPath, 502);
- DWORD type_2 = REG_SZ;
- char chKey[] = "Path";
- DWORD cbData_2 = 512;
- // 读取注册表内的信息
- lRe = RegQueryValueEx(hKey, chKey, NULL, &type_2, pPath, &cbData_2);
- if (lRe == ERROR_SUCCESS)
- {
- CString strRegPath = CString(pPath);
- strRegPath.Append(strExeName);
- // 运行注册表里取到到地址
- this->RunGame(strRegPath, strGameParam);
- delete [] pPath;
- ::RegCloseKey(hKey);
- return;
- }
- // 释放内存
- delete [] pPath;
- }
- // 读取端点服务器服务器端内的游戏
- // TODO
- // 没有找到,启动IE到指定网页
- CString strMsg = "没有找到该游戏,请确认游戏是否处于 ";
- strMsg.Append(strCurPath);
- strMsg.Append(" ,或者到重新官网下载!");
- AfxMessageBox(strMsg);
- // 打开游戏主页
- ShellExecute(GetSafeHwnd(), NULL, strGameUrl, NULL, NULL, SW_SHOWNORMAL);
- }
- /*! @RunGame
- ********************************************************************************
- <PRE>
- 函数名 : RunGame
- 功能 : 启动游戏,并传入参数
- 参数 : [IN] strPath : 游戏启动程序的绝对路径
- [IN] strParam : 要传给启动程序的参数
- 返回值 : 启动成功返回TRUE,否则返回FALSE
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- bool CClientDlg::RunGame(const CString strPath, const CString strParam)
- {
- // WINDOWS 启动API 参数
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- int iRes= -1;
- ZeroMemory( &si, sizeof(si) );
- si.cb = sizeof(si);
- //启动游戏
- iRes = CreateProcess(strPath, (LPSTR)(LPCTSTR)strParam, NULL, NULL, TRUE, CREATE_NEW_CONSOLE|HIGH_PRIORITY_CLASS, NULL, NULL, &si, &pi);
- if(iRes)
- {
- return true;
- }
- else
- {
- int nErrCode =GetLastError();
- char szInfo[255];
- sprintf(szInfo,"启动游戏失败: %d",nErrCode);
- AfxMessageBox(szInfo);
- return false;
- }
- }
- /*! @ReadLocalConfig
- ********************************************************************************
- <PRE>
- 函数名 : ReadLocalConfig
- 功能 : 读取本地配置文件,完成设置配置工作
- 参数 : -
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::ReadLocalConfig()
- {
- // 记录程序路径
- char chLocalPath[1024] = {0};
- // 记录配置文件键值内容
- char chINIContent[1024] = {0};
- // 取得当前目录路径
- GetCurrentDirectory(1024, chLocalPath);
- // 取得CONFIG文件路径
- strcat(chLocalPath, "\config.ini");
- CString strContent;
- // 读取当前CONFG文件的版本号
- GetPrivateProfileString("Version", "ConfigVersion","", chINIContent, 1024,chLocalPath);
- this->m_strLocalConfigVersion = CString(chINIContent);
- this->m_strLocalConfigVersion.Trim();
- // 读取端点服务器IP地址
- ZeroMemory(chINIContent, 1024);
- GetPrivateProfileString("ApplicationSet", "ServerIP","", chINIContent, 1024,chLocalPath);
- this->m_strServerIP = CString(chINIContent);
- this->m_strServerIP.Trim();
- // 读取默认主页地址
- ZeroMemory(chINIContent, 1024);
- GetPrivateProfileString("ApplicationSet", "MainWEB","", chINIContent, 1024,chLocalPath);
- this->m_strURL = CString(chINIContent);
- this->m_strURL.Trim();
- // 读取商户默认主页地址
- ZeroMemory(chINIContent, 1024);
- GetPrivateProfileString("ApplicationSet", "MasterMainWEB","", chINIContent, 1024,chLocalPath);
- this->m_strMasterURL = CString(chINIContent);
- this->m_strMasterURL.Trim();
- // 读取用户类型
- ZeroMemory(chINIContent, 1024);
- GetPrivateProfileString("ApplicationSet", "Master","", chINIContent, 1024,chLocalPath);
- this->m_strUser = CString(chINIContent);
- this->m_strUser.Trim();
- // 读取用户环境
- ZeroMemory(chINIContent, 1024);
- GetPrivateProfileString("ApplicationSet", "UserType","", chINIContent, 1024,chLocalPath);
- this->m_strUserType = CString(chINIContent);
- this->m_strUserType.Trim();
- // 读取网吧硬盘环境
- ZeroMemory(chINIContent, 1024);
- GetPrivateProfileString("ApplicationSet", "HaveDisk","", chINIContent, 1024,chLocalPath);
- this->m_strDisk = CString(chINIContent);
- this->m_strDisk.Trim();
- }
- /*! @ReadFTPfile
- ********************************************************************************
- <PRE>
- 函数名 : ReadFTPfile
- 功能 : 读取某FTP文件内容,,第一个参数为FTP的IP地址,第二个参数为文件名,第三个为键值
- 参数 : [IN] pIP : FTP的IP地址
- [IN] pFilename : 文件名
- [IN] pKey : 键值
- 返回值 : 读取出的内容
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : 文件统一采用“;”(分号)结束
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- CString CClientDlg::ReadFTPfile(char *pIP, char *pFilename, char *pKey)
- {
- // 参数检查
- if (pIP == NULL || pFilename == NULL || pKey == NULL)
- {
- return "";
- }
- CInternetSession * pNetSession = NULL;
- CFtpConnection * pFtpCnt = NULL;
- CInternetFile* pCINTFile = NULL;
- CString strTemp;
- char *pch = NULL;
- // 设定打开参数及超时
- pNetSession = new CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
- pNetSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,3000);
- pNetSession->SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,2000);
- pNetSession->SetOption(INTERNET_OPTION_SEND_TIMEOUT,2000);
- try
- {
- pFtpCnt = pNetSession->GetFtpConnection(pIP, NULL, NULL, 21);
- pCINTFile = pFtpCnt->OpenFile(pFilename, GENERIC_READ,FTP_TRANSFER_TYPE_BINARY,1);
- // 取得文件长度
- short nSize = pCINTFile->GetLength();
- pch = new char[nSize];
- ZeroMemory(pch, nSize);
- // 取得文件内容
- pCINTFile->Read(pch, nSize);
- }
- catch (CInternetException *e)
- {
- // 异常,释放资源,关闭连接
- delete [] pch;
- if (pCINTFile)
- {
- pCINTFile->Close();
- }
- if (pFtpCnt)
- {
- pFtpCnt->Close();
- }
- if (pNetSession)
- {
- pNetSession->Close();
- }
- return "";
- }
- strTemp = CString(pch);
- CString strKey = CString(pKey);
- // 加“=”号
- strKey.Append("=");
- short nStart = strTemp.Find(strKey, 0);
- if (nStart < 0)
- {
- return "";
- }
- // 文件统一采用“;”(分号)结束
- short nEnd = strTemp.Find(";", nStart);
- CString strResult;
- // 取得键值
- if ((0 <= nStart) && (nStart < nEnd))
- {
- short nS = nStart + strKey.GetLength();
- short nCount = nEnd - nS;
- strResult = strTemp.Mid(nS, nCount);
- }
- //释放资源
- delete [] pch;
- pCINTFile->Close();
- pFtpCnt->Close();
- pNetSession->Close();
- return strResult;
- }
- /*! @OnTimer
- ********************************************************************************
- <PRE>
- 函数名 : OnTimer
- 功能 : TIMER计时器响应方法
- 参数 : [IN] nIDEvent : 计时器编号
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::OnTimer(UINT nIDEvent)
- {
- // 储存程序路径
- char chLocalPath[1024] = {0};
- // 端点服务器上的filelist.xml下载到本地后的路径及文件名
- char chFilelistdown[1024] = {0};
- // XML操作类
- CMangeXml ServerXML;
- CMangeXml LocalXML;
- TXML *txml = NULL;
- // 服务器端filelist.XML文件下载个数
- int iFiledowncountServer = 0;
- // 本地filelist.XML文件下载个数
- int iFiledowncountLocal = 0;
- // 服务器端下载列表节点结构
- CFileDownInfo FileinfoServer;
- // 本地下载列表节点结构
- CFileDownInfo FileinfoLocal;
- // 记录是否有下载列表是否有重名
- bool bSamename = false;
- ZeroMemory(&FileinfoServer, sizeof(FileinfoServer));
- ZeroMemory(&FileinfoLocal, sizeof(FileinfoLocal));
- // 取得当前目录路径
- GetCurrentDirectory(1024, chLocalPath);
- strcpy(chFilelistdown, chLocalPath);
- // 设定从端点服务器下载后的filelist.xml文件名和路径
- strcat(chFilelistdown, "\filelist_server.xml");
- // 设定本地filelist.xml文件路径
- strcat(chLocalPath, "\filelist.xml");
- if(nIDEvent==(UINT)g_uTimercheckfiledown)
- {
- // 先暂停该计时器
- KillTimer(g_uTimercheckfiledown);
- // 下载端点服务器上的文件更新列表filelist.xml
- try
- {
- this->m_Ftp.SetFTPinfo(this->m_strServerIP, 21, NULL, NULL);
- if(!this->m_Ftp.ConectFTPCOMMAND())
- {
- return;
- }
- this->m_Ftp.SendUsername();
- this->m_Ftp.SendPWD();
- this->m_Ftp.Startdown("filelist.xml", chFilelistdown, true);
- }
- catch (CException *e)
- {
- this->m_Ftp.CloseCommandConect();
- // 重新打开该计时器
- SetTimer(g_uTimercheckfiledown, g_uTimercheckfiledownElapse, NULL);
- return;
- }
- this->m_Ftp.CloseCommandConect();
- // 打开下载的XML,获得文件个数
- iFiledowncountServer = ServerXML.SumXmlNodes(chFilelistdown, "/filelist/file");
- // 打开本地存在的XML,获得文件个数
- iFiledowncountLocal = ServerXML.SumXmlNodes(chLocalPath, "/filelist/file");
- // 存在文件更新
- if (0 < iFiledowncountServer)
- {
- // 遍历服务器端的filelist.xml
- for(int i = 0; i < iFiledowncountServer; i++)
- {
- // 重置状态
- bSamename = false;
- ZeroMemory(&FileinfoServer, sizeof(FileinfoServer));
- // 取得下载文件信息
- txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/file_name", i);
- strcpy(FileinfoServer.chFilename, ServerXML.p_con);
- ServerXML.CloseXml(txml);
- txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/server_file_path", i);
- strcpy(FileinfoServer.chFileserverpath, ServerXML.p_con);
- ServerXML.CloseXml(txml);
- txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/win_local_file_path", i);
- strcpy(FileinfoServer.chDownlocalpath, ServerXML.p_con);
- ServerXML.CloseXml(txml);
- txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/file_setup", i);
- strcpy(&FileinfoServer.cSetup, ServerXML.p_con);
- ServerXML.CloseXml(txml);
- txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/file_type", i);
- strcpy(FileinfoServer.chFiletype, ServerXML.p_con);
- ServerXML.CloseXml(txml);
- txml = ServerXML.ReadXml(chFilelistdown, "/filelist/file/update_date", i);
- strcpy(FileinfoServer.chLastupdate, ServerXML.p_con);
- ServerXML.CloseXml(txml);
- // 遍历本地的filelist.xml
- if (0 < iFiledowncountLocal)
- {
- for(int j = 0; j < iFiledowncountLocal; j++)
- {
- ZeroMemory(&FileinfoLocal, sizeof(FileinfoLocal));
- // 取得本地列表文件信息
- txml = LocalXML.ReadXml(chLocalPath, "/filelist/file/file_name", j);
- strcpy(FileinfoLocal.chFilename, LocalXML.p_con);
- LocalXML.CloseXml(txml);
- txml = LocalXML.ReadXml(chLocalPath, "/filelist/file/update_date", j);
- strcpy(FileinfoLocal.chLastupdate, LocalXML.p_con);
- LocalXML.CloseXml(txml);
- // 进行比较,文件名相同
- if (0 == strcmp(FileinfoServer.chFilename, FileinfoLocal.chFilename))
- {
- // 记录文件本地列表存在
- bSamename = true;
- // 本地更新日期比服务器上的更新日期小,则进行更新工作
- if (0 < strcmp(FileinfoServer.chLastupdate, FileinfoLocal.chLastupdate))
- {
- // 下载文件
- this->Downfile(&FileinfoServer);
- break;
- }
- }
- // 如果遍历到最后,且没有文件重名,则需要下载
- if ((j == (iFiledowncountLocal -1)) && (false == bSamename))
- {
- // 下载文件
- this->Downfile(&FileinfoServer);
- }
- }
- }
- // 如果本地列表问空,则全部都要下载
- else
- {
- // 下载文件
- this->Downfile(&FileinfoServer);
- }
- }
- }
- // 重新打开该计时器
- SetTimer(g_uTimercheckfiledown, g_uTimercheckfiledownElapse, NULL);
- }
- CDialog::OnTimer(nIDEvent);
- }
- /*! @Downfile
- ********************************************************************************
- <PRE>
- 函数名 : Downfile
- 功能 : 下载文件
- 参数 : [IN] pfiledowninfo : 文件下载结构体
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::Downfile(const CFileDownInfo *pfiledowninfo)
- {
- // 下载时的FTP文件名,包含路径
- char chFtpfilename[1024] = {0};
- // 下载到本地的文件名,包含路径
- char chLocalfilename[1024] = {0};
- // 初始化
- ZeroMemory(chFtpfilename, 1024);
- ZeroMemory(chLocalfilename, 1024);
- // 组合FTP端的路径
- strcat(chFtpfilename, pfiledowninfo->chFileserverpath);
- strcat(chFtpfilename, "/");
- strcat(chFtpfilename, pfiledowninfo->chFilename);
- // 组合本地下载文件路径
- strcat(chLocalfilename, pfiledowninfo->chDownlocalpath);
- strcat(chLocalfilename, pfiledowninfo->chFilename);
- // 开始下载
- try
- {
- this->m_Ftp.SetFTPinfo(this->m_strServerIP, 21, NULL, NULL);
- if(!this->m_Ftp.ConectFTPCOMMAND())
- {
- return;
- }
- this->m_Ftp.SendUsername();
- this->m_Ftp.SendPWD();
- this->m_Ftp.Startdown(chFtpfilename, chLocalfilename, false);
- // 检查是否运行程序
- if ('1' == pfiledowninfo->cSetup)
- {
- CString strExe = CString(chLocalfilename);
- strExe = strExe.Right(3);
- // 如果是EXE文件,则启动该文件
- if ("exe" == strExe || "EXE" == strExe)
- {
- // 启动该程序
- WinExec(chLocalfilename, SW_SHOW);
- }
- }
- }
- catch (CException *e)
- {
- this->m_Ftp.CloseCommandConect();
- // 重新打开该计时器
- SetTimer(g_uTimercheckfiledown, g_uTimercheckfiledownElapse, NULL);
- return;
- }
- this->m_Ftp.CloseCommandConect();
- // 写入本地的filelist.xml文件记录
- this->WriteToLocalXML(pfiledowninfo);
- }
- /*! @Downfile
- ********************************************************************************
- <PRE>
- 函数名 : Downfile
- 功能 : 写入本地的filelist.xml文件记录
- 参数 : [IN] pfiledowninfo : 文件下载结构体
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- void CClientDlg::WriteToLocalXML(const CFileDownInfo *pfiledowninfo)
- {
- // 记录程序路径
- char chLocalPath[1024] = {0};
- // 记录文件名
- char chName[500] = {0};
- // XML操作类
- CMangeXml LocalXML;
- // 记录XML该文件的总数
- short nCount = 0;
- // 记录当前序号
- short nIndex = 0;
- // 取得当前目录路径
- GetCurrentDirectory(1024, chLocalPath);
- // 设定本地filelist.xml文件路径
- strcat(chLocalPath, "\filelist.xml");
- //取得总数
- nCount = LocalXML.SumXmlNodes(chLocalPath, "/filelist/file");
- // 记录当前遍历到哪一个记录
- int iCur = 0;
- // 记录是否存在同名
- bool bSameName = false;
- TXML *txml = NULL;
- // 遍历本地记录,看是否存在
- for(iCur = 0; iCur < nCount; iCur++)
- {
- // 重置文件名
- ZeroMemory(chName, 500);
- txml = LocalXML.ReadXml(chLocalPath, "/filelist/file/file_name", iCur);
- // 获得文件名
- strcpy(chName, LocalXML.p_con);
- LocalXML.CloseXml(txml);
- // 比较文件名
- if (0 == strcmp(chName, pfiledowninfo->chFilename))
- {
- bSameName = true;
- // 删除该原来的节点
- iCur++;
- LocalXML.DeleteXml(chLocalPath, "/filelist/file", iCur);
- break;
- }
- }
- // 增加 XML记录
- if (bSameName)
- {
- // 如果该文件节点已存在
- nIndex = nCount;
- }
- else
- {
- // 新增一个文件节点
- nIndex = nCount + 1;
- }
- // setup节点内容处理
- char chSetup[20] = {0};
- strcpy(chSetup, &pfiledowninfo->cSetup);
- chSetup[1] = ' ';
- // 增加一个节点内容操作
- LocalXML.AddXml(chLocalPath, "/filelist", 1, "file", NULL);
- LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_name", pfiledowninfo->chFilename);
- LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "server_file_path", pfiledowninfo->chFileserverpath);
- LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "win_local_file_path", pfiledowninfo->chDownlocalpath);
- LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_setup", chSetup);
- LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_type", pfiledowninfo->chFiletype);
- LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "update_date", pfiledowninfo->chLastupdate);
- //////////////////////////// 保留 /////////////////////////////
- //if (bSameName)
- //{
- // iCur++;
- // // 修改XML记录
- // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "server_file_path", pfiledowninfo->chFileserverpath);
- // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "win_local_file_path", pfiledowninfo->chDownlocalpath);
- // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "file_setup", &pfiledowninfo->cSetup);
- // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "file_type", pfiledowninfo->chFiletype);
- // LocalXML.Changexml(chLocalPath, "/filelist/file", iCur, "update_date", pfiledowninfo->chLastupdate);
- //}
- //else
- //{
- // // 增加 XML记录
- // nIndex = nCount + 1;
- // LocalXML.AddXml(chLocalPath, "/filelist", 1, "file", NULL);
- // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_name", pfiledowninfo->chFilename);
- // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "server_file_path", pfiledowninfo->chFileserverpath);
- // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "win_local_file_path", pfiledowninfo->chDownlocalpath);
- // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_setup", &pfiledowninfo->cSetup);
- // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "file_type", pfiledowninfo->chFiletype);
- // LocalXML.AddXml(chLocalPath, "/filelist/file", nIndex, "update_date", pfiledowninfo->chLastupdate);
- //}
- }
- /*! @DrawTitleBar
- ********************************************************************************
- <PRE>
- 函数名 : DrawTitleBar
- 功能 : 重画标题栏,实现只有关闭和最小化
- 参数 : [IN] pDC :系统化刷
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE>
- *******************************************************************************/
- void CClientDlg::DrawTitleBar(CDC * pDC)
- {
- if (m_hWnd)
- {
- CBrush Brush(RGB(168,222,255));//画刷 绘制标题的颜色,现在颜色是蓝色
- CBrush* pOldBrush = pDC->SelectObject(&Brush); //选择作图对象
- CRect rtWnd, rtTitle, rtButtons;//创建矩形窗体
- GetWindowRect(&rtWnd); //获得窗体的大小
- //SM_CXFRAME 窗口边框的边缘宽度
- //SM_CYFRAME 窗口边框的边缘高度
- //SM_CXSIZE 窗口标题栏宽度
- //SM_CYSIZE 窗口标题栏高度
- //取得标题栏的位置
- rtTitle.left = GetSystemMetrics(SM_CXFRAME);//获得屏幕的宽度
- rtTitle.top = GetSystemMetrics(SM_CYFRAME);//获得屏幕的高度
- rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
- rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
- //准备画XP风格按钮
- CBitmap* pBitmap = new CBitmap;
- CBitmap* pOldBitmap;
- CDC* pDisplayMemDC=new CDC;
- pDisplayMemDC->CreateCompatibleDC(pDC);
- //重画标题栏,标题栏改换成图标
- pBitmap->LoadBitmap(IDB_BITMAP);
- pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
- pDC->BitBlt(0, 0, rtTitle.right+rtTitle.left, rtTitle.bottom+rtTitle.top, pDisplayMemDC, 0, 0, SRCCOPY); //设置标题栏的显示位置
- //pDC->BitBlt(rtTitle.left, rtTitle.top, rtTitle.Width(), rtTitle.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
- pDisplayMemDC->SelectObject(pOldBitmap);
- m_rtButtMin = rtTitle;
- m_rtButtMin.OffsetRect(rtWnd.TopLeft());
- pBitmap->DeleteObject();
- //重画图标
- ::DrawIconEx(pDC->m_hDC, rtTitle.left, 0, m_hIcon,
- rtTitle.bottom, rtTitle.bottom, 1, NULL, DI_NORMAL);
- m_rtIcon.OffsetRect(rtWnd.TopLeft()); //将图标移到窗体的左上角
- CPoint point;
- point.x =GetSystemMetrics(SM_CXFRAME);
- point.y = rtWnd.Height();
- pDC->PatBlt(0,0,point.x-1,point.y,PATCOPY);
- //填充底部框架
- point.x = rtWnd.Width();
- point.y = GetSystemMetrics(SM_CYFRAME) + 1;
- pDC->PatBlt(0, rtWnd.Height()-point.y+1, point.x, point.y, PATCOPY);
- //填充右侧框架
- point.x = GetSystemMetrics(SM_CXFRAME) + 1;
- point.y = rtWnd.Height();
- pDC->PatBlt(rtWnd.Width()-point.x+1, 0, point.x, point.y, PATCOPY);
- //重画关闭button
- rtButtons.left = rtTitle.right-45;
- rtButtons.top = rtTitle.top;
- rtButtons.right = rtButtons.left + 30;
- rtButtons.bottom = rtButtons.top + 19;
- pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
- pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
- pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
- pDisplayMemDC->SelectObject(pOldBitmap);
- m_rtButtExit = rtButtons;
- m_rtButtExit.OffsetRect(rtWnd.TopLeft());
- pBitmap->DeleteObject();
- //重画最小化button
- rtButtons.right = rtButtons.left;
- rtButtons.left = rtButtons.right - 21;
- rtButtons.right = rtButtons.left + 21;
- rtButtons.bottom = rtButtons.top + 19;
- pBitmap->LoadBitmap(IDB_MIN_NORMAL);
- pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
- pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
- pDisplayMemDC->SelectObject(pOldBitmap);
- m_rtButtMin = rtButtons;
- m_rtButtMin.OffsetRect(rtWnd.TopLeft());
- pBitmap->DeleteObject();
- //重新显示标题栏的题目
- int nOldMode = pDC->SetBkMode(TRANSPARENT);//设置字体背景颜色,TRANSPARENT将背景颜色设置为透明
- COLORREF clOldText=pDC->SetTextColor(RGB(35,35,35 ));//设置字体的颜色
- pDC->SelectStockObject(SYSTEM_FIXED_FONT);
- // 标题字体设置
- CFont font;
- 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,"宋体");
- CFont* pOldFont = pDC->SelectObject(&font);
- rtTitle.left +=40;
- rtTitle.top += 1;
- rtTitle.bottom =rtTitle.bottom-1;
- CString m_strTitle;
- m_strTitle.Format("17架构娱乐平台");
- // 显示标题文字
- pDC->DrawText(m_strTitle, &rtTitle, DT_LEFT);
- pDC->SetBkMode(nOldMode);//恢复颜色
- pDC->SetTextColor(clOldText);
- font.DeleteObject();
- ReleaseDC(pDisplayMemDC);
- delete pDisplayMemDC;
- delete pBitmap;
- }
- }
- /*! @DefWindowProc
- ********************************************************************************
- <PRE>
- 函数名 : DefWindowProc
- 功能 : 添加窗体处理消息,提供函数的缺省处理
- 参数 : -
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : 重载系统DefWindowProc方法实现
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE>
- *******************************************************************************/
- LRESULT CClientDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- LRESULT lrst = CDialog::DefWindowProc(message, wParam, lParam);
- if (!::IsWindow(m_hWnd))
- return lrst;
- if (message == WM_MOVE || message == WM_PAINT || message == WM_NCPAINT || message == WM_NCACTIVATE || message == WM_NOTIFY)
- {
- CDC* pWinDC = GetWindowDC();
- if (pWinDC)
- // 重画标题栏
- DrawTitleBar(pWinDC);
- // 释放DC
- ReleaseDC(pWinDC);
- }
- return lrst;
- }
- /*! @OnNcLButtonDown
- ********************************************************************************
- <PRE>
- 函数名 : OnNcLButtonDown
- 功能 : 鼠标相应标题栏事件
- 参数 : [IN] point : 鼠标位置
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE>
- *******************************************************************************/
- afx_msg void CClientDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
- {
- // 关闭消息
- if (m_rtButtExit.PtInRect(point))
- {
- if (!this->m_TrayStat)
- {
- // 程序关闭到托盘
- if (!this->AddtoTray())
- {
- ::AfxMessageBox("迁移到托盘失败");
- }
- else
- {
- this->m_TrayStat = true;
- }
- }
- ShowWindow(SW_HIDE);
- }
- // 最小化消息
- else if (m_rtButtMin.PtInRect(point))
- // 最小化到任务栏
- SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));
- // TODO 最小化到任务栏后,没有显示文字,
- else if (!IsZoomed())
- Default();
- CDialog::OnNcLButtonDown(nHitTest, point);
- }
- /*! @OnNcMouseMove
- ********************************************************************************
- <PRE>
- 函数名 : OnNcMouseMove
- 功能 : 鼠标移动到最小化,关闭的响应事件
- 参数 : [IN] point : 鼠标位置
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE>
- *******************************************************************************/
- void CClientDlg::OnNcMouseMove(UINT nHitTest , CPoint point)
- {
- // 设置DC
- CDC* pDC = GetWindowDC();
- CDC* pDisplayMemDC=new CDC;
- pDisplayMemDC->CreateCompatibleDC(pDC);
- // 定义为图
- CBitmap* pBitmap = new CBitmap;
- CBitmap* pOldBitmap;
- // 定义RECT
- CRect rtWnd, rtButton;
- // 如果窗体存在
- if (pDC)
- {
- // 取得窗体的矩形区域
- GetWindowRect(&rtWnd);
- //关闭button
- if (m_rtButtExit.PtInRect(point))
- // 更改关闭图片
- pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
- else
- // 更改关闭图片
- pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
- // 获得关闭按键的区域
- rtButton = m_rtButtExit;
- rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
- // 取得图片
- pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
- // 设置图片显示区域
- pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
- // 显示图片
- pDisplayMemDC->SelectObject(pOldBitmap);
- // 释放图片
- pBitmap->DeleteObject();
- //最小化button
- if (m_rtButtMin.PtInRect(point))
- // 更改最小化位图
- pBitmap->LoadBitmap(IDB_MIN_FOCUS);
- else
- // 更改最小化位图
- pBitmap->LoadBitmap(IDB_MIN_NORMAL);
- // 获得最小化按键的区域
- rtButton = m_rtButtMin;
- rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
- // 取得图片
- pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
- // 设置图片显示区域
- pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
- // 显示图片
- pDisplayMemDC->SelectObject(pOldBitmap);
- // 释放图片
- pBitmap->DeleteObject();
- }
- // 释放资源
- ReleaseDC(pDisplayMemDC);
- ReleaseDC(pDC);
- delete pDisplayMemDC;
- delete pBitmap;
- CDialog::OnNcMouseMove(nHitTest, point);
- }
- /*! @GetSubString
- ********************************************************************************
- <PRE>
- 函数名 : GetSubString
- 功能 : 从字符串中提取出特定的字符内容
- 参数 : [IN] strStart : 开始字符串
- [IN] strEnd : 结束字符串
- [IN] strDest : 目标字符串
- 返回值 : 提取出的内容,如果没有匹配的,返回空
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 刘俊
- </PRE>
- *******************************************************************************/
- CString CClientDlg::GetSubString(CString strStart, CString strEnd, CString strDest)
- {
- // 开始,结束位置,长度初始化
- short nStart = 0;
- short nEnd = 0;
- short nLen = 0;
- // 记录长度
- short nStartStringLen = strStart.GetLength();
- short nStrDestLen = strDest.GetLength();
- // 获得开始字符串位置
- nStart = strDest.Find(strStart, 0);
- if ( nStart < 0 || nStrDestLen < nStart)
- {
- return "";
- }
- // 获得结束字符串位置
- nEnd = strDest.Find(strEnd, nStart);
- if (nEnd < 0 || nStrDestLen < nEnd)
- {
- return "";
- }
- // 计算要获取的字符串位置
- short nMidStart = nStart + nStartStringLen;
- // 计算长度
- nLen = nEnd - nMidStart;
- // 截取内容
- CString strRes = strDest.Mid(nMidStart, nLen);
- return strRes;
- }
- /*! @OnNcHitTest
- ********************************************************************************
- <PRE>
- 函数名 : OnNcHitTest
- 功能 : 自画界面鼠标拖动消息
- 参数 : [IN] point : 鼠标位置
- 返回值 : -
- 抛出异常 : -
- --------------------------------------------------------------------------------
- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE>
- *******************************************************************************/
- UINT CClientDlg::OnNcHitTest(CPoint point)
- {
- CRect rc;
- // 取得窗体区域
- GetClientRect(&rc);
- // 重画窗体
- //////////////////////增加只相应标题栏拖动///////////////////////////////
- rc.left = 0 ;
- rc.top = 0;
- rc.bottom = 30;
- ///////////////////增加结束///////////////////////////////////////////////////////
- ClientToScreen(&rc);
- // 响应拖动
- return rc.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);
- }