rtoss - Blame information for rev 292

Subversion Repositories:
Rev:
Rev Author Line No. Line
280 roytam 1 // PokemonRomViewer.cpp : 定义应用程序的类行为。
2 //
3  
4 #include "stdafx.h"
5 #include "PokemonRomViewer.h"
6 #include "MainFrm.h"
7 #include "ConfigDlg.h"
8  
9 #ifdef _DEBUG
10 #define new DEBUG_NEW
11 #endif
12  
13 StringEntry * GetEncNameEntry(WORD wAreaId)
14 {
15         static DWORD    dwPreIndex = 0;
16         DWORD                   dwIndex;
17         StringEntry *   pEntry = NULL;
18  
19         if(dwPreIndex + 1 < ENC_COUNT &&
20                 cfg.pEncNameList[dwPreIndex + 1].dwId == wAreaId)
21         {
22                 ++dwPreIndex;
23                 pEntry = &(cfg.pEncNameList[dwPreIndex]);
24         }
25         else if(dwPreIndex > 0 &&
26                 cfg.pEncNameList[dwPreIndex - 1].dwId == wAreaId)
27         {
28                 --dwPreIndex;
29                 pEntry = &(cfg.pEncNameList[dwPreIndex]);
30         }
31         else if(cfg.pEncNameList[dwPreIndex].dwId == wAreaId)
32         {
33                 pEntry = &(cfg.pEncNameList[dwPreIndex]);
34         }
35         else
36         {
37                 for(dwIndex = 0; dwIndex < ENC_COUNT; ++dwIndex)
38                 {
39                         if(wAreaId == cfg.pEncNameList[dwIndex].dwId)
40                         {
41                                 dwPreIndex = dwIndex;
42                                 pEntry = &(cfg.pEncNameList[dwPreIndex]);
43                                 break;
44                         }
45                 }
46         }
47  
48         return pEntry;
49 }
50 /*
51 VOID SetBit(LPVOID pFlags, DWORD_PTR dwBitIndex)
52 {
53         LPBYTE  pb = &((LPBYTE)(pFlags))[dwBitIndex >> 0x3];
54         *pb |= ((BYTE)(1) << (BYTE)(dwBitIndex & 0x7));
55 }
56  
57 VOID ClrBit(LPVOID pFlags, DWORD_PTR dwBitIndex)
58 {
59         LPBYTE  pb = &((LPBYTE)(pFlags))[dwBitIndex >> 0x3];
60         *pb &= ~((BYTE)(1) << (BYTE)(dwBitIndex & 0x7));
61 }
62  
63 BYTE GetBit(LPCVOID pFlags, DWORD_PTR dwBitIndex)
64 {
65         return ((((LPBYTE)(pFlags))[dwBitIndex >> 0x3] >> (BYTE)(dwBitIndex & 0x7)) & 0x1);
66 }
67 */
68 WORD ConvertBreed(WORD wBreed, BOOL b387To412)
69 {
70         WORD    wCvt = wBreed;
71  
72         if(b387To412)   // from PokemonStruct space to Rom space
73         {
74                 if(wCvt > 386)
75                         wCvt = 0;
76                 else if(wCvt >= 252)
77                         wCvt += 25;
78         }
79         else            // from Rom space to PokemonStruct space
80         {
81                 if(wCvt > 411)
82                         wCvt = 0;
83                 else if(wCvt >= 277)
84                         wCvt -= 25;
85                 else if(wCvt >= 252)
86                         wCvt = 0;
87         }
88  
89         return wCvt;
90 }
91  
92 WORD TextToBreed(LPCTSTR szText)
93 {
94         BOOL    bFound = FALSE;
95         DWORD   dwLang, dwLength;
96         WORD    wBreed;
97         LPCTSTR szBreed = NULL;
98  
99         wBreed = (WORD)(_tcstoul(szText, 0, 0));
100         if(wBreed >= BREED_COUNT)
101         {
102                 wBreed = 0;
103         }
104         else if(wBreed == 0)
105         {
106                 dwLength = lstrlen(szText);
107                 for(wBreed = 0; wBreed < BREED_COUNT; ++wBreed)
108                 {
109                         for(dwLang = 0; dwLang < 3; ++dwLang)
110                         {
111                                 if(_tcsnicmp(szText, cfg.pBreedNameList[wBreed].rgszText[dwLang], dwLength) == 0)
112                                 {
113                                         bFound = TRUE;
114                                         break;
115                                 }
116                         }
117                         if(bFound)
118                                 break;
119                 }
120                 if(wBreed >= BREED_COUNT)
121                         wBreed = 0;
122         }
123  
124         return wBreed;
125 }
126  
127 VOID FormatSkillDesc(WORD wSkill, CString &szDesc)
128 {
129         SkillListEntry *pSkill = NULL;
130         DWORD   dwTargetTypeIndex;
131         CString szTemp;
132  
133         szDesc = _T("");
134         pSkill = rom.GetSkillListEntry(wSkill);
135         if(pSkill)
136         {
137                 // type
284 roytam 138                 if(pSkill->bType < dwTypesCount)
139                         szTemp.Format(_T("属性:%s"), szTypes[pSkill->bType]);
140                 else
141                         szTemp.Format(_T("属性:???(0x%02x)"), pSkill->bType);
280 roytam 142                 szDesc = szDesc + szTemp;
143  
144                 // target
145                 dwTargetTypeIndex = GetTargetTypeIndex(pSkill->bTargetType);
146                 if(dwTargetTypeIndex < dwSkillTargetTypesCount)
147                         szTemp.Format(_T("对象:%s"), rgSkillTargetTypes[dwTargetTypeIndex].szName);
148                 else
284 roytam 149                         szTemp.Format(_T("对象:???(0x%02x)"), pSkill->bTargetType);
280 roytam 150                 szDesc = szDesc + _T("\r\n") + szTemp;
151  
152                 // power
153                 if(pSkill->bPower > 1)
154                         szTemp.Format(_T("威力:%lu"), pSkill->bPower);
155                 else
156                         szTemp.Format(_T("威力:"));
157                 szDesc = szDesc + _T("\r\n") + szTemp;
158  
159                 // acc
160                 if(pSkill->bAccuracy > 0)
161                         szTemp.Format(_T("命中:%lu%%"), pSkill->bAccuracy);
162                 else
163                         szTemp.Format(_T("命中:必中"));
164                 szDesc = szDesc + _T("\r\n") + szTemp;
165  
166                 // pp
167                 szTemp.Format(_T("PP:%lu"), pSkill->bPP);
168                 szDesc = szDesc + _T("\r\n") + szTemp;
169  
170                 // priority
171                 szTemp.Format(_T("优先:%li"), (LONG)(pSkill->nPriority));
172                 szDesc = szDesc + _T("\r\n") + szTemp;
173  
174                 // effect ratio
175                 if(pSkill->bPower > 1)
176                         szTemp.Format(_T("效果几率:%lu%%"), pSkill->bEffectRatio);
177                 else
178                         szTemp.Format(_T("效果几率:必然发动"));
179                 szDesc = szDesc + _T("\r\n") + szTemp;
180  
181                 // effect
182                 szTemp.Format(_T("效果:%s"), cfg.pSkillEffList[pSkill->bEffect].rgszText[cfg.dwLang]);
183                 szDesc = szDesc + _T("\r\n") + szTemp;
184  
185                 // special
186                 szTemp.Format(_T("\n特殊:%s"), cfg.pSkillSpecList[wSkill].rgszText[cfg.dwLang]);
187                 szDesc = szDesc + _T("\r\n") + szTemp;
188         }
189 }
190  
191 VOID GetPositionInBox(WORD wIndex, WORD &wPage, WORD &wRow, WORD &wColumn)
192 {
193         if(wIndex > 0 && wIndex < 387)
194         {
195                 wPage = wIndex / 30 + 1;
196                 wRow = (wIndex % 30) / 6 + 1;
197                 wColumn = wIndex % 6 + 1;
198         }
199         else
200         {
201                 wPage = 0;
202                 wRow = 0;
203                 wColumn = 0;
204         }
205 }
206  
207 // CPokemonRomViewerApp
208  
209 BEGIN_MESSAGE_MAP(CPokemonRomViewerApp, CWinApp)
210         ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
211         ON_COMMAND(ID_CONFIG, OnConfig)
212         ON_COMMAND(ID_SHOW_BREED, OnShowBreed)
213         ON_UPDATE_COMMAND_UI(ID_SHOW_BREED, OnUpdateShowBreed)
214         ON_COMMAND(ID_SHOW_EVO, OnShowEvo)
215         ON_UPDATE_COMMAND_UI(ID_SHOW_EVO, OnUpdateShowEvo)
216         ON_COMMAND(ID_SHOW_ITEM, OnShowItem)
217         ON_UPDATE_COMMAND_UI(ID_SHOW_ITEM, OnUpdateShowItem)
218         ON_COMMAND(ID_SHOW_SKILL, OnShowSkill)
219         ON_UPDATE_COMMAND_UI(ID_SHOW_SKILL, OnUpdateShowSkill)
220         ON_COMMAND(ID_SHOW_ENC, OnShowEnc)
221         ON_UPDATE_COMMAND_UI(ID_SHOW_ENC, OnUpdateShowEnc)
222         ON_COMMAND(ID_SHOW_BERRY, OnShowBerry)
223         ON_UPDATE_COMMAND_UI(ID_SHOW_BERRY, OnUpdateShowBerry)
224 END_MESSAGE_MAP()
225  
226  
227 // CPokemonRomViewerApp 构造
228  
229 CPokemonRomViewerApp::CPokemonRomViewerApp()
230 {
231         m_bFirstInstance = TRUE;
232         m_hMutex = NULL;
233  
234         cfg.dwLang = ui_lang_cn;
235         cfg.dwCount = ui_count_none;
236         cfg.pBreedNameList = NULL;
237         cfg.pSkillNameList = NULL;
238         cfg.pSkillEffList = NULL;
239         cfg.pSkillSpecList = NULL;
240         cfg.pItemNameList = NULL;
241         cfg.pItemDescList = NULL;
242         cfg.pSpecNameList = NULL;
243         cfg.pSpecDescList = NULL;
244         cfg.pEncNameList = NULL;
245  
246         m_rgpDlgs[0] = &m_dlgSkill;
247         m_rgpDlgs[1] = &m_dlgEnc;
248         m_rgpDlgs[2] = &m_dlgBreed;
249         m_rgpDlgs[3] = &m_dlgEvo;
250         m_rgpDlgs[4] = &m_dlgItem;
251         m_rgpDlgs[5] = &m_dlgBerry;
252 }
253  
254 CPokemonRomViewerApp::~CPokemonRomViewerApp()
255 {
256         DestroyStringLists();
257         if(m_hMutex)
258                 CloseHandle(m_hMutex);
259 }
260  
261 // 唯一的一个 CPokemonRomViewerApp 对象
262 CPokemonRomViewerApp theApp;
263 ConfigStruct    cfg;
264 CPokemonRom             rom;
265  
266 #define REG_KEY_NAME    _T("PokemonRomViewer")
267 #define SECTION_NAME    _T("Configurations")
268 #define VAL_ROM_PATH    _T("Rom Path")
269 #define VAL_UI_LANG             _T("UI Language")
270 #define VAL_UI_COUNT    _T("UI Count")
271  
272 // CPokemonRomViewerApp 初始化
273 BOOL CPokemonRomViewerApp::InitInstance()
274 {
275         BOOL    bResult = TRUE;
276         INITCOMMONCONTROLSEX    icc;
277         DWORD   cchPathLength;
278         LPTSTR  szPath;
279  
280         icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
281         icc.dwICC = ICC_BAR_CLASSES |
282                                 ICC_LISTVIEW_CLASSES |
283                                 ICC_PROGRESS_CLASS |
284                                 ICC_STANDARD_CLASSES |
285                                 ICC_TAB_CLASSES;
286         InitCommonControlsEx(&icc);
287  
288         CWinApp::InitInstance();
289  
290         if (!AfxOleInit())
291         {
292                 AfxMessageBox(IDP_OLE_INIT_FAILED);
293                 return FALSE;
294         }
295         AfxEnableControlContainer();
296  
297         m_hMutex = CreateMutex(NULL, FALSE, _T("PokemonRomViewer"));
298         if(m_hMutex)
299         {
300                 if(GetLastError() == ERROR_ALREADY_EXISTS)
301                 {
302                         m_bFirstInstance = FALSE;
303                 }
304         }
305         else
306         {
307                 AfxMessageBox(IDS_ERR_INIT);
308                 return FALSE;
309         }
310  
311         szPath = m_szInitialPath.GetBufferSetLength(MAX_PATH);
312         if(szPath)
313         {
314                 cchPathLength = GetCurrentDirectory(MAX_PATH, szPath);
315                 m_szInitialPath.ReleaseBuffer(cchPathLength);
316         }
317  
318         // read config
319         SetRegistryKey(REG_KEY_NAME);
320         ReadConfig();
321         WriteConfig();
322  
323         // create frame
324         CMainFrame* pFrame = new CMainFrame;
325         if (!pFrame)
326                 return FALSE;
327         m_pMainWnd = pFrame;
328         pFrame->LoadFrame(IDR_MAINFRAME,
329                 WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
330                 NULL);
331  
332         // initialize
333         if(bResult)
281 roytam 334         {
292 roytam 335 OutputDebugString(_T("1\n"));
280 roytam 336                 bResult = CreateDialogs();
281 roytam 337         }
280 roytam 338  
339         #ifndef _DEBUG
340         if(bResult)
281 roytam 341         {
280 roytam 342                 bResult = ReadStringLists();
281 roytam 343         }
280 roytam 344         #endif
345  
346         if(bResult)
347         {
292 roytam 348 OutputDebugString(_T("2\n"));
280 roytam 349                 pFrame->ShowWindow(SW_SHOW);
350                 pFrame->UpdateWindow();
351         }
352  
353         #ifdef _DEBUG
354         if(bResult)
281 roytam 355         {
292 roytam 356 OutputDebugString(_T("3\n"));
280 roytam 357                 bResult = ReadStringLists();
281 roytam 358         }
280 roytam 359         #endif
360  
361         if(bResult)
281 roytam 362         {
292 roytam 363 OutputDebugString(_T("4\n"));
280 roytam 364                 ApplyConfig(TRUE, TRUE);
281 roytam 365         }
280 roytam 366  
367         if(!bResult)
281 roytam 368         {
280 roytam 369                 AfxMessageBox(IDS_ERR_INIT);
281 roytam 370         }
280 roytam 371  
372         return bResult;
373 }
374  
375  
376 // CPokemonRomViewerApp 消息处理程序
377  
378  
379  
380 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
381  
382 class CAboutDlg : public CDialog
383 {
384 public:
385         CAboutDlg();
386  
387 // 对话框数据
388         enum { IDD = IDD_ABOUTBOX };
389  
390 protected:
391         virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
392  
393 // 实现
394 protected:
395         DECLARE_MESSAGE_MAP()
396 };
397  
398 CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
399 {
400 }
401  
402 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
403 {
404         CDialog::DoDataExchange(pDX);
405 }
406  
407 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
408 END_MESSAGE_MAP()
409  
410 // 用于运行对话框的应用程序命令
411 void CPokemonRomViewerApp::OnAppAbout()
412 {
413         CAboutDlg aboutDlg;
414         aboutDlg.DoModal();
415 }
416  
417 // CPokemonRomViewerApp 消息处理程序
418 BOOL CPokemonRomViewerApp::ReadStringLists()
419 {
420         BOOL                    bResult;
421         CStringReader   sr;
422  
423         try
424         {
425                 #ifdef _DEBUG
426                 m_dlgWait.BeginWait(TEXT_FILE_COUNT);
427                 #endif
428  
429                 /////////////////////////////////////////
430                 cfg.pBreedNameList = new StringEntry[BREED_COUNT];
431                 if(!cfg.pBreedNameList)
281 roytam 432                 {
280 roytam 433                         throw 0;
281 roytam 434                 }
280 roytam 435  
436                 bResult = sr.BatchReadString(_T("BreedNameList.txt"), cfg.pBreedNameList, BREED_COUNT);
437                 if(!bResult)
281 roytam 438                 {
280 roytam 439                         throw 0;
281 roytam 440                 }
280 roytam 441  
442                 #ifdef _DEBUG
443                 m_dlgWait.IncStep();
444                 #endif
445  
446                 /////////////////////////////////////////
447                 cfg.pSkillNameList = new StringEntry[SKILL_COUNT];
448                 if(!cfg.pSkillNameList)
281 roytam 449                 {
280 roytam 450                         throw 0;
281 roytam 451                 }
280 roytam 452  
453                 bResult = sr.BatchReadString(_T("SkillNameList.txt"), cfg.pSkillNameList, SKILL_COUNT);
454                 if(!bResult)
281 roytam 455                 {
280 roytam 456                         throw 0;
281 roytam 457                 }
280 roytam 458  
459                 #ifdef _DEBUG
460                 m_dlgWait.IncStep();
461                 #endif
462  
463                 /////////////////////////////////////////
464                 cfg.pSkillEffList = new StringEntry[SKILL_EFFECT_COUNT];
465                 if(!cfg.pSkillEffList)
281 roytam 466                 {
280 roytam 467                         throw 0;
281 roytam 468                 }
280 roytam 469  
470                 bResult = sr.BatchReadString(_T("SkillEffList.txt"), cfg.pSkillEffList, SKILL_EFFECT_COUNT);
471                 if(!bResult)
281 roytam 472                 {
280 roytam 473                         throw 0;
281 roytam 474                 }
280 roytam 475  
476                 #ifdef _DEBUG
477                 m_dlgWait.IncStep();
478                 #endif
479  
480                 /////////////////////////////////////////
481                 cfg.pSkillSpecList = new StringEntry[SKILL_COUNT];
482                 if(!cfg.pSkillSpecList)
281 roytam 483                 {
280 roytam 484                         throw 0;
281 roytam 485                 }
280 roytam 486  
487                 bResult = sr.BatchReadString(_T("SkillSpecList.txt"), cfg.pSkillSpecList, SKILL_COUNT);
488                 if(!bResult)
281 roytam 489                 {
280 roytam 490                         throw 0;
281 roytam 491                 }
280 roytam 492  
493                 #ifdef _DEBUG
494                 m_dlgWait.IncStep();
495                 #endif
496  
497                 /////////////////////////////////////////
498                 cfg.pItemNameList = new StringEntry[ITEM_COUNT];
499                 if(!cfg.pItemNameList)
281 roytam 500                 {
280 roytam 501                         throw 0;
281 roytam 502                 }
280 roytam 503  
504                 bResult = sr.BatchReadString(_T("ItemNameList.txt"), cfg.pItemNameList, ITEM_COUNT);
505                 if(!bResult)
281 roytam 506                 {
280 roytam 507                         throw 0;
281 roytam 508                 }
280 roytam 509  
510                 #ifdef _DEBUG
511                 m_dlgWait.IncStep();
512                 #endif
513  
514                 /////////////////////////////////////////
515                 cfg.pItemDescList = new StringEntry[ITEM_COUNT];
516                 if(!cfg.pItemDescList)
281 roytam 517                 {
280 roytam 518                         throw 0;
281 roytam 519                 }
280 roytam 520  
521                 bResult = sr.BatchReadString(_T("ItemDescList.txt"), cfg.pItemDescList, ITEM_COUNT);
522                 if(!bResult)
281 roytam 523                 {
280 roytam 524                         throw 0;
281 roytam 525                 }
280 roytam 526  
527                 #ifdef _DEBUG
528                 m_dlgWait.IncStep();
529                 #endif
530  
531                 /////////////////////////////////////////
532                 cfg.pSpecNameList = new StringEntry[SPEC_COUNT];
533                 if(!cfg.pSpecNameList)
281 roytam 534                 {
280 roytam 535                         throw 0;
281 roytam 536                 }
280 roytam 537  
538                 bResult = sr.BatchReadString(_T("SpecNameList.txt"), cfg.pSpecNameList, SPEC_COUNT);
539                 if(!bResult)
281 roytam 540                 {
280 roytam 541                         throw 0;
281 roytam 542                 }
280 roytam 543  
544                 #ifdef _DEBUG
545                 m_dlgWait.IncStep();
546                 #endif
547  
548                 /////////////////////////////////////////
549                 cfg.pSpecDescList = new StringEntry[SPEC_COUNT];
550                 if(!cfg.pSpecDescList)
281 roytam 551                 {
280 roytam 552                         throw 0;
281 roytam 553                 }
280 roytam 554  
555                 bResult = sr.BatchReadString(_T("SpecDescList.txt"), cfg.pSpecDescList, SPEC_COUNT);
556                 if(!bResult)
281 roytam 557                 {
280 roytam 558                         throw 0;
281 roytam 559                 }
280 roytam 560  
561                 #ifdef _DEBUG
562                 m_dlgWait.IncStep();
563                 #endif
564  
565                 /////////////////////////////////////////
566                 cfg.pEncNameList = new StringEntry[ENC_COUNT];
567                 if(!cfg.pEncNameList)
281 roytam 568                 {
280 roytam 569                         throw 0;
281 roytam 570                 }
280 roytam 571  
572                 bResult = sr.BatchReadString(_T("EncNameList.txt"), cfg.pEncNameList, ENC_COUNT);
573                 if(!bResult)
281 roytam 574                 {
280 roytam 575                         throw 0;
281 roytam 576                 }
280 roytam 577  
578                 #ifdef _DEBUG
579                 m_dlgWait.IncStep();
580                 #endif
581         }
582         catch(int)
583         {
584                 bResult = FALSE;
585         }
586  
587         if(!bResult)
588         {
589                 #ifdef _DEBUG
590                 m_dlgWait.ShowWindow(SW_HIDE);
591                 #endif
592  
593                 DestroyStringLists();
594         }
595  
596         return bResult;
597 }
598  
599 VOID CPokemonRomViewerApp::DestroyStringLists()
600 {
601         if(cfg.pBreedNameList)
602         {
603                 delete [](cfg.pBreedNameList);
604                 cfg.pBreedNameList = NULL;
605         }
606         if(cfg.pSkillNameList)
607         {
608                 delete [](cfg.pSkillNameList);
609                 cfg.pSkillNameList = NULL;
610         }
611         if(cfg.pSkillEffList)
612         {
613                 delete [](cfg.pSkillEffList);
614                 cfg.pSkillEffList = NULL;
615         }
616         if(cfg.pSkillSpecList)
617         {
618                 delete [](cfg.pSkillSpecList);
619                 cfg.pSkillSpecList = NULL;
620         }
621         if(cfg.pItemNameList)
622         {
623                 delete [](cfg.pItemNameList);
624                 cfg.pItemNameList = NULL;
625         }
626         if(cfg.pItemDescList)
627         {
628                 delete [](cfg.pItemDescList);
629                 cfg.pItemDescList = NULL;
630         }
631         if(cfg.pSpecNameList)
632         {
633                 delete [](cfg.pSpecNameList);
634                 cfg.pSpecNameList = NULL;
635         }
636         if(cfg.pSpecDescList)
637         {
638                 delete [](cfg.pSpecDescList);
639                 cfg.pSpecDescList = NULL;
640         }
641         if(cfg.pEncNameList)
642         {
643                 delete [](cfg.pEncNameList);
644                 cfg.pEncNameList = NULL;
645         }
646 }
647  
648  
649 VOID CPokemonRomViewerApp::ReadConfig()
650 {
651         cfg.szRomPath = GetProfileString(SECTION_NAME, VAL_ROM_PATH, NULL);
652         cfg.dwCount = GetProfileInt(SECTION_NAME, VAL_UI_COUNT, ui_count_none);
653         cfg.dwLang = GetProfileInt(SECTION_NAME, VAL_UI_LANG, ui_lang_jp);
654 }
655  
656 VOID CPokemonRomViewerApp::WriteConfig()
657 {
658         if(m_bFirstInstance)
659         {
660                 WriteProfileString(SECTION_NAME, VAL_ROM_PATH, cfg.szRomPath);
661                 WriteProfileInt(SECTION_NAME, VAL_UI_COUNT, cfg.dwCount);
662                 WriteProfileInt(SECTION_NAME, VAL_UI_LANG, cfg.dwLang);
663         }
664 }
665  
666 BOOL CPokemonRomViewerApp::CreateDialogs()
667 {
668         BOOL    bResult;
669         DWORD   dwIndex;
670  
671         for(dwIndex = 0; dwIndex < APP_DLG_COUNT; ++dwIndex)
672         {
673                 bResult = m_rgpDlgs[dwIndex]->Create(m_rgpDlgs[dwIndex]->m_uTemplateId, m_pMainWnd);
674                 if(!bResult)
675                         break;
676  
677                 //m_rgpDlgs[dwIndex]->ShowWindow(SW_HIDE);
678         }
679  
680         if(bResult)
681         {
682                 bResult = m_dlgWait.Create(CWaitDlg::IDD, m_pMainWnd);
683                 //if(bResult)
684                 //      m_dlgWait.ShowWindow(SW_HIDE);
685         }
686  
687         return bResult;
688 }
689  
690 BOOL CPokemonRomViewerApp::ApplyConfig(BOOL bRomChanged, BOOL bUILangChanged)
691 {
692         BOOL    bResult = TRUE;
693         DWORD   dwIndex;
694         CString szCaption;
695         CString szRomName;
696  
697         if(bRomChanged)
698         {
699                 // open rom
700                 bResult = rom.OpenRom(cfg.szRomPath);
701                 if(bResult)
702                 {
703                         if(rom.m_bIsFileReadOnly)
704                         {
705                                 AfxMessageBox(IDS_WRN_ROM_READONLY);
706                         }
707                 }
708  
709                 // refresh the caption of the main window
710                 szCaption = AfxGetAppName();
711                 szRomName = rom.GetRomName();
712                 if(szRomName.GetLength() > 0)
713                         szCaption = szCaption + _T(" - ") + rom.GetRomName();
714  
715                 m_pMainWnd->SetWindowText(szCaption);
716         }
717  
718         if(bResult)
719         {
720                 // update each dialog
721                 m_dlgWait.BeginWait(APP_DLG_COUNT);
722                 for(dwIndex = 0; dwIndex < APP_DLG_COUNT; ++dwIndex)
723                 {
724                         m_rgpDlgs[dwIndex]->OnConfigChanged(bRomChanged, bUILangChanged);
725                         m_dlgWait.IncStep();
726                 }
727         }
728         else
729         {
730                 // hide each dialog, and report error
731                 for(dwIndex = 0; dwIndex < APP_DLG_COUNT; ++dwIndex)
732                 {
733                         m_rgpDlgs[dwIndex]->ShowWindow(SW_HIDE);
734                 }
735  
736                 AfxMessageBox(IDS_ERR_ROM_READ);
737         }
738  
739         return bResult;
740 }
741  
742 void CPokemonRomViewerApp::OnConfig()
743 {
744         // TODO: 在此添加命令处理程序代码
745         CConfigDlg      cd;
746         BOOL    bRomChanged = FALSE;
747         BOOL    bUILangChanged = FALSE;
748  
749         if(cd.DoModal() == IDOK)
750         {
751                 if(cfg.szRomPath.CompareNoCase(cd.m_szRomPath) != 0)
752                 {
753                         cfg.szRomPath = cd.m_szRomPath;
754                         bRomChanged = TRUE;
755                 }
756  
757                 if(cfg.dwLang != cd.m_dwLang ||
758                         cfg.dwCount != cd.m_dwCount)
759                 {
760                         bUILangChanged = TRUE;
761                         cfg.dwLang = cd.m_dwLang;
762                         cfg.dwCount = cd.m_dwCount;
763                 }
764  
765                 ApplyConfig(bRomChanged, bUILangChanged);
766         }
767  
768         if(bRomChanged || bUILangChanged)
769                 WriteConfig();
770 }
771  
772 void CPokemonRomViewerApp::OnShowBreed()
773 {
774         // TODO: 在此添加命令处理程序代码
775         m_dlgBreed.ShowWindow(SW_SHOWDEFAULT);
776         m_dlgBreed.SetForegroundWindow();
777 }
778  
779 void CPokemonRomViewerApp::OnUpdateShowBreed(CCmdUI *pCmdUI)
780 {
781         // TODO: 在此添加命令更新用户界面处理程序代码
782         pCmdUI->Enable(rom.m_bOpened);
783 }
784  
785 void CPokemonRomViewerApp::OnShowEvo()
786 {
787         // TODO: 在此添加命令处理程序代码
788         m_dlgEvo.ShowWindow(SW_SHOWDEFAULT);
789         m_dlgEvo.SetForegroundWindow();
790 }
791  
792 void CPokemonRomViewerApp::OnUpdateShowEvo(CCmdUI *pCmdUI)
793 {
794         // TODO: 在此添加命令更新用户界面处理程序代码
795         pCmdUI->Enable(rom.m_bOpened);
796 }
797  
798 void CPokemonRomViewerApp::OnShowItem()
799 {
800         // TODO: 在此添加命令处理程序代码
801         m_dlgItem.ShowWindow(SW_SHOWDEFAULT);
802         m_dlgItem.SetForegroundWindow();
803 }
804  
805 void CPokemonRomViewerApp::OnUpdateShowItem(CCmdUI *pCmdUI)
806 {
807         // TODO: 在此添加命令更新用户界面处理程序代码
808         pCmdUI->Enable(rom.m_bOpened);
809 }
810  
811 void CPokemonRomViewerApp::OnShowSkill()
812 {
813         // TODO: 在此添加命令处理程序代码
814         m_dlgSkill.ShowWindow(SW_SHOWDEFAULT);
815         m_dlgSkill.SetForegroundWindow();
816 }
817  
818 void CPokemonRomViewerApp::OnUpdateShowSkill(CCmdUI *pCmdUI)
819 {
820         // TODO: 在此添加命令更新用户界面处理程序代码
821         pCmdUI->Enable(rom.m_bOpened);
822 }
823  
824 void CPokemonRomViewerApp::OnShowEnc()
825 {
826         // TODO: 在此添加命令处理程序代码
827         m_dlgEnc.ShowWindow(SW_SHOWDEFAULT);
828         m_dlgEnc.SetForegroundWindow();
829 }
830  
831 void CPokemonRomViewerApp::OnUpdateShowEnc(CCmdUI *pCmdUI)
832 {
833         // TODO: 在此添加命令更新用户界面处理程序代码
834         pCmdUI->Enable(rom.m_bOpened);
835 }
836  
837 void CPokemonRomViewerApp::OnShowBerry()
838 {
839         // TODO: 在此添加命令处理程序代码
840         m_dlgBerry.ShowWindow(SW_SHOWDEFAULT);
841         m_dlgBerry.SetForegroundWindow();
842 }
843  
844 void CPokemonRomViewerApp::OnUpdateShowBerry(CCmdUI *pCmdUI)
845 {
846         // TODO: 在此添加命令更新用户界面处理程序代码
847         pCmdUI->Enable(rom.m_bOpened);
848 }