RLE编码算法

  1 
  2  //  RLEDlg.cpp : 实现文件
  3  //
  4 
  5  #include  " stdafx.h "
  6  #include  " RLE.h "
  7  #include  " RLEDlg.h "
  8 
  9  #ifdef _DEBUG
 10  #define  new DEBUG_NEW
 11  #endif
 12 
 13  struct  repeate
 14  {
 15       int  name;
 16       int  num ;
 17  }all[ 8 ][ 8 ];
 18  //  用于应用程序“关于”菜单项的 CAboutDlg 对话框
 19 
 20  // 判断该数是否存在
 21  int  isExistInArray( int  b, int  j)
 22  {
 23       for  ( int  i = 0 ;i < 8 ;i ++ )
 24      {
 25           if  (all[j][i].name == b)
 26          {
 27               return  i;
 28          }
 29      }
 30       return   - 1 ;
 31  }
 32 
 33 
 34  class  CAboutDlg :  public  CDialog
 35  {
 36  public :
 37      CAboutDlg();
 38 
 39  //  对话框数据
 40       enum  { IDD  =  IDD_ABOUTBOX };
 41 
 42       protected :
 43       virtual   void  DoDataExchange(CDataExchange *  pDX);     //  DDX/DDV 支持
 44 
 45  //  实现
 46  protected :
 47      DECLARE_MESSAGE_MAP()
 48  };
 49 
 50  CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
 51  {
 52  }
 53 
 54  void  CAboutDlg::DoDataExchange(CDataExchange *  pDX)
 55  {
 56      CDialog::DoDataExchange(pDX);
 57  }
 58 
 59  BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
 60  END_MESSAGE_MAP()
 61 
 62 
 63  //  CRLEDlg 对话框
 64 
 65 
 66 
 67 
 68  CRLEDlg::CRLEDlg(CWnd *  pParent  /* =NULL */ )
 69      : CDialog(CRLEDlg::IDD, pParent)
 70  {
 71      m_hIcon  =  AfxGetApp() -> LoadIcon(IDR_MAINFRAME);
 72  }
 73 
 74  void  CRLEDlg::DoDataExchange(CDataExchange *  pDX)
 75  {
 76      CDialog::DoDataExchange(pDX);
 77  }
 78 
 79  BEGIN_MESSAGE_MAP(CRLEDlg, CDialog)
 80      ON_WM_SYSCOMMAND()
 81      ON_WM_PAINT()
 82      ON_WM_QUERYDRAGICON()
 83       // }}AFX_MSG_MAP
 84      ON_BN_CLICKED(IDC_BTN_GET_ORIGION,  & CRLEDlg::OnBnClickedBtnGetOrigion)
 85      ON_BN_CLICKED(IDC_GETRLE,  & CRLEDlg::OnBnClickedGetrle)
 86  END_MESSAGE_MAP()
 87 
 88 
 89  //  CRLEDlg 消息处理程序
 90 
 91  BOOL CRLEDlg::OnInitDialog()
 92  {
 93      CDialog::OnInitDialog();
 94 
 95       //  将“关于...”菜单项添加到系统菜单中。
 96 
 97       //  IDM_ABOUTBOX 必须在系统命令范围内。
 98      ASSERT((IDM_ABOUTBOX  &   0xFFF0 ==  IDM_ABOUTBOX);
 99      ASSERT(IDM_ABOUTBOX  <   0xF000 );
100 
101      CMenu *  pSysMenu  =  GetSystemMenu(FALSE);
102       if  (pSysMenu  !=  NULL)
103      {
104          BOOL bNameValid;
105          CString strAboutMenu;
106          bNameValid  =  strAboutMenu.LoadString(IDS_ABOUTBOX);
107          ASSERT(bNameValid);
108           if  ( ! strAboutMenu.IsEmpty())
109          {
110              pSysMenu -> AppendMenu(MF_SEPARATOR);
111              pSysMenu -> AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
112          }
113      }
114 
115       //  设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
116       //   执行此操作
117      SetIcon(m_hIcon, TRUE);             //  设置大图标
118      SetIcon(m_hIcon, FALSE);         //  设置小图标
119 
120       //  TODO: 在此添加额外的初始化代码
121 
122       return  TRUE;   //  除非将焦点设置到控件,否则返回 TRUE
123  }
124 
125  void  CRLEDlg::OnSysCommand(UINT nID, LPARAM lParam)
126  {
127       if  ((nID  &   0xFFF0 ==  IDM_ABOUTBOX)
128      {
129          CAboutDlg dlgAbout;
130          dlgAbout.DoModal();
131      }
132       else
133      {
134          CDialog::OnSysCommand(nID, lParam);
135      }
136  }
137 
138  //  如果向对话框添加最小化按钮,则需要下面的代码
139  //   来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
140  //   这将由框架自动完成。
141 
142  void  CRLEDlg::OnPaint()
143  {
144       if  (IsIconic())
145      {
146          CPaintDC dc( this );  //  用于绘制的设备上下文
147 
148          SendMessage(WM_ICONERASEBKGND, reinterpret_cast < WPARAM > (dc.GetSafeHdc()),  0 );
149 
150           //  使图标在工作区矩形中居中
151           int  cxIcon  =  GetSystemMetrics(SM_CXICON);
152           int  cyIcon  =  GetSystemMetrics(SM_CYICON);
153          CRect rect;
154          GetClientRect( & rect);
155           int  x  =  (rect.Width()  -  cxIcon  +   1 /   2 ;
156           int  y  =  (rect.Height()  -  cyIcon  +   1 /   2 ;
157 
158           //  绘制图标
159          dc.DrawIcon(x, y, m_hIcon);
160      }
161       else
162      {
163          CDialog::OnPaint();
164      }
165  }
166 
167  // 当用户拖动最小化窗口时系统调用此函数取得光标
168  // 显示。
169  HCURSOR CRLEDlg::OnQueryDragIcon()
170  {
171       return  static_cast < HCURSOR > (m_hIcon);
172  }
173 
174  // 获取默认图像
175  void  CRLEDlg::OnBnClickedBtnGetOrigion()
176  {
177       //  TODO: 在此添加控件通知处理程序代码
178       for  ( int  i  =   1009 ;i  <=   1072 ++ i)
179      {
180           if  (i < 1017 )
181          {
182              GetDlgItem(i) -> SetWindowText(L " 5 " );
183          }
184           else   if  (i < 1021 )
185          {
186              GetDlgItem(i) -> SetWindowText(L " 6 " );
187          }
188           else   if  (i < 1030 )
189          {
190              GetDlgItem(i) -> SetWindowText(L " 9 " );
191          }
192           else   if  (i <   1035 )
193          {
194              GetDlgItem(i) -> SetWindowText(L " 8 " );
195          }
196           else   if  (i < 1041 )
197          {
198              GetDlgItem(i) -> SetWindowText(L " 7 " );
199          }
200           else   if  (i < 1049 )
201          {
202              GetDlgItem(i) -> SetWindowText(L " 4 " );
203          }
204           else   if  (i < 1054 )
205          {
206              GetDlgItem(i) -> SetWindowText(L " 6 " );
207          }
208           else   if  (i < 1060 )
209          {
210              GetDlgItem(i) -> SetWindowText(L " 3 " );
211          }
212           else   if  (i < 1065 )
213          {
214              GetDlgItem(i) -> SetWindowText(L " 8 " );
215          }
216           else   if  (i < 1069 )
217          {
218              GetDlgItem(i) -> SetWindowText(L " 5 " );
219          }
220           else
221              GetDlgItem(i) -> SetWindowText(L " 9 " );
222      }
223 
224  }
225  // RLE编码
226  void  CRLEDlg::OnBnClickedGetrle()
227  {
228       //  TODO: 在此添加控件通知处理程序代码
229       // 将数组清零
230      ClearArray();
231       int  number[ 8 ][ 8 ];
232       int  start  =   1009 ;
233       int  temp  =   0 ;
234      CString str;
235       int  z  = 0 ;
236      CString  out ;
237       for  ( int  i = 0 ;i < 8 ;i ++ )
238      {
239           for  ( int  j = 0 ;j < 8 ;j ++ )
240          {
241               // 依次取了每个控件的值
242              GetDlgItem(start) -> GetWindowText(str);
243               // 转换成整形
244              temp = _wtoi(str);
245               // 保存至数组中
246              number[i][j] = temp;
247              start ++ ;
248          }
249      }
250       for  ( int  j  = 0 ;j < 8 ;j ++ )
251      {
252          z  =   0 ;
253           for  ( int  i = 0 ;i < 8 ; ++ i)
254          {
255               int  b = isExistInArray(number[j][i],j);
256               if  (b !=- 1 )
257              {
258                  all[j][b].num ++ ;
259              }
260               else
261              {
262                  all[j][z].name  =  number[j][i];
263                  all[j][z].num ++ ;
264                  z ++ ;
265              }
266          }
267      }
268      CString strCount;
269       for  ( int  j = 0 ;j < 8 ; ++ j)
270       for  ( int  i = 0 ;i < 8 ; ++ i)
271      {
272           if  (all[j][i].name != 0 )
273          {
274              strCount.Format(L " %d " ,all[j][i].name);
275               out   +=  strCount + L "   " ;
276              strCount.Format(L " %d " ,all[j][i].num);
277               out   +=  strCount + L "   " ;
278          }
279      }
280       // 显示RLE结果
281      GetDlgItem(IDC_EDIT_RESULT) -> SetWindowText( out );
282  }
283  // 将结果清零
284  void  CRLEDlg::ClearArray()
285  {
286       for  ( int  i = 0 ;i < 8 ; ++ i)
287           for  ( int  j = 0 ;j < 8 ;j ++ )
288          {
289              all[i][j].name  = 0 ;
290              all[i][j].num  = 0 ;
291          }
292 
293  }

 

结果截图

RLE编码算法_第1张图片工程文件下载/Files/eping/RLE.rar

转载于:https://www.cnblogs.com/eping/archive/2009/12/19/1627986.html

你可能感兴趣的:(RLE编码算法)