1.Çí»ç ºä

°¡.Çí»ç ºä Ŭ·¡½º

CApiEdit¸¦ ºä¿Í ÇÁ·¹ÀÓÀ¸·Î Èûµé°Ô ºÐÇÒÇÑ ¶Ç ´Ù¸¥ ÀÌÀ¯´Â ´Ù¸¥ Á¾·ùÀÇ º¸±â ¸ðµå¸¦ Áö¿øÇϱâ À§Çؼ­ÀÌ´Ù. º¸±â ¸ðµå¶õ ¹®¼­¸¦ ¾î¶»°Ô º¸¿©ÁÙ °ÍÀΰ¡¸¦ Á¤ÀÇÇÏ´Â ºäÀÇ Ãâ·Â ¹æ½ÄÀÌ´Ù. ´Ù¾çÇÑ º¸±â ¸ðµå¸¦ Áö¿øÇÏ¸é ¹®¼­ÀÇ ³»¿ëÀ» °¡Àå È¿À²ÀûÀ¸·Î ÆľÇÇÏ°í ÆíÁýÇÒ ¼ö ÀÖ´Â ¸ðµå¸¦ °ñ¶ó »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀÌÁ¡ÀÌ ÀÖ´Ù.

ÅؽºÆ® ÆíÁý±â°¡ ÅؽºÆ® ÆÄÀÏÀ» º¸¿©ÁÖ´Â ¹æ¹ýÀÌ¾ß ¹®ÀÚ¿­À» È­¸é¿¡ »Ñ¸®´Â °Í ¹Û¿¡ ´õ Àְڴ°¡ ½Í°ÚÁö¸¸ ±×·¸Áö°¡ ¾Ê´Ù. Ãâ·Â ¹æ½Ä¸¸ ¹Ù²ãµµ ¼¼·Î º¸±â, ¿ì¿¡¼­ Á·Πº¸±â°¡ °¡´ÉÇϸç ÅؽºÆ®ÀÇ ³í¸®ÀûÀÎ Æ÷¸Ë¿¡ µû¶ó HTML·Î º¸¿©ÁÙ ¼öµµ ÀÖ°í XML Æ®¸® ÇüÅ·Πº¸¿©ÁÙ ¼öµµ ÀÖ´Ù. ¶ÇÇÑ ÆíÁý °¡´É ÆÄÀÏÀ» ÀÌÁø ÆÄÀϷαîÁö È®´ëÇϸé À̹ÌÁö º¸±â, ¸ÖƼ ¹Ìµð¾î º¸±â´Â ¹°·ÐÀÌ°í ActiveX ÀÚµ¿È­ ±â´ÉÀ» ä¿ëÇÏ¸é ¸ðµç ÆÄÀÏÀ» ¿øÇϴ´ë·Î Ãâ·ÂÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·± ´ÙÁß ºä Áö¿øÀº Â÷ÈÄ ´ç±ÙÀÌ ´Ù¸¥ ÅؽºÆ® ÆíÁý±â¿Í ±¸º°µÇ´Â °¡Àå Áß¿äÇÑ Â÷ÀÌÁ¡ÀÌ µÉ °ÍÀÌ´Ù.

ÇöÀç ApiEdit´Â ¿À·ÎÁö ÅؽºÆ® ºä ÇÑ Á¾·ù¸¸ Áö¿øÇϴµ¥ ¿©±â¼­´Â ºä ŸÀÔ ÀüȯÀÌ °¡´ÉÇÑÁö¸¦ Á¡°ËÇØ º¸±â À§ÇØ ÇÑ°¡Áö ŸÀÔ¸¸ ´õ Ãß°¡ÇØ º¸±â·Î ÇÏÀÚ. ¸¹Àº ºä ŸÀÔ Áß¿¡ ÅؽºÆ® ºä ´ÙÀ½À¸·Î °¡Àå ½Ç¿ëÀûÀÎ ºä´Â 16Áø¼ö ÇüÅ·ΠÆÄÀÏÀÇ ³»¿ëÀ» ±×´ë·Î ´ýÇÁÇÏ´Â Çí»ç ºä¶ó°í ÇÒ ¼ö Àִµ¥ ¾ÆÁÖ °£´ÜÇÑ Çí»ç ºä¸¦ ¸¸µé¾î º¼ °ÍÀÌ´Ù. ½Ç½ÀÀ» ½ÃÀÛÇϱâ Àü¿¡ Dangeun16 ÇÁ·ÎÁ§Æ®¸¦ º¹»çÇÏ¿© Dangeun17 ÇÁ·ÎÁ§Æ®¸¦ ¸¸µç´Ù.

ApiEditHexa.h, cpp ¸ðµâÀº ½Ç½ÀÀ» ½ÃÀÛÇÒ ¶§ ÀÌ¹Ì ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇØ ³õ¾Ò´Ù. CApiEdit Ŭ·¡½º´Â CApiEditHexa¸¦ ÇÁ·£µå·Î ÁöÁ¤ÇÏ¿© Çí»ç ºäµµ ÇÁ·¹ÀÓÀÇ ¸ðµç ¸â¹ö¸¦ ÀÚÀ¯·Ó°Ô ¾×¼¼½ºÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. CApiEdit°¡ Á÷Á¢ Çí»ç ºäÀÇ Å¸ÀÔÀ» ÂüÁ¶ÇÏÁö´Â ¾ÊÀ¸¹Ç·Î CApiEditHexa Ŭ·¡½º¸¦ Àü¹æ ¼±¾ðÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÇÁ·¹ÀÓÀº ÅؽºÆ® ºä¿¡ ´ëÇÑ ¹è¿­°ú °ü¸® ÇÔ¼ö¸¸À» °¡Áú »ÓÀÌÁö ±× ÆÄ»ý Ŭ·¡½º±îÁö´Â ±»ÀÌ ¾Ë¾Æ¾ß ÇÒ ÇÊ¿ä°¡ ¾ø´Â °ÍÀÌ´Ù.

 

class CApiEdit : public CWindow

{

     friend class CApiEditText;

    friend class CApiEditHexa;

 

Çì´õ ÆÄÀÏ¿¡ CApiEditHexa Ŭ·¡½º¸¦ ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù. Ŭ·¡½ºÀÇ ¸ð¾çÀº ApiEditText¿Í °ÅÀÇ À¯»çÇÏÁö¸¸ ¸â¹ö ¼ö°¡ ¾ÆÁ÷ ¸¹Áö ¾Ê´Ù.

 

#ifndef __APIEDITHEXA_H

#define __APIEDITHEXA_H

 

class CApiEditHexa : public CApiEditText

{

     friend class CApiEdit;

     friend class CParse;

     friend class CParseCpp;

     friend class CParseNull;

     friend class CParseHtml;

     friend class CParseSql;

public:

     CApiEditHexa();

 

     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);

     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);

     void OnMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam);

 

     virtual void SetCaret(BOOL bUpdatePrevX=TRUE, BOOL bScrollToCaret=TRUE);

     virtual void Insert(int nPos, TCHAR *str, int len, BOOL bRec=TRUE);

     virtual void Delete(int nPos, int nCount, BOOL bRec=TRUE);

     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 int GetOffFromXY(int x, int y);

     virtual void SetWrap(int aWrap) { nWrap=aWrap; }

     virtual void UpdateScrollInfo();

     virtual int DrawLine(HDC hdc, int Line);

     virtual BOOL IsInSelection(int x,int y) { return FALSE; }

     virtual void SetFont(LOGFONT *alogfont);

     virtual int GetInfoFromOff(int Type, int nPos=-1);

     virtual int GetDocInfo(int type);

     virtual void BeginPrint(Ae_PrintInfo *pi);

     virtual BOOL PrintPage(Ae_PrintInfo *pi,int nPage);

     virtual void EndPrint(Ae_PrintInfo *pi);

     virtual void InitView();

};

 

#endif // __APIEDITHEXA_H

 

ÀÌ Å¬·¡½ºÀÇ ¼±¾ð¿¡¼­ °¡Àå ÁÖ¸ñÇÒ Á¡Àº ±âº» ºäÀÎ CApiEditTextŬ·¡½º·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ¾Ò´Ù´Â Á¡ÀÌ´Ù. µû¶ó¼­ Çí»ç ºä´Â ÅؽºÆ® ºäÀÇ ¸ðµç ¸â¹ö º¯¼ö¸¦ »ó¼Ó¹ÞÀ¸¸ç ÅؽºÆ® ºäÀÇ ¸â¹öµéÀº protected ¾×¼¼½º ¼Ó¼ºÀ» °¡Áö¹Ç·Î Çí»ç ºä¿¡¼­ Á¦ÇѾøÀÌ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. »ó¼Ó¹ÞÀº ¸â¹ö Áß ÀϺδ Çí»ç ºä¿¡´Â »ç¿ëµÇÁö ¾Ê´Â °Íµéµµ Àִµ¥ ÀÌ·± ¸â¹ö´Â ¹«½ÃÇÏ¸é µÈ´Ù. ¾ÆÁ÷ Ãß°¡µÈ ¸â¹ö´Â ¾øÁö¸¸ 16Áø ´ýÇÁ¸¦ À§ÇØ Àá½Ã ÈÄ¸é ¸â¹öµéÀÌ Ãß°¡µÉ °ÍÀÌ´Ù.

¸Þ½ÃÁö ó¸® ÇÔ¼öµéÀº ´ëºÎºÐ ÀçÁ¤ÀÇÇÏ¿´À¸³ª ÇѱÛÀ» ÀԷ¹ÞÀ» ÀÏÀº ¾øÀ¸¹Ç·Î IME °ü·Ã ¸Þ½ÃÁö´Â ó¸®ÇÏÁö ¾Ê´Â´Ù. ÀÏ¹Ý ¸â¹ö ÇÔ¼ö´Â ²À ÇÊ¿äÇÑ °Í¸¸ ÀçÁ¤ÀÇÇÏ¿´°í ³ª¸ÓÁö´Â ±âº» ºäÀÇ ¸â¹ö¿¡°Ô 󸮸¦ ³Ñ±æ °ÍÀÌ´Ù. 16Áø ÆíÁýÀ» À§Çؼ­ ´õ ÇÊ¿äÇÑ ¸â¹ö ÇÔ¼öµµ ¹°·Ð ¸¹ÀÌ Àִµ¥ ¾ÕÀ¸·Î Ãß°¡ÇÏ°Ô µÉ °ÍÀÌ´Ù. IsInSelection ÇÔ¼ö´Â ¹«Á¶°Ç FALSE¸¦ ¸®ÅÏÇÑ´Ù. Çí»ç ºä´Â ¸¶¿ì½º·Î µå·¡±×Çؼ­ º¹»ç ¹× À̵¿ÇÏ´Â µ¿ÀÛÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.

³ª.±âº» ºä ¼öÁ¤

´ÙÀ½Àº Çí»ç ºä Ŭ·¡½ºÀÇ ±¸Çö Äڵ带 ÀÛ¼ºÇÒ Â÷·ÊÀε¥ ±× Àü¿¡ ±âº» ºäÀÇ Äڵ带 Á¶±Ý ¼öÁ¤ÇÏ¿© ÆÄ»ý Ŭ·¡½º°¡ ±â¹Ý Ŭ·¡½ºÀÇ Äڵ带 ÃÖ´ëÇÑ ÀçÈ°¿ëÇÒ ¼ö ÀÖ°Ô ÇØ º¸ÀÚ. ±âº» ºä°¡ ¸¹Àº ÀÏÀ» Çϸé ÆÄ»ý Ŭ·¡½º°¡ °£´ÜÇØÁø´Ù. Ŭ·¡½º °èÃþÀ» ¸¸µé¾î ³ª°¡´Ù º¸¸é ÇÏÀ§ Ŭ·¡½ºÀÇ ÇÊ¿ä¿¡ ÀÇÇØ »óÀ§ Ŭ·¡½º¸¦ ¼öÁ¤ÇÏ´Â ÀÏÀº ºó¹øÇÏ°Ô ¹ß»ýÇÏ¸ç ¾ÕÀ¸·Îµµ ¸¹ÀÌ ¹ß»ýÇÒ °ÍÀÌ´Ù. ¿©±â¼­´Â ÀÏ´Ü ºä ŸÀÔ ÀüȯÀ» À§ÇØ ±ÞÇÑ ÄÚµå ¼¼ ±ºµ¥¸¸ ¼öÁ¤ÇÒ °ÍÀÌ´Ù. ÅؽºÆ® ºäÀÇ OnDestroy ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::OnDestroy(HWND hWnd)

{

    if (arHanWidth) free(arHanWidth);

    if (pLine) free(pLine);

     if (hBit) {

     ...

 

Çí»ç ºä´Â ÇÑ ÁÙ´ç ´ýÇÁÇÒ ¹ÙÀÌÆ® ¼ö°¡ °íÁ¤ÀûÀ̱⠶§¹®¿¡ Á¤·Ä Á¤º¸¸¦ ÀÛ¼ºÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ±×·¡¼­ pLine ¹è¿­Àº ÃʱâÈ­ÇÒ ¶§ºÎÅÍ ÇÒ´çÇÏÁöµµ ¾Ê°í »ç¿ëÇÏÁöµµ ¾Ê´Â´Ù. ±×·¡¼­ Æı«ÇÒ ¶§µµ pLine ¹è¿­À» ÇØÁ¦ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç OnDestroy¿¡¼­ pLineÀÌ NULLÀ̸é ÇØÁ¦ÇÏÁö ¾Ê´Â´Ù. ´ÙÀ½Àº OnPaint¸¦ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::OnPaint(HWND hWnd)

{

     ....

     t=yPos/LineHeight;

     s=(yPos+ps.rcPaint.top)/LineHeight;

     e=(yPos+ps.rcPaint.bottom-1)/LineHeight;

    if (ViewType == TEXT_VIEW) {

        e=min(e,TotalLine-1);

        Parser->ParseLines(*this,e);

    } else {

        e=min(e,GetRowCount()-1);

    }

    

     hMemDC=CreateCompatibleDC(hdc);

     ....

 

Á¤·ÄÀ» ÇÏÁö ¾ÊÀ¸¹Ç·Î TotalLine º¯¼ö°¡ ÀǹÌÀÖ´Â °ªÀ» °¡ÁöÁö ¾ÊÀ¸¸ç ´ë½Å GetRowCount ÇÔ¼ö·Î ÁÙ ¼ö¸¦ ½Ç½Ã°£À¸·Î ±¸ÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ Çí»ç ºä´Â ¹®ÀÚ¿­À» Ãâ·ÂÇÏ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ±¸¹® ºÐ¼® ±â´Éµµ »ç¿ëÇÏÁö ¾Ê´Â´Ù. ÇöÀç ºäÀÇ Å¸ÀÔ¿¡ µû¶ó ¾à°£¾¿ ´Ù¸£°Ô µ¿ÀÛÇϵµ·Ï OnPaint¸¦ ¼öÁ¤Çߴµ¥ ÀÌ·¸°Ô µÇ¸é Çí»ç ºä¿¡¼­µµ ÀÌ ÇÔ¼ö¸¦ ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. OnSize ÇÔ¼öµµ Á¶±Ý º¯°æÇÑ´Ù.

 

void CApiEditText::OnSize(HWND hWnd, UINT state, int cx, int cy)

{

     if (state != SIZE_MINIMIZED) {

          ....

        if (nWrap && ViewType == TEXT_VIEW) {

              nPara=pLine[yPos/LineHeight].nPara;

              nLine=pLine[yPos/LineHeight].nLine;

              toff=GetOffFromPara(nPara,0);

              UpdateLineInfo();

          }

          UpdateScrollInfo();

        if (nWrap && ViewType == TEXT_VIEW) {

              GetRCFromOff(toff,r,c);

              ....

 

ÀÚµ¿ °³Çà »óÅÂÀÏ ¶§ È­¸é ùÁÙÀ» °¡±ÞÀû À¯ÁöÇϴµ¥ ÀÚµ¿ °³ÇàÀ̶ó´Â °³³äÀÌ ¾ø´Â Çí»ç ºä¿¡¼­´Â Àǹ̰¡ ¾ø´Ù. Çí»ç ºä´Â pLine ¹è¿­ ÀÚü°¡ ¾ø¾î ÀÌ Äڵ带 ±×´ë·Î ½ÇÇàÇÏ¸é ¾ÈµÈ´Ù.

´Ù.Çí»ç ºä

´ÙÀ½Àº Çí»ç ºäÀÇ ±¸Çö ÆÄÀÏÀÇ Àüü ¸®½ºÆ®ÀÌ´Ù. ÅؽºÆ® ºä¿Í ÀϺΠºñ½ÁÇÑ Äڵ嵵 ÀÖÁö¸¸ ¿ÏÀüÈ÷ ´Ù¸¥ Äڵ尡 ´õ ¸¹´Ù.

 

//#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 "ApiEditHexa.h"

#include "stdafx.h"

 

CApiEditHexa::CApiEditHexa()

{

     ViewType=HEXA_VIEW;

}

 

BOOL CApiEditHexa::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;

}

 

LRESULT CApiEditHexa::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_CHAR, OnChar);

          HANDLE_MSG(hWnd, WM_KEYDOWN, OnKey);

          HANDLE_MSG(hWnd, WM_KEYUP, OnKey);

          HANDLE_MSG(hWnd, WM_PAINT, OnPaint);

          HANDLE_MSG(hWnd, WM_SETFOCUS, OnSetFocus);

          HANDLE_MSG(hWnd, WM_KILLFOCUS, OnKillFocus);

          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_TIMER, OnTimer);

          HANDLE_MSG(hWnd, WM_SIZE, OnSize);

          HANDLE_MSG(hWnd, WM_HSCROLL, OnHScroll);

          HANDLE_MSG(hWnd, WM_VSCROLL, OnVScroll);

          HANDLE_MSG(hWnd, WM_CONTEXTMENU, OnContextMenu);

          HANDLE_MSG(hWnd, WM_COMMAND, OnCommand);

          HANDLE_MSG(hWnd, WM_SETCURSOR, OnSetCursor);

          HANDLE_MSG(hWnd, WM_GETDLGCODE, OnGetDlgCode);

     case WM_MOUSEWHEEL:

          OnMouseWheel(hWnd,wParam,lParam);

          return 0;

     }

     return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

///////////////////////////////////////////////////////////////////////////////////

// ¸Þ½ÃÁö Çڵ鷯

 

BOOL CApiEditHexa::OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)

{

     xMax=0;

     return CApiEditText::OnCreate(hWnd,lpCreateStruct);

}

 

void CApiEditHexa::OnDestroy(HWND hWnd)

{

     CApiEditText::OnDestroy(hWnd);

}

 

void CApiEditHexa::OnSize(HWND hWnd, UINT state, int cx, int cy)

{

     CApiEditText::OnSize(hWnd,state,cx,cy);

}

 

void CApiEditHexa::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

}

 

void CApiEditHexa::OnPaint(HWND hWnd)

{

     CApiEditText::OnPaint(hWnd);

}

 

void CApiEditHexa::OnSetFocus(HWND hWnd, HWND hwndOldFocus)

{

     CApiEditText::OnSetFocus(hWnd,hwndOldFocus);

}

 

void CApiEditHexa::OnKillFocus(HWND hWnd, HWND hwndNewFocus)

{

     CApiEditText::OnKillFocus(hWnd,hwndNewFocus);

}

 

void CApiEditHexa::OnChar(HWND hWnd, TCHAR ch, int cRepeat)

{

}

 

void CApiEditHexa::OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)

{

     CApiEditText::OnHScroll(hWnd,hwndCtl,code,pos);

}

 

void CApiEditHexa::OnVScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)

{

     CApiEditText::OnVScroll(hWnd,hwndCtl,code,pos);

}

 

void CApiEditHexa::OnContextMenu(HWND hWnd, HWND hwndContext, UINT xPos, UINT yPos)

{

     CApiEditText::OnContextMenu(hWnd,hwndContext,xPos,yPos);

}

 

void CApiEditHexa::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)

{

     CApiEditText::OnCommand(hWnd,id,hwndCtl,codeNotify);

}

 

void CApiEditHexa::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)

{

     RECT crt;

     POINT pt;

 

     GetClientRect(hWnd,&crt);

     GetCursorPos(&pt);

     ScreenToClient(hWnd,&pt);

     if (pt.x != x || pt.y != y) {

          return;

     }

     if (StartSplit(hWnd,fDoubleClick,x,y)) {

          return;

     }

     if (y > crt.bottom-SBW || x > crt.right-SBW) {

          return;

     }

 

     bFindSelect=FALSE;

     SetFocus(hWnd);

}

 

void CApiEditHexa::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)

{

     if (Spliting(hWnd,x,y)) {

          return;

     }

}

 

void CApiEditHexa::OnLButtonUp(HWND hWnd, int x, int y, UINT keyFlags)

{

     if (EndSplit(hWnd,x,y)) {

          return;

     }

}

 

void CApiEditHexa::OnTimer(HWND hWnd, UINT id)

{

     CApiEditText::OnTimer(hWnd,id);

}

 

BOOL CApiEditHexa::OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg)

{

     return CApiEditText::OnSetCursor(hWnd,hwndCursor,codeHitTest,msg);

}

 

void CApiEditHexa::OnMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

     CApiEditText::OnMouseWheel(hWnd,wParam,lParam);

}

 

///////////////////////////////////////////////////////////////////////////////////

// ÀÏ¹Ý ÇÔ¼öµé

 

void CApiEditHexa::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)

{

}

 

void CApiEditHexa::Insert(int nPos, TCHAR *str, int len, BOOL bRec/*=TRUE*/)

{

}

 

void CApiEditHexa::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)

{

}

 

int CApiEditHexa::GetRowCount()

{

     return 1;

}

 

void CApiEditHexa::GetRCFromOff(int nPos,int &r,int &c)

{

}

 

int CApiEditHexa::GetOffFromRC(int r,int c)

{

     return 0;

}

 

void CApiEditHexa::GetXYFromOff(int nPos,int &x,int &y)

{

}

 

int CApiEditHexa::GetOffFromXY(int x,int y)

{

     return 0;

}

 

void CApiEditHexa::UpdateScrollInfo()

{

     SCROLLINFO si;

 

     yMax=(GetRowCount()+frt.bottom/LineHeight/2)*LineHeight;

 

     si.cbSize=sizeof(SCROLLINFO);

     si.fMask=SIF_ALL | SIF_DISABLENOSCROLL;

     si.nMin=0;

     si.nMax=yMax;

     si.nPage=(frt.bottom/LineHeight)*LineHeight;

     si.nPos=yPos;

     SetScrollInfo(hVertScroll, SB_CTL, &si, TRUE);

 

     si.nMax=xMax;

     si.nPage=frt.right;

     si.nPos=xPos;

     SetScrollInfo(hHorzScroll, SB_CTL, &si, TRUE);

}

 

int CApiEditHexa::DrawLine(HDC hdc, int Line)

{

     TextOut(hdc,100,0,"Hexa",4);

     return 1;

}

 

void CApiEditHexa::SetFont(LOGFONT *alogfont)

{

     CApiEditText::SetFont(alogfont);

     if (xMax!=0) {

          UpdateScrollInfo();

          SetCaret();

          Invalidate(-1);

     }

}

 

int CApiEditHexa::GetInfoFromOff(int Type, int nPos/*=-1*/)

{

     return 0;

}

 

int CApiEditHexa::GetDocInfo(int type)

{

     return 0;

}

 

void CApiEditHexa::BeginPrint(Ae_PrintInfo *pi)

{

}

 

BOOL CApiEditHexa::PrintPage(Ae_PrintInfo *pi,int nPage)

{

     return TRUE;

}

 

void CApiEditHexa::EndPrint(Ae_PrintInfo *pi)

{

}

 

void CApiEditHexa::InitView()

{

     bOvr=TRUE;

     off=0;

     bComp=FALSE;

     xMax=2048;

     xPos=0;

     yPos=0;

     SelStart=SelEnd=0;

     ClearBookmark();

     UpdateScrollInfo();

     if (GetFocus()==hWnd) {

          SetCaret();

     }

     bVertSplit=TRUE;

     bHorzSplit=TRUE;

     iDrag=0;

     OldSplit=0;

     Invalidate(-1);

}

 

»ý¼ºÀÚ¿¡¼­ ºäÀÇ Å¸ÀÔÀ» HEXA_VIEW·Î ÃʱâÈ­ÇÏ¿© ÀÚ½ÅÀÌ Çí»ç ºäÀÓÀ» ¸íÈ®ÇÏ°Ô ±â¾ïÇÑ´Ù. OnCreate, OnDestroy ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â ÅؽºÆ® ºä¿Í ±â´ÉÀÌ µ¿ÀÏÇϱ⠶§¹®¿¡ ÅؽºÆ® ºäÀÇ ÇÔ¼ö¸¦ ´ë½Å È£ÃâÇϸç OnSize³ª OnPaint µîµµ ±âº» ºäÀÇ Äڵ带 ¼öÁ¤ÇßÀ¸¹Ç·Î ±âº» ºäÀÇ Çڵ鷯¸¦ ´ë½Å È£ÃâÇÑ´Ù. OnKey¿Í ¸¶¿ì½º ¸Þ½ÃÁö Çڵ鷯´Â ¾à°£ ´Ù¸¥ Äڵ尡 Àֱ⠶§¹®¿¡ ÀçÁ¤ÀÇÇÏ¿´´Ù. ¸¶¿ì½º ¸Þ½ÃÁö Çڵ鷯´Â ½ºÇø´ ¹Ù¸¦ µå·¡±×ÇÏ´Â ±â´É¸¸ Á¤ÀǵǾî ÀÖ´Ù. OnChar ÇÔ¼ö´Â ¾Æ¿¹ ¾Æ¹« µ¿ÀÛµµ ÇÏÁö ¾ÊÀ¸¹Ç·Î ºñ¾î ÀÖ´Ù.

ÀÏ¹Ý ¸â¹ö ÇÔ¼öµéµµ ´ëºÎºÐ ³»¿ëÀÌ ºñ¾î ÀÖÀ¸¸ç Á¦´ë·Î Äڵ尡 ÀÛ¼ºµÇ¾î ÀÖ´Â ÇÔ¼ö´Â InitView, SetFont Á¤µµ°¡ °íÀÛÀÌ´Ù. ÇöÀç ºñ¾îÀÖ´Â ÇÔ¼öµéÀº ¾Æ¹« Äڵ嵵 °¡ÁöÁö ¾ÊÁö¸¸ 16Áø ÆíÁý ±â´ÉÀ» ÀÛ¼ºÇÒ ¶§´Â ¸ðµÎ Äڵ带 °¡Áö°Ô µÉ °ÍÀÌ´Ù. DrawLine ÇÔ¼ö¿¡¼­´Â (100,0)¿¡ "HEXA"¶ó´Â ¹®ÀÚ¿­À» Ãâ·ÂÇÏ¿© ÀÚ½ÅÀÌ Çí»ç ºäÀÓÀ» Ç¥½ÃÇϱ⸸ ÇÑ´Ù. GetRowCount´Â ¹«Á¶°Ç 1À» ¸®ÅÏÇÏ¿© 1ÁÙÂ¥¸® ¹®¼­ÀÎ °Í ó·³ ¸¸µç´Ù.

Çí»ç ºä´Â ÀÚµ¿ °³Çà ¿É¼ÇÀ» ¾²Áö ¾Ê´Â´Ù. ÇÏÁö¸¸ SetWrap ÇÔ¼ö´Â ÀÏ´Ü Àü´ÞµÈ ¿É¼Ç°ªÀ» ¸â¹ö º¯¼ö¿¡ ÀúÀåÇØ µÎ´Âµ¥ ÀÌ´Â ºäÀÇ Å¸ÀÔ ±³Ã¼½Ã¿¡ ¿ø·¡°ªÀ» À¯ÁöÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÚµ¿ °³Çà¿¡ µû¶ó ºÎ¼öÀûÀΠ󸮴 ÇÒ ÇÊ¿ä¾øÀÌ °ª¸¸ ±â¾ïÇÏ¸é µÈ´Ù.

SetFont ÇÔ¼öÀÇ °æ¿ì ÆùÆ® º¯°æ¿¡ µû¸¥ ÀÛ¾÷ ¸ñ·ÏÀÌ ºñ½ÁÇϱ⠶§¹®¿¡ ±âº»ºäÀÇ SetFont¸¦ È£ÃâÇÑ´Ù. ´Ü, Çí»ç ºä´Â pLineÀÌ Ç×»ó NULLÀ̱⠶§¹®¿¡ ½ºÅ©·Ñ Á¤º¸ °»½Å, ´Ù½Ã ±×¸®±â´Â Á÷Á¢ ÇØ¾ß ÇÑ´Ù. ÃʱâÈ­ ¿Ï·á ¿©ºÎ¸¦ Á¶»çÇϱâ À§ÇØ xMax°ªÀ» »ç¿ëÇϴµ¥ OnCreate¿¡¼­ 0À¸·Î ÃʱâÈ­ÇÏ°í InitView¿¡¼­ 2048·Î ´Ù½Ã ÃʱâÈ­ÇÏ¿© ÃʱâÈ­ ¿Ï·á¸¦ Ç¥½ÃÇÑ´Ù. ÅؽºÆ® ºä´Â pLineÀ» ´ë½Å »ç¿ëÇß¾ú´Ù.

´Ù.ºä ŸÀÔ ±³Ã¼

ÇÁ·¹ÀÓÀÌ »õ·Î Ãß°¡µÈ ºä ŸÀÔÀÎ Çí»ç ºä¸¦ ÀνÄÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. °´Ã¼¸¦ ºÐÇÒÇÒ ¶§ºÎÅÍ Áغñ¸¦ Ç߱⠶§¹®¿¡ ¸¹Àº ºÎºÐÀ» °íÄ¥ ÇÊ¿ä´Â ¾ø´Ù. ¿ì¼± CreateView ÇÔ¼ö¿¡¼­ Çí»ç ºä °´Ã¼¸¦ »ý¼ºÇÑ´Ù.

 

CApiEditText *CApiEdit::CreateView(int Type)

{

     CApiEditText *pView;

     switch (Type) {

     case TEXT_VIEW:

          pView=new CApiEditText;

          break;

    case HEXA_VIEW:

        pView=new CApiEditHexa;

        break;

     }

     pView->pFrame=this;

     pView->Create(0,0,0,0,WS_CHILD | WS_VISIBLE,0,hWnd);

     return pView;

}

 

Àμö·Î Àü´ÞµÈ TypeÀÌ HEXA_VIEWÀ̸é CApiEditHexa Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸¸µé¾î ±× Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÇÁ·¹ÀÓÀÌ °ü¸®ÇÏ´Â ºäÀÇ ¹è¿­ÀÎ arView´Â CApiEditText *ÇüÀÇ ¹è¿­ÀÌ°í Çí»ç ºä´Â ÀÌ Å¬·¡½º·ÎºÎÅÍ ÆÄ»ýµÇ¾úÀ¸¹Ç·Î ÇÁ·¹ÀÓÀÇ ºä°¡ µÉ ÀÚ°ÝÀÌ ÀÖ´Ù. ÇÁ·¹ÀÓ¿¡ ºäÀÇ Å¸ÀÔÀ» º¯°æÇÒ ¼ö ÀÖ´Â ¸â¹ö ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

void CApiEdit::ChangeViewType(int nView,int Type)

{

     CApiEditText *pView;

     int OldActive;

 

     // È°¼º ºä¸¦ ÀüȯÇÑ´Ù.

     if (nView==-1) {

          nView=ActiveView;

     }

 

     // °°Àº ŸÀÔÀÌ¸é º¯È¯ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

     if (arView[nView]->ViewType == Type) {

          return;

     }

 

     // »õ·Î¿î ºä¸¦ ¸¸µç ÈÄ ¼Ó¼ºÀ» º¹Á¦ÇÑ´Ù.

     pView=CreateView(Type);

     CloneView(pView,arView[nView],3);

     OldActive=ActiveView;

     DeleteView(nView);

 

     // »õ·Î ¸¸µç ºä·Î ´ëüÇÏ°í È°¼ºÈ­ÇÑ´Ù.

     arView[nView]=pView;

     ActiveView=OldActive;

     SetFocus(pView->hWnd);

     SendMessage(hWnd,WM_SIZE,0,0);

     AdjustSplitable();

}

 

Àμö·Î Àü´ÞµÈ nView¸¦ TypeÇüÀÇ ºä·Î ÀüȯÇϴµ¥ nView°¡ -1À̸é È°¼º ºä°¡ Àüȯ ´ë»óÀÌ´Ù. ´ë»ó ºäÀÇ Å¸ÀÔÀÌ ÀÌ¹Ì TypeÀÌ¸é ´õ ÀÌ»ó ÀüȯÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ºäÀÇ Å¸ÀÔÀ» ±³Ã¼ÇÏ´Â °ÍÀº »ý°¢º¸´Ù ÈξÀ ´õ °£´ÜÇÏ´Ù. ±âÁ¸ÀÇ ºä¸¦ Æı«ÇÏ°í »õ·Î¿î ºä¸¦ ¿øÇϴ ŸÀÔ´ë·Î ¸¸µé¾î ¹Ù²ã Ä¡±â¸¸ ÇÏ¸é µÈ´Ù. ´Ù¸¸ »õ·Î ¸¸µé¾îÁö´Â ºä°¡ ±âÁ¸ ºäÀÇ ¼Ó¼ºÀ» º¹Á¦ÇØ¾ß ÇϹǷΠº¹Á¦°¡ ¿Ï·áµÉ ¶§±îÁö ±âÁ¸ ºä¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù´Â °Í¸¸ ÁÖÀÇÇÏ¸é µÈ´Ù. CloneView ÇÔ¼ö´Â ÁÖ·Î ¼öÆò, ¼öÁ÷ ºÐÇÒ ¶§ ÇüÁ¦ ºä¸¦ ¸¸µé±â À§ÇØ È£ÃâÇÏ¸ç ¼¼ ¹ø° Àμö´Â ºÐÇÒ Å¸ÀÔÀ» ÁöÁ¤ÇÑ´Ù. ºäÀÇ Å¸ÀÔÀ» º¯°æÇÒ ¶§´Â ºÐÇÒÇÏ´Â °Í°ú´Â ´Ù¸£¹Ç·Î ÀÌ Àμö·Î ¼öÆòµµ, ¼öÁ÷µµ ¾Æ´Ñ 3ÀÇ °ªÀ» Àü´ÞÇßÀ¸¸ç ÀÌ °æ¿ì ºÏ¸¶Å©´Â º¹Á¦ÇÏÁö ¾Ê´Â´Ù.

DeleteView ÇÔ¼ö´Â È°¼º ºä°¡ »èÁ¦µÉ ¶§ Àá½Ã È°¼º ºä¸¦ -1·Î ¸¸µç´Ù. È°¼ººäÀÇ Å¸ÀÔÀ» ±³Ã¼ÇÒ ¶§´Â ÀϽÃÀûÀ¸·Î È°¼º ºä°¡ ¾ø´Â »óÅ°¡ µÉ ¼ö ÀÖÀ¸¹Ç·Î È°¼º ºäÀÇ ¹øÈ£¸¦ ¹Ì¸® Á¶»çÇØ ³õ°í »èÁ¦ ÈÄ ´Ù½Ã È°¼º ºä¸¦ Á¦´ë·Î ´ëÀÔÇØ¾ß ÇÑ´Ù. ºäÀÇ Å¸ÀÔÀ» ±³Ã¼ÇÑ ÈÄ »õ·Î ¸¸µé¾îÁø ºä¿¡°Ô Æ÷Ä¿½º¸¦ ÁÖ°í WM_SIZE ¸Þ½ÃÁö¸¦ º¸³» »õ·Î »ý¼ºµÈ ºä¸¦ ÇÁ·¹ÀÓÀÇ ÀÛ¾÷ ¿µ¿ª¿¡ ¹èÄ¡ÇÑ´Ù. »õ·Î »ý¼ºµÈ ºä´Â ±âÁ¸ ºä¿Í °°Àº ÷ÀÚ¸¦ »ç¿ëÇϹǷΠ±âÁ¸ ºäÀÇ ÀÚ¸®¿¡ °°Àº Å©±â·Î ¹èÄ¡µÉ °ÍÀÌ´Ù. »õ·Î ¸¸µé¾îÁø ºäµµ ºÐÇÒ »óÅ¿¡ µû¶ó ½ºÇø´ ¹Ú½º¸¦ °ü¸®ÇØ¾ß ÇϹǷΠAdjustSplittable ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

ÀÌÁ¦ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϱ⸸ ÇÏ¸é ºäÀÇ Å¸ÀÔÀÌ ÀüȯµÈ´Ù. º¸±â ¸Þ´º¿¡ 16Áø º¸±â Ç׸ñÀÌ ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖÀ¸¹Ç·Î ÀÌ ¸Þ´º°¡ ¼±ÅõǾúÀ» ¶§ ChangeViewType ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. Dangeun.cpp¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

          if (pView->ViewType == HEXA_VIEW) {

              pSi->Ae.ChangeViewType(-1,TEXT_VIEW);

          } else {

              pSi->Ae.ChangeViewType(-1,HEXA_VIEW);

          }

          break;

 

È°¼º ºäÀÇ Å¸ÀÔÀÌ Çí»ç ºäÀ̸é ÅؽºÆ® ºä·Î ±³Ã¼ÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é ÅؽºÆ® ºä·Î ±³Ã¼ÇÑ´Ù. ÇöÀç Áö¿øµÇ´Â ºä ŸÀÔÀÌ µÎ °¡Áö¹Û¿¡ ¾øÀ¸¹Ç·Î ÀÌ ¸í·ÉÀº ºäÀÇ Å¸ÀÔÀ» Åä±ÛÇÏ´Â ¹æ½ÄÀ» äÅÃÇß´Ù. Â÷ÈÄ¿¡ ºäÀÇ Å¸ÀÔÀÌ ¸¹¾ÆÁö¸é ¼øȯÇÏ´Â ¸í·ÉÀ¸·Î ¹Ù²Ü °ÍÀÌ´Ù. ´ÜÃàÅ° Ctrl+H°¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ´ÜÃàÅ°·Îµµ ºä ŸÀÔÀ» ½±°Ô Åä±ÛÇÒ ¼ö ÀÖ´Ù. OnInitMenu¿¡¼­´Â È°¼º ºäÀÇ Å¸ÀÔÀ» ¸Þ´º¿¡ º¸¿©ÁØ´Ù.

 

void OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

    CApiEditText *pView;

 

     hMenu=(HMENU)wParam;

     hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

     if (hActive) {

          pSi=(SInfo *)GetWindowLong(hActive,0);

        pView=pSi->Ae.GetActiveView();

          ....

          if (pView->ViewType == HEXA_VIEW) {

              CheckMenuItem(hMenu, IDM_VIEW_HEXA, MF_BYCOMMAND | MF_CHECKED);

          } else {

              CheckMenuItem(hMenu, IDM_VIEW_HEXA, MF_BYCOMMAND | MF_UNCHECKED);

          }

 

GetActiveView·Î È°¼º ºäÀÇ Æ÷ÀÎÅ͸¦ ±¸ÇÑ ÈÄ ÀÌ ºäÀÇ ViewTypeÀÌ HEXA_VIEWÀÌ¸é º¸±â ¸Þ´ºÀÇ 16Áø º¸±â Ç׸ñ¿¡ üũ Ç¥½Ã¸¦ ºÙÀδÙ. Åø¹Ù¿¡µµ Çí»ç ºä Àüȯ ¹öÆ°ÀÌ ÀÖÀ¸¹Ç·Î OnIdle¿¡¼­ ÀÌ ¹öÆ°À» °ü¸®ÇØ¾ß ÇÑ´Ù.

 

void OnIdle()

{

    CApiEditText *pView;

 

     hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

     if (hActive) {

          pSi=(SInfo *)GetWindowLong(hActive,0);

        pView=pSi->Ae.GetActiveView();

          ....

          if (pView->ViewType == HEXA_VIEW) {

              SendMessage(hToolBar,TB_SETSTATE,IDM_VIEW_HEXA,

                   MAKELONG(TBSTATE_ENABLED | TBSTATE_CHECKED,0));

          } else {

              SendMessage(hToolBar,TB_SETSTATE,IDM_VIEW_HEXA,MAKELONG(TBSTATE_ENABLED,0));

          }

     } else {

          ....

          SendMessage(hToolBar,TB_SETSTATE,IDM_VIEW_HEXA,MAKELONG(0,0));

     }

}

 

¸Þ´º¿Í ¸¶Âù°¡Áö·Î È°¼º ºäÀÇ Å¸ÀÔÀÌ HEXA_VIEWÀ̸é Åø ¹öÆ°À» ´­·¯Áø »óÅ·Π¸¸µç´Ù. ±×·³ Á¦´ë·Î ºäÀÇ Å¸ÀÔÀÌ ÀüȯµÇ´ÂÁö Å×½ºÆ®ÇØ º¸ÀÚ. ¾Æ¹« ÆÄÀÏÀ̳ª ¿­¾î ³õ°í Ctrl+H¸¦ ´©¸£¸é ÀÛ¾÷¿µ¿ª¿¡ Hexa¶ó°í Ãâ·ÂµÉ °ÍÀÌ´Ù.

¾ÆÁ÷ Á¦´ë·Î 16Áø ´ýÇÁ¸¦ ÇÏÁö´Â ¸øÇÏÁö¸¸ ºÐÇÒµÈ »óÅ¿¡¼­ °¢ ºÐÇÒ ºä¿¡ ´ëÇؼ­µµ ŸÀÔ ÀüȯÀÌ °¡´ÉÇϸç Çí»ç ºä¿¡¼­µµ â ºÐÇÒÀÌ °¡´ÉÇÏ´Ù.

¶ó.¾µ ¼ö ¾ø´Â ¸í·É

ÆíÁý ¸í·É Áß ÀϺδ Çí»ç ºä¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î ºí·Ï µé¿©¾²±â °°Àº ¸í·ÉÀº ¹®´ÜÀÇ °³³äÀÌ ¾ø±â ¶§¹®¿¡ ¾îµð¸¦ ¾ó¸¶¸¸Å­ µé¿©¾µÁö °áÁ¤ÇÒ ¼ö ¾ø´Ù. Çí»ç ºä·Î ÀüȯÇÑ ÈÄ ÆíÁý/º¯È¯/µé¿©¾²±â ÇØ º¸¸é ´çÀå ´Ù¿îµÇ¾î ¹ö¸± °ÍÀÌ´Ù. Á¶ÀÛ ´ë»óÀÎ pLineÀÌ ¾ø±â ¶§¹®Àε¥ ÀÌ·± ¸í·ÉµéÀÌ Çí»ç ºä·Î Àü´ÞµÇÁö ¾Êµµ·Ï ¸·¾Æ¾ß ÇÑ´Ù. ¼¼ °¡Áö ¹æ¹ýÀÌ Àִµ¥ ù ¹ø°·Î È£½ºÆ®°¡ ÀÌ ¸Þ´º ¸í·ÉÀÌ ¼±ÅõǾúÀ» ¶§ ÇÔ¼ö È£ÃâÀ» °¡·Î¸·´Â ¹æ½ÄÀ» »ý°¢ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÉ °ÍÀÌ´Ù.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_EDIT_TOTAB:

          if (pView->ViewType != HEXA_VIEW)

              pView->ConvertSpaceTab(FALSE);

          break;

     case IDM_EDIT_TOSPACE:

          if (pView->ViewType != HEXA_VIEW)

              pView->ConvertSpaceTab(TRUE);

          break;

          ....

     case IDM_EDIT_INDENT:

          if (pView->ViewType != HEXA_VIEW)

              pView->BlockIndent(FALSE);

          break;

     case IDM_EDIT_UNINDENT:

          if (pView->ViewType != HEXA_VIEW)

              pView->BlockIndent(TRUE);

          break;

     case IDM_EDIT_COMMENT:

          if (pView->ViewType != HEXA_VIEW)

              pView->InsertComment(FALSE);

          break;

     case IDM_EDIT_UNCOMMENT:

          if (pView->ViewType != HEXA_VIEW)

              pView->InsertComment(TRUE);

          break;

     ....

     case IDM_EDIT_COPYUP:

          if (pView->ViewType != HEXA_VIEW)

              pView->CopyChar(0);

          break;

     case IDM_EDIT_COPYDOWN:

          if (pView->ViewType != HEXA_VIEW)

              pView->CopyChar(1);

          break;

 

±âº»ºä¿¡¼­ ÆÄ»ýµÈ ¸ðµç ºä´Â ViewTypeÀ̶ó´Â ¸â¹ö¸¦ °¡Áö°í ÀÖ°í »ý¼ºÀÚ¿¡¼­ ÀÌ ¸â¹ö¿¡ ÀڱⰡ ´©±¸¶ó´Â Á¤º¸¸¦ ´ëÀÔÇØ ³õ¾ÒÀ¸¹Ç·Î ÇöÀç ºäÀÇ Å¸ÀÔ ÆǺ°ÀÌ °¡´ÉÇÏ´Ù. ÀÌ °ªÀ» ÀÐ¾î º¸°í ¸í·ÉÀ» ó¸®ÇÒ ºä°¡ Çí»ç ºäÀÌ¸é ¾Æ¿¹ È£ÃâÇÏÁö ¾Ê´Â´Ù. ÀÌ ¹æ¹ýÀº È£½ºÆ®°¡ ¸í·ÉÀÇ °¡´É¼ºÀ» ÆǺ°ÇØ¾ß ÇϹǷΠÁÁÁö ¾Ê´Ù.

µÎ ¹ø° ¹æ¹ýÀº ±âº» ºäÀÇ ÇØ´ç ÇÔ¼ö°¡ ÀÌ ÇÔ¼öµéÀ» ÀçÁ¤ÀÇÇÏ¿© ½º½º·Î ŸÀÔÀ» ÆǺ°ÇÏ¿© ºÒ°¡´ÉÇÑ µ¿ÀÛÀ» ÇÏÁö ¾Ê´Â °ÍÀÌ´Ù. °¢ ÇÔ¼öÀÇ ¼±µÎ¿¡ ´ÙÀ½ Á¶°Ç¹®À» ³Ö¾î ÁØ´Ù.

 

void CApiEditText::ConvertSpaceTab(BOOL bToSpace)

{

     if (pFrame->bReadOnly || ViewType==HEXA_VIEW) {

          return;

     }

     ....

 

void CApiEditText::BlockIndent(BOOL bUnindent)

{

     if (pFrame->bReadOnly || ViewType==HEXA_VIEW) {

          return;

     }

     ....

 

void CApiEditText::InsertComment(BOOL bUnComment)

{

     if (pFrame->bReadOnly || ViewType==HEXA_VIEW) {

          return;

     }

     ....

 

void CApiEditText::CopyChar(int dir)

{

     if (pFrame->bReadOnly || ViewType==HEXA_VIEW) {

          return;

     }

     ....

 

Àбâ Àü¿ë »óÅÂÀ̰ųª Çí»ç ºäÀÌ¸é ¾Æ¹« µ¿ÀÛµµ ÇÏÁö ¾Ê´Â´Ù. ÀÌ ÇÔ¼öµéÀº ¸ðµÎ °¡»ó ÇÔ¼öÀ̸ç Çí»ç ºä¿¡¼­µµ ÀçÁ¤ÀÇÇÏÁö ¾ÊÀ¸¹Ç·Î Çí»ç ºä¿¡ ´ëÇØ °ü·Ã ÆíÁý ¸í·ÉÀ» ³»¸®¸é ÀÌ ÇÔ¼öµéÀÌ È£ÃâµÈ´Ù. ¿©±â¼­ ºäÀÇ Å¸ÀÔÀ» ÆǺ°ÇØ º¸°í µ¿ÀÛÀÇ °è¼Ó ¿©ºÎ¸¦ °áÁ¤ÇÏ¸é µÈ´Ù.

¼¼ ¹ø° ¹æ¹ýÀº Çí»ç ºä°¡ »ó±â °¡»ó ÇÔ¼öµéÀ» ÀçÁ¤ÀÇÇ쵂 ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â ºó ÇÔ¼ö¸¦ °¡Áö´Â °ÍÀÌ´Ù. ±×·¯¸é ±âº»ºäÀÇ ÇÔ¼ö°¡ È£ÃâµÇÁö ¾Ê°í ºñ¾îÀÖ´Â Çí»çºäÀÇ ÇÔ¼ö°¡ È£ÃâµÇ¹Ç·Î ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù.

¼¼°¡Áö ¹æ¹ýÁß ¾î¶² ¹æ¹ýÀ» ¾²´õ¶óµµ ¾µ ¼ö ¾ø´Â ¸í·ÉÀ» ¸·À» ¼ö´Â ÀÖ´Ù. ù¹ø° ¹æ¹ýÀº È£½ºÆ®¿¡°Ô ºÎ´ãÀÌ µÈ´Ù´Â Á¡ÀÌ ÁÁÁö ¾Ê°í ¸Þ´º°¡ ¾Æ´Ñ ´Ù¸¥ °æ·Î, ¿¹¸¦ µé¾î ¸ÅÅ©·Î³ª ´ÜÃàÅ°¸¦ ÅëÇØ ¸í·ÉÀÌ Àü´ÞµÉ ¶§ ´Ù½Ã Çѹø ´õ ÀÛ¾÷ÇØ¾ß ÇÑ´Ù. ¼¼¹ø° ¹æ¹ýÀº ¿øÄ¢ÀûÀ̱â´Â ÇÏÁö¸¸ ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â °ÍÀ» ¸í½ÃÇϱâ À§ÇØ ºó ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù´Â Á¡ÀÌ ¸¸À½¿¡ µéÁö ¾Ê´Â´Ù. µÎ ¹ø° ¹æ¹ýÀÌ ÄÚµå ±æÀ̵µ ª°í °¡Àå °£´ÜÇÏ°í ÁÁÀ¸¹Ç·Î µÎ ¹ø° ¹æ¹ýÀ» äÅÃÇÑ´Ù.

ÀÌ ÀÛ¾÷À» Çϸ鼭 1.0ÀÇ ¹ö±×°¡ Çϳª ¹ß°ßµÇ¾ú´Âµ¥ CopyChar ÇÔ¼ö ¿Ü¿¡´Â Àбâ Àü¿ë Ç÷¡±×¸¦ Á¡°ËÇÏÁö ¾Ê°í ÀÖ´Ù´Â Á¡ÀÌ´Ù. ±×·¡¼­ À̹ø ±âȸ¿¡ ÀÌ ¹ö±×µµ °°ÀÌ ¼öÁ¤Çß´Ù. ³ª¸ÓÁö Çí»ç ºä¿¡¼­ ¾µ ¼ö ÀÖ´Â ÆíÁý ÇÔ¼öµéµµ ¸¶Âù°¡Áö·Î ¹æ¹ýÀ¸·Î ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

 

void CApiEditText::ChangeCase(int action)

{

     if (pFrame->bReadOnly) {

          return;

     }

 

void CApiEditText::RemoveExtraSpace()

{

     if (pFrame->bReadOnly) {

          return;

     }

 

ÇÔ¼ö ³»ºÎ¿¡¼­ µ¿ÀÛ °¡´É¼ºÀ» Á¡°ËÇÏ°í ÀÖÀ¸¹Ç·Î È£½ºÆ®´Â ºäÀÇ Å¸ÀÔ¿¡ »ó°ü¾øÀÌ ¹«Á¶°Ç ÇÔ¼ö¸¦ ºÎ¸£±â¸¸ ÇÏ¸é µÈ´Ù. ÇÏÁö¸¸ ¾µ ¼ö ¾ø´Â ¸í·ÉÀ̶ó´Â °ÍÀ» Ç¥½ÃÇϱâ À§ÇØ ¸Þ´º Ç׸ñÀº °ü¸®ÇØ¾ß ÇÑ´Ù.

 

void OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

          if (s != e && pView->ViewType != HEXA_VIEW) {

              EnableMenuItem(hMenu, IDM_EDIT_TOTAB, MF_BYCOMMAND | MF_ENABLED);

              EnableMenuItem(hMenu, IDM_EDIT_TOSPACE, MF_BYCOMMAND | MF_ENABLED);

          } else {

              EnableMenuItem(hMenu, IDM_EDIT_TOTAB, MF_BYCOMMAND | MF_GRAYED);

              EnableMenuItem(hMenu, IDM_EDIT_TOSPACE, MF_BYCOMMAND | MF_GRAYED);

          }

 

          if (pView->ViewType != HEXA_VIEW) {

              EnableMenuItem(hMenu, IDM_EDIT_INDENT, MF_BYCOMMAND | MF_ENABLED);

              EnableMenuItem(hMenu, IDM_EDIT_UNINDENT, MF_BYCOMMAND | MF_ENABLED);

              EnableMenuItem(hMenu, IDM_EDIT_COPYUP, MF_BYCOMMAND | MF_ENABLED);

              EnableMenuItem(hMenu, IDM_EDIT_COPYDOWN, MF_BYCOMMAND | MF_ENABLED);

          } else {

              EnableMenuItem(hMenu, IDM_EDIT_INDENT, MF_BYCOMMAND | MF_GRAYED);

              EnableMenuItem(hMenu, IDM_EDIT_UNINDENT, MF_BYCOMMAND | MF_GRAYED);

              EnableMenuItem(hMenu, IDM_EDIT_COPYUP, MF_BYCOMMAND | MF_GRAYED);

              EnableMenuItem(hMenu, IDM_EDIT_COPYDOWN, MF_BYCOMMAND | MF_GRAYED);

          }

          ....

          if (lstrlen(pSi->Ae.GetParser()->GetInfo(2)) == 0 || pView->ViewType==HEXA_VIEW) {

              EnableMenuItem(hMenu,IDM_EDIT_COMMENT, MF_BYCOMMAND | MF_GRAYED);

              EnableMenuItem(hMenu,IDM_EDIT_UNCOMMENT, MF_BYCOMMAND | MF_GRAYED);

          } else {

              EnableMenuItem(hMenu,IDM_EDIT_COMMENT, MF_BYCOMMAND | MF_ENABLED);

              EnableMenuItem(hMenu,IDM_EDIT_UNCOMMENT, MF_BYCOMMAND | MF_ENABLED);

          }

 

¼±Åà ¿µ¿ª¸¸ ÀÖÀ¸¸é ÅÇ/°ø¹é º¯È¯À» ÇÒ ¼ö ÀÖ¾úÀ¸³ª ¿©±â¿¡ Çí»ç ºä°¡ ¾Æ´Ï¶ó´Â Á¶°ÇÀÌ ´õ Ãß°¡µÇ¾î¾ß ÇÑ´Ù. Ŭ¸³º¸µå ¸í·É°ú °°Àº »óŸ¦ °¡Áö´ø IDM_EDIT_TOTAB, IDM_EDIT_TOSPACEÀÇ »óÅ °ü¸®¸¦ º°µµÀÇ if¹®À¸·Î ºÐ¸®ÇÏ¿´´Ù. µé¿©¾²±â/³»¾î¾²±â, ¹®ÀÚ º¹»ç´Â Ç×»ó °¡´ÉÇßÀ¸³ª Çí»ç ºä°¡ ¾Æ´Ò ¶§¸¸ °¡´ÉÇϵµ·Ï »õ·Î Á¶°ÇÀÌ Ãß°¡µÇ¾ú´Ù.

ÁÖ¼®À¸·Î ¸¸µé±â ±â´ÉÀº ±¸¹® ºÐ¼®±â°¡ ÇÑÁÙ ÁÖ¼®À» Á¤ÀÇÇÏÁö ¾ÊÀ» ¶§¸¸ »ç¿ëÇÒ ¼ö ¾ø¾ú´Âµ¥ ¿©±â¿¡ Çí»ç ºä¶ó´Â Á¶°Çµµ °°ÀÌ Á¡°ËÇØ¾ß ÇÑ´Ù. Áï, ÇÑÁÙ ÁÖ¼®ÀÌ Á¤ÀǵǾî ÀÖ°í Çí»ç ºä°¡ ¾Æ´Ï¾î¾ß¸¸ ÁÖ¼® ¸¸µé±â°¡ °¡´ÉÇÏ´Ù.