¾Õ Àý¿¡¼ °´Ã¼ ºÐÇÒÀ» Á÷Á¢ ÇØ º¸¸é¼ ºÐÇÒ ¹æ¹ý°ú °ü·Ã À̷п¡ ´ëÇØ ¾Ë¾Æ º¸¾ÒÀ¸¹Ç·Î ÀÌÁ¦ ApiEditµµ ¶È°°Àº ¹æ¹ýÀ¸·Î °´Ã¼¸¦ ºÐÇÒÇÏÀÚ. ½Ç½À ÀýÂ÷³ª ¹æ¹ýÀº °ÅÀÇ µ¿ÀÏÇÏÁö¸¸ SplitView ¿¹Á¦¿Í´Â ´Þ¸® °´Ã¼°¡ ÈξÀ Å©±â ¶§¹®¿¡ ÀÛ¾÷ÇØ¾ß ÇÒ ¾çÀÌ ´õ ¸¹´Ù. ÀÏ´Ü °´Ã¼ ºÐÇÒ¸¸ ÇÏ¿© ¿ÏÀüÈ÷ µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÏ´Â ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í ³ ÈÄ Ã¢ ºÐÇÒÀ» ÇÒ °ÍÀÌ´Ù. Áö±Ý±îÁö ±×·¡¿Ô´ø °Íó·³ »õ ÇÁ·ÎÁ§Æ®´Â Ç×»ó ÀÌÀü ÇÁ·ÎÁ§Æ®ÀÇ ¿¬¼ÓÀÌ´Ù. ¾ÕÀå¿¡¼ ÀÛ¼ºÇÑ Dangeun13 ÇÁ·ÎÁ§Æ®¸¦ º¹»çÇÏ¿© Dangeun14 ÇÁ·ÎÁ§Æ®¸¦ ¸¸µç´Ù.
SplitView ¿¹Á¦¸¦ ¿Ïº®ÇÏ°Ô ÀÌÇØÇϰí ÀÖ´Ù¸é ÀÌ ÀåÀÇ ½Ç½ÀÀº ¾ÆÁÖ ½¬¿ï °ÍÀ̳ª ±×·¸Áö ¾Ê´Ù¸é µµ´ëü Äڵ尡 ¾î¶»°Ô ¹Ù²î´ÂÁö ¹«Ã´ ¾î·Á¿ö º¸ÀÏ °ÍÀÌ´Ù. SplitView ¿¹Á¦´Â ºñ·Ï ªÁö¸¸ ÀÌ Àå°ú ´ÙÀ½ ÀåÀÇ ÀÌ·ÐÀûÀÎ ±Ù°Å°¡ µÇ´Â Áß¿äÇÑ ¿¹Á¦À̹ǷΠ¾ÆÁ÷ Àß ¸ð¸£°Ú´Ù¸é ´Ù½Ã Çѹø ´õ º¹½ÀÇÏ°í ¿À±â ¹Ù¶õ´Ù. Å« ÇÁ·ÎÁ§Æ®¸¦ ´Ù·ê ¶§´Â ªÀº ¿¹Á¦¸¦ ÅëÇØ Ç×»ó ÀÌ·ÐÀ» ¸ÕÀú È®¸³ÇÑ ÈÄ ½ÇÁ¦ Àû¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.
¾Õ¿¡¼ SplitView ¿¹Á¦¸¦ ¸¸µé ¶§¿Í µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î CApiEdit Ŭ·¡½º¸¦ ÇÁ·¹ÀÓ°ú ºä·Î ºÐÇÒÇÑ´Ù. ÀÌ¹Ì Çß´ø ½Ç½ÀÀ» ¹Ýº¹ÇÏ´Â °ÍÀ̹ǷΠÀÚ¼¼ÇÑ ÀÌ·ÐÀû ¼³¸íÀº »ý·«ÇÏ°í ½Ç½À °úÁ¤¿¡ ´ëÇØ ¿ä¾àÀûÀ¸·Î Á¤¸®ÇÏ¿´´Ù. °´Ã¼ ºÐÇÒ¿¡ ´ëÇÑ ÀÌ·ÐÀº SplitView ¿¹Á¦¿Í °ÅÀÇ µ¿ÀÏÇÏÁö¸¸ ApiEdit¿¡´Â ±× ¿Ü¿¡µµ º¹ÀâÇÑ ¹®Á¦µéÀÌ ¸î°¡Áö ´õ Àִµ¥ ÁÖ·Î ¸â¹öµéÀ» ¾î¶»°Ô ³ª´©¾î °¡Áú °ÍÀΰ¡ÀÇ ¹®Á¦ÀÌ´Ù.
´ëºÎºÐÀÇ ÄÚµå´Â 1.0¿¡ ÀÖ´ø Äڵ带 ±×´ë·Î °¡Á® ¿À°Å³ª ¾à°£¾¿¸¸ º¯°æµÉ °ÍÀÌ´Ù. ÀÌ ½Ç½À¿¡¼ "¿ø·¡ ApiEdit"¶ó°í ĪÇÏ´Â °ÍÀº 1.0ÀÇ ApiEdit ¸ðµâÀ» ÀǹÌÇÏ´Â °ÍÀε¥ ±¸Ã¼ÀûÀ¸·Î Dangeun13ÀÇ ApiEdit.cpp¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ´ÙÀ½ ¼ø¼´ë·Î ½Ç½ÀÀ» ÁøÇàÇϴµ¥ °úÁ¤ÀÌ »ó´çÈ÷ ±æ¾î ½Ã°£ÀÌ ¿À·¡ °É¸°´Ù. ÀÌ ¹®¼´ë·Î ¿©·¯ ¹ø Å×½ºÆ®¸¦ ÇßÀ¸¹Ç·Î °úÁ¤À» ±×´ë·Î µû¶óÇÏ¸é °´Ã¼ ºÐÇÒÀÌ Á¤È®ÇÏ°Ô ¿Ï·áµÈ´Ù.
ApiEdit.h¿¡ ¸ðµç À©µµ¿ì Ŭ·¡½ºÀÇ ·çÆ®ÀÎCWindow Ŭ·¡½º¸¦ ¼±¾ðÇÑ´Ù.
¾Õ¿¡¼ ¸¸µé¾ú´ø Ŭ·¡½º¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. À©µµ¿ì ÇÚµéÀÎ hWnd¿Í ÆÄ±«ÀÚ, ±×¸®°í ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â OnMessage ¼ø¼ö °¡»ó ÇÔ¼ö¸¸ ¸â¹ö·Î
Æ÷ÇԵǾî ÀÖ´Ù.
class CWindow
{
public:
HWND hWnd;
~CWindow();
virtual LRESULT OnMessage(UINT iMessage,WPARAM wParam,LPARAM lParam)=0;
};
ÆÄ±«ÀÚµµ µ¿ÀÏÇÏ°Ô ÀÛ¼ºÇÑ´Ù. ¹°·Ð ÀÌ ÄÚµå´Â ApiEdit.cpp¿¡ ÀÛ¼ºÇϴµ¥ _RegisterHelper Àü¿ª µµ¿ì¹Ì °´Ã¼ ¼±¾ð¹® ´ÙÀ½¿¡ ÀÛ¼ºÇÑ´Ù. ·çÆ® Ŭ·¡½ºÀÎ CWindowÀÇ ÆÄ±«ÀÚ¿¡¼ °´Ã¼¸¦ Á¦°ÅÇϹǷΠCApiEdit¸¦ ºñ·ÔÇÑ ÆÄ»ý Ŭ·¡½ºµéÀº °´Ã¼ ¸Ê¿¡¼ ÀÚ½ÅÀ» Á¦°ÅÇÏ´Â ÄÚµå´Â ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ µÈ´Ù.
CWindow::~CWindow()
{
if (_RegisterHelper.arObj)
_RegisterHelper.RemoveObject(hWnd);
}
±×¸®°í ApiEdit.cpp¿¡ ÀÛ¼ºµÇ¾î ÀÖ´Â µµ¿ì¹Ì °´Ã¼¸¦ ¼öÁ¤ÇÑ´Ù. ¿ª½Ã ¾Õ¿¡¼ ¸¸µç ¿¹Á¦¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î ¼öÁ¤ÇÑ´Ù. CApiEdit *¸¦ CWindow *·Î ¸ðµÎ º¯°æÇϰí RemoveObjectÀÇ DestroyWindow È£ÃâÀ» »èÁ¦ÇÑ´Ù. ÀÌÁ¦ µµ¿ì¹Ì´Â CWindow·ÎºÎÅÍ ÆÄ»ýµÈ ¸ðµç °´Ã¼µéÀ» °ü¸®ÇÒ ¼ö ÀÖ´Ù.
ApiEditProcÀÇ pAE¸¦ CWindow *ŸÀÔÀ¸·Î ¹Ù²Ù¾î
CWindow ÆÄ»ý Ŭ·¡½ºÀÇ À©µµ¿ì·Î Àü´ÞµÇ´Â ¸ðµç ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.
LRESULT CALLBACK ApiEditProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
CWindow *pAE;
pAE=_RegisterHelper.FindObject(hWnd);
if (pAE == NULL) {
pAE=(CWindow *)((LPCREATESTRUCT)lParam)->lpCreateParams;
_RegisterHelper.AddObject(hWnd,pAE);
}
return pAE->OnMessage(iMessage, wParam, lParam);
}
µµ¿ì¹ÌÀÇ »ý¼ºÀÚ¿¡¼ ApiEditText À©µµ¿ì Ŭ·¡½º¸¦ Ãß°¡ µî·ÏÇÑ´Ù.
ÀÌ À©µµ¿ì´Â ApiEditÀÇ ±âº» ºä·Î »ç¿ëµÈ´Ù.
CRegisterHelper::CRegisterHelper()
{
....
RegisterClass(&WndClass);
WndClass.lpszClassName="ApiEditText";
RegisterClass(&WndClass);
....
À©µµ¿ì Ŭ·¡½ºÀÇ À̸§¸¸ ¹Ù²î¾úÀ» »Ó ¸ðµç ¼Ó¼ºÀº ApiEdit ÇÁ·¹ÀÓ°ú µ¿ÀÏÇÏ´Ù. ¹è°æ ºê·¯½Ãµµ ¾ø°í Ä¿¼µµ µ¿ÀÏÇÏ¸ç ½ÉÁö¾î À©µµ¿ì ÇÁ·Î½ÃÀúµµ °øÀ¯ÇÑ´Ù. À̸§¸¸ ´Ù¸¥ ¶È°°Àº À©µµ¿ì Ŭ·¡½º¸¦ Çϳª ´õ ¸¸µé¾úÀ» »ÓÀε¥ ÇöÀç ´Ü°è¿¡¼´Â ºä¿Í ÇÁ·¹ÀÓÀÌ °°Àº À©µµ¿ì Ŭ·¡½º·ÎºÎÅÍ »ý¼ºµÇ¾îµµ º° ¹®Á¦°¡ ¾ø´Ù. ¿Ö³ÄÇÏ¸é µµ¿ì¹Ì°¡ À©µµ¿ì Ŭ·¡½º°¡ ¾Æ´Ñ °´Ã¼ÀÇ Å¸ÀÔÀ¸·Î ¸Þ½ÃÁö ó¸® ÇÔ¼ö¸¦ ¼±ÅÃÇϱ⠶§¹®ÀÌ´Ù.
ApiEdit.h¿¡ Áö¿øÇÏ´Â ºäÀÇ Å¸ÀÔ¿¡ ´ëÇÑ ¿°ÅÇü°ú ÇÁ·¹ÀÓÀÌ ¸ðµç ºä¸¦
ÇѲ¨¹ø¿¡ °ü¸®ÇÒ ¼ö ÀÖ´Â ¸ÅÅ©·Î ÇÔ¼ö¸¦ ¼±¾ðÇÑ´Ù.
enum {TEXT_VIEW, HEXA_VIEW};
#define ForAllView(fn) for (int aet=0;aet<4 && arView[aet];aet++) {\
arView[aet]->fn;\
}
ºäÀÇ Å¸ÀÔÀº ÅØ½ºÆ® ºä, Çí»ç ºä ÀÏ´Ü µÎ°¡ÁöÀÌÁö¸¸ ¾ó¸¶µçÁö ´õ ´Ã¾î³¯ ¼ö ÀÖÀ¸¸ç Â÷ÈÄ¿¡ ´õ ¸¹Àº ºä¸¦ Ãß°¡ÇÒ °ÍÀÌ´Ù. Çí»ç ºä´Â ÇÑÂü ÈÄ¿¡³ª ¸¸µé¾î º¸°ÚÁö¸¸ ÀÏ´Ü ±×·± ºä¸¦ ¸¸µé °èȹÀ̶ó´Â °ÍÀº ¾Ë¾ÆµÎÀÚ. ºäÀÇ Å¸ÀÔÀ» ´Ù¾çÇÏ°Ô ¹Ù²ã°¡¸ç ¾²±â À§ÇØ ApiEdit¸¦ ºÐÇÒÇϰí ÀÖ´Â ÁßÀÌ´Ù. ForAllView ¸ÅÅ©·Î´Â Á¸ÀçÇÏ´Â ¸ðµç ºä¸¦ ¼øÈ¸ÇÏ¸é¼ fn ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¸ÅÅ©·ÎÀÌ´Ù. È£½ºÆ®¿¡¼ ¼³Á¤ »óŸ¦ º¯°æÇϸé ÇÁ·¹ÀÓÀº »ý¼ºµÇ¾î ÀÖ´Â ¸ðµç ºä¿¡ ´ëÇØ ¼³Á¤ º¯°æ ÇÔ¼ö¸¦ È£ÃâÇØ¾ß Çϴµ¥ ±×¶§¸¶´Ù ·çÇÁ¸¦ ±¸¼ºÇϱâ´Â ¹ø°Å·Î¿ì¹Ç·Î ¹Ì¸® ¸ÅÅ©·Î ÇÔ¼ö¸¦ ÀÛ¼ºÇØ µÎ¾ú´Ù. ¿¹¸¦ µé¾î ¸ðµç ºäÀÇ ÁÙ°£À» Á¶Á¤ÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ È£ÃâÇÑ´Ù.
ForAllView(SetLineRatio(aRatio))
¸ÅÅ©·Î³»¿¡ ¼¼¹ÌÄÝ·ÐÀÌ Æ÷ÇԵǾî ÀÖÀ¸¹Ç·Î ¼¼¹ÌÄÝ·ÐÀº µÚ¿¡ ºÙÀÌÁö ¸»¾Æ¾ß ÇÑ´Ù. ¹°·Ð ºÙ¿©µµ ¹«½ÃµÇ¹Ç·Î º° »ó°üÀº ¾ø´Ù. ApiEdit´Â ÃÖ´ë 4°³±îÁö ºä¸¦ ºÐÇÒÇÒ ¼ö ÀÖ°í Á¸ÀçÇÏ´Â ºäÀÇ ¹øÈ£´Â 0ºÎÅÍ ¿¬¼ÓÀûÀ̱⠶§¹®¿¡ ÀÌ·± ÀÚµ¿ÈµÈ ¸ÅÅ©·Î ±¸¼ºÀÌ °¡´ÉÇÏ´Ù.
CWindow¸¦ Á¤ÀÇÇÏ°í °´Ã¼ ¸ÊÀÌ Å¬·¡½º °èÃþÀ» Áö¿øÇϱâ À§ÇÑ Áغñ¸¦ ¸¶ÃÆ´Ù. ´ÙÀ½Àº ÇÁ·¹ÀÓ Å¬·¡½º¸¦ ÀÛ¼ºÇÑ´Ù. ¿ø·¡ CApiEdit Ŭ·¡½ºÀÇ ¸â¹ö Áß ¹®¼³ª Àü¿ª ¼³Á¤°ú »ó°üÀÖ´Â ¸â¹öµéÀÌ ÇÁ·¹ÀÓ¿¡ ¼Ò¼ÓµÉ °ÍÀÌ´Ù. ºä °ü¸®¸¦ À§ÇØ »õ·Î Ãß°¡µÇ´Â ¸â¹ö º¯¼ö¿Í ÇÔ¼öµéµµ ¹°·Ð ÀÖ´Ù. ´ÙÀ½ ¼ø¼¿¡ µû¶ó ½Ç½ÀÀ» ÁøÇàÇÑ´Ù.
¸â¹ö ¸ñ·Ï¿¡ º¯È°¡ ¸¹À¸¹Ç·Î ApiEdit.h¿¡ ¼±¾ðµÇ¾î ÀÖ´Â
CApiEdit Ŭ·¡½º ¼±¾ð¹®À» ¿ÏÀüÈ÷ »èÁ¦ÇÏ°í ´ÙÀ½°ú °°ÀÌ ´Ù½Ã ÀÛ¼ºÇÑ´Ù. Ŭ·¡½º ¼±¾ð¹® ÀÌÀü¿¡ ÀÖ´Â tagLine ±¸Á¶Ã¼³ª
UndoRecord ±¸Á¶Ã¼, ±âŸ ¿°ÅÇü ¼±¾ð µîÀº ±×´ë·Î µÎ¸é µÈ´Ù. Á÷Á¢ ÀÔ·ÂÇϱ⠽ÈÀ¸¸é CD-ROMÀÇ ¼Ò½º¿¡¼ º¹»çÇØ ¿ÀµÇ ±×·¸´õ¶óµµ ½Ç½ÀÀº
ÁøÇàÇØ º¸±â ¹Ù¶õ´Ù.
class CApiEditText;
class CApiEdit : public CWindow
{
friend class CApiEditText;
friend class CParse;
friend class CParseCpp;
friend class CParseNull;
friend class CParseHtml;
friend class CParseSql;
private:
TCHAR *buf;
static HFONT hLineNumFont;
static HCURSOR hCSel,hCCopy,hCMove,hCMargin,hCNoDrop;
BOOL bReadOnly;
int buflen;
int doclen;
BOOL bWantTab;
BOOL bModified;
int UndoSize;
int UndoMin;
int saveur;
int URtick;
int URnest;
int LastEditOff;
DWORD dwFormat;
BOOL bUseLineEnd;
BOOL bAllowDrag;
BOOL bSpaceForTab;
BOOL bAutoIndent;
BOOL bBlockIndentWithTab;
BOOL bHomeToFirstChar;
int HideSelType;
int nShowCurLine;
BOOL bHideCurLine;
int CaretWidth;
BOOL bCalcTabWithAvg;
COLORREF MarColor1, MarColor2;
COLORREF NumColor;
COLORREF MarkColor;
COLORREF CodeColor;
COLORREF CurColor;
COLORREF cFore,cBack;
COLORREF cSelFore,cSelBack;
public:
CApiEdit();
UndoRecord *pUR;
int URSize;
int nowur;
CApiEditText *arView[4];
int ActiveView;
BOOL Create(int x,int y,int w,int h,DWORD style,UINT id,HWND hParent);
LRESULT OnMessage(UINT iMessage,WPARAM wParam,LPARAM lParam);
BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void OnPaint(HWND hWnd);
void OnSetFocus(HWND hWnd, HWND hwndOldFocus);
void OnDestroy(HWND hWnd);
void OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
void OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags);
void OnLButtonUp(HWND hWnd, int x, int y, UINT keyFlags);
void OnSize(HWND hWnd, UINT state, int cx, int cy);
void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);
BOOL OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg);
BOOL IsDBCS(int nPos);
int GetPrevOff(int nPos);
int GetNextOff(int nPos);
void Insert(int nPos, TCHAR *str, BOOL bRec=TRUE);
void Delete(int nPos, int nCount, BOOL bRec=TRUE);
void SetWrap(int aWrap);
void Invalidate(int Pos1, int Pos2=-1);
int FindParaStart(int nPos);
int IncludeEnter(int nPos);
void ClearBookmark();
void ToggleBookmark(int Para, int Mark);
void GotoBookmark(int Mark);
void GotoLine(int Line, int Col=0, int Type=0);
static void LoadAeResource();
static void UnLoadAeResource();
BOOL GetModified() { return bModified; }
void SetModified(BOOL aModi);
void InitDoc();
void SetText(TCHAR *TextBuf, int dwSize);
void GetText(TCHAR *TextBuf, int BufSize, int s=-1, int e=-1);
int GetTextLength();
BOOL GetReadOnly() { return bReadOnly; }
void SetReadOnly(BOOL aReadOnly);
void GetSelect(int &s, int &e);
void SetSelect(int s, int e, BOOL bFind);
BOOL GetShowState(int nIndex);
void SetShowState(int nIndex, BOOL aValue);
int GetLineRatio();
void SetLineRatio(int aLineHeight);
int GetWrap();
int GetShowCurLine() { return nShowCurLine; }
void SetShowCurLine(int aShowCurLine);
int GetTabWidth();
void SetTabWidth(int aTabWidth);
int GetHideSelType() { return HideSelType; }
void SetHideSelType(int aHideSelType);
void GetFont(LOGFONT *alogfont);
void SetFont(LOGFONT *alogfont);
COLORREF GetForeColor() { return cFore; }
void SetForeColor(COLORREF acol);
COLORREF GetBackColor() { return cBack; }
void SetBackColor(COLORREF acol);
COLORREF GetSelForeColor() { return cSelFore; }
void SetSelForeColor(COLORREF acol);
COLORREF GetSelBackColor() { return cSelBack; }
void SetSelBackColor(COLORREF acol);
BOOL GetNoFirstSpace();
void SetNoFirstSpace(BOOL aNoFirstSpace);
BOOL GetWantTab() { return bWantTab; }
void SetWantTab(BOOL aWantTab) { bWantTab=aWantTab; }
int GetShowTabType();
void SetShowTabType(int aShowTabType);
int GetShowEnterType();
void SetShowEnterType(int aShowEnterType);
int GetShowSpaceType();
void SetShowSpaceType(int aShowSpaceType);
COLORREF GetMarColor1() { return MarColor1; }
void SetMarColor1(COLORREF acol);
COLORREF GetMarColor2() { return MarColor2; }
void SetMarColor2(COLORREF acol);
COLORREF GetMarkColor() { return MarkColor; }
void SetMarkColor(COLORREF acol);
COLORREF GetCodeColor() { return CodeColor; }
void SetCodeColor(COLORREF acol);
COLORREF GetCurColor() { return CurColor; }
void SetCurColor(COLORREF acol);
COLORREF GetNumColor() { return NumColor; }
void SetNumColor(COLORREF acol);
BOOL GetUseLineEnd() { return bUseLineEnd; }
void SetUseLineEnd(BOOL aUseLineEnd) { bUseLineEnd=aUseLineEnd; }
BOOL GetAllowDrag() { return bUseLineEnd; }
void SetAllowDrag(BOOL aAllowDrag) { bAllowDrag=aAllowDrag; }
int GetCaretWidth() { return CaretWidth; }
void SetCaretWidth(int aCaretWidth);
BOOL GetHideCurLine() { return bHideCurLine; }
void SetHideCurLine(BOOL aHideCurLine);
BOOL GetCalcTabWithAvg() { return bCalcTabWithAvg; }
void SetCalcTabWithAvg(int aCalcTabWithAvg);
int GetRightWrap();
void SetRightWrap(int aRightWrap);
int GetColMark();
void SetColMark(int aColMark);
void URInsert(int nPos, TCHAR *str);
void URDelete(int nPos, TCHAR *str);
void URMove(int nPos, int Dest, TCHAR *str);
void Undo();
void Redo();
BOOL CanUndo();
BOOL CanRedo();
void ClearRedo();
void NextRecord();
void AllocURData(int idx,int need,int extra);
int GetUndoSize() { return UndoSize; }
void SetUndoSize(int aSize);
int GetUndoMin() { return UndoMin; }
void SetUndoMin(int aMin);
void SaveModified();
void ArrangeModified();
void StartUndoGroup();
void EndUndoGroup();
CParse* GetParser();
void SetParser(int ParseType);
BOOL FindText(int nPos, TCHAR *what, DWORD dwFlag);
int ReplaceText(int nPos, TCHAR *what, DWORD dwFlag, TCHAR *to);
int GetOffset();
void GetSelRect(RECT &srt);
BOOL bFindSelect;
int GetInfoFromOff(int Type, int nPos=-1);
void GotoLastEditOff();
void SendNotify(int code);
int GetDocInfo(int type);
BOOL GetInsMode();
int GetOffFromPara(int pr, int pc);
BOOL GetSpaceForTab() { return bSpaceForTab; }
void SetSpaceForTab(BOOL aSpaceForTab) { bSpaceForTab=aSpaceForTab; }
BOOL GetAutoIndent() { return bAutoIndent; }
void SetAutoIndent(BOOL aAutoIndent) { bAutoIndent=aAutoIndent; }
BOOL GetBlockIndentWithTab() { return bBlockIndentWithTab; }
void SetBlockIndentWithTab(BOOL aBlockIndentWithTab)
{ bBlockIndentWithTab=aBlockIndentWithTab; }
BOOL GetHomeToFirstChar() { return bHomeToFirstChar; }
void SetHomeToFirstChar(BOOL aHomeToFirstChar) { bHomeToFirstChar=aHomeToFirstChar; }
DWORD GetFormat() { return dwFormat; }
void SetFormat(DWORD aFormat);
DWORD AnalyzeFormat(TCHAR *Text, int dwSize);
int ConvertFormat(DWORD from, DWORD to, TCHAR *src, TCHAR *&dest);
void BeginPrint(Ae_PrintInfo *pi);
BOOL PrintPage(Ae_PrintInfo *pi,int nPage);
void EndPrint(Ae_PrintInfo *pi);
CApiEditText *GetActiveView();
CApiEditText *CreateView(int Type);
void DeleteView(int nView);
};
±× ¸¹´ø ¸â¹ö º¯¼öµéÀÌ ´ëºÎºÐ »èÁ¦µÇ¾úÀ¸¸ç ¹®¼¿Í Á÷Á¢ °ü·ÃÀÌ ÀÖ´Â º¯¼öµé°ú ±âŸ ¸î Á¾·ùÀÇ º¯¼öµé¸¸ ³²¾Ò´Ù. ¾î¶² º¯¼öµéÀÌ »ì¾Æ ³²¾Ò´ÂÁö ¸ñ·ÏÀ» »ìÆì º¸ÀÚ. ¿ì¼± buf, doclen°ú °°ÀÌ ¹®¼ÀÇ µ¥ÀÌÅ͸¦ ±â¾ïÇÏ´Â ¸â¹ö°¡ ÇÁ·¹ÀÓ¿¡ ¼ÓÇϸç Ãë¼Ò ·¹Äڵ带 °ü¸®ÇÏ´Â º¯¼ö Àüüµµ ÇÁ·¹ÀÓ ¼Ò¼ÓÀÌ´Ù. ¸ðµç ºäµéÀÌ °øÀ¯ÇÏ´Â Ä¿¼, ÆùÆ® µîÀÇ Á¤Àû ¸â¹öµµ ÇÁ·¹ÀÓÀÌ °¡Áö¸ç ºä´Â ÇÁ·¹ÀÓÀ¸·ÎºÎÅÍ ÀÌ °ªµéÀ» ÂüÁ¶Çϱ⸸ ÇÑ´Ù.
±× ¿Ü ´Ü¼øÈ÷ °ª¸¸ ±â¾ïÇÏ°í º¯°æ½Ã Ãß°¡ ÀÛ¾÷ÀÌ ÇÊ¿ä¾ø´Â ¼³Á¤ º¯¼öµéÀÌ ÇÁ·¹ÀÓ¿¡ ¼Ò¼ÓµÈ´Ù. ÁÙ°£(LineRatio)À̳ª ÀÚµ¿ °³Çà ¹æ½Ä(nWrap) µîÀÇ ¼³Á¤ º¯¼öµéÀº º¯°æµÉ ¶§ ÀçÁ¤·ÄÀ̳ª È¸é °»½Å, ij·µ ó¸® µîÀÇ Ãß°¡ µ¿ÀÛÀÌ ÇÊ¿äÇϹǷΠºä°¡ °ªÀ» Á÷Á¢ °¡Á®¾ß ÇÏÁö¸¸ bAllowDrag³ª bSpaceForTabÀº ¸¶¿ì½º µå·¡±×°¡ ½ÃÀÛµÉ ¶§³ª ÅÇ Å°°¡ ÀÔ·ÂµÉ ¶§¸¸ Àû¿ëµÇ¹Ç·Î ÀÌ °ªÀÌ ¹Ù²ï´Ù°í ÇØ¼ ºäÀÇ »óŰ¡ º¯ÇÏÁö´Â ¾Ê´Â´Ù. ±×·¡¼ ÀÌ ¼³Á¤°ªÀº ÇÁ·¹ÀÓ¿¡ µÎ°í ºä´Â ÀÌ °ªµéÀÌ ÇÊ¿äÇÒ ¶§ ÂüÁ¶Çϱ⸸ ÇÑ´Ù.
ÇöÀçÇà º¸±â ¿É¼ÇÀ̳ª »ö»ó ¿É¼ÇµéÀº ºä°¡ »ç¿ëÇϱâ´Â ÇÏÁö¸¸ ºäº°·Î °¢°¢ ´Ù¸¥ ¿É¼ÇÀ» Àû¿ëÇÒ °æ¿ì°¡ º°·Î ¾ø±â ¶§¹®¿¡ ÇÁ·¹ÀÓÀÌ ¸â¹ö¸¦ °¡Áö°í ÀÌ °ªÀÌ º¯°æµÉ ¶§ ºä¸¦ ´Ù½Ã ±×¸®µµ·Ï Çß´Ù. ÇÁ·¹ÀÓÀÌ °¡Áö´Â º¯¼ö´Â ¸ðµç ºä¿¡ °øÅëÀûÀ¸·Î Àû¿ëµÇ´Â °ÍµéÀÌ°í ºä°¡ °¡Áö´Â º¯¼ö´Â °³º° ºä¿¡¼ °¢°¢ ´Þ¶óÁú ¼ö ÀÖ´Â °ÍµéÀÌ´Ù.
Ãß°¡µÈ ¸â¹öµµ Àִµ¥ ÇÁ·¹ÀÓ ¾Æ·¡¿¡ ºä°¡ »ý¼ºµÇ¹Ç·Î ¿¬°áµÈ ºäÀÇ ¸ñ·ÏÀ» °ü¸®Çϱâ À§ÇØ arView ¹è¿À» ¸â¹ö·Î ¼±¾ðÇÏ¿´´Ù. ºä´Â CApiEditText ŸÀÔÀ» °¡Áö¹Ç·Î arView ¹è¿ÀÇ Å¸ÀÔÀº CApiEditText *À̸ç ÀÌ ¹è¿ÀÇ Å©±â°¡ 4À̹ǷΠÃÖ´ë 4°³±îÁöÀÇ ºä·Î ºÐÇÒÇÒ ¼ö ÀÖ´Ù. ActiveView´Â Æ÷Ä¿½º¸¦ °¡Áö°í Àִ Ȱ¼ººäÀÇ ¹øÈ£À̸ç Çѹø¿¡ ÇϳªÀÇ ºä¸¸ Ȱ¼ºÈµÉ ¼ö ÀÖ´Ù. ÇÁ·¹ÀÓÀÌ ºäÀÇ Æ÷ÀÎÅ͸¦ ¸â¹ö·Î °¡Áö¹Ç·Î CApiEditText Ŭ·¡½º¸¦ Àü¹æ ¼±¾ðÇÏ¿´À¸¸ç ºä°¡ ÇÁ·¹ÀÓÀÇ ¸ðµç ¸â¹ö¸¦ ÀÚÀ¯·Ó°Ô ¾×¼¼½ºÇϱâ À§ÇØ ÇÁ·»µå·Î ÁöÁ¤ÇÏ¿´´Ù.
È£½ºÆ®¿¡¼ ¿É¼ÇÀ» º¯°æÇÒ ¶§ ºÐÇÒµÈ ¸ðµç ºä¿¡ »õ ¿É¼ÇÀ» Àû¿ëÇØ¾ß ÇÑ´Ù. ±×·¯±â À§Çؼ´Â ¿ÜºÎ¿¡¼ arView ¹è¿À» ÂüÁ¶ÇÒ ¼ö ÀÖ¾î¾ß ÇϹǷΠarView¿Í °ü·Ã º¯¼ö´Â public ¿µ¿ª¿¡ ¼±¾ðÇß´Ù. ¶ÇÇÑ ÀÌ Â÷ÈÄ ÀÛ¼ºÇÒ ÆíÁý Á¤º¸ ÀúÀå ±â´ÉÀ» ±¸ÇöÇϱâ À§ÇØ ºÐÇÒ »óÅ¿¡ ´ëÇÑ Á¤º¸¸¦ È£½ºÆ®°¡ Á÷Á¢ ´Ù·ê Çʿ䰡 ÀÖ´Ù. Ãë¼Ò ·¹ÄÚµåÀÎ pUR, URSize, nowur µîÀÇ ¸â¹öµµ ¸¶Âù°¡Áö ÀÌÀ¯·Î public ¿µ¿ªÀ¸·Î À§Ä¡¸¦ ¿Å°å´Ù.
¸â¹ö º¯¼öµéÀº ´ëÆø Á¤¸®µÇ¾úÁö¸¸ ¸â¹ö ÇÔ¼öµéÀº ÀϺΠ¸î°¡Áö¸¦ Á¦¿ÜÇÏ°í ´ëºÎºÐ ÇÁ·¹ÀÓ¿¡ ³²¾Æ ÀÖ´Ù. ÇÁ·¹ÀÓÀÌ »ç¿ëÀڷκÎÅÍ Á÷Á¢ ÀÔ·ÂÀ» ¹ÞÁö´Â ¾ÊÀ¸¹Ç·Î OnChar°°Àº ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â ÇÁ·¹ÀÓ¿¡ ³²¾Æ ÀÖÀ» Çʿ䰡 ¾øÀ¸¸ç ±Û²ÃÀ» ´Ù·çÁö ¾Ê±â ¶§¹®¿¡ GetCharWidth°°Àº ÇÔ¼öµµ Çʿ䰡 ¾ø´Ù. InitDoc, Undo °°ÀÌ buf¸¦ Á¶ÀÛÇÏ´Â ÇÔ¼öµéÀÌ ÁÖ·Î ÇÁ·¹ÀÓ¿¡ ³²¾Æ ÀÖ´Ù.
ÇÁ·¹ÀÓÀº ÀϺΠ¸î°¡Áö¸¦ Á¦¿ÜÇÏ°í ¼³Á¤ º¯¼öµéÀ» ¸â¹ö·Î °¡ÁöÁö ¾ÊÁö¸¸ ´ëºÎºÐÀÇ ¼³Á¤°ª ¾×¼¼½º ÇÔ¼ö´Â ÇÁ·¹ÀÓ¿¡ ±×´ë·Î ³²¾Æ ÀÖ¾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ÀÚµ¿ °³Çà »óŸ¦ ±â¾ïÇÏ´Â nWrap º¯¼ö´Â ¹®¼¸¦ º¸¿©ÁÙ ¹æ¹ýÀ» ÁöÁ¤ÇϹǷΠÇÁ·¹ÀÓ¿¡ ÀÖÀ» Çʿ䰡 ¾ø°í ºä¿¡¸¸ ÀÖÀ¸¸é µÈ´Ù. ÇÏÁö¸¸ SetWrap/GetWrap ÇÔ¼ö´Â ºäÀÇ ¸â¹öÀÌ¸é¼ µ¿½Ã¿¡ ÇÁ·¹ÀÓÀÇ ¸â¹ö¿¡µµ ¼ÓÇØ¾ß ÇÑ´Ù.
¿Ö³ÄÇϸé È£½ºÆ®ÀÇ ÀÔÀå¿¡¼´Â ÇÁ·¹ÀÓÀÌ ApiEdit ÄÁÆ®·ÑÀ̱⠶§¹®¿¡ ÀÚµ¿ °³Çà »óŸ¦ ¹Ù²Ü ¶§ ÇÁ·¹ÀÓÀÇ SetWrap ÇÔ¼ö¸¦ È£ÃâÇϱ⠶§¹®ÀÌ´Ù. ÇÁ·¹ÀÓÀÇ SetWrap ÇÔ¼ö´Â ¸ðµç ºäÀÇ SetWrap ÇÔ¼ö¸¦ ´Ù½Ã È£ÃâÇÏ´Â Á߰迪ÇÒÀ» ÇÒ »ÓÀ̸ç ÀÚµ¿ °³Çà »óŰ¡ ¹Ù²ð ¶§ÀÇ Ãß°¡ ÀÛ¾÷Àº °¢ ºäÀÇ SetWrap ÇÔ¼ö°¡ ÇÒ °ÍÀÌ´Ù. È£½ºÆ®¿¡¼ ÀÚµ¿ °³Çà »óŸ¦ º¯°æÇÏ¸é ´ÙÀ½ ¼ø¼´ë·Î ÇÔ¼ö°¡ È£ÃâµÈ´Ù.

ÇÁ·¹ÀÓÀº È£½ºÆ®ÀÇ ÀÚ½ÄÀÌ¸é¼ µ¿½Ã¿¡ ºäÀÇ ºÎ¸ðÀÌ´Ù. ±×·¡¼ µÎ °´Ã¼ÀÇ Áß°£¿¡¼ Åë½ÅÀ» ´ã´çÇØ¾ß ÇÑ´Ù. È£½ºÆ®°¡ º¸±â¿¡ ApiEdit´Â ÇϳªÀÇ ÄÁÆ®·ÑÀÏ »ÓÀÌÁö ÀÌ ÄÁÆ®·ÑÀÌ ºä¸¦ ¸î °³³ª °¡Áö°í ÀÖ´ÂÁö, ¾î¶² ºäÀÇ ¼³Á¤ »óŸ¦ ¹Ù²Ü °ÍÀÎÁö¿¡ ´ëÇØ¼´Â ¾Ë ¼öµµ ¾ø°í ¾Ë Çʿ䵵 ¾ø´Ù. âºÐÇÒ ±â´ÉÀº È£½ºÆ®¿Í´Â ÀüÇô »ó°üÀÌ ¾ø´Â ÄÁÆ®·ÑÀÇ °íÀ¯ ±â´ÉÀ̸ç ÄÁÆ®·ÑÀÌ ½º½º·Î Á¦°øÇÏ´Â ±â´ÉÀ̱⠶§¹®ÀÌ´Ù. »ç½Ç È£½ºÆ®´Â ºäÀÇ Á¸Àç ÀÚü¸¦ ¸ð¸£¸ç ±×·¡¼ arView ¹è¿ÀÌ private ¾×¼¼½º ¼Ó¼ºÀ» °¡Áö´Â °ÍÀÌ´Ù.
Ãß°¡µÈ ¸â¹ö ÇÔ¼ö·Î´Â ºä¸¦ »ý¼º, ÆÄ±«ÇÏ´Â CreateView, DeleteView¿Í Ȱ¼º ºä¸¦ ±¸ÇÏ´Â GetActiveView°¡ ÀÖ´Ù. ÀÌ ÇÔ¼öÀÇ ÄÚµå´Â SplitView¿¹Á¦ÀÇ °æ¿ì¿Í °ÅÀÇ À¯»çÇϸç Àá½Ã ÈÄ¿¡ º»Ã¼¸¦ ÀÛ¼ºÇÒ °ÍÀÌ´Ù.
ApiEdit.cpp´Â ÀÌÁ¦ ÇÁ·¹ÀÓÀÇ ¸ðµâÀÌ µÇ¹Ç·Î ÇÁ·¹ÀÓ¿¡ °ü·ÃµÈ ÇÔ¼ö¸¸
Á¤ÀÇÇØ¾ß ÇÑ´Ù. µµ¿ì¹Ì¿¡ ´ëÇÑ ÄÚµå´Â ÀÌ ¸ðµâ¿¡ °è¼Ó À¯ÁöÇÒ °ÍÀ̸ç CApiEdit ÇÁ·¹ÀÓÀÇ ¸ðµç ¸â¹ö´Â ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÑ´Ù. ÀϺΠ¸î°¡Áö ÇÔ¼ö¸¦
Á¦¿ÜÇϰí´Â ÇÔ¼öÀÇ Àǹ̰¡ ¹Ù²î¹Ç·Î »ý¼ºÀÚ ÀÌÈÄÀÇ ¸ðµç ¸â¹ö ÇÔ¼öµéÀº ÀÏ´Ü »èÁ¦ÇÏÀÚ. µµ¿ì¹Ì °ü·Ã ÄÚµå´Â ¾Õ¿¡¼ ¼öÁ¤ÇÑ´ë·Î ±×´ë·Î À¯ÁöÇÑ´Ù.
Èûµé°Ô ÀÛ¼ºÇÑ ´ë·®ÀÇ Äڵ带 »èÁ¦Çߴµ¥ ÇÊ¿äÇÑ ÇÔ¼öµéÀº ´Ù½Ã ¿ø·¡ ApiEdit.cpp¿¡¼ º¹»çÇØ ¿Ã °ÍÀ̹ǷΠ°ÆÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ´ç±Ù 1.0À¸·Î ¿ø·¡ ApiEdit.cpp¸¦ ¿¾î ³õ°í ´ÙÀ½ ÀÛ¾÷À» ÁøÇàÇÏÀÚ. ¸ÕÀú »ý¼ºÀÚ´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
CApiEdit::CApiEdit()
{
int i;
buf=NULL;
pUR=NULL;
bWantTab=TRUE;
UndoSize=100*1024;
UndoMin=100;
bUseLineEnd=TRUE;
bAllowDrag=TRUE;
bSpaceForTab=FALSE;
bAutoIndent=TRUE;
bBlockIndentWithTab=TRUE;
bHomeToFirstChar=TRUE;
bCalcTabWithAvg=TRUE;
nShowCurLine=0;
HideSelType=1;
MarColor1=RGB(192,192,192);
MarColor2=RGB(160,160,160);
NumColor=RGB(0,0,0);
MarkColor=RGB(255,255,0);
CodeColor=RGB(128,128,128);
CurColor=RGB(255,255,0);
cBack=GetSysColor(COLOR_WINDOW);
cFore=GetSysColor(COLOR_WINDOWTEXT);
cSelFore=GetSysColor(COLOR_HIGHLIGHTTEXT);
cSelBack=GetSysColor(COLOR_HIGHLIGHT);
CaretWidth=2;
bHideCurLine=TRUE;
ActiveView=0;
for (i=0;i<4;i++) {
arView[i]=NULL;
}
}
BOOL CApiEdit::Create(int x,int y,int w,int h,DWORD style,UINT id,HWND hParent)
{
CreateWindow("ApiEdit",NULL, style | WS_CLIPCHILDREN,
x,y,w,h,hParent,(HMENU)id,GetModuleHandle(NULL),this);
return TRUE;
}
¹®¼¿Í °ü·ÃµÈ ¸â¹ö¿Í Àü¿ª ¼³Á¤ º¯¼öµéÀ» ÃʱâÈÇÏ¸ç ºä ¹è¿À» ¸ðµÎ NULL·Î ¸¸µé¾î ÃÖÃÊ ºä ¾øÀÌ ÇÁ·¹ÀÓ¸¸ ¸¸µç´Ù. ActiveView´Â 0À¸·Î ÃʱâÈÇÏ¿© ù ¹øÂ° ºä¸¦ Ȱ¼ºÈ½ÃŲ´Ù. ¿ø·¡ »ý¼ºÀÚ¿¡ ÀÖ´ø pLine, hBit, Parser¿¡ ´ëÇÑ ÃʱâÈ ÄÚµå´Â ºä¿Í °ü·ÃµÈ °ÍÀ̹ǷΠÇÁ·¹ÀÓÀÇ »ý¼ºÀÚ¿¡¼´Â »èÁ¦µÈ´Ù. ÆÄ±«ÀÚ´Â CWindow·ÎºÎÅÍ »ó¼Ó¹ÞÀ¸¹Ç·Î ÀçÁ¤ÀÇÇÒ Çʿ䰡 ¾ø´Ù.
Create ÇÔ¼ö´Â º°·Î º¯ÇÑ °ÍÀÌ ¾øµÇ À©µµ¿ì ½ºÅ¸ÀÏ¿¡ WS_CLIPCHILDREN ½ºÅ¸ÀÏÀÌ Ãß°¡µÇ¾ú´Ù. ÇÁ·¹ÀÓÀÇ ÀÛ¾÷ ¿µ¿ª¿¡´Â ºä°¡ ¹èÄ¡µÇ¹Ç·Î ºä°¡ Â÷ÁöÇϰí ÀÖ´Â ¿µ¿ªÀº ±×¸®±â ¿µ¿ª¿¡¼ Á¦¿ÜÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ´Ù½Ã ±×¸®±â¸¦ ÇÒ ¶§¸¶´Ù ÇÁ·¹ÀÓ°ú ºä°¡ µ¿½Ã¿¡ ±×·ÁÁö¹Ç·Î ȸéÀÌ ±ô¹Ú°Å¸± °ÍÀÌ´Ù.
ÇÁ·¹ÀÓµµ À©µµ¿ìÀ̹ǷΠ¸Þ½ÃÁö¸¦ ó¸®Çϴµ¥ ¿ø·¡ CApiEdit°¡ ¸Þ½ÃÁö¸¦
ó¸®ÇÏ´Â ¹æ½Ä°ú´Â ¿ÏÀüÈ÷ ´Ù¸£´Ù. ÇÁ·¹ÀÓÀÇ ÀÓ¹«´Â ¿À·ÎÁö ¹®¼¿Í ºä¸¦ °ü¸®ÇÏ´Â °Í»ÓÀ̹ǷΠ»ç¿ëÀڷκÎÅÍ ¸í·ÉÀ» ¹Þ¾ÆµéÀÌÁö ¾Ê´Â´Ù. µû¶ó¼ ó¸®Çؾß
ÇÒ ¸Þ½ÃÁöÀÇ Á¾·ùµµ ¸¹Áö ¾Ê´Ù. OnMessage ÇÔ¼ö¿Í ¸Þ½ÃÁö ó¸® ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
LRESULT CApiEdit::OnMessage(UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
HANDLE_MSG(hWnd, WM_CREATE, OnCreate);
HANDLE_MSG(hWnd, WM_DESTROY, OnDestroy);
HANDLE_MSG(hWnd, WM_PAINT, OnPaint);
HANDLE_MSG(hWnd, WM_SETFOCUS, OnSetFocus);
HANDLE_MSG(hWnd, WM_LBUTTONDOWN, OnLButtonDown);
HANDLE_MSG(hWnd, WM_LBUTTONDBLCLK, OnLButtonDown);
HANDLE_MSG(hWnd, WM_MOUSEMOVE, OnMouseMove);
HANDLE_MSG(hWnd, WM_LBUTTONUP, OnLButtonUp);
HANDLE_MSG(hWnd, WM_SIZE, OnSize);
HANDLE_MSG(hWnd, WM_COMMAND, OnCommand);
HANDLE_MSG(hWnd, WM_SETCURSOR, OnSetCursor);
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
///////////////////////////////////////////////////////////////////////////////////
// ¸Þ½ÃÁö Çڵ鷯
BOOL CApiEdit::OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
InitDoc();
arView[0]=CreateView(TEXT_VIEW);
return TRUE;
}
void CApiEdit::OnDestroy(HWND hWnd)
{
int i;
for (i=0;i<4 && arView[i];i++) {
DeleteView(i);
}
free(buf);
if (pUR) {
for (i=0;;i++) {
if (pUR[i].action == UR_NONE)
break;
if (pUR[i].data)
free(pUR[i].data);
}
free(pUR);
}
}
void CApiEdit::OnSize(HWND hWnd, UINT state, int cx, int cy)
{
RECT crt;
if (state == SIZE_MINIMIZED) {
return;
}
GetClientRect(hWnd,&crt);
MoveWindow(arView[0]->hWnd,0,0,crt.right,crt.bottom,TRUE);
}
void CApiEdit::OnPaint(HWND hWnd)
{
HDC hdc;
PAINTSTRUCT ps;
hdc=BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
}
void CApiEdit::OnSetFocus(HWND hWnd, HWND hwndOldFocus)
{
if (ActiveView != -1)
SetFocus(GetActiveView()->hWnd);
}
void CApiEdit::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
{
}
void CApiEdit::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)
{
}
void CApiEdit::OnLButtonUp(HWND hWnd, int x, int y, UINT keyFlags)
{
}
void CApiEdit::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
GetActiveView()->OnCommand(hWnd,id,hwndCtl,codeNotify);
}
BOOL CApiEdit::OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg)
{
return FORWARD_WM_SETCURSOR(hWnd,hwndCursor,codeHitTest,msg,DefWindowProc);
}
OnCreate¿¡¼´Â InitDoc ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¹®¼¸¦ ÃʱâÈÇϰí CreateView ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ±âº» ºä Çϳª¸¦ ¸¸µç´Ù. OnSize¿¡¼´Â ±âº» ºä¸¦ ÇÁ·¹ÀÓÀÇ ÀÛ¾÷ ¿µ¿ª¿¡ °¡µæ ä¿ì¸ç ±×·¡¼ ApiEdit ÄÁÆ®·ÑÀ» »ý¼ºÇÏ¸é ±âº» ºä Çϳª¸¸ »ý¼ºµÇ¾î »ç¿ëÀÚ¿¡°Ô º¸ÀÏ °ÍÀÌ´Ù. ¿©±â±îÁöÀÇ ÃʱâÈ °á°ú¸¦ º¸¸é ¿ø·¡ÀÇ ApiEdit¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù.
OnDestroy¿¡¼´Â »ý¼ºµÇ¾î ÀÖ´Â ¸ðµç ºä¸¦ »èÁ¦Çϰí Ãë¼Ò ·¹Äڵ忡 ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù. OnSetFocus¿¡¼´Â Ȱ¼º ºä·Î Æ÷Ä¿½º¸¦ ³Ñ±âµÇ ´Ü Ȱ¼ººä°¡ ÀÖÀ» ¶§¸¸ Æ÷Ä¿½º¸¦ ³Ñ±ä´Ù. ÀÌ Á¶°ÇÀÌ ¿Ö ÇÊ¿äÇÑÁö´Â Àá½Ã ÈÄ ¾Ë¾Æº¼ °ÍÀÌ´Ù. OnCommand´Â È£½ºÆ®·ÎºÎÅÍ ¸í·ÉÀ» Àü´Þ¹Þ¾Æ ±×´ë·Î Ȱ¼ººä¿¡°Ô ³Ñ±â´Â ¿ªÇÒ¸¸ ÇÑ´Ù. OnPaint¿Í ³ª¸ÓÁö ¸¶¿ì½º ¸Þ½ÃÁö ó¸® ÇÔ¼öµéÀº ÇöÀç ¾Æ¹« °Íµµ ÇÏÁö ¾Ê°í Àִµ¥ âÀÌ ºÐÇÒµÇ¸é ºÐÇÒâÀ» °ü¸®ÇÏ´Â Äڵ尡 ÀÛ¼ºµÉ °ÍÀÌ´Ù. OnSetCursor ÇÔ¼öµµ µðÆúÆ® ó¸®ÇÏ¸ç ½ÇÁúÀûÀÎ ÄÚµå´Â ¾ÆÁ÷ ¾ø´Â ¼ÀÀÌ´Ù.
Ãß°¡µÈ ¼¼ °³ÀÇ ¸â¹ö ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù. ¸ðµÎ ºä¸¦ »ý¼º, ÆÄ±«Çϰí
°ü¸®ÇÏ´Â ÇÔ¼öµéÀÌ´Ù.
///////////////////////////////////////////////////////////////////////////////////
// ÀÏ¹Ý ÇÔ¼öµé
CApiEditText *CApiEdit::GetActiveView()
{
return arView[ActiveView];
}
CApiEditText *CApiEdit::CreateView(int Type)
{
CApiEditText *pView;
switch (Type) {
case TEXT_VIEW:
pView=new CApiEditText;
break;
}
pView->pFrame=this;
pView->Create(0,0,0,0,WS_CHILD | WS_VISIBLE,0,hWnd);
return pView;
}
void CApiEdit::DeleteView(int nView)
{
if (ActiveView==nView) {
ActiveView=-1;
}
DestroyWindow(arView[nView]->hWnd);
delete arView[nView];
arView[nView]=NULL;
}
GetActiveView´Â Ȱ¼º ºä¸¦ Á¶»çÇϴµ¥ ActiveView¿¡ Ȱ¼º ºäÀÇ Ã·ÀÚ°¡ ÀúÀåµÇ¾î ÀÖÀ¸¹Ç·Î arView ¹è¿¿¡¼ ÀÌ Ã·ÀÚÀÇ ºä¸¦ ÀÐ¾î ±× Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ¸ðµç ÆíÁý µ¿ÀÛÀº Ȱ¼ººä¿¡¼ ÀϾ¹Ç·Î È£½ºÆ®³ª ÇÁ·¹ÀÓÀº »ç¿ëÀڷκÎÅÍ Àü´ÞµÇ´Â ¸ðµç ÆíÁý ¸í·ÉÀ» Ȱ¼º ºä·Î Àü´ÞÇØ¾ß ÇÑ´Ù. µû¶ó¼ ÆíÁý ÇÔ¼ö È£ÃâÀº ¸ðµÎ GetActiveView()->ÇÔ¼ö; ÇüŰ¡ µÉ °ÍÀÌ´Ù.
CreateView ÇÔ¼öÀÇ ÄÚµå´Â SplitView ÇÔ¼ö¿Í °ÅÀÇ µ¿ÀÏÇϹǷΠµû·Î ºÐ¼®ÇÒ Çʿ䰡 ¾øÀ» °ÍÀÌ´Ù. new ¿¬»êÀÚ·Î ¿äûµÈ ºä °´Ã¼¸¦ »ý¼ºÇϰí Create ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ºä À©µµ¿ì¸¦ ¸¸µé¾î ±× Æ÷ÀÎÅ͸¸ ¸®ÅÏÇÑ´Ù. ÇöÀç´Â ÅØ½ºÆ® ºä¸¸ »ý¼ºÇÏÁö¸¸ ºä ŸÀÔÀÌ ´Ã¾î³ª¸é switch¹®ÀÇ case°¡ ´õ ´Ã¾î³ª°Ô µÈ´Ù.
DeleteView ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ nView¸¦ »èÁ¦Çϴµ¥ ¾Õ¿¡¼ »ìÆìºÃ´Ù½ÃÇÇ ÆÄ±«ÀÚ¿¡¼ °¡»ó ÇÔ¼ö¸¦ Á¦´ë·Î ãÁö ¸øÇϱ⠶§¹®¿¡ DestroyWindow ÇÔ¼ö·Î À©µµ¿ì¸¦ ¸ÕÀú ÆÄ±«ÇÑ ÈÄ delete¿¬»êÀÚ·Î °´Ã¼¸¦ ÆÄ±«ÇØ¾ß ÇÑ´Ù. °´Ã¼¸¦ ÆÄ±«ÇÑ ÈÄ arViewÀÇ ÇØ´ç ºä¸¦ NULL·Î ¸¸µé¾î ÀÌ ºä°¡ È®½ÇÈ÷ »èÁ¦µÇ¾úÀ½À» Ç¥½ÃÇØ µÐ´Ù. ¿©±â±îÁö´Â SplitView ¿¹Á¦¿Í µ¿ÀÏÇ쵂 ´Ù¸¸ ºä¸¦ »èÁ¦Çϱâ Àü¿¡ »èÁ¦µÇ´Â ºä°¡ Ȱ¼ººäÀ̸é ActiveView¸¦ -1·Î º¯°æÇÏ¿© ÀÓ½ÃÀûÀ¸·Î Ȱ¼ººä°¡ ¾ø´Â »óÅ·Π¸¸µç´Ù´Â Á¡ÀÌ Á¶±Ý ´Ù¸£´Ù.
ÀÌ Ã³¸®°¡ ÇÊ¿äÇÑ ÀÌÀ¯´Â ÆÄ±«µÇ±â Á÷ÀüÀÇ ºä¿¡°Ô´Â Æ÷Ä¿½º¸¦ ÁÖÁö ¾Ê±â À§ÇؼÀÌ´Ù. Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖ´Â ÀÚ½Ä À©µµ¿ì°¡ ÆÄ±«µÇ¸é ºÎ¸ð À©µµ¿ì°¡ Æ÷Ä¿½º¸¦ ¹Þ´Âµ¥ ÇÁ·¹ÀÓÀÇ OnSetFocus´Â Ȱ¼º ºä¿¡°Ô ´Ù½Ã Æ÷Ä¿½º¸¦ ³Ñ±âµµ·Ï µÇ¾î ÀÖ´Ù. ±×·¡¼ ÀÌ´ë·Î ¾Æ¹« Á¶Ä¡¸¦ ÃëÇÏÁö ¾Ê°í DestroyWindow¸¦ È£ÃâÇØ ¹ö¸®¸é ÇÁ·¹ÀÓÀº Á׾´Â ÀڽĿ¡°Ô Æ÷Ä¿½º¸¦ ³Ñ±â·Á°í ÇÒ °ÍÀ̸ç ÀÚ½ÄÀº Á׾´Â ¸¶´ç¿¡ Æ÷Ä¿½º¸¦ ´Ù½Ã ¹Þ¾Æ ij·µÀÇ À§Ä¡¸¦ ¿Å±â·Á°í ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ ºä´Â ÀÌ¹Ì ÀÚ½ÅÀÌ µ¿ÀÛÇϱâ À§ÇÑ µ¥ÀÌÅÍ(Á¤·Ä Á¤º¸)¸¦ Á¤¸®ÇØ ¹ö·È±â ¶§¹®¿¡ ij·µÀÇ À§Ä¡¸¦ ã´Ù°¡ ´Ù¿îµÇ°í ¸¸´Ù.
Ȱ¼ººä¸¦ Á¦°ÅÇϱâ Àü¿¡ ActiveView¿¡ -1À» ´ëÀÔÇÏ´Â ÄÚµå´Â "ÀÌ ³à¼®Àº Áö±Ý ¿½ÉÈ÷ Á×°í ÀÖ´Â ÁßÀÓ"À̶ó´Â Ç¥½ÄÀ» ³²±â´Â °ÍÀ̰í ÇÁ·¹ÀÓÀÇ OnSetFocus´Â ºä¿¡°Ô Æ÷Ä¿½º¸¦ ³Ñ±â±â Àü¿¡ Ȱ¼ººä°¡ Á¦´ë·Î »ì¾Æ ÀÖ´ÂÁö¸¦ ¸ÕÀú È®ÀÎÇÑ´Ù. CApiEdit::OnSetFocusÇÔ¼ö´Â if (ActiveView != -1)À̶ó´Â Á¶°ÇÀ» Á¡°ËÇÔÀ¸·Î½á "À½. Ȱ¼ººä°¡ ²Ð²¿´Ú ÀϺ¸Á÷ÀüÀ̱º" ÆÇ´ÜÀ» ÇÏ°í Æ÷Ä¿½º¸¦ ³Ñ±âÁö ¾Ê´Â´Ù. DeleteView¿¡¼ ºä¸¦ ÆÄ±«Çϱâ Àü¿¡ ActiveView¿¡ -1À» ´ëÀÔÇÏ´Â ÄÚµå´Â ¾îµð±îÁö³ª ÀÓ½ÃÀûÀΠó¸®ÀÏ »ÓÀÌ´Ù. µû¶ó¼ DeleteView¸¦ È£ÃâÇÏ´Â ¸ðµç ÇÔ¼ö´Â ºä¸¦ »èÁ¦ÇÑ ÈÄ È°¼ººä¸¦ Á¤È®ÇÏ°Ô ´Ù½Ã ã¾Æ¾ß ÇÒ Çʿ䰡 ÀÖ´Ù. ActiveView°¡ -1ÀÎ »óÅ·ΠGetActiveView°¡ È£ÃâµÇµµ·Ï ³»¹ö·Á µÎ¾î¼´Â ¾ÈµÈ´Ù.
´ÙÀ½Àº ÇÁ·¹ÀÓÀÇ ¸â¹ö ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù. ¿ø·¡ ApiEdit.cpp¿¡¼ Äڵ带
º¹»çÇØ ¿Â ÈÄ ¾à°£¸¸ ¼Õº¸¸é µÈ´Ù. °´Ã¼°¡ ºÐÇÒµÊÀ¸·Î½á Á¶±Ý¾¿ µ¿ÀÛÀÌ ¼öÁ¤µÇ¾î¾ß ÇÏ´Â ÇÔ¼öµéÀÌ¸ç ´ÙÀ½ ¿©¼¸ °³°¡ ÀÖ´Ù. ¸ÕÀú ¹®¼¸¦ °ü¸®ÇÏ´Â °¡Àå
ÇÙ½É ÇÔ¼öÀÎ Insert, Delete¸¦ ¼öÁ¤ÇÑ´Ù.
void CApiEdit::Insert(int nPos, TCHAR *str, BOOL bRec/*=TRUE*/)
{
int len;
int movelen;
int needlen;
if (bReadOnly)
return;
if (bRec) {
URInsert(nPos,str);
}
needlen=doclen+lstrlen(str)+1;
if (needlen > buflen) {
buflen = needlen+1024;
buf=(TCHAR *)realloc(buf,buflen);
if (buf == NULL) {
}
}
len=lstrlen(str);
if (len==0) return;
movelen=doclen-nPos+1;
memmove(buf+nPos+len,buf+nPos,movelen);
memcpy(buf+nPos,str,len);
SetModified(TRUE);
LastEditOff=nPos+len;
doclen+=len;
SendNotify(AEN_CHANGE);
}
void CApiEdit::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)
{
int movelen;
TCHAR *p=buf+nPos;
TCHAR *t;
if (bReadOnly)
return;
if (nCount == 0) return;
if (doclen < nPos+nCount) return;
if (bRec) {
t=(TCHAR *)malloc(nCount+1);
lstrcpyn(t,p,nCount+1);
URDelete(nPos,t);
free(t);
}
movelen=doclen-nPos-nCount+1;
memmove(buf+nPos, buf+nPos+nCount, movelen);
SetModified(TRUE);
doclen-=nCount;
LastEditOff=nPos;
SendNotify(AEN_CHANGE);
}
Àбâ Àü¿ë Ç÷¡±× Á¡°Ë, Ãë¼Ò ·¹ÄÚµå °ü¸®, buf °ü¸® µî ¹®¼¿Í Á÷Á¢ÀûÀÎ »ó°üÀÌ ÀÖ´Â Äڵ常 ³²¾ÒÀ¸¸ç »ðÀÔ, »èÁ¦¿¡ µû¸¥ ºÏ¸¶Å© °ü¸®³ª ÀçÁ¤·Ä, ½ºÅ©·Ñ Á¤º¸ °ü¸® µîÀÇ ºÎ°¡ ÀÛ¾÷Àº ºä°¡ ÇØ¾ß ÇÑ´Ù. ºä¿¡µµ µ¿ÀÏÇÑ À̸§ÀÇ ÇÔ¼ö°¡ ÀÖÀ¸¸ç ºäÀÇ Insert, Delete¿¡¼ »ðÀÔ, »èÁ¦¿¡ µû¸¥ ºÎ°¡ ÀÛ¾÷À» ÇÒ °ÍÀÌ´Ù. ÀÌ·± ÀÛ¾÷Àº ºä¸¶´Ù Á¤Ã¥ÀÌ ´Ù¸¦ ¼ö Àֱ⠶§¹®¿¡ ÇÁ·¹ÀÓÀÌ Á÷Á¢ ÇÒ ¼ö ¾ø´Âµ¥ ¿¹¸¦ µé¾î ÅØ½ºÆ® ºä´Â ¹®¼ ³»¿ëÀÌ ¹Ù²ð ¶§¸¶´Ù Á¤·ÄÀ» ´Ù½Ã ÇØ¾ß ÇÏÁö¸¸ Çí»ç ºä´Â ÇÑ ÇàÀÇ ¹ÙÀÌÆ® ¼ö°¡ °íÁ¤ÀûÀ̱⠶§¹®¿¡ Á¤·ÄÇÒ Çʿ䰡 ¾ø´Ù.
»ç¿ëÀڷκÎÅÍ Á÷Á¢ Űº¸µå ÀÔ·ÂÀ» ¹Þ¾ÆµéÀÌ´Â ÁÖü´Â ºäÀÌ´Ù. µû¶ó¼ ¹®ÀÚ ÀÔ·ÂÀ̳ª Ŭ¸³º¸µå Á¶ÀÛÀÌ ÀÖÀ» ¶§ ºäÀÇ Insert, Delete°¡ ¸ÕÀú È£ÃâµÇ¸ç ÀÌ ÇÔ¼ö¿¡¼ ÇÁ·¹ÀÓÀÇ Insert, Delete¸¦ È£ÃâÇÑ ÈÄ ÇÊ¿äÇÑ ºÎ°¡ ÀÛ¾÷À» ÇÑ´Ù. Ãë¼Ò ·¹Äڵ带 °ü¸®ÇÏ´Â µÎ °³ÀÇ ÇÔ¼ö¿Í ¹®¼ ÃʱâÈ °ü·Ã ÇÔ¼öµµ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void CApiEdit::Undo()
{
int from, to, len, dest;
int tick;
CApiEditText *pView;
pView=GetActiveView();
if (pUR[nowur].action == UR_NONE || pUR[nowur].status==UR_CANCELED) {
nowur--;
}
pView->ClearSelection();
tick=pUR[nowur].tick;
for (;;) {
switch (pUR[nowur].action) {
case UR_INSERT:
pView->Delete(pUR[nowur].pos,lstrlen(pUR[nowur].data),FALSE);
pView->SetOffset(pUR[nowur].pos);
break;
case UR_DELETE:
pView->Insert(pUR[nowur].pos,pUR[nowur].data,FALSE);
pView->SetOffset(pUR[nowur].pos+lstrlen(pUR[nowur].data));
break;
case UR_MOVE:
from=pUR[nowur].pos;
to=pUR[nowur].dest[0];
len=pUR[nowur].dest[1];
if (from > to) {
dest=from+len;
pView->CopyString(FALSE,to,dest,len,FALSE);
} else {
pView->CopyString(FALSE,to-len,from,len,FALSE);
}
pView->SetOffset(from+len);
break;
}
pUR[nowur].status=UR_CANCELED;
if (tick==0 || nowur==0)
break;
if (tick!=pUR[nowur-1].tick)
break;
nowur--;
}
Invalidate(-1);
ArrangeModified();
}
void CApiEdit::Redo()
{
int from, to, len;
int tick;
CApiEditText *pView;
pView=GetActiveView();
pView->ClearSelection();
tick=pUR[nowur].tick;
for (;;) {
switch (pUR[nowur].action) {
case UR_INSERT:
pView->Insert(pUR[nowur].pos,pUR[nowur].data,FALSE);
pView->SetOffset(pUR[nowur].pos+lstrlen(pUR[nowur].data));
break;
case UR_DELETE:
pView->Delete(pUR[nowur].pos,lstrlen(pUR[nowur].data),FALSE);
pView->SetOffset(pUR[nowur].pos);
break;
case UR_MOVE:
from=pUR[nowur].pos;
to=pUR[nowur].dest[0];
len=pUR[nowur].dest[1];
pView->CopyString(FALSE,from,to,len,FALSE);
pView->SetOffset(to+len);
break;
}
pUR[nowur].status=UR_MAKING;
NextRecord();
if (tick==0)
break;
if (tick!=pUR[nowur].tick)
break;
}
Invalidate(-1);
ArrangeModified();
}
void CApiEdit::SetText(TCHAR *TextBuf, int dwSize)
{
TCHAR *dest;
InitDoc();
dwFormat=AnalyzeFormat(TextBuf, dwSize);
if (dwFormat != AE_FORMAT_WIN && dwFormat != AE_FORMAT_BINARY) {
ConvertFormat(dwFormat,AE_FORMAT_WIN,TextBuf,dest);
GetActiveView()->Insert(0,dest,FALSE);
free(dest);
} else {
GetActiveView()->Insert(0,TextBuf,FALSE);
}
}
void CApiEdit::InitDoc()
{
int i;
if (pUR) {
for (i=0;;i++) {
if (pUR[i].action == UR_NONE)
break;
if (pUR[i].data)
free(pUR[i].data);
}
free(pUR);
}
URSize=100;
pUR=(UndoRecord *)malloc(sizeof(UndoRecord)*URSize);
memset(pUR,0,sizeof(UndoRecord)*URSize);
nowur=0;
if (buf) {
free(buf);
}
buflen=1024;
buf=(TCHAR *)malloc(buflen);
memset(buf,0,buflen);
doclen=0;
bReadOnly=FALSE;
LastEditOff=0;
bModified=FALSE;
SaveModified();
URtick=0;
URnest=0;
dwFormat=AE_FORMAT_WIN;
ForAllView(InitView())
}
Ãë¼Ò ·¹Äڵ带 ÇÁ·¹ÀÓÀÌ °¡Áö°í ÀÖÀ¸¹Ç·Î Undo, Redo 󸮵µ ÇÁ·¹ÀÓÀÌ Ç쵂 Ãë¼Ò, Àç½ÇÇà ÈÄ È°¼ººä¿¡µµ ¹®¼ º¯°æ »ç½ÇÀ» ¹Ý¿µÇØ¾ß ÇÑ´Ù. ±×·¡¼ Insert, Delete ÇÔ¼ö´Â ÇÁ·¹ÀÓÀÇ ÇÔ¼ö¸¦ ºÎ¸£Áö ¾Ê°í ºäÀÇ ÇÔ¼ö¸¦ ºÎ¸¥´Ù. ºäÀÇ Insert, Delete´Â ÇÁ·¹ÀÓÀÇ Insert, Delete¸¦ È£ÃâÇÒ »Ó¸¸ ¾Æ´Ï¶ó ÇüÁ¦ ºäÀÇ °»½Å±îÁöµµ °°ÀÌ Ã³¸®ÇÑ´Ù. ¹®¼¸¦ º¯°æÇÒ ¶§´Â Ç×»ó ºäÀÇ Insert, Delete¸¦ ÅëÇØ¾ß Çϸç SetText ÇÔ¼öµµ ¹®¼¸¦ ÀÐÀº ÈÄ ºäÀÇ Insert ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï Çß´Ù.
¹®¼¸¦ ÃʱâÈÇÏ´Â InitDoc ÇÔ¼ö¿¡´Â off, pLine µî ºä¿¡ ¼ÓÇÏ´Â ¸â¹öµé¿¡ ´ëÇÑ ÃʱâÈ Äڵ尡 »èÁ¦µÇ¾úÀ¸¸ç ¹öÆÛ, Ãë¼Ò ·¹ÄÚµå µî ÇÁ·¹ÀÓÀÇ ¸â¹ö¸¸ ÃʱâÈÇÑ´Ù. ºä¿¡ ¼ÓÇÑ ¸â¹ö´Â ºä°¡ ½º½º·Î ÃʱâÈÇϹǷΠInitDocÀº ¿À·ÎÁö ¹®¼¿Í °ü·ÃµÈ ¸â¹ö¸¸ ÃʱâÈÇÏ¿´´Ù. ´ë½Å ÇÁ·¹ÀÓÀÌ Ãʱâ鵃 ¶§ °¢ ºäÀÇ InitView¸¦ È£ÃâÇÔÀ¸·Î½á ÇÁ·¹ÀÓ¿¡ ¿¬°áµÈ ¸ðµç ºäµµ ÃʱâÈÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ß ÇÑ´Ù. ¹®¼°¡ ÃʱâȵǸé ÀÌ ¹®¼¸¦ º¸¿©ÁÖ´Â ºäµéµµ ´ç¿¬È÷ ÃʱâÈÇØ¾ß ÇÑ´Ù.
´ÙÀ½ ¸â¹ö ÇÔ¼ö´Â ¿ø·¡ ApiEdit.cpp¿¡ ÀÖ´ø ÇÔ¼öÀÇ ÄÚµå¿Í ¿ÏÀüÈ÷
µ¿ÀÏÇϹǷΠ±×´ë·Î ´Ù½Ã º¹»çÇØ ¿À¸é µÈ´Ù. ÀÌ ÇÔ¼öµéÀº ¼Ò½º ÆÄÀÏ¿¡ ¿¬¼ÓÀûÀ¸·Î ºÙ¾î Àֱ⠶§¹®¿¡ º¹»çÇϱ⵵ ½¬¿ï °ÍÀÌ´Ù.
IsDBCS, GetPrevOff, GetNextOff(3°³)
FindParaStart, IncludeEnter
LoadAeResource, UnLoadAeResource, SetModified
GetText,GetTextLength,SetReadOnly
CanUndo~ URMove(7°³)
SetUndoSize~EndUndoGroup(6°³)
SendNotify
SetFormat, AnalyzeFormat, ConvertFormat
IsDBCS ÇÔ¼ö´Â inline ¼Ó¼ºÀ» ÇØÁ¦ÇÑ´Ù. Ä¿¼¿Í ÆùÆ®¸¦ »ý¼ºÇÏ´Â Á¤Àû ÇÔ¼öµéÀÇ ³»¿ëÀº ºä¿Í´Â ¾Æ¹«·± »ó°üÀÌ ¾øÀ¸¹Ç·Î ±âÁ¸ Äڵ带 ±×´ë·Î ¾µ ¼ö ÀÖ´Ù. Ãë¼Ò ·¹Äڵ带 °ü¸®ÇÏ´Â ÇÔ¼öµéµµ Undo, Redo¸¸ Á¦¿ÜÇÏ°í ´ëºÎºÐ ±×´ë·Î ¾µ ¼ö ÀÖÀ¸¸ç Æ÷¸Ë °ü·Ã ÇÔ¼öÀÇ Äڵ嵵 µ¿ÀÏÇÏ´Ù. º¸´Ù½ÃÇÇ ÀÌ ÇÔ¼öµéÀº º¸±â ¸ðµå¿Í´Â ¾Æ¹«·± »ó°üÀÌ ¾ø´Â °ÍµéÀÌ´Ù.
±×¿ÜÀÇ ¸â¹ö ÇÔ¼öµéÀº ¿ø·¡ ApiEdit.cpp¿¡ ÀÖ´ø ÄÚµå¿Í´Â ¿ÏÀüÈ÷ ´Ù¸£¹Ç·Î
´Ù½Ã ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ÁÖ·Î ¼³Á¤°ªµéÀ» ´Ù·ç´Â ÇÔ¼öµéÀ̸ç È£½ºÆ®¿Í ºä »çÀ̸¦ Áß°èÇÏ´Â ¿ªÇÒ¸¸ ÇϹǷΠÄÚµåÀÇ ±æÀ̰¡ ¾ÆÁÖ Âª°í Çü½ÄÀÌ °ÅÀÇ À¯»çÇÏ´Ù.
int CApiEdit::GetWrap()
{
return GetActiveView()->GetWrap();
}
void CApiEdit::SetWrap(int aWrap)
{
ForAllView(SetWrap(aWrap))
}
void CApiEdit::Invalidate(int Pos1, int Pos2/*=-1*/)
{
ForAllView(Invalidate(Pos1,Pos2))
}
void CApiEdit::ClearBookmark()
{
ForAllView(ClearBookmark())
}
void CApiEdit::ToggleBookmark(int Para, int Mark)
{
GetActiveView()->ToggleBookmark(Para,Mark);
}
void CApiEdit::GotoBookmark(int Mark)
{
GetActiveView()->GotoBookmark(Mark);
}
void CApiEdit::GotoLine(int Line, int Col/*=0*/, int Type/*=0*/)
{
GetActiveView()->GotoLine(Line,Col,Type);
}
void CApiEdit::GetSelect(int &s, int &e)
{
GetActiveView()->GetSelect(s,e);
}
void CApiEdit::SetSelect(int s, int e, BOOL bFind)
{
GetActiveView()->SetSelect(s,e,bFind);
}
BOOL CApiEdit::GetShowState(int nIndex)
{
return GetActiveView()->GetShowState(nIndex);
}
void CApiEdit::SetShowState(int nIndex, BOOL aValue)
{
ForAllView(SetShowState(nIndex,aValue))
}
int CApiEdit::GetLineRatio()
{
return GetActiveView()->GetLineRatio();
}
void CApiEdit::SetLineRatio(int aLineHeight)
{
ForAllView(SetLineRatio(aLineHeight))
}
void CApiEdit::SetShowCurLine(int aShowCurLine)
{
nShowCurLine=aShowCurLine;
ForAllView(Invalidate(-1))
}
int CApiEdit::GetTabWidth()
{
return GetActiveView()->GetTabWidth();
}
void CApiEdit::SetTabWidth(int aTabWidth)
{
ForAllView(SetTabWidth(aTabWidth))
}
void CApiEdit::SetHideSelType(int aHideSelType)
{
HideSelType=aHideSelType;
ForAllView(Invalidate(-1))
}
void CApiEdit::GetFont(LOGFONT *alogfont)
{
GetActiveView()->GetFont(alogfont);
}
void CApiEdit::SetFont(LOGFONT *alogfont)
{
ForAllView(SetFont(alogfont))
}
void CApiEdit::SetForeColor(COLORREF acol)
{
if (acol==-1) {
cFore=GetSysColor(COLOR_WINDOWTEXT);
} else {
cFore=acol;
}
ForAllView(Invalidate(-1))
}
void CApiEdit::SetBackColor(COLORREF acol)
{
if (acol==-1) {
cBack=GetSysColor(COLOR_WINDOW);
} else {
cBack=acol;
}
ForAllView(Invalidate(-1))
}
void CApiEdit::SetSelForeColor(COLORREF acol)
{
if (acol==-1) {
cSelFore=GetSysColor(COLOR_HIGHLIGHTTEXT);
} else {
cSelFore=acol;
}
ForAllView(Invalidate(-1))
}
void CApiEdit::SetSelBackColor(COLORREF acol)
{
if (acol==-1) {
cSelBack=GetSysColor(COLOR_HIGHLIGHT);
} else {
cSelBack=acol;
}
ForAllView(Invalidate(-1))
}
BOOL CApiEdit::GetNoFirstSpace()
{
return GetActiveView()->GetNoFirstSpace();
}
void CApiEdit::SetNoFirstSpace(BOOL aNoFirstSpace)
{
ForAllView(SetNoFirstSpace(aNoFirstSpace))
}
int CApiEdit::GetShowTabType()
{
return GetActiveView()->GetShowTabType();
}
void CApiEdit::SetShowTabType(int aShowTabType)
{
ForAllView(SetShowTabType(aShowTabType))
}
int CApiEdit::GetShowEnterType()
{
return GetActiveView()->GetShowEnterType();
}
void CApiEdit::SetShowEnterType(int aShowEnterType)
{
ForAllView(SetShowEnterType(aShowEnterType))
}
int CApiEdit::GetShowSpaceType()
{
return GetActiveView()->GetShowSpaceType();
}
void CApiEdit::SetShowSpaceType(int aShowSpaceType)
{
ForAllView(SetShowSpaceType(aShowSpaceType))
}
void CApiEdit::SetMarColor1(COLORREF acol)
{
MarColor1=acol;
ForAllView(Invalidate(-1))
}
void CApiEdit::SetMarColor2(COLORREF acol)
{
MarColor2=acol;
ForAllView(Invalidate(-1))
}
void CApiEdit::SetMarkColor(COLORREF acol)
{
MarkColor=acol;
ForAllView(Invalidate(-1))
}
void CApiEdit::SetCodeColor(COLORREF acol)
{
CodeColor=acol;
ForAllView(Invalidate(-1))
}
void CApiEdit::SetCurColor(COLORREF acol)
{
CurColor=acol;
ForAllView(Invalidate(-1))
}
void CApiEdit::SetNumColor(COLORREF acol)
{
NumColor=acol;
ForAllView(Invalidate(-1))
}
void CApiEdit::SetCaretWidth(int aCaretWidth)
{
CaretWidth=aCaretWidth;
ForAllView(SetCaret())
}
void CApiEdit::SetHideCurLine(BOOL aHideCurLine)
{
bHideCurLine=aHideCurLine;
ForAllView(Invalidate(-1))
}
void CApiEdit::SetCalcTabWithAvg(int aCalcTabWithAvg)
{
bCalcTabWithAvg=aCalcTabWithAvg;
ForAllView(SetTabWidth(arView[aet]->GetTabWidth()))
}
int CApiEdit::GetRightWrap()
{
return GetActiveView()->GetRightWrap();
}
void CApiEdit::SetRightWrap(int aRightWrap)
{
ForAllView(SetRightWrap(aRightWrap))
}
int CApiEdit::GetColMark()
{
return GetActiveView()->GetColMark();
}
void CApiEdit::SetColMark(int aColMark)
{
ForAllView(SetColMark(aColMark))
}
CParse* CApiEdit::GetParser()
{
return GetActiveView()->GetParser();
}
void CApiEdit::SetParser(int ParseType)
{
ForAllView(SetParser(ParseType))
}
BOOL CApiEdit::FindText(int nPos, TCHAR *what, DWORD dwFlag)
{
return GetActiveView()->FindText(nPos,what,dwFlag);
}
int CApiEdit::ReplaceText(int nPos, TCHAR *what, DWORD dwFlag, TCHAR *to)
{
return GetActiveView()->ReplaceText(nPos,what,dwFlag,to);
}
int CApiEdit::GetOffset()
{
return GetActiveView()->GetOffset();
}
void CApiEdit::GetSelRect(RECT &srt)
{
GetActiveView()->GetSelRect(srt);
}
int CApiEdit::GetInfoFromOff(int Type, int nPos/*=-1*/)
{
return GetActiveView()->GetInfoFromOff(Type,nPos);
}
void CApiEdit::GotoLastEditOff()
{
GetActiveView()->GotoLastEditOff();
}
int CApiEdit::GetDocInfo(int type)
{
return GetActiveView()->GetDocInfo(type);
}
BOOL CApiEdit::GetInsMode()
{
return GetActiveView()->GetInsMode();
}
int CApiEdit::GetOffFromPara(int pr, int pc)
{
return GetActiveView()->GetOffFromPara(pr,pc);
}
void CApiEdit::BeginPrint(Ae_PrintInfo *pi)
{
GetActiveView()->BeginPrint(pi);
}
BOOL CApiEdit::PrintPage(Ae_PrintInfo *pi,int nPage)
{
return GetActiveView()->PrintPage(pi,nPage);
}
void CApiEdit::EndPrint(Ae_PrintInfo *pi)
{
GetActiveView()->EndPrint(pi);
}
ÇÔ¼öÀÇ °³¼ö°¡ ¸¹±â´Â ÇÏÁö¸¸ ¹æ½ÄÀº °ÅÀÇ ºñ½ÁÇϹǷΠ´ëÇ¥ÀûÀ¸·Î GetWrap, SetWrap ÇÔ¼öÀÇ Äڵ常 ±¸°æÇØ º¸ÀÚ. GetWrap ÇÔ¼ö´Â Ȱ¼ººäÀÇ ÀÚµ¿ °³Çà »óŸ¦ ¸®ÅÏÇÑ´Ù. nWrap ¸â¹ö´Â ºä¿¡ ¼Ò¼ÓµÇ´Âµ¥ ÀÌ °ªÀ» ¾î¶»°Ô »ç¿ëÇÒ °ÍÀÎÁö´Â ºä¸¶´Ù ´Ù¸¦ ¼ö ÀÖ´Ù. ÅØ½ºÆ® ºä¿¡¼´Â ÀÌ °ª¿¡ µû¶ó ÀÚµ¿ °³Çà ¹æ½ÄÀ» º¯°æÇÏÁö¸¸ Çí»ç ºä¿¡¼´Â ÀÚµ¿ °³ÇàÀ̶ó´Â °³³ä ÀÚü°¡ ¾ø´Ù. ¾î¶µç GetWrapÀº Ȱ¼º ºä°¡ À¯ÁöÇϰí ÀÖ´Â °ªÀ» Á¶»çÇÑ´Ù. SetWrapÀº ¸ðµç ºä¿¡ ´ëÇØ SetWrap ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ °¢ ºä°¡ ÀÌ ÇÔ¼ö È£ÃâÀ» ¾î¶»°Ô ó¸®ÇÒ °ÍÀΰ¡µµ ºä¸¶´Ù ´Ù¸£´Ù. ÅØ½ºÆ® ºä´Â ÀÚµ¿ °³ÇàÀ» ÇϹǷΠÀçÁ¤·Ä, ½ºÅ©·Ñ ¹Ù °ü¸® µîÀ» ÇϰÚÁö¸¸ Çí»ç ºä´Â ÀÌ °ªÀ» »ç¿ëÇÏÁö ¾ÊÀ¸¸ç ´Ü¼øÈ÷ ´ëÀÔÇØ ³õ±â¸¸ ÇÒ °ÍÀÌ´Ù.
ÇÁ·¹ÀÓÀÇ Get/Set ÇÔ¼öµéÀº ´ëü·Î ÀÌ·± ½ÄÀ¸·Î ÀÛ¼ºµÇ¾î ÀÖ´Ù. GetÇÒ ¶§´Â Ȱ¼º ºäÀÇ °ªÀ» Á¶»çÇϰí SetÇÒ ¶§´Â ¸ðµç ºäÀÇ »óŸ¦ º¯°æÇÑ´Ù. ¹°·Ð ¿¹¿Üµµ ÀÖ´Ù. SetSelect´Â ¸ðµç ºäÀÇ ¼±Åà ¿µ¿ªÀ» ¹Ù²Ù´Â °ÍÀÌ ¾Æ´Ï°í Ȱ¼º ºäÀÇ ¼±Åÿµ¿ª¸¸ ¹Ù²Û´Ù. »ö»ó ¿É¼ÇÀ» º¯°æÇÏ´Â ÇÔ¼öµéÀº °ª º¯°æ ÈÄ ¸ðµç ºä¸¦ ´Ù½Ã ±×¸°´Ù. Àü¿¡´Â Á¶°ÇÀ» Á¡°ËÇÏ¿© ÇØ´ç ºä°¡ ±× ¿É¼ÇÀÇ ¿µÇâÀ» ¹ÞÀ» ¶§¸¸ ´Ù½Ã ±×·ÈÀ¸³ª ÀÌÁ¦´Â ¹«Á¶°Ç ±×¸°´Ù. ¿¹¸¦ µé¾î SetMarColor1 ÇÔ¼ö´Â ¸¶Áø »ö»óÀ» º¯°æÇ쵂 ¸¶ÁøÀÌ º¸ÀÏ ¶§¸¸ ´Ù½Ã ±×·È´Ù. °¢ ºäÀÇ »óŸ¦ ÀÏÀÏÀÌ Á¡°ËÇϱⰡ ±ÍÂú±â ¶§¹®¿¡ ÀÌ·± Á¶°Ç Á¡°ËÀ» »ý·«Çß´Ù. ¿É¼ÇÀ» ÀÚÁÖ ¹Ù²Ù´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ȸé 󸮻óÀÇ Å« ¹®Á¦´Â ¾ø°í ¿ÀÈ÷·Á Äڵ尡 ´õ ª¾ÆÁö´Â È¿°ú°¡ ÀÖ´Ù.
FindText³ª PrintPage µîÀÇ ÇÔ¼öµµ ºäÀÇ Æ¯¼º¿¡ µû¶ó °Ë»ö ¹× Àμ⠹æ¹ýÀÌ ´Þ¶óÁö¹Ç·Î È£½ºÆ®·ÎºÎÅÍ ÇÔ¼ö È£ÃâÀ» ¹Þ¾Æ ºä·Î Àü´ÞÇÏ´Â ¿ªÇÒ¸¸ Çϰí ÀÖ´Ù.
ÇÁ·¹ÀÓÀ» ¸¸µé¾úÀ¸´Ï ´ÙÀ½Àº ºä¸¦ ¸¸µé Â÷·Ê´Ù. ¾Õ¿¡¼ ÀÌ¹Ì Çß´ø ½Ç½ÀÀ» Çѹø ´õ ¹Ýº¹Çϰí Àִµ¥ ½Ç½À °úÁ¤ÀÌ ºñ·Ï ´Ü¼øÇÏÁö¸¸ ÀܼÕÀÌ ¸¹ÀÌ °¡±â ¶§¹®¿¡ ¹«Ã´ Áö·çÇÏ´Ù. SplitView ¿¹Á¦¿¡¼ °´Ã¼¸¦ ºÐÇÒÇÏ´Â ¹æ¹ýÀ» ¿Ïº®ÇÏ°Ô ÀÌÇØÇß´Ù¸é ÀÌ Áö°Ü¿î ½Ç½ÀÀ» ±»ÀÌ µû¶óÇØ º¼ ÇÊ¿ä´Â ¾ø´Ù. ¹°·Ð °°ÀÌ ÇØ º¸¸é ÁÁ±â´Â ÇϰÚÁö¸¸ ½Ã°£ÀÌ ¸¹ÀÌ µé°í ±ÍÂúÀº ¸éÀÌ ÀÖÀ¸¹Ç·Î Çϱ⠽ÈÀº »ç¶÷Àº ½Ç½ÀÀ» »ý·«Çصµ ÁÁ´Ù. ÇÏÁö¸¸ ¾î¶² °úÁ¤À» °ÅÃÄ ºä°¡ ¸¸µé¾îÁö´ÂÁö ½Ç½À °úÁ¤Àº ´«¿©°Ü ºÁ µÎ±â ¹Ù¶õ´Ù.
ÇÁ·¹ÀÓÀº ºä¸¦ °¨½Î´Â ²®µ¥±â¿¡ ºÒ°úÇÏ°í ½ÇÁ¦ ÅØ½ºÆ® ÆíÁýÀº ºä°¡ ÇϹǷΠ¿ø·¡ ApiEdit¿¡ ÀÖ´ø ´ëºÎºÐÀÇ ÆíÁý ÄÚµåµéÀÌ ºä¿¡ ´Ù½Ã ÀÛ¼ºµÉ °ÍÀÌ´Ù. Űº¸µå·Î ¹®ÀÚ¿À» ÀԷ¹ޱâ, ȸ鿡 ¹®¼ ³»¿ë Ãâ·ÂÇϱâ, ¸¶¿ì½º·Î ¼±ÅÃÇϱ⠵îÀÌ ¸ðµÎ ºäÀÇ ±â´ÉµéÀÌ´Ù. ´ÙÀ½ ÀýÂ÷¸¦ µû¶ó ½Ç½ÀÀ» ÁøÇàÇϰųª ¾Æ´Ï¸é ½Ç½À °úÁ¤À» ÀÐ¾î º¸±â¶óµµ ÇÏÀÚ.
¾ÕÀå¿¡¼ ÀÌ¹Ì Ãß°¡ÇØ ³õÀº ApiEditText.h¿¡ ºä Ŭ·¡½º¸¦ ¼±¾ðÇÑ´Ù.
ÀÌ Å¬·¡½º°¡ ApiEdit ÄÁÆ®·ÑÀÇ ±âº» ºäÀÌ´Ù. ¿ø·¡ CApiEdit Ŭ·¡½ºÀÇ ¸â¹öµé ´ëºÎºÐÀ» °¡ÁöÁö¸¸ ÀϺΠÁ¦¿ÜµÈ °Íµµ ÀÖ°í Çʿ信 µû¶ó »õ·Î
Ãß°¡µÈ °Íµµ ÀÖ´Ù.
#ifndef __APIEDITTEXT_H
#define __APIEDITTEXT_H
class CApiEditText : public CWindow
{
friend class CApiEdit;
friend class CParse;
friend class CParseCpp;
friend class CParseNull;
friend class CParseHtml;
friend class CParseSql;
protected:
BOOL bComp;
int off;
int FontHeight;
int LineRatio;
int LineHeight;
int nWrap;
BOOL bNoFirstSpace;
int PrevX;
BOOL bLineEnd;
int yPos,xPos;
int yMax,xMax;
int FontWidth;
int TabWidth;
int TabSize;
int SelStart, SelEnd;
BOOL bCapture;
int arChWidth[128];
BYTE *arHanWidth;
tagLine *pLine;
int TotalLine;
HBITMAP hBit;
int MarginWidth;
RECT frt;
BOOL bShowLineNum;
int arMark[MAXBOOKMARK];
BOOL bShowTab;
BOOL bShowEnter;
BOOL bShowSpace;
int ShowTabType;
int ShowEnterType;
int ShowSpaceType;
BOOL bSelLine;
int SelStartLine;
BOOL bDragSel;
BOOL bOvr;
int Linelen;
int SumDelta;
BOOL bHideCaret;
LOGFONT logfont;
int RightWrap;
int ColMark;
BOOL bPrevCompoGroup;
CParse *Parser;
BOOL bFindSelect;
HFONT hMainFont;
public:
CApiEditText();
CApiEdit *pFrame;
int ViewType;
BOOL Create(int x,int y,int w,int h,DWORD style,UINT id,HWND hParent);
LRESULT OnMessage(UINT iMessage,WPARAM wParam,LPARAM lParam);
BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void OnChar(HWND hWnd, TCHAR ch, int cRepeat);
void OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags);
void OnPaint(HWND hWnd);
void OnSetFocus(HWND hWnd, HWND hwndOldFocus);
void OnKillFocus(HWND hWnd, HWND hwndNewFocus);
void OnDestroy(HWND hWnd);
LRESULT OnImeComposition(HWND hWnd, WPARAM wParam, LPARAM lParam);
LRESULT OnImeChar(HWND hWnd, WPARAM wParam, LPARAM lParam);
void OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
void OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags);
void OnLButtonUp(HWND hWnd, int x, int y, UINT keyFlags);
void OnTimer(HWND hWnd, UINT id);
void OnSize(HWND hWnd, UINT state, int cx, int cy);
void OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos);
void OnVScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos);
void OnContextMenu(HWND hWnd, HWND hwndContext, UINT xPos, UINT yPos);
virtual void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);
BOOL OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg);
UINT OnGetDlgCode(HWND hWnd, LPMSG lpmsg);
void OnMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam);
virtual int GetCharWidth(TCHAR *ch, int len);
virtual void SetCaret(BOOL bUpdatePrevX=TRUE, BOOL bScrollToCaret=TRUE);
virtual void Insert(int nPos, TCHAR *str, BOOL bRec=TRUE);
virtual void Delete(int nPos, int nCount, BOOL bRec=TRUE);
virtual void GetLine(int Line, int &s, int &e);
virtual int GetRowCount();
virtual void GetRCFromOff(int nPos, int &r, int &c);
virtual int GetOffFromRC(int r, int c);
virtual void GetXYFromOff(int nPos, int &x, int &y);
virtual void SetWrap(int aWrap);
virtual int GetXPosOnLine(int r,int DestX);
virtual void UpdateScrollInfo();
virtual int DrawLine(HDC hdc, int Line);
virtual void DrawSegment(HDC hdc, int &x, int y, int SegOff, int len, BOOL ignoreX,
COLORREF fore, COLORREF back);
virtual int GetOffFromXY(int x, int y);
virtual BOOL IsDelimiter(int nPos);
virtual int GetPrevWord(int nPos);
virtual int GetNextWord(int nPos);
virtual void ClearSelection();
virtual void ExpandSelection(int Start, int End);
virtual BOOL DeleteSelection();
virtual void PrepareCharWidth(HDC hdc);
virtual int MyGetTextExtent(TCHAR *text, int len);
virtual void UpdateLineInfo(int nPos=-1, int nCount=-1);
virtual void Invalidate(int Pos1, int Pos2=-1);
virtual void ClearBookmark();
virtual void ToggleBookmark(int Para, int Mark);
virtual void GotoBookmark(int Mark);
virtual void GotoLine(int Line, int Col=0, int Type=0);
virtual int FindBookmark(int Para);
virtual void DisplayTab(HDC hdc, int x1, int x2, int y,COLORREF back);
virtual void DisplayEnter(HDC hdc, int x, int y,COLORREF back);
virtual void DisplaySpace(HDC hdc, int x, int y, TCHAR *text, int len);
virtual void GetNowWord(int nPos, int &s, int &e);
virtual BOOL IsInSelection(int x,int y);
virtual void CopyString(BOOL bCopy, int from, int &to, int len, BOOL bRec=TRUE);
virtual void GetSelect(int &s, int &e);
virtual void SetSelect(int s, int e, BOOL bFind);
virtual BOOL GetShowState(int nIndex);
virtual void SetShowState(int nIndex, BOOL aValue);
virtual int GetLineRatio() { return LineRatio; }
virtual void SetLineRatio(int aLineHeight);
virtual int GetWrap() { return nWrap; }
virtual int GetTabWidth() { return TabWidth; }
virtual void SetTabWidth(int aTabWidth);
virtual void GetFont(LOGFONT *alogfont);
virtual void SetFont(LOGFONT *alogfont);
virtual BOOL GetNoFirstSpace() { return bNoFirstSpace; }
virtual void SetNoFirstSpace(BOOL aNoFirstSpace);
virtual int GetShowTabType() { return ShowTabType; }
virtual void SetShowTabType(int aShowTabType);
virtual int GetShowEnterType() { return ShowEnterType; }
virtual void SetShowEnterType(int aShowEnterType);
virtual int GetShowSpaceType() { return ShowSpaceType; }
virtual void SetShowSpaceType(int aShowSpaceType);
virtual void SetDefaultSetting();
virtual int GetRightWrap() { return RightWrap; }
virtual void SetRightWrap(int aRightWrap);
virtual int GetColMark() { return ColMark; }
virtual void SetColMark(int aColMark);
virtual CParse* GetParser() { return Parser; }
virtual void SetParser(int ParseType);
virtual BOOL FindText(int nPos, TCHAR *what, DWORD dwFlag);
virtual int ReplaceText(int nPos, TCHAR *what, DWORD dwFlag, TCHAR *to);
virtual int GetOffset() { return off; }
virtual void GetSelRect(RECT &srt);
virtual int GetInfoFromOff(int Type, int nPos=-1);
virtual void FindParen(BOOL bSelect);
virtual void GotoLastEditOff();
virtual int GetDocInfo(int type);
virtual BOOL GetInsMode() { return bOvr; }
virtual void ChangeCase(int action);
virtual void ConvertSpaceTab(BOOL bToSpace);
virtual void RemoveExtraSpace();
virtual void GetParaFromOff(int nPos, int &pr, int &pc);
virtual int GetOffFromPara(int pr, int pc);
virtual int GetParaFirstLine(int nPara);
virtual int GetParaLastLine(int nPara);
virtual void ProcessIndent(TCHAR ch);
virtual BOOL IsParaEmpty(TCHAR *p);
virtual int GetPrevPara(int nPos);
virtual int GetIndentLevel(TCHAR *p);
virtual void GetIndentString(int nPara,TCHAR *szIndent,int len);
virtual void MakeIndentString(int nTab, TCHAR *str, int len);
virtual BOOL IsPrevParaBlockOpen(int nPos);
virtual void BlockIndent(BOOL bUnindent);
virtual void InsertComment(BOOL bUnComment);
virtual void InsertText(TCHAR *Text);
virtual void CopyChar(int dir);
virtual void BeginPrint(Ae_PrintInfo *pi);
virtual BOOL PrintPage(Ae_PrintInfo *pi,int nPage);
virtual void EndPrint(Ae_PrintInfo *pi);
virtual void GetLine(int Line, int &s, int &e,Ae_PrintInfo *pi);
virtual void InitView();
virtual void SetOffset(int aoff);
};
#endif // __APIEDITTEXT_H
ÇÁ·¹ÀÓ¿¡¼ ºäÀÇ ¸â¹ö¸¦ ¸¶À½´ë·Î ¾×¼¼½ºÇÒ ¼ö ÀÖµµ·Ï ÇÁ·£µå·Î ¼±¾ðÇß´Ù. ºä´Â ÇÁ·¹ÀÓÀÇ ÇÁ·£µåÀ̰í ÇÁ·¹ÀÓÀº ºäÀÇ ÇÁ·£µåÀ̹ǷΠ»óÈ£ ¼·ÎÀÇ ¸â¹ö¸¦ Á¦¾à¾øÀÌ ÀÐ°í ¾µ ¼ö ÀÖ´Ù. ¸ðµç ¸â¹ö º¯¼öÀÇ ¾×¼¼½º ÁöÁ¤À» protected·Î º¯°æÇߴµ¥ ´Ù¸¥ ŸÀÔÀÇ ºä¿¡¼µµ ±âº» ºäÀÇ ¸ðµç ¸â¹ö¸¦ ¾×¼¼½ºÇÒ ¼ö ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ÀÌÈÄ Ãß°¡µÇ´Â ºä Ŭ·¡½ºµéÀº ¸ðµÎ ÀÌ Å¬·¡½º·ÎºÎÅÍ ÆÄ»ýµÉ °ÍÀÌ´Ù.
buf, doclen µî ¹®¼¿Í »ó°üÀÖ´Â º¯¼öµéÀº ¸â¹ö¿¡¼ »èÁ¦µÇ¾úÀ¸¸ç CWindow·ÎºÎÅÍ »ó¼Ó¹Þ¾ÒÀ¸¹Ç·Î hWndÀ©µµ¿ì ÇÚµéÀº µû·Î °¡Áú Çʿ䰡 ¾ø´Ù. Ãß°¡µÈ °Íµµ ¸î°¡Áö Àִµ¥ pFrameÀº ÀڽŰú ¿¬°áµÈ ÇÁ·¹ÀÓÀÇ Æ÷ÀÎÅ͸¦ °¡¸®Å²´Ù. ÇÁ·¹ÀÓÀÇ CreateView ÇÔ¼ö¿¡¼ ºä¸¦ »ý¼ºÇÒ ¶§ pFrame¿¡ ÀÚ½ÅÀÇ Æ÷ÀÎÅ͸¦ ´ëÀÔÇϹǷΠºä´Â pFrameÀ¸·ÎºÎÅÍ ÇÁ·¹ÀÓÀÇ ¸ðµç ¸â¹ö¸¦ ÀÚÀ¯·Ó°Ô ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ÇÁ·¹ÀÓÀÇ ¹öÆÛ¸¦ ÀÐ°í ½ÍÀ¸¸é pFrame->buf·Î ÀÐÀ¸¸é µÈ´Ù. ViewTypeÀº ºäÀÇ Å¸ÀÔÀ» ±â¾ïÇϴµ¥ ÅØ½ºÆ® ºä´Â 0¹ø(TEXT_VIEW)°ªÀ» °¡Áø´Ù.
¿©±â±îÁö ¸¸µé¾îÁø Ŭ·¡½ºÀÇ °èÃþµµ´Â CWindow¸¦ ·çÆ®·Î ÇÏ°í ±× ÆÄ»ý Ŭ·¡½º·Î CApiEdit¿Í CApiEditText¸¦ Á¤ÀÇÇÑ´Ù. ÅØ½ºÆ® ºä¿Ü¿¡ ´Ù¸¥ ºä¸¦ Ãß°¡·Î ¸¸µç´Ù¸é ´ÙÀ½°ú °°Àº °èÃþÀ» ÀÌ·ê °ÍÀÌ´Ù.

Ãß°¡µÇ´Â ºäµéÀº ±âº» ºäÀÎ CApiEditText¸¦ »ó¼Ó¹Þ¾Æ ¸¸µé¾îÁø´Ù. µû¶ó¼ ÅØ½ºÆ® ÆíÁý ºä¿Í µ¿ÀÏÇÏ°Ô Ã³¸®ÇÒ ¼ö ÀÖ´Â ÄÚµå´Â ¸ðµÎ »ó¼Ó¹ÞÀ¸¸ç ´Ù¸£°Ô µ¿ÀÛÇÏ´Â ºÎºÐÀº ÀçÁ¤ÀÇµÉ °ÍÀÌ´Ù. ÀÌ·± ¹æ¹ý¿Ü¿¡ CWindow·ÎºÎÅÍ ºäÀÇ ÀϹÝÀûÀÎ ¼Ó¼ºÀ» °¡Áö´Â CView¸¦ ÆÄ»ý½Ã۰í CView·ÎºÎÅÍ ¿©·¯ °¡Áö ºä¸¦ ´Ù½Ã »ó¼ÓÇÏ´Â ¹æ¹ýÀ» »ý°¢ÇØ º¼ ¼ö ÀÖ´Ù. ÀϹÝÀûÀÎ ºä¸¦ Á¤ÀÇÇϱâ À§ÇÑ ´Ü°è¸¦ °¡Áö°Ô µÊÀ¸·Î½á ÇÁ·¹ÀÓÀº CViewÀÇ Æ÷ÀÎÅÍ·Î ¸ðµç ºä¸¦ Àϰý °ü¸®ÇÒ ¼ö ÀÖ´Ù´Â ÀÌÁ¡ÀÌ ÀÖ°í À̰ÍÀÌ ÈξÀ ´õ ÁÁÀº µðÀÚÀÎÀÌ´Ù.
±×·¯³ª ÀÌ ¿¹Á¦¿¡¼ ±×·¸°Ô ÇÏÁö ¾ÊÀº ÀÌÀ¯´Â CView¿¡ ³Ê¹« ¸¹Àº ºó ÇÔ¼öµéÀÌ ÀÛ¼ºµÇ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ºä°£¿¡ Â÷ÀÌÁ¡ÀÌ °ÅÀÇ ¾ø´Ù¸é ºäÀÇ ·çÆ® Ŭ·¡½º¸¦ ¼±¾ðÇÏ°í ·çÆ®¿Í ´Ù¸¥ ºÎºÐ¸¸ ºÎºÐÀûÀ¸·Î ÀçÁ¤ÀÇÇÏ¸é µÇÁö¸¸ Â÷ÀÌÁ¡ÀÌ ¸¹¾ÆÁö¸é ´ëºÎºÐÀ» ÀçÁ¤ÀÇÇØ¾ß Çϱ⠶§¹®¿¡ ¿ÀÈ÷·Á ºñÈ¿À²ÀûÀÌ´Ù. ¶ÇÇÑ CView°¡ ÀϹÝÀûÀÎ ºäÀÇ Æ¯¼ºÀ» °¡Áö±â À§Çؼ´Â ±âÁ¸ÀÇ ¸â¹ö ÇÔ¼ö¸¦ Á¶±Ý¾¿ ¼öÁ¤ÇØ¾ß ÇÏ°í ½Ç½À °úÁ¤ÀÌ ¹ø°Å·Î¿ÍÁö´Â ¹®Á¦µµ ÀÖ´Ù. ¿ø·¡ CApiEdit¿¡ ÀÛ¼ºµÇ¾î ÀÖ´ø Äڵ带 ÃÖ´ëÇÑ ¼öÁ¤¾øÀÌ ÀçȰ¿ëÇϱâ À§Çؼ Àú·± ±¸Á¶°¡ ³ª¿Ô´Ù.
ÇÁ·¹ÀÓÀº Àڽſ¡°Ô ¿¬°áµÈ ºäÀÇ Æ÷ÀÎÅ͸¦ ¹è¿·Î °ü¸®ÇÏ¸ç ºäÀÇ ÇÔ¼ö¸¦ ºÎ¸¦ ¶§´Â arView[n]->¸â¹öÇÔ¼ö; È£Ãâ¹®À» »ç¿ëÇÑ´Ù. Æ÷ÀÎÅͷκÎÅÍ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇϱ⠶§¹®¿¡ ºäÀÇ ¸â¹ö ÇÔ¼öµéÀº ´ëºÎºÐ °¡»ó ÇÔ¼ö°¡ µÇ¾î¾ß ÇÑ´Ù. »ç½Ç ÀüºÎ ´Ù °¡»ó ÇÔ¼ö·Î ¸¸µé ÇÊ¿ä´Â ¾ø°í ¿ÜºÎ¿¡¼ Æ÷ÀÎÅͷκÎÅÍ È£ÃâµÇ´Â ÇÔ¼ö¸¸ °¡»ó ÇÔ¼ö·Î ¸¸µé¸é µÇ³ª À̰ÍÀ» ±¸ºÐÇϱⰡ ³Ê¹« ±ÍÂú¾Æ ÀüºÎ °¡»ó ÇÔ¼ö·Î ¼±¾ðÇß´Ù. vtableÀÌ Á¶±Ý Ä¿Áú»Ó ¼º´É»óÀÇ º° Â÷ÀÌ´Â ¾øÀ¸¹Ç·Î Â÷ÈÄ¿¡ ÃÖÀûÈ °úÁ¤¿¡¼ ÀϺΠÇÔ¼ö¸¦ ´Ù½Ã ºñ°¡»óÀ¸·Î ¸¸µé °ÍÀÌ´Ù.
ApiEditText.cpp¿¡ ÀÌ Å¬·¡½ºÀÇ Äڵ带 ÀÛ¼ºÇÑ´Ù. ¸ÕÀú Ç¥ÁØ Çì´õ
ÆÄÀÏÀ» Æ÷ÇÔ½Ã۱â À§ÇØ stdafx.h¸¦ ÀÎŬ·çµåÇÑ´Ù. ÁÖ¼®À¸·Î ó¸®µÈ #includeµµ ´çÀåÀº ÇÊ¿ä¾øÁö¸¸ ÄÄÆÄÀÏµÈ Çì´õ¸¦ ¾²Áö ¾Ê´Â ÇÁ·ÎÁ§Æ®¸¦
À§ÇØ ¹Ì¸® Æ÷ÇÔ½ÃÄÑ µÎ´Â °ÍÀÌ ÁÁ´Ù.
//#define _WIN32_WINNT 0x400
//#define _WIN32_WINDOWS 0x401
//#include <windows.h>
//#include <windowsx.h>
//#include <imm.h>
//#include <stdio.h>
//#include <io.h>
//#include <malloc.h>
//#include <commctrl.h>
//#include <Shlwapi.h>
//#include <Shlobj.h>
//#include <wininet.h>
//#include <stdio.h>
//#include "Parse.h"
//#include "AeUtil.h"
//#include "ApiEdit.h"
//#include "ApiEditText.h"
#include "stdafx.h"
¸â¹ö ÇÔ¼öµéÀÇ ÄÚµå´Â ´ëºÎºÐ ¿ø·¡ ApiEditÀÇ ÄÚµå¿Í °°±â ¶§¹®¿¡ ÀÏ´Ü ¿ø·¡ÀÇ ApiEdit.cpp¸¦ º¹»çÇØ¿Â ÈÄ ¼öÁ¤ÇÏ´Â °ÍÀÌ ÁÁ´Ù. Danguen13ÀÇ ApiEdit.cpp¿¡¼ »ý¼ºÀÚ ÀÌÈĸ¦ ¸ðµÎ ÀÌ ÆÄÀÏ·Î º¹»çÇØ ¿Â´Ù. µµ¿ì¹Ì³ª ApiEditProc µûÀ§´Â ÇÁ·¹ÀÓ¿¡ ÀÖÀ¸¹Ç·Î °¡Á®¿Ã Çʿ䰡 ¾ø´Ù.
ºä¿¡ ¼ÓÇÏÁö ¾Ê´Â ¸â¹ö ÇÔ¼öµéÀ» »èÁ¦ÇÑ´Ù. ´ÙÀ½ÀÌ »èÁ¦ ´ë»ó ÇÔ¼öµéÀÌ¸ç °øÀ¯
¸®¼Ò½º¸¦ °ü¸®ÇÏ´Â Á¤Àû ÇÔ¼öÀ̰ųª ¹®¼, Ãë¼Ò ·¹Äڵ带 ´Ù·ç´Â ÇÔ¼öµéÀÌ´Ù. ÀÌ ÇÔ¼öµéÀº ÇÁ·¹ÀÓ¿¡¸¸ ÀÖÀ¸¸ç ºä¿¡°Ô´Â Çʿ䰡 ¾ø´Ù´Â °ÍÀ» Á÷°üÀûÀ¸·Î
ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÆÄ±«ÀÚ(~ApiEdit)
IsDBCS, GetPrevOff, GetNextOff(3°³)
FindParaStart, IncludeEnter
LoadAeResource~ SetReadOnly(8°³)
SetUseLineEnd, SetAllowDrag
CanUndo~ EndUndoGroup(16°³)
SendNotify
SetFormat, AnalyzeFormat, ConvertFormat
SetShowCurLine, SetHideSelType
SetForeColor~SetSelBackColor(4°³)
SetMarColor1~SetNumColor(6°³)
SetCaretWidth~SetCalcTabWidthAvg(3°³)
¿ø·¡ ApiEdit.cpp¿¡ ÀÌ ¼ø¼´ë·Î ¿¬¼ÓÀûÀ¸·Î ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ¼ø¼´ë·Î °Ë»öÇÏ¸é¼ »èÁ¦ÇÏ¸é µÈ´Ù. »ç½Ç Çì´õ ÆÄÀÏ¿¡ ÀζóÀÎÀ¸·Î ¼±¾ðµÇ¾î ÀÖ´ø ÇÔ¼ö±îÁö Æ÷ÇÔÇØ¼ À̺¸´Ù ÈξÀ ´õ ¸¹Àº ÇÔ¼öµéÀÌ »èÁ¦µÇ¾ú´Ù. ³²Àº ÇÔ¼öµéÀº ÀÌÁ¦ ¸ðµÎ ÅØ½ºÆ® ºä¿¡ ¼Ò¼ÓµÇ¹Ç·Î CApiEdit::À» CApiEditText::À¸·Î Àϰý º¯°æÇÑ´Ù. ºñÁÖ¾ó ½ºÆ©µð¿À ÆíÁý±âÀÇ Àϰý ġȯ ±â´ÉÀ» »ç¿ëÇϸé ÇѲ¨¹ø¿¡ ¹®ÀÚ¿À» º¯°æÇÒ ¼ö ÀÖ´Ù.
³²¾Æ ÀÖ´Â ÇÔ¼öµéÀº ºä¿¡ ¸Â°Ô ¼öÁ¤ÇØ¾ß Çϴµ¥ ¸ÕÀú ÃʱâÈ °ü·Ã ÇÔ¼öºÎÅÍ
¼öÁ¤ÇØ º¸ÀÚ. »ý¼ºÀÚ¿Í Create ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
CApiEditText::CApiEditText()
{
arHanWidth=NULL;
pLine=NULL;
hBit=NULL;
Parser=NULL;
bFindSelect=FALSE;
ViewType=TEXT_VIEW;
}
BOOL CApiEditText::Create(int x,int y,int w,int h,DWORD style,UINT id,HWND hParent)
{
CreateWindow("ApiEditText",NULL, style | WS_CLIPCHILDREN,
x,y,w,h,hParent,(HMENU)id,GetModuleHandle(NULL),this);
return TRUE;
}
buf¿Í pURµî ÇÁ·¹ÀÓÀÇ ¸â¹ö¿¡ ´ëÇÑ ÃʱâȰ¡ ºüÁö´Â ´ë½Å ViewTypeÀ» TEXT_VIEW·Î ÃʱâÈÇÏ¿© 0¹ø ŸÀÔÀÇ ºäÀÓÀ» ½º½º·Î ±â¾ïÇϵµ·Ï ÇÏ¿´´Ù. Create ÇÔ¼ö´Â ApiEditText À©µµ¿ì Ŭ·¡½º·Î ÅØ½ºÆ® ºä¸¦ »ý¼ºÇÑ´Ù. â ºÐÇÒ ±â´ÉÀ» À§ÇØ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀ» »ç¿ëÇÒ ¿¹Á¤Àε¥ ºä°¡ Â÷Àϵå ÄÁÆ®·ÑÀÇ ¿µ¿ªÀ» ±×¸®Áö ¾Êµµ·Ï WS_CLIPCHILDREN ½ºÅ¸ÀÏÀ» ÁÖ¾ú´Ù. OnCreate¿Í OnDestroy´Â ´ÙÀ½Ã³·³ ¼öÁ¤µÈ´Ù.
BOOL CApiEditText::OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
bComp=FALSE;
bCapture=FALSE;
bSelLine=FALSE;
SelStartLine=0;
bDragSel=FALSE;
SumDelta=0;
bHideCaret=FALSE;
SetDefaultSetting();
InitView();
return TRUE;
}
void CApiEditText::OnDestroy(HWND hWnd)
{
free(arHanWidth);
free(pLine);
if (hBit) {
DeleteObject(hBit);
hBit=NULL;
}
SetParser(-1);
if (hMainFont) {
DeleteObject(hMainFont);
}
}
ºäÀÇ ÁÖ¿ä Ç÷¡±×µéÀÌ ÃʱâȵǸç InitDoc ´ë½Å InitView ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ºä¸¦ ÃʱâÈÇÑ´Ù. ºä°¡ ÆÄ±«µÉ ¶§´Â ±Û²Ã Á¤º¸, ´õºí ¹öÆÛ¸µ ºñÆ®¸Ê µîÀ» Á¦°ÅÇÏ°í ºÐ¼®±â¸¦ ºÐ¸®ÇÑ´Ù. Ãë¼Ò ·¹ÄÚµå´Â ´õ ÀÌ»ó ºäÀÇ ¸â¹ö°¡ ¾Æ´Ï¹Ç·Î OnDestroy¿¡¼ ÇØÁ¦ÇÒ Çʿ䰡 ¾ø´Ù.
»õ·Î Ãß°¡µÈ µÎ °³ÀÇ ¸â¹ö ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.
void CApiEditText::InitView()
{
int i;
Parser->InitInfo(TRUE);
Linelen=100;
if (pLine) {
free(pLine);
}
pLine=(tagLine *)malloc(sizeof(tagLine)*Linelen);
for (i=0;i<Linelen;i++) {
pLine[i].Start=-1;
}
bOvr=FALSE;
off=0;
PrevX=0;
bLineEnd=FALSE;
xMax=1024;
xPos=0;
yPos=0;
SelStart=SelEnd=0;
ClearBookmark();
UpdateLineInfo();
UpdateScrollInfo();
if (GetFocus()==hWnd) {
SetCaret();
}
bPrevCompoGroup=FALSE;
Invalidate(-1);
}
void CApiEditText::SetOffset(int aoff)
{
off=aoff;
SetCaret();
}
InitView ÇÔ¼ö¿¡´Â ¿ø·¡ InitDoc¿¡ ÀÖ´Â ÄÚµå Áß ¹®¼¿Í Á÷Á¢ °ü·ÃÀÌ ¾ø°í º¸±â »óÅÂ¿Í °ü·ÃÀÖ´Â º¯¼öµé¿¡ ´ëÇÑ ÃʱâÈ Äڵ尡 ÀÛ¼ºµÇ¾î ÀÖ´Ù. »ý¼ºÀÚ³ª OnCreate¿¡¼ÀÇ Ãʱâȿʹ ´Þ¸® ÀÌ ÇÔ¼öÀÇ ÃʱâÈ´Â ÀÏȸÀûÀÌÁö ¾ÊÀ¸¸ç ºä°¡ ´Ù¸¥ ¿ëµµ·Î »ç¿ëµÉ ¶§¸¶´Ù ÇÊ¿äÇÑ °ÍµéÀÌ´Ù. SetOffset ÇÔ¼ö´Â ¿ÀÇÁ¼ÂÀ» º¯°æÇϰí ij·µÀ» ¿Å±â´Âµ¥ ÇÁ·¹ÀÓÀÇ Undo, Redo¸¦ Áö¿øÇϱâ À§ÇØ ÇÊ¿äÇÏ´Ù. ÇÁ·¹ÀÓÀº Ãë¼Ò, Àç½ÇÇà½Ã ºäÀÇ SetOffset ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ºäÀÇ ÆíÁý À§Ä¡¸¦ Á÷Á¢ ¿Å±ä´Ù.
Insert, Delete ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ƯÀÌÇϰԵµ ÇÁ·¹ÀÓ¿¡µµ
ÀÖ°í ºä¿¡µµ Àִµ¥ ¹®¼°¡ ÆíÁýµÉ ¶§ bufÀÇ ³»¿ëÀÌ º¯ÇÔÀº ¹°·ÐÀÌ°í ºä¿¡¼µµ ÀçÁ¤·Ä, ºÏ¸¶Å© °ü¸®, ½ºÅ©·Ñ Á¤º¸ °»½Å µîÀÇ ÀÛ¾÷À» ÇØ¾ß Çϱâ
¶§¹®ÀÌ´Ù.
void CApiEditText::Insert(int nPos, TCHAR *str, BOOL bRec/*=TRUE*/)
{
int nCrLf=0,i;
int r,c;
int nowPara;
TCHAR *p=str;
if (bReadOnly)
return;
pFrame->Insert(nPos,str,bRec);
bLineEnd=FALSE;
UpdateLineInfo(nPos,lstrlen(str));
UpdateScrollInfo();
while (*p) {
if (*p=='\r')
nCrLf++;
p++;
}
if (nCrLf) {
GetRCFromOff(nPos,r,c);
nowPara=pLine[r].nPara;
if (c != 0) {
nowPara++;
}
for (i=0;i<MAXBOOKMARK;i++) {
if (arMark[i] >= nowPara) {
arMark[i]+=nCrLf;
}
}
}
}
void CApiEditText::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)
{
int nCrLf=0,i;
int sr,sc,er,ec;
int sPara,ePara;
TCHAR *p=buf+nPos;
if (bReadOnly)
return;
if (nCount == 0) return;
if (doclen < nPos+nCount) return;
for (i=0;i<nCount;i++) {
if (p[i]=='\r')
nCrLf++;
}
if (nCrLf) {
GetRCFromOff(nPos,sr,sc);
sPara=pLine[sr].nPara;
GetRCFromOff(nPos+nCount,er,ec);
ePara=pLine[er].nPara;
for (i=0;i<MAXBOOKMARK;i++) {
if (arMark[i] >= sPara && arMark[i] < ePara) {
arMark[i]=-1;
}
if (arMark[i] >= ePara) {
arMark[i]-=nCrLf;
}
}
}
pFrame->Delete(nPos,nCount,bRec);
UpdateLineInfo(nPos,-nCount);
UpdateScrollInfo();
}
½ÇÁ¦ ¹®¼¸¦ º¯°æÇÏ´Â ÀÛ¾÷Àº ÇÁ·¹ÀÓÀÇ Insert, Delete ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ó¸®ÇÏ¸ç ºä´Â ¹®¼ º¯°æ¿¡ µû¸¥ Ãß°¡ ÀÛ¾÷¸¸ ó¸®ÇÑ´Ù. ÀÌ·± ÀÛ¾÷Àº ¹®¼°¡ º¯°æµÉ ¶§¸¶´Ù ÇØ¾ß ÇÏÁö¸¸ ºäÀÇ Å¸ÀÔ¿¡ µû¶ó ´Þ¶óÁú ¼ö ÀÖÀ¸¹Ç·Î ÇÁ·¹ÀÓÀÌ Á÷Á¢ ÇÒ ¼ö ÀÖÀ¸¸ç °³º° ºä°¡ Àڽſ¡°Ô ¸Â´Â ÀÛ¾÷À» Á÷Á¢ ÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î Çí»çºä´Â bLineEnd¶ó´Â º¯¼ö¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸ç Á¤·Äµµ ÇÏÁö ¾Ê´Â´Ù.
ÇÁ·¹ÀÓ¿¡ ÀÖ´Â ¸â¹ö¸¦ ÂüÁ¶ÇÏ´Â ¸ðµç ¹®ÀåÀ» ¼öÁ¤ÇÑ´Ù. ÀÌ ÀÛ¾÷Àº ¾ÆÁÖ Áö°Ü¿î
ġȯ °úÁ¤ÀÌ¸ç ¸Ó¸®´Â ÇÊ¿ä¾ø°í ¼Õ¸¸ ºÎÁö·±È÷ ³î¸®¸é µÈ´Ù. ÁÁ¾ÆÇÏ´Â À½¾ÇÀ̳ª °¨»óÇÏ¸é¼ ÀÛ¾÷Çϸé Á» ´ú Áö°ã´Ù. ¸ÕÀú Á¤Àû º¯¼öµéÀ» ġȯÇÑ´Ù.
hLineNumFont,hCSel,hCCopy,hCMove,hCMargin,hCNoDrop;
ÀÌ º¯¼öµéÀº ¸ðµÎ ÇÁ·¹ÀÓ¿¡ ¼Ò¼ÓµÇ¾î ÀÖÀ¸¹Ç·Î ¾Õ¿¡ CApiEdit::À» ºÙÀδÙ. Á¤Àû º¯¼öÀ̹ǷΠŬ·¡½º À̸§À¸·Î ¼Ò¼ÓÀ» ¹àÇû´Ù. ºä°¡ ÂüÁ¶ÇÏ´Â ÇÁ·¹ÀÓÀÇ º¯¼öµéµµ ¸ðµÎ ġȯÇÑ´Ù. ¿¹¸¦ µé¾î buf¸¦ ÂüÁ¶ÇÏ´Â ¸ðµç ¹®ÀåÀº pFrame->buf·Î Àϰý Ä¡È¯ÇØ¾ß ÇÑ´Ù. ´ÙÀ½ÀÌ Ä¡È¯´ë»óÀÌ´Ù.
buf, doclen, bReadOnly, LastEditOff, bWantTab, bUseLineEnd, bAllowDrag, bSpaceForTab, bAutoIndent, bBlockIndentWithTab, bHomeToFirstChar, HideSelType, nShowCurLine, bHideCurLine, bCalcTabWithAvg
MarColor1, MarColor2, NumColor, MarkColor, CodeColor, CurColor, cFore, cBack, cSelFore, cSelBack
ºñÁÖ¾ó ½ºÆ©µð¿ÀÀÇ Àϰý ġȯ ±â´ÉÀ» »ç¿ëÇ쵂 ¹Ýµå½Ã ´Ü¾î ´ÜÀ§·Î ¿É¼ÇÀ» ¼±ÅÃÇØ ³õ°í ÀÛ¾÷ÇØ¾ß ÇÑ´Ù. ÀÌ ¿É¼ÇÀ» ¼±ÅÃÇÏÁö ¾ÊÀ¸¸é LastEditOff¸¦ º¯°æÇÒ ¶§ GotoLastEditOff°¡ GotopFrame->LastEditOff°¡ µÇ¾î ¹ö¸± °ÍÀ̰í tbuf´Â tpFrame->buf°¡ µÉ °ÍÀÌ´Ù. ¹Ýµå½Ã ´Ü¾î ´ÜÀ§·Î Ä¡È¯ÇØ¾ß ÇÑ´Ù.
CaretWidth¸¦ ¹Ù²Ü ¶§´Â ´ë¼Ò¹®ÀÚ ÀÏÄ¡ ¿É¼Çµµ °°ÀÌ ¼±ÅÃÇØ¾ß ÇϹǷΠ¼ÕÀ¸·Î Á÷Á¢ ¹Ù²Ù´Â °ÍÀÌ ¼ÓÆíÇÏ´Ù. µü Çѱºµ¥ »ÓÀÌ´Ù.
void CApiEditText::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
....
if (bComp) {
toff=off-2;
caretwidth=GetCharWidth(pFrame->buf+toff,2);
} else {
toff=off;
caretwidth=pFrame->CaretWidth;
}
Áö¿ª º¯¼ö¿¡ caretwidth°¡ ÀÖ¾î Àϰý ġȯÇϸé ÀÌ º¯¼ö±îÁö °°ÀÌ ¹Ù²ï´Ù. Àü¿ª º¯¼ö¿Í ´ë¼Ò¹®ÀÚ ±¸¼º¸¸ ´Ù¸£°í öÀÚ°¡ °°¾Æ ġȯÇÏ±â ºÒÆíÇѵ¥ ¾Æ¹«·¡µµ º¯¼ö À̸§À» Á» À߸ø ÁöÀº °Í °°´Ù. ÇÁ·¹ÀÓÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¹®Àåµéµµ ġȯÇÑ´Ù. ¸â¹ö º¯¼ö¿Í ¸¶Âù°¡Áö·Î ÇÔ¼ö È£Ãâ¹® ¾Õ¿¡ pFrame->À» ºÙÀÌ¸é µÈ´Ù. ¿¹¸¦ µé¾î Undo()´Â pFrame->Undo()·Î ġȯµÈ´Ù.
IsDBCS, GetPrevOff, GetNextOff, FindParaStart, IncludeEnter, SendNotify, CanUndo, CanRedo, Undo, Redo, StartUndoGroup, EndUndoGroup, AnalyzeFormat, ConvertFormat, URInsert, URMove
ApiEdit°¡ ¿ö³« ¸¹Àº ¸â¹ö¸¦ °¡Áö°í Àֱ⠶§¹®¿¡ ºÐÇÒ ÈÄ¿¡ °¢ ¸â¹ö¸¦ ÂüÁ¶ÇÏ´Â ¸ðµç ¹®ÀåÀ» ÀÏÀÏÀÌ ¼öÁ¤ÇØ¾ß ÇÏ´Â ±ÍÂúÀ½ÀÌ ÀÖ´Ù. ´ÙÇàÈ÷ ÆíÁý±âÀÇ Àϰý ġȯ ±â´ÉÀ» »ç¿ëÇÏ¸é ½Ã°£ÀÌ Á» °É¸®±â´Â ÇÏÁö¸¸ Å« ¾î·Á¿ò¾øÀÌ ÀÛ¾÷À» ¿Ï·áÇÒ ¼ö ÀÖ´Ù.
±âº» ¼³Á¤ »óÅ·Πµ¹¾Æ°¡´Â SetDefaultSetting ÇÔ¼öµµ ´ëÆø ¼öÁ¤µÈ´Ù.
ÀÚ½ÅÀÇ ¸â¹ö°¡ ¾Æ´Ñ º¯¼ö´Â ÃʱâÈÇÒ Çʿ䰡 ¾ø´Ù. ¶ÇÇÑ SetFont ÇÔ¼öµµ ¾à°£ ¼öÁ¤µÈ´Ù.
void CApiEditText::SetDefaultSetting()
{
if (pLine) {
SetLineRatio(120);
SetWrap(0);
SetTabWidth(4);
SetShowState(SHOWMARGIN,TRUE);
} else {
LineRatio=120;
nWrap=0;
TabWidth=4;
MarginWidth=25;
}
logfont.lfHeight=0;
hMainFont=NULL;
SetFont(&logfont);
bShowEnter=FALSE;
bShowTab=FALSE;
bShowSpace=FALSE;
bShowLineNum=FALSE;
bNoFirstSpace=FALSE;
ShowTabType=1;
ShowEnterType=1;
ShowSpaceType=0;
RightWrap=0;
ColMark=0;
SetParser(0);
}
void CApiEditText::SetFont(LOGFONT *alogfont)
{
....
if (pLine) {
UpdateLineInfo();
....
¼³Á¤°ªÀ» º¯°æÇÏ´Â ÇÔ¼ö¸¦ ºÎ¸¦ °ÍÀΰ¡ ¾Æ´Ï¸é º¯¼ö¸¦ Á÷Á¢ º¯°æÇÒ °ÍÀΰ¡¸¦ ÆÇ´ÜÇϱâ À§Çؼ ¿ø·¡ ApiEditÀÇ ÄÚµå´Â if (buf) Á¶°Ç¹®À» »ç¿ëÇÏ¿´´Ù. buf°¡ ÇÒ´çµÇ¾î ÀÖÀ¸¸é ½ÇÇàÁß¿¡ ¼³Á¤°ªÀ» ¹Ù²Ù´Â °ÍÀ̹ǷΠ¸â¹ö ÇÔ¼ö¸¦ ºÒ·¯ Ãß°¡ ÀÛ¾÷±îÁö °°ÀÌ ÇßÀ¸¸ç ±×·¸Áö ¾Ê´Ù¸é º¯¼ö¿¡ Á÷Á¢ °ªÀ» ´ëÀÔÇÏ¿´À¸³ª ÀÌÁ¦ buf°¡ ÇÁ·¹ÀÓÀ¸·Î ¿Å°ÜÁ³À¸¹Ç·Î ÀÌ º¯¼ö°ªÀ» ºÁ¼´Â ºäÀÇ ÃʱâÈ ¿©ºÎ¸¦ ¾Ë ¼ö ¾ø´Ù. ´ë½Å µ¿ÀÏÇÑ ¸ñÀûÀ¸·Î pLineÀ» º¸°í ºäÀÇ ÃʱâÈ ¿©ºÎ¸¦ ÆÇ´ÜÇÑ´Ù.
±âÁ¸ÀÇ CApiEdit °´Ã¼¸¦
ÇÁ·¹ÀÓ°ú ºä·Î ºÐÇÒÇÏ´Â Áö°Ü¿î ½Ç½ÀÀÌ ³¡³µÀ¸¸ç CApiEdit Ŭ·¡½º´Â CApiEdit¿Í CApiEditText·Î ºÐÇҵǾú´Ù. °´Ã¼ ºÐÇÒÀÇ ¸¶Áö¸·
ÀÛ¾÷Àº ÀÌ¹Ì ºÐÇҵǾî ÀÖ´Â ºÐ¼®±â °´Ã¼µµ ºÐÇÒµÈ ÇÁ·¹ÀÓ°ú ºä¸¦ ÀνÄÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ºÐ¼®±â´Â ÇÁ·¹ÀÓÀÌ °¡Áö°í ÀÖ´Â bufÀÇ ³»¿ë°ú ºä°¡ °¡Áö°í
ÀÖ´Â pLine Á¤·Ä Á¤º¸¸¦ ÂüÁ¶ÇÏ¿© ±¸¹® ºÐ¼®À» ÇϹǷΠ¾çÂÊ °´Ã¼¿¡ Èð¾îÁ® ÀÖ´Â Á¤º¸¸¦ ¸ðµÎ ÀÐÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
ÇöÀç ºÐ¼®±â´Â CApiEdit Ŭ·¡½ºÀÇ Æ÷ÀÎÅ͸¦ Àμö·Î Àü´Þ¹Þ¾Æ ÀÌ °´Ã¼ÀÇ buf¿Í pLineÀ» ÂüÁ¶Çϴµ¥ ºäÀÇ Æ÷ÀÎÅ͸¦ Àμö·Î Àü´Þ¹Þµµ·Ï º¯°æÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é buf´Â ºäÀÇ pFrame->buf·Î ÂüÁ¶ÇÒ ¼ö ÀÖ°Ô µÇ°í pLineÀº ±âÁ¸ ¹æ¹ý´ë·Î ÂüÁ¶ÇÏ¸é µÈ´Ù. ÇÁ·¹ÀÓÀÇ Æ÷ÀÎÅ͸¦ Àμö·Î Àü´Þ¹ÞÀ¸¸é buf´Â ±âÁ¸ ¹æ¹ý´ë·Î ÂüÁ¶ÇÒ ¼ö ÀÖÁö¸¸ pLineÀ» ÂüÁ¶Çϱâ À§Çؼ Ȱ¼º ºä¸¦ ã¾Æ¾ß Çϴµ¥´Ù ±¸¹® ºÐ¼® µ¿ÀÛÀÌ ºäÀÇ µ¿ÀÛÀ̱⠶§¹®¿¡ ºäÀÇ Æ÷ÀÎÅ͸¦ ¹Þ´Â °ÍÀÌ ÇÕ´çÇÏ´Ù. ºÐ¼®±âÀÇ ¸ðµâÀÎ Parse.h, Parse.cppÀÇ ´ÙÀ½ ´Ü¾îµéÀ» Àϰý ġȯÇÏ¿© ÇÁ·¹ÀÓ ´ë½Å ºä °´Ã¼¸¦ ÂüÁ¶ÇÏ°í ºä·ÎºÎÅÍ ÇÁ·¹ÀÓÀ» ã¾Æ buf¸¦ ÂüÁ¶ÇÑ´Ù. ÀÌ ÀÛ¾÷µµ Àϰý ġȯ ±â´ÉÀ» »ç¿ëÇÏ¸é ½±°Ô ¿Ï·áÇÒ ¼ö ÀÖ´Ù.
CApiEdit ¡æ CApiEditText
ae.buf ¡æ ae.pFrame->buf
¸ðµç ºÐ¼®±âµéÀº ApiEditText¿Í ApiEdit Ŭ·¡½º¿¡ ÇÁ·£µå·Î ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î buf³ª pLineÀº ÂüÁ¶Çϴµ¥ ¾Æ¹«·± Á¦¾àÀÌ ¾ø´Ù. ÂüÁ¶ÇÏ´Â Á¤º¸¸¦ ã´Â ¹æ¹ýÀÌ ¹Ù²î¾úÀ» »Ó ºÐ¼® ¹æ¹ý ÀÚü¿¡ º¯È°¡ »ý±ä °ÍÀº ¾Æ´Ï´Ù.
ÄÁÆ®·ÑÀÌ ¹Ù²î¾ú´Ù°í ÇØ¼ ÀÌ ÄÁÆ®·ÑÀÇ È£½ºÆ®¸¦ ¼öÁ¤ÇÏ´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù. ÄÁÆ®·ÑÀÇ ¹öÀüÀÌ ¹Ù²î´õ¶óµµ °¡±ÞÀûÀ̸é ÀÌÀü ¹öÀüÀÇ ÀÎÅÍÆäÀ̽º¸¦ À¯ÁöÇÏ´Â °ÍÀÌ ÁÁ°í ±×·¡¾ß Á¦´ë·Î µÈ ÄÁÆ®·ÑÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ApiEdit´Â ¿ÏÀüÈ÷ ¸±¸®ÁîµÈ °ÍÀÌ ¾Æ´Ï¶ó ¾ÆÁ÷ °³¹ßÁßÀ̸ç ÀÎÅÍÆäÀ̽ºµµ È®Á¤µÈ °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡ ºÒ°¡ÇÇÇÏ°Ô È£½ºÆ®°¡ ¿µÇâÀ» ¹Þ°Ô µÇ¾ú´Ù. ÄÁÆ®·ÑÀÇ ±â´ÉÀ» ´ë´ëÀûÀ¸·Î È®ÀåÇÏ¸é¼ ÀÎÅÍÆäÀ̽º¸¦ ±×´ë·Î À¯ÁöÇÑ´Ù´Â °ÍÀº »ç½Ç ¹«Ã´ ¾î·Á¿î ÀÏÀÌ´Ù.
ƯÈ÷ ApiEdit´Â ºÐÇÒâ°ú ´Ù¾çÇÑ º¸±â ¸ðµå Áö¿øÀ» À§ÇØ ±Ùº»ÀûÀÎ ±¸Á¶¸¦ º¯°æÇ߱⠶§¹®¿¡ °ú°ÅÀÇ ÀÎÅÍÆäÀ̽º¸¦ ±×´ë·Î À¯ÁöÇÏ±â ¾î·Æ´Ù. ApiEditÀÇ À¯ÀÏÇÑ È£½ºÆ®´Â ¾ÆÁ÷±îÁö ´ç±Ù¹Û¿¡ ¾ø±â ¶§¹®¿¡(»ç½Ç NonSoolÀ̶ó´Â ¿¹Á¦µµ ÀÖ¾ú´Ù) ÀÌ ´Ü°è¿¡¼ ÄÁÆ®·ÑÀÇ ÀÎÅÍÆäÀ̽º¸¦ ¼öÁ¤ÇÏ´Â °ÍÀº Å« ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ´ç±ÙÀ» ¸¸µç »ç¶÷Àº ApiEditÀÇ º¯È¿¡ ´ëÇØ ¾ÆÁÖ ±àÁ¤ÀûÀÎ Æò°¡¸¦ ³»¸®°í Àֱ⠶§¹®¿¡ ´õ ÁÁÀº ±â´É ±¸ÇöÀ» À§ÇÑ ÀÎÅÍÆäÀ̽ºÀÇ º¯È¸¦ ±â²¨ÀÌ ¹Þ¾ÆµéÀÏ °ÍÀÌ´Ù.
¹°·Ð ²À ÇÊ¿äÇÏ´Ù¸é ÀÎÅÍÆäÀ̽º¸¦ ¹Ù²ÙÁö ¾Ê°íµµ ±â´ÉÀ» È®ÀåÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ±×·¸°Ô ÇÏÀÚ¸é ÁÁÁö ¾ÊÀº ±¸Á¶¸¦ ±×´ë·Î À¯ÁöÇØ¾ß ÇÏ°í ¸¹Àº ±º´õ´õ±â Äڵ尡 ³²°Ô µÇ¹Ç·Î ÀÎÅÍÆäÀ̽ºÀÇ º¯È¸¦ °¨¼öÇÏ´õ¶óµµ ±ò²ûÇÏ°Ô ´Ù½Ã ÀÛ¼ºÇÏ´Â °ÍÀÌ ´õ ÁÁÀ¸¸ç µû¶ó¼ È£½ºÆ®µµ ºÒ°¡ÇÇÇÏ°Ô ÀÌ º¯ÈÀÇ ¿µÇâÀ» ¹Þ°Ô µÈ´Ù. ÁÖ·Î ApiEdit ÇÁ·¹ÀÓ¿¡¼ »èÁ¦µÈ ¸â¹ö¿¡ ´ëÇÑ ¾×¼¼½º¹®ÀÌ ¹Ù²î´Â Á¤µµ¿¡ ºÒ°úÇϸç ÁúÀûÀ¸·Î Å« º¯È´Â ¾øÀ» °ÍÀÌ´Ù. ¸ÕÀú °¡Àå Áß¿äÇÑ ¼öÁ¤ »çÇ×Àº DgChildProcÀÇ WM_DESTROY¿¡¼ ¹®¼Ã¢À» ÆÄ±«ÇÒ ¶§ ApiEdit ÄÁÆ®·ÑÀÇ À©µµ¿ìµµ ¸í½ÃÀûÀ¸·Î ÆÄ±«ÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. DGChildProc¿¡ ´ÙÀ½ ÄÚµå ÇÑ ÁÙÀ» Ãß°¡ÇÑ´Ù.
LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
case WM_DESTROY:
pSi=(SInfo *)GetWindowLong(hWnd,0);
DeleteFileTab(pSi->NowFile);
DestroyWindow(pSi->Ae.hWnd);
delete pSi;
g_ChildNum--;
if (g_ChildNum==0) {
....
»ó¼ÓµÈ ÆÄ±«ÀÚ°¡ °¡»ó ÇÔ¼ö¸¦ Á¦´ë·Î ãÁö ¸øÇϹǷΠÀ©µµ¿ì ÆÄ±«°¡ ¼öµ¿ ¹æ½ÄÀ¸·Î ÀüȯµÇ¾úÀ¸¸ç ¿Ö ±×·¸°Ô Çß´ÂÁö¿¡ ´ëÇØ¼´Â ¾Õ¿¡¼ ÀÌ·ÐÀû Á¡°ËÀ» ÀÌ¹Ì ¸¶ÃÆ´Ù. pSi¸¦ ÆÄ±«ÇÒ ¶§ ÀÌ ±¸Á¶Ã¼ÀÇ ¸â¹öÀÎ Aeµµ °°ÀÌ ÆÄ±«µÇ´Âµ¥ ±× Àü¿¡ DestroyWindow·Î Ae.hWnd À©µµ¿ì¸¸ ÆÄ±«ÇÏ¸é µÈ´Ù. À©µµ¿ì ¼öµ¿ ÆÄ±« ¹æ½ÄÀ¸·Î ÀÎÇØ È£½ºÆ®°¡ ºÎ´ãÇØ¾ß ÇÒ ÀÛ¾÷Àº ¿©±â ÇÑ ±ºµ¥ »ÓÀÌ´Ù.
´ç±ÙÀÇ ¸Þ´º¿¡´Â ApiEdit ÄÁÆ®·ÑÀÇ ¸â¹ö ÇÔ¼ö¸¦ Á÷Á¢ È£ÃâÇÏ´Â Ç׸ñµéÀÌ ¸¹ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î ´ë¼Ò¹®ÀÚ º¯È¯ Ç׸ñÀº ChangeCase ÇÔ¼ö¸¦ È£ÃâÇÏ¸ç ½Ã°£, ³¯Â¥ »ðÀÔ ¸í·ÉÀº InsertText ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. È£½ºÆ®ÀÇ ÀÔÀå¿¡¼ ApiEdit´Â ÇÁ·¹ÀÓÀε¥ ÀÌ ÇÔ¼öµéÀÌ ÇÁ·¹ÀÓ¿¡¼ ºä·Î À̵¿µÇ¾úÀ¸¹Ç·Î ºäÀÇ ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï ¼öÁ¤ÇØ¾ß ÇÑ´Ù. OnCommandÀÇ ¸Þ´º Ç׸ñ ó¸® Äڵ带 ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
CApiEditText *pView;
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
if (hActive==NULL) {
if (TestNeedActive(LOWORD(wParam)))
return;
} else {
pSi=(SInfo *)GetWindowLong(hActive,0);
pView=pSi->Ae.GetActiveView();
}
....
case IDM_EDIT_UPPER:
pView->ChangeCase(0);
break;
case IDM_EDIT_LOWER:
pView->ChangeCase(1);
break;
case IDM_EDIT_REVERSE:
pView->ChangeCase(2);
break;
case IDM_EDIT_UPPERFIRST:
pView->ChangeCase(3);
break;
case IDM_EDIT_UPPERSENT:
pView->ChangeCase(4);
break;
case IDM_EDIT_TOTAB:
pView->ConvertSpaceTab(FALSE);
break;
case IDM_EDIT_TOSPACE:
pView->ConvertSpaceTab(TRUE);
break;
case IDM_EDIT_REMOVESPACE:
pView->RemoveExtraSpace();
break;
case IDM_EDIT_INDENT:
pView->BlockIndent(FALSE);
break;
case IDM_EDIT_UNINDENT:
pView->BlockIndent(TRUE);
break;
case IDM_EDIT_COMMENT:
pView->InsertComment(FALSE);
break;
case IDM_EDIT_UNCOMMENT:
pView->InsertComment(TRUE);
break;
case IDM_EDIT_DATE:
GetLocalTime(&st);
wsprintf(szTemp,"%d³â %d¿ù %dÀÏ ",st.wYear, st.wMonth, st.wDay);
pView->InsertText(szTemp);
break;
case IDM_EDIT_TIME:
GetLocalTime(&st);
wsprintf(szTemp,"%d½Ã %dºÐ %dÃÊ ",st.wHour, st.wMinute, st.wSecond);
pView->InsertText(szTemp);
break;
case IDM_EDIT_COPYUP:
pView->CopyChar(0);
break;
case IDM_EDIT_COPYDOWN:
pView->CopyChar(1);
break;
....
case IDM_SEARCH_WORD:
case IDM_SEARCH_WORDUP:
int nStart;
pSi->Ae.GetSelect(s,e);
if (s==e) {
pView->GetNowWord(pSi->Ae.GetOffset(),s,e);
}
....
case IDM_SEARCH_PAREN:
pView->FindParen(FALSE);
break;
case IDM_SEARCH_PARENSEL:
pView->FindParen(TRUE);
break;
ÀÌ ÇÔ¼öµéÀº ÀÌÁ¦ CApiEditÇÁ·¹ÀÓ¿¡ ÀÖÁö ¾Ê°í CApiEditText¿¡¸¸ ÀÖÀ¸¹Ç·Î GetActiveView ÇÔ¼ö·Î Ȱ¼º ºä¸¦ ±¸ÇÑ ÈÄ ºäÀÇ ÇÔ¼ö¸¦ È£ÃâÇß´Ù. OnCommand¿Ü¿¡ ºäÀÇ ÇÔ¼ö¸¦ Á÷Á¢ È£ÃâÇÏ´Â °÷ÀÌ Çѱºµ¥ ´õ Àִµ¥ Find.cpp¿¡¼ GetNowWord¸¦ µÎ ¹ø È£ÃâÇÑ´Ù. ÀÌ Äڵ嵵 ¼öÁ¤ÇÏ¿© Ȱ¼º ºäÀÇ GetNowWord¸¦ È£ÃâÇÏÀÚ.
BOOL CALLBACK FindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
pSi->Ae.GetActiveView()->GetNowWord(pSi->Ae.GetOffset(),s,e);
....
BOOL CALLBACK FileFindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
pSi->Ae.GetActiveView()->GetNowWord(pSi->Ae.GetOffset(),s,e);
....
¸ðµç ºä´Â CApiEditText·ÎºÎÅÍ ÆÄ»ýµÇ¹Ç·Î ºä ŸÀÔ¿¡ »ó°ü¾øÀÌ ÀÌ ÇÔ¼öµéÀº Ç×»ó Á¸ÀçÇÒ °ÍÀÌ´Ù. ±×·¯³ª ÇÔ¼ö´Â ÀÖÁö¸¸ ºä ŸÀÔ¿¡ µû¶ó¼ Àǹ̾ø´Â µ¿ÀÛÀÎ °æ¿ì´Â ¸¹ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î °Ë»ö/´Ü¾îã±â ±â´ÉÀº Çí»ç ºä¿¡¼´Â Àǹ̰¡ ¾øÀ¸¸ç °ýȣ¦ã±â, °ø¹é°ú ÅÇ º¯È¯ µîÀÇ µ¿ÀÛµµ ÅØ½ºÆ® ºä¿¡¼¸¸ ½ÇÁúÀûÀÎ Àǹ̰¡ ÀÖ´Ù. ÀÁÙ ¹®ÀÚ ¹Ýº¹ °°Àº ±â´ÉÀº ¹®´ÜÀÇ °³³äÀÌ ÀÖ¾î¾ß¸¸ °¡´ÉÇÏ¸ç µé¿©¾²±âµµ ¸¶Âù°¡Áö´Ù.
ÇÏÁö¸¸ È£½ºÆ®´Â ºäÀÇ Å¸ÀÔÀ» ÆÇº°ÇÏÁö ¾Ê°í ¹«Á¶°Ç Ȱ¼º ºäÀÇ ÇØ´ç ÇÔ¼ö¸¦ È£ÃâÇØ ¹ö¸®´Âµ¥ À̰ÍÀº È£½ºÆ®°¡ ºäÀÇ Å¸ÀÔÀ» °í·ÁÇÏÁö ¾Ê°Ú´Ù´Â ¶æÀÌ´Ù. ºä´Â ÀÚ½ÅÀÌ Áö¿øÇÏÁö ¸øÇÏ´Â µ¿ÀÛ¿¡ ´ëÇØ¼´Â »óÀ§ Ŭ·¡½º¿¡°Ô À§ÀÓÇϰųª ¾Æ´Ï¸é ¾Æ¿¹ ¾Æ¹« µ¿ÀÛµµ ÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î Çí»çºäÀÇ CopyChar ÇÔ¼ö´Â ºñ¿ö µÐ ä·Î ÀçÁ¤ÀÇÇϰųª ¾Æ´Ï¸é È£ÃâÀü¿¡ ºäÀÇ Å¸ÀÔÀ» ÆÇº°ÇØ º¸¸é ¾Æ¹« ¸»½éÀÌ ¾ø´Ù. Find.cppÀÇ ´ÙÀ½ ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.
void SendOutputToWindow()
{
TCHAR *buf;
HWND hActive;
SInfo *pSi;
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
if (hActive==NULL)
return;
pSi=(SInfo *)GetWindowLong(hActive,0);
ExtractOutputToText(buf);
pSi->Ae.GetActiveView()->Insert(pSi->Ae.GetOffset(),buf);
pSi->Ae.Invalidate(-1);
free(buf);
}
Ȱ¼º ºäÀÇ Insert¸¦ ºÒ·¯¾ß È¸é °»½Å°ú ºÏ¸¶Å© Á¶Á¤±îÁö µÈ´Ù. ¸¶Áö¸·À¸·Î ²À ÇÊ¿äÇÑ °ÍÀº ¾Æ´ÏÁö¸¸ ¼Ò½º¸¦ º¸±â ÁÁ°Ô Á¶±Ý ÆíÁýÇÑ´Ù. ¸â¹ö ¾Õ¿¡ pFrame-> °°Àº Æ÷ÀÎÅÍ ¿¬»ê¹®ÀÌ »ðÀÔµÊÀ¸·Î½á °¡·Î·Î ³Ê¹« ±æ¾îÁø ÇàÀÌ Àִµ¥ Àû´çÈ÷ °³ÇàÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¿¹¸¦ µé¾î GetXPosOnLine ÇÔ¼öÀÇ ¾Æ·¡ÂÊÀ» º¸¸é ´ÙÀ½°ú °°Àº Äڵ尡 ÀÖ´Ù.
int CApiEditText::GetXPosOnLine(int r,int DestX)
{
....
bLineEnd=(p-pFrame->buf==pLine[r].End && pFrame->buf[p-pFrame->buf]!='\r' && pFrame->buf[p-pFrame->buf]!=0);
return p-pFrame->buf;
}
pFrame->°¡ ´Ù¼¸ ¹øÀ̳ª »ðÀԵǴٺ¸´Ï ¼öÆò ±æÀ̰¡ 113Ä÷³À̳ª µÇ´Âµ¥ ÀÌ·¸°Ô ±ä ÇàÀÌ ÀÖÀ¸¸é ¼Ò½º¸¦ º¼ ¶§ ¿·À¸·Î ½ºÅ©·ÑÇØ¾ß ÇϹǷΠºÒÆíÇÏ´Ù. Àû´çÇÑ °÷¿¡ °³Çà Äڵ带 »ðÀÔÇÏ¿© µÎ ÁÙ¿¡ ¾²´Â °ÍÀÌ ´õ ÁÁ´Ù.
bLineEnd=(p-pFrame->buf==pLine[r].End && pFrame->buf[p-pFrame->buf]!='\r' &&
pFrame->buf[p-pFrame->buf]!=0);
¹°·Ð ÀÌ·± ÆíÁýÀº ¾îµð±îÁö³ª °³ÀÎÀûÀÎ ±âÈ£ÀÇ ¹®Á¦ÀÏ »ÓÀ̹ǷΠ¾îµð´Ù °³Çà Äڵ带 »ðÀÔÇÒ °ÍÀΰ¡´Â ÀüÇô Áß¿äÇÏÁö ¾Ê°í ¸ð´ÏÅͰ¡ ÃæºÐÈ÷ Å©´Ù¸é ±×³É µÎ¾îµµ ¹«°üÇÏ´Ù. ÇÏÁö¸¸ ÀÌ ÇÁ·ÎÁ§Æ®´Â Áö¸é¿¡ º¸¿©¾ß ÇÒ ¼Ò½ºÀ̱⠶§¹®¿¡ ¼öÆò ±æÀ̰¡ ³Ê¹« ±æ¸é °ï¶õÇÏ´Ù. ±×·¡¼ ApiEdit.cpp¸¦ Àϰý ÆíÁýÇÏ¿© °¡±ÞÀû 90Ä÷³À» ³ÑÁö ¾Ê°Ô ÆíÁýÇß´Ù.
¿©±â±îÁö °´Ã¼ ºÐÇÒÀÌ ¿Ï·áµÇ¾ú´Ù. ÄÄÆÄÀÏ °á°ú ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é ¾Æ¸¶ ½Ç½À °úÁ¤Áß Çϳª¸¦ ´©¶ôÇßÀ» °ÍÀÌ´Ù. °´Ã¼ ºÐÇÒ °úÁ¤ÀÌ ¿ö³« º¹ÀâÇϰí ÀܼÕÀÌ ¸¹ÀÌ °¡±â ¶§¹®¿¡ À¢¸¸Å ²Ä²ÄÇÑ ¼º°ÝÀÌ ¾Æ´Ï¸é ÀÌ ½Ç½ÀÀ» ¿Ï¼öÇϱ⠹«Ã´ ¾î·Á¿ï °ÍÀÌ´Ù. ½ÇÇàÇØ º¸¸é Dangeun13°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÏ°Ô µ¿ÀÛÇϸç Ãß°¡µÈ ±â´Éµµ ¾ø°í »èÁ¦µÈ ±â´Éµµ ¾ø´Ù. ÇÏÁö¸¸ °Ñ¸ð½À¸¸ °°À» »Ó ³»ºÎÀûÀ¸·Î´Â ¾öû³ º¯È°¡ ÀÖ¾úÀ¸¸ç ÀÌÈÄ ±â´ÉÀ» È®ÀåÇϱâ À§ÇÑ ±¸Á¶ Á¶Á¤ÀÌ ¿Ï·áµÇ¾ú´Ù.
"¿¡±¸! Áö±Ý±îÁö Èûµé°Ô ½Ç½ÀÀ» Çߴµ¥ ¾Æ¹« °Íµµ ´Þ¶óÁø °ÍÀÌ ¾ø´Ü ¸»À̾ß?" ¶ó´Â ºÒ¸¸ÀÌ È¤½Ã ÀÖÀ»Áö ¸ð¸£°Ú´Ù. ÇÏ±ä ½Ç½ÀÀ̶õ ¹º°¡ Á¶±Ý¾¿ ÁÁ¾ÆÁö´Â °ÍÀ» ´«À¸·Î È®ÀÎÇÏ¸é¼ ÁøÇàÇØ¾ß Àç¹Ì°¡ ÀÖ´Â ¹ýÀÌ´Ù. ÇÏÁö¸¸ ¾Æ¹«·± ±â´É Ãß°¡¾øÀÌ ³»ºÎÀûÀÎ ±¸Á¶¸¸ ¹Ù²Ùµµ·Ï ½Ç½À °úÁ¤À» Â¥´Â °Íµµ °úÈ÷ ½¬¿î ÀÏÀÌ ¾Æ´Ï¾ú´Ù. ¿©±â¼ Èûµé°Ô °´Ã¼ ºÐÇÒÀ» ÇØ ³õ¾ÒÀ¸´Ï ´ÙÀ½ Àå¿¡¼ ÀÌ ±¸Á¶¸¦ ¹ÙÅÁÀ¸·Î ¸¹Àº »õ·Ó°í Àç¹ÌÀÖ´Â ±â´ÉÀ» Ãß°¡ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.