15.4.3 游戏英雄榜对话框的实现

2013-10-07 13:03:46 · 作者: · 浏览: 75

15.4.3  游戏英雄榜对话框的实现

扫雷游戏英雄榜的实现,分为如下几步:

(1)创建一个对话框资源,并添加相应的控件,如图15.6所示。

 
(点击查看大图)图15.6  英雄榜对话框资源
(2)配置(setup.ini)文件格式如下:
  1. [HERO]  
  2. name=XXX 
  3. time=0 

(3)添加CHeroDlg类,其中需要包含IDD_HERO_DLG对话框资源和"设置可写记录标志"接口函数声明,用于外部函数调用时,设置是否对配置文件进行写操作。类的声明如代码15.4所示。

代码15.4  CHeroDlg类的声明

  1. 01  #if !defined(AFX_HERODLG_H__)  
  2. 02  #define AFX_HERODLG_H__  
  3. 03  
  4. 04  // HeroDlg.h 头文件  
  5. 05  
  6. 06  ////////////////////////////////////////////  
  7. 07  // CHeroDlg dialog  
  8. 08  
  9. 09  class CHeroDlg : public CDialog  
  10. 10  {  
  11. 11  public:  
  12. 12      void SetWriteFlg(BOOL bflg);            
    //接口函数,设置可记录标志变量  
  13. 13      CHeroDlg(CWnd* pParent = NULL);         //构造函数  
  14. 14  
  15. 15      enum { IDD = IDD_HERO_LIST };           //对话框资源  
  16. 16      int     m_time;         //保存时间变量  
  17. 17      CString m_name;         //保存姓名变量  
  18. 18  
  19. 19      public:  
  20. 20      virtual int DoModal();  //弹出对话框函数声明  
  21. 21      protected:  
  22. 22      virtual void DoDataExchange(CDataExchange* pDX);  
  23. 23  
  24. 24  protected:  
  25. 25  
  26. 26      virtual void OnOK();    //单击"久仰"按钮响应函数声明  
  27. 27  
  28. 28      DECLARE_MESSAGE_MAP()  
  29. 29  private:  
  30. 30      BOOL m_bWriteflg;       //记录标志变量  
  31. 31  };  
  32. 32  
  33. 33  #endif 

(4)CHeroDlg类的实现中通过调用系统API函数,来对配置文件进行读写操作。而"设置读写标志"接口函数,是对类的一个成员变量m_bWrite进行赋值操作,达到写入或者读取的区分。其代码如代码15.5所示。

代码15.5  CHeroDlg类的实现

  1. 01  // HeroDlg.cpp 源文件  
  2. 02  #include "stdafx.h  
  3.         //插入头文件  
  4. 03  #include "mine.h"  
  5. 04  #include "HeroDlg.h  
  6.     //插入类声明头文件  
  7. 05  
  8. 06  ///////////////////////////////////////////////  
  9. 07  // CHeroDlg 对话框  
  10. 08  
  11. 09  CHeroDlg::CHeroDlg(CWnd* pParent /*=NULL*/)//构造函数  
  12. 10      : CDialog(CHeroDlg::IDD, pParent)  
  13. 11  {  
  14. 12      m_bWriteflg = FALSE;    //初始化写标志变量为假  
  15. 13  }  
  16. 14  
  17. 15  void CHeroDlg::DoDataExchange(CDataExchange* pDX)  
  18. 16  {  
  19. 17      CDialog::DoDataExchange(pDX);           //变量与资源映射  
  20. 18      //{{AFX_DATA_MAP(CHeroDlg)  
  21. 19      DDX_Text(pDX, IDC_TIME_EDIT, m_time);  
  22. 20      DDX_Text(pDX, IDC_NAME_EDIT, m_name);  
  23. 21      //}}AFX_DATA_MAP  
  24. 22  }  
  25. 23  
  26. 24  BEGIN_MESSAGE_MAP(CHeroDlg, CDialog)  
  27. 25      ON_BN_CLICKED(IDOK_BTN, OnBtn)          //按钮与函数映射  
  28. 26  END_MESSAGE_MAP()  
  29. 27  
  30. 28  ////////////////////////////////////////////////////  
  31. 29  // CHeroDlg 消息句柄  
  32. 30  
  33. 31  void CHeroDlg::SetWriteFlg(BOOL bflg)       //设置写入标志  
  34. 32  {  
  35. 33      m_bWriteflg = bflg;  
  36. 34  }  
  37. 35  
  38. 36  int CHeroDlg::DoModal()     //弹出对话框  
  39. 37  {  
  40. 38      char pszTmp[128] = {0};  
  41. 39  
  42. 40      //读取配置文件  
  43. 41      GetPrivateProfileString("HERO", "name", "无名氏",  
  44. 42          pszTmp, 127, ".\\hero.ini");        //读入姓名  
  45. 43      m_name = CString(pszTmp);  
  46. 44  
  47. 45      if(!m_bWriteflg)  
  48. 46      {  
  49. 47          GetPrivateProfileString("HERO", "time", "0",  
  50. 48pszTmp, 127, ".\\hero.ini");  //读入等级  
  51. 49          m_time = atoi(pszTmp);  
  52. 50      }  
  53. 51  
  54. 52      return CDialog::DoModal();  
  55. 53  }  
  56. 54  
  57. 55  void CHeroDlg::OnBtn()      //按钮响应  
  58. 56  {  
  59. 57      UpdateData(TRUE);  
  60. 58      if(m_bWriteflg)  
  61. 59      {  
  62. 60          CString tmp;  
  63. 61          //写入姓名和时间记录  
  64. 62          WritePrivateProfileString("HERO", "name",
    m_name,       ".\\hero.ini");  
  65. 63          tmp.Format("%d", m_time);  
  66. 64          WritePrivateProfileString("HERO", 
    "time", tmp, ".\\hero.ini");  
  67. 65      }  
  68. 66      m_bWriteflg = FALSE;  
  69. 68      CDialog::OnOK();  
  70. 69  }  
  71. 70  
  72. 71  BOOL CHeroDlg::OnInitDialog() //初始化对话  
  73. 72  {  
  74. 73      CDialog::OnInitDialog();  
  75. 74  
  76. 75      if(m_bWriteflg)  
  77. 76      {       //当为写入时,把按钮名称改变  
  78. 77          SetDlgItemText(IDOK_BTN, "记录");  
  79. 78      }  
  80. 79  
  81. 80      return TRUE;  
  82. 81  }