2.ApiEdit ºÐÇÒ

°¡. µµ¿ì¹Ì ¼öÁ¤

¾Õ Àý¿¡¼­ °´Ã¼ ºÐÇÒÀ» Á÷Á¢ ÇØ º¸¸é¼­ ºÐÇÒ ¹æ¹ý°ú °ü·Ã À̷п¡ ´ëÇØ ¾Ë¾Æ º¸¾ÒÀ¸¹Ç·Î ÀÌÁ¦ 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°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÏ°Ô µ¿ÀÛÇϸç Ãß°¡µÈ ±â´Éµµ ¾ø°í »èÁ¦µÈ ±â´Éµµ ¾ø´Ù. ÇÏÁö¸¸ °Ñ¸ð½À¸¸ °°À» »Ó ³»ºÎÀûÀ¸·Î´Â ¾öû³­ º¯È­°¡ ÀÖ¾úÀ¸¸ç ÀÌÈÄ ±â´ÉÀ» È®ÀåÇϱâ À§ÇÑ ±¸Á¶ Á¶Á¤ÀÌ ¿Ï·áµÇ¾ú´Ù.

"¿¡±¸! Áö±Ý±îÁö Èûµé°Ô ½Ç½ÀÀ» Çߴµ¥ ¾Æ¹« °Íµµ ´Þ¶óÁø °ÍÀÌ ¾ø´Ü ¸»À̾ß?" ¶ó´Â ºÒ¸¸ÀÌ È¤½Ã ÀÖÀ»Áö ¸ð¸£°Ú´Ù. ÇÏ±ä ½Ç½ÀÀ̶õ ¹º°¡ Á¶±Ý¾¿ ÁÁ¾ÆÁö´Â °ÍÀ» ´«À¸·Î È®ÀÎÇϸ鼭 ÁøÇàÇØ¾ß Àç¹Ì°¡ ÀÖ´Â ¹ýÀÌ´Ù. ÇÏÁö¸¸ ¾Æ¹«·± ±â´É Ãß°¡¾øÀÌ ³»ºÎÀûÀÎ ±¸Á¶¸¸ ¹Ù²Ùµµ·Ï ½Ç½À °úÁ¤À» Â¥´Â °Íµµ °úÈ÷ ½¬¿î ÀÏÀÌ ¾Æ´Ï¾ú´Ù. ¿©±â¼­ Èûµé°Ô °´Ã¼ ºÐÇÒÀ» ÇØ ³õ¾ÒÀ¸´Ï ´ÙÀ½ Àå¿¡¼­ ÀÌ ±¸Á¶¸¦ ¹ÙÅÁÀ¸·Î ¸¹Àº »õ·Ó°í Àç¹ÌÀÖ´Â ±â´ÉÀ» Ãß°¡ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.