. Util 모듈

이 모듈에는 프로젝트 전체에 걸쳐 자주 호출되는 함수와 클래스들이 정의되어 있다. 기존의 Util 모듈에는 전역 함수들만 두도록 하고 SOption 클래스는 Option 모듈로, CMru, CHistory 클래스는 Mru 모듈로 분할한다. 다음은 분할 후의 헤더 파일이다. 각각의 헤더 파일에는 이중 컴파일을 방지하기 위해 헤더 파일별로 고유한 매크로를 정의한다.

 

Util.h

Mru.h

#ifndef __UTIL_H

#define __UTIL_H

 

#define STARTQ TCHAR qMes[256];\

          static qcount=0;\

          LARGE_INTEGER qs,s1,s2,s3,qe,qfreq;\

          double g1,g2,g3,ge;\

          QueryPerformanceFrequency(&qfreq);\

          QueryPerformanceCounter(&qs);\

          s1=s2=s3=qs;

#define SPOT1 QueryPerformanceCounter(&s1);

#define SPOT2 QueryPerformanceCounter(&s2);

#define SPOT3 QueryPerformanceCounter(&s3);

#define ENDQ QueryPerformanceCounter(&qe);\

          g1=((double)(s1.QuadPart-qs.QuadPart))/((double)qfreq.QuadPart);\

          g2=((double)(s2.QuadPart-qs.QuadPart))/((double)qfreq.QuadPart);\

          g3=((double)(s3.QuadPart-qs.QuadPart))/((double)qfreq.QuadPart);\

          ge=((double)(qe.QuadPart-qs.QuadPart))/((double)qfreq.QuadPart);\

          sprintf(qMes, "%04d : S1=%.6f,S2=%.6f,S3=%.6f,QE=%.6f\r\n",++qcount,g1,g2,g3,ge);\

          OutputDebugString(qMes);

 

#define SHLM HKEY_LOCAL_MACHINE

#define SHCU HKEY_CURRENT_USER

#define SHCR HKEY_CLASSES_ROOT

 

void WriteLogFile(TCHAR *strLog,...);

void MySetImeMode(HWND hEdit, BOOL bHan);

UINT SHRegReadInt(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, INT nDefault);

BOOL SHRegReadString(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, LPCTSTR lpDefault,

   LPTSTR lpRet, DWORD nSize);

BOOL SHRegWriteInt(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, UINT nData);

BOOL SHRegWriteString(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, LPCTSTR lpData);

void SavePosition(HWND hWnd, TCHAR *Key);

void LoadPosition(HWND hWnd, TCHAR *Key, RECT *Def=NULL);

HRESULT MyCreateShortCut(LPCSTR szSrcFile, LPSTR szLnkFile, LPSTR szArgument, LPSTR szDesc);

void MyGetSpecialFolderPath(HWND hWnd, int nFolder, TCHAR *szPath);

void MoveToParentCenter(HWND hWnd);

BOOL BrowseFolder(HWND hParent, LPCTSTR szTitle, LPCTSTR StartPath, TCHAR *szFolder);

void ParseFtpInfo(TCHAR *Path, TCHAR *Server, TCHAR *User, TCHAR *Pass, TCHAR *& File, int &Port);

void EncodePath(TCHAR *Path, TCHAR *EncPath);

void EncodeBinary(PBYTE buf, int Length, BOOL bEncode);

int BinaryToTextEnccode(PBYTE Src, int length, PBYTE Dest, BOOL bEncode);

int DecodeText(TCHAR *EncText, TCHAR *Text);

void EncodeText(TCHAR *Text, TCHAR *EncText);

 

#define FIF_DEEP 1

#define FIF_DIRFILTER 2

#define FIF_INCHID 4

typedef int (*FIFCALLBACK)(TCHAR *, DWORD, LPVOID);

void FindInFiles(TCHAR *Path, TCHAR *Pattern, DWORD Flags, FIFCALLBACK pCallBack, LPVOID pCustom);

BOOL IsMatch(TCHAR *Path, TCHAR *Pattern);

 

#endif // __UTIL_H

#ifndef __MRU_H

#define __MRU_H

 

class CHistory

{

private:

          TCHAR **data;

          int width;

 

public:

          int num;

          int height;

 

          CHistory();

          CHistory(int awidth,int aheight);

          ~CHistory();

 

          void Init(int awidth, int aheight);

          void ChangeHeight(int aheight);

          void Add(TCHAR *str);

          void Delete(int idx);

          TCHAR *Get(int idx);

          void Set(int idx, TCHAR *str);

          void Empty();

};

 

class CMru

{

private:

          CHistory arMru;

          HMENU hMenu;

          TCHAR Key[MAX_PATH];

 

public:

          UINT MenuID;

          int MaxMru;

 

          CMru();

          ~CMru();

          BOOL InitMRU(TCHAR *aKey, HMENU aMenu, UINT aMenuID, int aMaxMru);

          BOOL ChangeMenu(HMENU aMenu);

          void ChangeMaxMru(int aMaxMru);

          void LoadMRU();

          void SaveMRU();

          void AddMRU(TCHAR *Path);

          void RemoveMRU(int nIndex);

          void ArrangeMenu();

          void GetFilePath(int nIndex,TCHAR *buf);

};

 

#endif // __MRU_H

 

Option.h

#ifndef __OPTION_H

#define __OPTION_H

 

struct SOption

{

          SOption();

          void Init();

          int GetMaxMru();

          int GetUndoLimit();

          void Load(TCHAR *Key);

          void Save(TCHAR *Key);

          void GetStyleColor();

          void SetStyleColor(CParse *Parser);

 

          int StartAction;

          BOOL bExplorerPopup;

          BOOL bAllowMulti;

          BOOL bMaxFirstChild;

          int MaxMru;

          TCHAR DefExt[12];

          BOOL Hangul;

          int OutputHeight;

          BOOL bInitFind;

          BOOL bInitNextFind;

          BOOL bShowToolBar;

          BOOL bShowStatus;

          BOOL bShowFileWnd;

          int FileWndWidth;

          BOOL bShowFileTab;

          BOOL bShowHidden;

          int FilterIndex;

          BOOL bToolBarBig;

          BOOL bToolBarText;

          BOOL bBrowseMode;

          BOOL bSoundFindFail;

          BOOL bWatchChange;

          BOOL bReloadNoAsk;

          BOOL bReloadProject;

 

          int LineRatio;

          BOOL bWrap;

          int nWrap;

          int RightWrap;

          int ColMark;

          int HideSelType;

          int nShowCurLine;

          LOGFONT logfont;

          BOOL bShowMargin;

          BOOL bShowLineNum;

          BOOL bShowEnter;

          BOOL bShowTab;

          BOOL bShowSpace;

          int TabWidth;

          BOOL bNoFirstSpace;

          COLORREF MarColor1;

          COLORREF MarColor2;

          COLORREF NumColor;

          COLORREF MarkColor;

          int ShowTabType;

          int ShowEnterType;

          int ShowSpaceType;

          COLORREF CodeColor;

          COLORREF CurColor;

          COLORREF cBack;

          COLORREF cFore;

          COLORREF cSelFore;

          COLORREF cSelBack;

          BOOL bUseLineEnd;

          BOOL bAllowDrag;

          int CaretWidth;

          BOOL bHideCurLine;

          BOOL bCalcTabWithAvg;

          int UndoLimit;

          BOOL bSpaceForTab;

          BOOL bAutoIndent;

          BOOL bBlockIndentWithTab;

          BOOL bHomeToFirstChar;

          int FindDlgPos;

 

          TCHAR arExt[4][250];

          SParseStyle arStyle[4][32];

          FtpInfo arFtp[32];

 

          LOGFONT prtFont;

          RECT prtMargin;

          BOOL prtbParse;

          BOOL prtnWrap;

          BOOL prtbLineNum;

          BOOL prtbSysHeader;

          BOOL prtbDirect;

          TCHAR prtHeader[256];

          TCHAR prtFooter[256];

          int prtnHeader;

          int prtnFooter;

          TCHAR prtBkText[64];

};

 

#endif // __OPTION_H

 

이미 실습했던 클래스와 함수들이므로 내용은 굳이 볼 필요가 없을 것 같고 어떤 모듈에 어떤 함수가 배치되었는지만 살펴 보도록 하자. 대충의 모양만 살펴 보면 되므로 지면 절약을 위해 글꼴을 좀 작게 인쇄했다.

원래의 Util.h에 있는 선언문들을 적당히 나누어 가지기만 했는데 단, Util.h에 선언되어 있던 FtpInfo 구조체는 Internet.h로 옮길 것이므로 일단 삭제하였다. 또한 bContFIF 변수에 대한 extern 선언도 global.h라는 별도의 모듈에서 전담하므로 Util.h에는 둘 필요가 없다.

구현 파일에는 물론 헤더 파일에 선언한 함수의 본체와 각 클래스의 멤버함수들이 정의되어 있다. 기존의 Util.cpp에 있던 코드들을 각 모듈로 복사하기만 하면 된다. 미리 컴파일된 헤더 기능을 사용하므로 모든 CPP파일은 stdafx.h를 인클루드해야 한다. 구현 파일의 내용은 CD-ROM의 소스를 참조하기 바라되 헤더 파일만 보면 어떻게 분할되었는지 알 수 있으므로 굳이 확인해 볼 필요까지는 없을 것이다.