rtoss - Blame information for rev 292

Subversion Repositories:
Rev:
Rev Author Line No. Line
280 roytam 1 // EvoDlg.cpp : 实现文件
2 //
3  
4 #include "stdafx.h"
5 #include "PokemonRomViewer.h"
6 #include "EvoDlg.h"
7 #include ".\evodlg.h"
8  
9 // CEvoDlg 对话框
10  
11 IMPLEMENT_DYNAMIC(CEvoDlg, CBaseDialog)
12 CEvoDlg::CEvoDlg()
13 {
14         m_uTemplateId = CEvoDlg::IDD;
15         m_pEvo = NULL;
16         m_wCurSel = -1;
17         m_wCurBreed = -1;
18         m_dwCurOrder = pm_order_internal;
19 }
20  
21 CEvoDlg::~CEvoDlg()
22 {
23 }
24  
25 void CEvoDlg::DoDataExchange(CDataExchange* pDX)
26 {
27         DWORD   dwIndex;
28  
29         CBaseDialog::DoDataExchange(pDX);
30  
31         DDX_Control(pDX, IDC_PM_LIST, m_ctrlPmList);
32         DDX_Control(pDX, IDC_CONFIRM, m_ctrlConfirm);
33  
34         for(dwIndex = 0; dwIndex < EVO_LIST_COUNT; ++dwIndex)
35         {
36                 DDX_Control(pDX, IDC_EVO_COND_LIST0  + dwIndex, m_ctrlEvoCondList[dwIndex]);
37                 DDX_Control(pDX, IDC_EVO_PARAM_DESC0 + dwIndex, m_ctrlEvoParamDesc[dwIndex]);
38                 DDX_Control(pDX, IDC_EVO_PARAM0      + dwIndex, m_ctrlEvoParam[dwIndex]);
39                 DDX_Control(pDX, IDC_EVO_ITEM_LIST0  + dwIndex, m_ctrlEvoItemList[dwIndex]);
40                 DDX_Control(pDX, IDC_EVO_BRD_LIST0   + dwIndex, m_ctrlEvoBreedList[dwIndex]);
41                 DDX_Control(pDX, IDC_EVO_ICON0       + dwIndex, m_ctrlEvoBreedIcon[dwIndex]);
42         }
43 }
44  
45 BEGIN_MESSAGE_MAP(CEvoDlg, CBaseDialog)
46         ON_BN_CLICKED(IDC_REFRESH, OnBnClickedRefresh)
47         ON_BN_CLICKED(IDC_CONFIRM, OnBnClickedConfirm)
48         ON_NOTIFY(LVN_ITEMCHANGED, IDC_PM_LIST, OnLvnItemchangedPmList)
49         ON_CONTROL_RANGE(CBN_SELCHANGE, IDC_EVO_BRD_LIST0, IDC_EVO_BRD_LIST4, OnCbnSelchangeEvoBrdList)
50         ON_CONTROL_RANGE(CBN_SELCHANGE, IDC_EVO_COND_LIST0, IDC_EVO_COND_LIST4, OnCbnSelchangeEvoCondList)
51         ON_CONTROL_RANGE(BN_CLICKED, IDC_EVO_SET_BRD0, IDC_EVO_SET_BRD4, OnBnClickedEvoSetBrd)
52         ON_NOTIFY(LVN_GETINFOTIP, IDC_PM_LIST, OnLvnGetInfoTipPmList)
53         ON_BN_CLICKED(IDC_FROM_BRD, OnBnClickedFromBrd)
54         ON_BN_CLICKED(IDC_REVERSE_FIND, OnBnClickedReverseFind)
55         ON_CONTROL_RANGE(STN_DBLCLK, IDC_EVO_ICON0, IDC_EVO_ICON4, OnStnDblclickIcon)
56         ON_CONTROL_RANGE(BN_CLICKED, IDC_ORDER_INTERNAL, IDC_ORDER_HOUEN, OnChangeOrder)
57 END_MESSAGE_MAP()
58  
59  
60 // CEvoDlg 消息处理程序
61 void CEvoDlg::GetCurrentEvo()
62 {
63         if(!rom.m_bOpened || m_wCurBreed >= BREED_COUNT)
64                 m_pEvo = NULL;
65         else
66                 m_pEvo = rom.GetEvoListEntry(m_wCurBreed, 0);
67 }
68  
69 void CEvoDlg::RefreshPmList(BOOL bRomChanged)
70 {
71         BOOL    bResult;
72         WORD    wIndex, wBreed;
73         DWORD   dwIcon;
74         WORD    wCount = m_ctrlPmList.GetItemCount();
75         LVITEM  lvi;
76         CString szIndex, szText;
77         LPCTSTR szFmt33[3] = { _T(""), _T("%-3hu:"), _T("%03hX:") };
78         WORD *  rgwOrderList = NULL;    // i-th element: the breed id of the i-th item of pm list
79  
80         if(!rom.m_bOpened)
81                 return;
82  
83         ///////////////////////////////////////////////////////////////////
84         // build order list if rom is changed
85         if(bRomChanged)
86         {
87                 if(m_dwCurOrder != pm_order_internal)
88                 {
89                         rgwOrderList = new WORD[BREED_COUNT];
90                         if(!rgwOrderList)
91                                 return;
92                 }
93  
94                 switch(m_dwCurOrder)
95                 {
96                 case pm_order_kanto:
97                         for(wBreed = 0; wBreed < BREED_COUNT; ++wBreed)
98                                 rgwOrderList[rom.m_pPokedexKantoOrder[wBreed]] = wBreed;
99                         break;
100  
101                 case pm_order_houen:
102                         for(wBreed = 0; wBreed < BREED_COUNT; ++wBreed)
103                                 rgwOrderList[rom.m_pPokedexHouenOrder[wBreed]] = wBreed;
104                         break;
105                 }
106         }
107  
108         ///////////////////////////////////////////////////////////////////
109         lvi.mask = LVIF_TEXT | LVIF_IMAGE;
110         lvi.iSubItem = 0;
111  
112         for(wIndex = 0; wIndex < BREED_COUNT; ++wIndex)
113         {
114                 lvi.iItem = wIndex;
115  
116                 if(rgwOrderList)
117                         wBreed = rgwOrderList[wIndex];
118                 else if(m_dwCurOrder == pm_order_internal)
119                         wBreed = wIndex;
120                 else
121                         wBreed = (WORD)(m_ctrlPmList.GetItemData(wIndex));
122  
123                 dwIcon = rom.GetSmallIconCount(wBreed);
124                 if(dwIcon > 0)
125                         dwIcon = rom.GetSmallIconIndex(wBreed, rand() % dwIcon);
126                 lvi.iImage = dwIcon;
127  
128                 szIndex.Format(szFmt33[cfg.dwCount], wIndex);
129                 szText = szIndex + cfg.pBreedNameList[wBreed].rgszText[cfg.dwLang];
130                 lvi.pszText = szText.GetBuffer();
131                 if(wBreed < wCount)
132                         bResult = m_ctrlPmList.SetItem(&lvi);
133                 else
134                         m_ctrlPmList.InsertItem(&lvi);
135                 szText.ReleaseBuffer();
136  
137                 if(bRomChanged)
138                         m_ctrlPmList.SetItemData(wIndex, wBreed);
139         }
140  
141         if(rgwOrderList)
142                 delete []rgwOrderList;
143  
144         if(m_wCurBreed < BREED_COUNT)
145         {
146                 SetCurPm(m_wCurBreed);
147         }
148 }
149  
150 void CEvoDlg::OnConfigChanged(BOOL bRomChanged, BOOL bUILangChanged)
151 {
152         static BOOL bInitialized = FALSE;
153  
154         if(!rom.m_bOpened)
155                 return;
156  
157         ///////////////////////////////////////////////////////////////////
158         // refresh image list for pm list
159         if(bRomChanged)
160                 m_ctrlPmList.SetImageList(rom.m_pSmallIconList, LVSIL_NORMAL);
161  
162         ///////////////////////////////////////////////////////////////////
163         // refresh pm list & item lists
164         RefreshPmList(bRomChanged);
165         SetItemList();
166  
167         if(bUILangChanged || !bInitialized)
168         {
169                 DWORD   dwIndex;
170                 DWORD   dwEvoIndex, dwCurCond;
171                 WORD    wBreed, wCurBreed;
172                 WORD    wCount = m_ctrlPmList.GetItemCount();
173                 CString szIndex, szText;
174                 LPCTSTR szFmt22[3] = { _T(""), _T("%-2lu:"), _T("%02lX:") };
175                 LPCTSTR szFmt33[3] = { _T(""), _T("%-3hu:"), _T("%03hX:") };
176  
177                 ///////////////////////////////////////////////////////////////////
178                 // setup evo-condition lists
179                 if(!bInitialized)
180                 {
181                         for(dwIndex = 0; dwIndex < EVO_LIST_COUNT; ++dwIndex)
182                         {
183                                 dwCurCond = m_ctrlEvoCondList[dwIndex].GetCurSel();
184                                 m_ctrlEvoCondList[dwIndex].ResetContent();
185                                 for(dwEvoIndex = 0; dwEvoIndex < dwEvoConditionsCount; ++dwEvoIndex)
186                                 {
187                                         szIndex.Format(szFmt22[cfg.dwCount], dwEvoIndex);
188                                         szText = szIndex + rgEvoConditions[dwEvoIndex].szCondition;
189                                         m_ctrlEvoCondList[dwIndex].AddString(szText);
190                                 }
191                                 if(dwCurCond < dwEvoConditionsCount)
192                                         m_ctrlEvoCondList[dwIndex].SetCurSel(dwCurCond);
193                         }
194                 }
195  
196                 ///////////////////////////////////////////////////////////////////
197                 // refresh breed lists
198                 for(dwIndex = 0; dwIndex < EVO_LIST_COUNT; ++dwIndex)
199                 {
200                         ////////////////////////////////////////
201                         wCurBreed = m_ctrlEvoBreedList[dwIndex].GetCurSel();
202                         m_ctrlEvoBreedList[dwIndex].ResetContent();
203                         for(wBreed = 0; wBreed < BREED_COUNT; ++wBreed)
204                         {
205                                 szIndex.Format(szFmt33[cfg.dwCount], wBreed);
206                                 szText = szIndex + cfg.pBreedNameList[wBreed].rgszText[cfg.dwLang];
207                                 m_ctrlEvoBreedList[dwIndex].AddString(szText);
208                         }
209                         if(wCurBreed < BREED_COUNT)
210                                 m_ctrlEvoBreedList[dwIndex].SetCurSel(wCurBreed);
211                 }
212  
213                 bInitialized = TRUE;
214         }
215  
216         if(bRomChanged)
217         {
218                 m_ctrlConfirm.EnableWindow(!rom.m_bIsFileReadOnly);
219  
220                 GetCurrentEvo();
221  
222                 if(m_wCurBreed >= BREED_COUNT)
223                         m_ctrlPmList.SetItemState(0, -1, LVIS_SELECTED | LVIS_FOCUSED);
224                 else
225                         SetAllParams();
226         }
227 }
228  
229 void CEvoDlg::SetItemList()
230 {
231         DWORD   dwIndex;
232         WORD    wItem, wCurItem, wItemCount;
233         CString szIndex, szText;
234         LPCTSTR szFmt33[3] = { _T(""), _T("%-3hu:"), _T("%03hX:") };
235  
236         if(!rom.m_bOpened)
237                 return;
238  
239         for(dwIndex = 0; dwIndex < EVO_LIST_COUNT; ++dwIndex)
240         {
241                 wItemCount = rom.GetItemCount();
242                 wCurItem = m_ctrlEvoItemList[dwIndex].GetCurSel();
243                 m_ctrlEvoItemList[dwIndex].ResetContent();
244                 for(wItem = 0; wItem < wItemCount; ++wItem)
245                 {
246                         szIndex.Format(szFmt33[cfg.dwCount], wItem);
247                         szText = szIndex + cfg.pItemNameList[wItem].rgszText[cfg.dwLang];
248                         m_ctrlEvoItemList[dwIndex].AddString(szText);
249                 }
250                 if(wCurItem < wItemCount)
251                         m_ctrlEvoItemList[dwIndex].SetCurSel(wCurItem);
252         }
253 }
254  
255 void CEvoDlg::OnBnClickedRefresh()
256 {
257         // TODO: 在此添加控件通知处理程序代码
258         if(!rom.ReadEvoList())
259         {
260                 AfxMessageBox(IDS_ERR_ROM_READ);
261                 return;
262         }
263  
264         SetAllParams();
265 }
266  
267 void CEvoDlg::OnBnClickedConfirm()
268 {
269         // TODO: 在此添加控件通知处理程序代码
270         GetAllParams();
271  
272         if(!rom.SaveEvoList())
273         {
274                 AfxMessageBox(IDS_ERR_ROM_WRITE);
275                 return;
276         }
277 }
278  
279 void CEvoDlg::OnLvnItemchangedPmList(NMHDR *pNMHDR, LRESULT *pResult)
280 {
281         LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
282         // TODO: 在此添加控件通知处理程序代码
283         *pResult = 0;
284  
285         if(pNMLV->uNewState & (LVIS_SELECTED | LVIS_FOCUSED))
286         {
287                 GetAllParams();
288                 m_wCurSel = pNMLV->iItem;
289                 if(m_wCurSel < BREED_COUNT)
290                 {
291                         m_wCurBreed = (WORD)(m_ctrlPmList.GetItemData(m_wCurSel));
292                         GetCurrentEvo();
293                         SetAllParams();
294                 }
295                 else
296                 {
297                         m_wCurBreed = -1;
298                 }
299         }
300 }
301  
302 BOOL CEvoDlg::OnInitDialog()
303 {
304         CBaseDialog::OnInitDialog();
305  
306         // TODO:  在此添加额外的初始化
307         m_ctrlPmList.SetIconSpacing(SMALL_ICON_BIT_WIDTH2 + 28, SMALL_ICON_BIT_HEIGHT2 + 24);
308         m_ctrlPmList.SetExtendedStyle(LVS_EX_BORDERSELECT | LVS_EX_INFOTIP);
309  
310         CheckDlgButton(IDC_ORDER_INTERNAL + m_dwCurOrder, BST_CHECKED);
311  
312         return TRUE;  // return TRUE unless you set the focus to a control
313         // 异常: OCX 属性页应返回 FALSE
314 }
315  
316 void CEvoDlg::GetParam(DWORD dwIndex)
317 {
318         EvoConditions * pEvoCond = NULL;
319         CString szText;
320         WORD    wBreed;
321         WORD    wItem, wItemCount;
322  
323         if(m_pEvo == NULL || dwIndex >= EVO_LIST_COUNT)
324                 return;
325  
326         wBreed = m_ctrlEvoBreedList[dwIndex].GetCurSel();
327         if(wBreed < BREED_COUNT)
328                 m_pEvo[dwIndex].wBreed = wBreed;
329  
330         if(wBreed == 0 || wBreed >= BREED_COUNT)
331                 m_pEvo[dwIndex].wCondition = 0;
332  
333         pEvoCond = &(rgEvoConditions[m_pEvo[dwIndex].wCondition]);
334         switch(pEvoCond->dwParamType)
335         {
336         case evo_none:
337                 m_pEvo[dwIndex].wValue = 0;
338                 break;
339  
340         case evo_level:
341                 GetDlgItemText(IDC_EVO_PARAM0 + dwIndex, szText);
342                 m_pEvo[dwIndex].wValue = (WORD)(min(_tcstoul(szText, 0, 0), 0x64));
343                 break;
344  
345         case evo_beauty:
346                 GetDlgItemText(IDC_EVO_PARAM0 + dwIndex, szText);
347                 m_pEvo[dwIndex].wValue = (WORD)(min(_tcstoul(szText, 0, 0), 0xFF));
348                 break;
349  
350         case evo_item:
351                 wItemCount = rom.GetItemCount();
352                 wItem = m_ctrlEvoItemList[dwIndex].GetCurSel();
353                 if(wItem < wItemCount)
354                         m_pEvo[dwIndex].wValue = wItem;
355                 break;
356         }
357 }
358  
359 void CEvoDlg::GetAllParams()
360 {
361         DWORD   dwIndex;
362  
363         for(dwIndex = 0; dwIndex < EVO_LIST_COUNT; ++dwIndex)
364         {
365                 GetParam(dwIndex);
366         }
367 }
368  
369 void CEvoDlg::SetAllParams()
370 {
371         DWORD   dwIndex;
372  
373         if(m_pEvo == NULL)
374                 return;
375  
376         for(dwIndex = 0; dwIndex < EVO_LIST_COUNT; ++dwIndex)
377         {
378                 SetParam(dwIndex);
379         }
380 }
381  
382 void CEvoDlg::SetParam(DWORD dwIndex, BOOL bForceUpdate)
383 {
384         if(m_pEvo == NULL)
385                 return;
386  
387         if(dwIndex >= EVO_LIST_COUNT)
388                 return;
389  
390         WORD    wEvoCond;
391         WORD    wItem, wItemCount;
392         EvoConditions * pEvoCond = NULL;
393         INT             iItemListShow, iParamShow;
394         BOOL    bBreedListEnable;
395  
292 roytam 396         wEvoCond = m_pEvo[dwIndex].wCondition < dwEvoConditionsCount ? m_pEvo[dwIndex].wCondition : 0;
280 roytam 397         if(wEvoCond == 0)
398                 bBreedListEnable = FALSE;
399         else
400                 bBreedListEnable = TRUE;
401  
402         pEvoCond = &(rgEvoConditions[wEvoCond]);
403         switch(pEvoCond->dwParamType)
404         {
405         case evo_level:
406                 iParamShow = SW_SHOW;
407                 iItemListShow = SW_HIDE;
408                 SetDlgItemInt(IDC_EVO_PARAM0 + dwIndex, min(m_pEvo[dwIndex].wValue, 0x64), FALSE);
409                 break;
410  
411         case evo_beauty:
412                 iParamShow = SW_SHOW;
413                 iItemListShow = SW_HIDE;
414                 SetDlgItemInt(IDC_EVO_PARAM0 + dwIndex, min(m_pEvo[dwIndex].wValue, 0xFF), FALSE);
415                 break;
416  
417         case evo_item:
418                 iParamShow = SW_HIDE;
419                 iItemListShow = SW_SHOW;
420                 wItemCount = rom.GetItemCount();
421                 wItem = min(m_pEvo[dwIndex].wValue, wItemCount - 1);
422                 m_ctrlEvoItemList[dwIndex].SetCurSel(wItem);
423                 break;
292 roytam 424  
425         case evo_none:
426         default:
427                 iParamShow = SW_HIDE;
428                 iItemListShow = SW_HIDE;
429                 break;
280 roytam 430         }
431  
432         if(bForceUpdate || m_ctrlEvoCondList[dwIndex].GetCurSel() != wEvoCond)
433         {
434                 m_ctrlEvoCondList[dwIndex].SetCurSel(wEvoCond);
435                 m_ctrlEvoParamDesc[dwIndex].SetWindowText(pEvoCond->szParamDesc);
436                 m_ctrlEvoParam[dwIndex].ShowWindow(iParamShow);
437                 m_ctrlEvoItemList[dwIndex].ShowWindow(iItemListShow);
438                 m_ctrlEvoBreedList[dwIndex].EnableWindow(bBreedListEnable);
439         }
440  
441         if(m_ctrlEvoBreedList[dwIndex].GetCurSel() != m_pEvo[dwIndex].wBreed)
442         {
443                 m_ctrlEvoBreedList[dwIndex].SetCurSel(bBreedListEnable ? m_pEvo[dwIndex].wBreed : 0);
444                 SetBreedIcon(dwIndex);
445         }
446 }
447  
448 void CEvoDlg::SetBreedIcon(DWORD dwIndex)
449 {
450         WORD    wBreed;
451         DWORD   dwIcon;
452  
453         if(dwIndex >= EVO_LIST_COUNT)
454                 return;
455  
456         wBreed = m_ctrlEvoBreedList[dwIndex].GetCurSel();
457         if(wBreed >= BREED_COUNT)
458                 wBreed = 0;
459  
460         if(wBreed > 0)
461         {
462                 dwIcon = rom.GetSmallIconCount(wBreed);
463                 if(dwIcon > 0)
464                         dwIcon = rom.GetSmallIconIndex(wBreed, rand() % dwIcon);
465  
466                 m_ctrlEvoBreedIcon[dwIndex].ShowWindow(SW_SHOW);
467                 m_ctrlEvoBreedIcon[dwIndex].SetBitmap(rom.m_rghbmSmallIcons[dwIcon]);
468         }
469         else
470         {
471                 m_ctrlEvoBreedIcon[dwIndex].ShowWindow(SW_HIDE);
472         }
473 }
474  
475 ///////////////////////////////////////////////////////////////////////////////////////////////////
476 BOOL CEvoDlg::GetBreed(DWORD dwIndex)
477 {
478         WORD    wBreed;
479  
480         if(m_pEvo == NULL || dwIndex >= EVO_LIST_COUNT)
481                 return FALSE;
482  
483         wBreed = m_ctrlEvoBreedList[dwIndex].GetCurSel();
484         if(wBreed >= BREED_COUNT)
485                 return FALSE;
486  
487         m_pEvo[dwIndex].wBreed = wBreed;
488         return TRUE;
489 }
490  
491 void CEvoDlg::OnCbnSelchangeEvoBrdList(UINT uID)
492 {
493         // TODO: 在此添加控件通知处理程序代码
494         if(GetBreed(uID - IDC_EVO_BRD_LIST0))
495                 SetBreedIcon(uID - IDC_EVO_BRD_LIST0);
496 }
497  
498 ///////////////////////////////////////////////////////////////////////////////////////////////////
499 void CEvoDlg::OnCondChanged(DWORD dwIndex)
500 {
501         if(m_pEvo && dwIndex < EVO_LIST_COUNT)
502         {
503                 GetParam(dwIndex);
504                 m_pEvo[dwIndex].wCondition = m_ctrlEvoCondList[dwIndex].GetCurSel();
505                 SetParam(dwIndex, TRUE);
506         }
507 }
508  
509 void CEvoDlg::OnCbnSelchangeEvoCondList(UINT uID)
510 {
511         // TODO: 在此添加控件通知处理程序代码
512         OnCondChanged(uID - IDC_EVO_COND_LIST0);
513 }
514  
515 ///////////////////////////////////////////////////////////////////////////////////////////////////
516 void CEvoDlg::OnSetBreed(DWORD dwIndex)
517 {
518         if(theApp.m_dlgBreed.m_wCurBreed < BREED_COUNT &&
519                 m_pEvo && m_pEvo[dwIndex].wCondition != 0)
520         {
521                 m_ctrlEvoBreedList[dwIndex].SetCurSel(theApp.m_dlgBreed.m_wCurBreed);
522                 GetBreed(dwIndex);
523                 SetBreedIcon(dwIndex);
524         }
525 }
526  
527 void CEvoDlg::OnBnClickedEvoSetBrd(UINT uID)
528 {
529         // TODO: 在此添加控件通知处理程序代码
530         OnSetBreed(uID - IDC_EVO_SET_BRD0);
531 }
532  
533 void CEvoDlg::OnLvnGetInfoTipPmList(NMHDR *pNMHDR, LRESULT *pResult)
534 {
535         LPNMLVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMLVGETINFOTIP>(pNMHDR);
536         // TODO: 在此添加控件通知处理程序代码
537         *pResult = 0;
538  
539         WORD    wBreed;
540         WORD    wBreed387, wIndexKanto, wIndexHouen;
541         WORD    wPage, wRow, wColumn;
542         WORD    wPageKanto, wRowKanto, wColumnKanto;
543         WORD    wPageHouen, wRowHouen, wColumnHouen;
544  
545         if(rom.m_bOpened &&
546                 pGetInfoTip->cchTextMax >= 100 &&
547                 pGetInfoTip->dwFlags == LVGIT_UNFOLDED &&
548                 pGetInfoTip->iItem <= BREED_COUNT)
549         {
550                 wBreed = (WORD)(m_ctrlPmList.GetItemData(pGetInfoTip->iItem));
551                 wBreed387 = ConvertBreed(wBreed, FALSE);
552                 GetPositionInBox(wBreed387, wPage, wRow, wColumn);
553  
554                 wIndexKanto = rom.m_pPokedexKantoOrder[wBreed];
555                 GetPositionInBox(wIndexKanto - 1, wPageKanto, wRowKanto, wColumnKanto);
556  
557                 wIndexHouen = rom.m_pPokedexHouenOrder[wBreed];
558                 GetPositionInBox(wIndexHouen - 1, wPageHouen, wRowHouen, wColumnHouen);
559  
560                 wsprintf(
561                         pGetInfoTip->pszText,
562                         _T("%3hu|%2hu-%hu-%hu(K)\n")
563                         _T("%3hu|%2hu-%hu-%hu(H)\n")
564                         _T("%3hu|%03hXh\n")
565                         _T("%hu-%hu-%hu"),
566                         wIndexKanto, wPageKanto, wRowKanto, wColumnKanto,
567                         wIndexHouen, wPageHouen, wRowHouen, wColumnHouen,
568                         wBreed, wBreed, wPage, wRow, wColumn);
569         }
570 }
571  
572 void CEvoDlg::OnBnClickedFromBrd()
573 {
574         // TODO: 在此添加控件通知处理程序代码
575         WORD    wBreed = theApp.m_dlgBreed.m_wCurBreed;
576         if(wBreed < BREED_COUNT)
577         {
578                 SetCurPm(wBreed);
579         }
580 }
581  
582 void CEvoDlg::OnBnClickedReverseFind()
583 {
584         // TODO: 在此添加控件通知处理程序代码
585         BYTE    bEvoIndex;
586         WORD    wBreed;
587         EvoListEntry *pEvo = NULL;
588  
589         if(rom.m_bOpened && m_wCurBreed > 0 && m_wCurBreed < BREED_COUNT)
590         {
591                 for(wBreed = 0; wBreed < BREED_COUNT; ++wBreed)
592                 {
593                         for(bEvoIndex = 0; bEvoIndex < EVO_LIST_COUNT; ++bEvoIndex)
594                         {
595                                 pEvo = rom.GetEvoListEntry(wBreed, bEvoIndex);
596                                 if(pEvo->wBreed == m_wCurBreed)
597                                 {
598                                         SetCurPm(wBreed);
599                                         break;
600                                 }
601                         }
602                 }
603         }
604 }
605  
606 void CEvoDlg::OnStnDblclickIcon(UINT uID)
607 {
608         DWORD   dwIndex = uID - IDC_EVO_ICON0;
609         WORD    wBreed;
610  
611         if(m_pEvo && dwIndex < EVO_LIST_COUNT)
612         {
613                 wBreed = m_pEvo[dwIndex].wBreed;
614                 SetCurPm(wBreed);
615         }
616 }
617  
618 void CEvoDlg::SetCurPm(WORD wBreed)
619 {
620         if(rom.m_bOpened && wBreed < BREED_COUNT)
621         {
622                 switch(m_dwCurOrder)
623                 {
624                 case pm_order_internal:
625                 default:
626                         m_wCurSel = wBreed;
627                         break;
628  
629                 case pm_order_kanto:
630                         m_wCurSel = rom.m_pPokedexKantoOrder[wBreed];
631                         break;
632  
633                 case pm_order_houen:
634                         m_wCurSel = rom.m_pPokedexHouenOrder[wBreed];
635                         break;
636                 }
637  
638                 // m_wCurBreed = wBreed;
639                 m_ctrlPmList.SetItemState(m_wCurSel, -1, LVIS_SELECTED | LVIS_FOCUSED);
640                 m_ctrlPmList.EnsureVisible(m_wCurSel, FALSE);
641         }
642 }
643  
644 INT CALLBACK CEvoDlg::SortPokemons(LPARAM lParam1, LPARAM lParam2, LPARAM lSortParam)
645 {
646         INT             iResult = 0;
647  
648         if(rom.m_bOpened)
649         {
650                 switch(lSortParam)
651                 {
652                 case pm_order_internal:
653                         iResult = INT(lParam1 - lParam2);
654                         break;
655  
656                 case pm_order_kanto:
657                         iResult = INT(rom.m_pPokedexKantoOrder[lParam1] - rom.m_pPokedexKantoOrder[lParam2]);
658                         break;
659  
660                 case pm_order_houen:
661                         iResult = INT(rom.m_pPokedexHouenOrder[lParam1] - rom.m_pPokedexHouenOrder[lParam2]);
662                         break;
663                 }
664         }
665  
666         return iResult;
667 }
668  
669 void CEvoDlg::OnChangeOrder(UINT uID)
670 {
671         if(!rom.m_bOpened || uID < IDC_ORDER_INTERNAL || uID > IDC_ORDER_HOUEN)
672                 return;
673  
674         POSITION        pos;
675  
676         if(m_dwCurOrder != uID - IDC_ORDER_INTERNAL)
677         {
678                 m_dwCurOrder = uID - IDC_ORDER_INTERNAL;
679                 //m_ctrlPmList.SortItems(SortPokemons, (LPARAM)(m_dwCurOrder));
680                 RefreshPmList(TRUE);
681  
682                 pos = m_ctrlPmList.GetFirstSelectedItemPosition();
683                 if(pos)
684                 {
685                         m_wCurSel = m_ctrlPmList.GetNextSelectedItem(pos);
686                         m_wCurBreed = (WORD)(m_ctrlPmList.GetItemData(m_wCurSel));
687                         m_ctrlPmList.EnsureVisible(m_wCurSel, FALSE);
688                 }
689                 else
690                 {
691                         m_wCurSel = -1;
692                         m_wCurBreed = -1;
693                 }
694         }
695 }