3.È£½ºÆ®ÀÇ ¸í·É

°¡.¸í·É

Áö±Ý±îÁö ÀÛ¼ºÇß´ø ¸í·ÉµéÀº ÄÁÆ®·Ñ ¼öÁØÀÇ ÆíÁý ¸í·ÉµéÀ̾ú´Âµ¥ Á» ´õ °Å½ÃÀûÀÎ Â÷¿ø¿¡¼­ º¸¸é È£½ºÆ® ¼öÁØÀÇ ¸í·Éµµ Á¸ÀçÇÑ´Ù. ÆíÁý ¸í·ÉÀº ¹®¼­ÀÇ ³»ºÎ µ¥ÀÌÅ͸¦ ´Ù·çÁö¸¸ È£½ºÆ®ÀÇ ¸í·ÉÀº ¹®¼­ ÀÚü³ª ¹®¼­Ã¢À» °ü¸®ÇÏ¸ç ¶ÇÇÑ ÄÁÆ®·Ñ ÀÚüÀÇ ¼³Á¤À» Á¶»çÇϱ⵵ ÇÑ´Ù. È£½ºÆ®ÀÇ ¸í·ÉÀº »ç½Ç ¹Ýº¹ÀÇ Àǹ̴ °ÅÀÇ ¾øÀ¸¸ç ´ÜÃàÅ° Á¤ÀǸ¦ À§ÇØ Á¸ÀçÇÑ´Ù. ¹°·Ð ¿øÇÑ´Ù¸é ¸ÅÅ©·Î¿¡ Æ÷ÇÔ½Ãų ¼ö´Â ÀÖ´Ù. È£½ºÆ® ¼öÁØÀÇ ¸í·É ¸ñ·ÏÀº ´ÙÀ½°ú °°´Ù.

 

µ¿»ç

¸ñÀû¾î

¼³¸í

call

¸ÅÅ©·Î¸í

¸ÅÅ©·Î È£Ãâ

clip

»ó¿ë±¸ ¸í

»ó¿ë±¸ »ðÀÔ

navi

next prev

â º¯°æ

set

showenter showtab showspace showlinenum showmargin showcurline hideseltype

set a b Çü½Ä

¸Þ´º¿¡ ÀÖ´Â °Ç Á¦¿Ü

toggle

showenter showtab showspace showlinenum showmargin

 

 

º¸´Ù½ÃÇÇ ´Ù¸¥ ¸ÅÅ©·Î¸¦ È£ÃâÇѴٰųª ¼³Á¤À» º¯°æÇÏ´Â Á» ´õ Å« ±â´ÉµéÀÌ´Ù. Macro.h¿¡ ÀÌ ¸ÅÅ©·Î¿¡ ´ëÇÑ ¿­°ÅÇü°ú °ü·Ã ÇÔ¼öÀÇ ¿øÇüÀ» ¼±¾ðÇÑ´Ù. Macro.h´Â ½Ç½ÀÀ» ½ÃÀÛÇÒ ¶§ ¹Ì¸® ¸¸µé¾î µÎ¾ú´Ù.

 

enum {DGC_CALL, DGC_CLIP, DGC_NAVI, DGC_SET, DGC_TOGGLE};

#define DGVERBNUM 5

 

int ExecMacro(const TCHAR *szMacro);

int DoCommand(const TCHAR *szCom);

 

Macro.cpp ±¸Çö ÆÄÀÏ¿¡´Â ¸í·É°ú ¸ñÀû¾î¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÛ¼ºÇÑ´Ù. »ç¿ëÇÏ´Â ±¸Á¶Ã¼´Â ApiEdit¿Í µ¿ÀÏÇÏ¸ç ¸í·É°ú ¸ñÀû¾î Æ÷¸Ëµµ µ¿ÀÏÇÏ´Ù.

 

SMacVerb arHostVerb[]={

     {"call","¸ÅÅ©·Î È£Ãâ",0x00},

     {"clip","»ó¿ë±¸ »ðÀÔ",0x00},

     {"navi","À©µµ¿ì ¼øȯ",0x02},

     {"set","¼³Á¤ º¯°æ",0x02},

     {"toggle","¼³Á¤ Åä±Û",0x02},

     {"","",0x00},

};

 

SMacObject arHostObject[]={

     {"next","´ÙÀ½ À©µµ¿ì"},                         // navi:0

     {"prev","ÀÌÀü À©µµ¿ì"},

     {NULL,NULL},

     {"showenter","°³Çà ÄÚµå º¸±â"},                     // set:3

     {"showtab","ÅÇ ÄÚµå º¸±â"},

     {"showspace","°ø¹é º¸±â"},

     {"showlinenum","ÁÙ¹øÈ£ º¸±â"},

     {"showmargin","¸¶Áø º¸±â"},

     {"showcurline","ÇöÀçÇà °­Á¶"},

     {"hideseltype","¼±Åÿµ¿ª ¼û±â±â"},

     {NULL,NULL},

     {"showenter","°³Çà ÄÚµå º¸±â"},                     // toggle:11

     {"showtab","ÅÇ ÄÚµå º¸±â"},

     {"showspace","°ø¹é º¸±â"},

     {"showlinenum","ÁÙ¹øÈ£ º¸±â"},

     {"showmargin","¸¶Áø º¸±â"},

     {NULL,NULL}

};

 

int arObjOfVerbHost[]={-1,-1,0,3,11};

 

ÀÌ ¸í·ÉµéÀº È£½ºÆ®°¡ Á¦°øÇÏ´Â °ÍÀ̹ǷΠApiEdit¿¡¼­´Â Á÷Á¢ÀûÀ¸·Î »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç È£½ºÆ®¿¡ µû¶ó ³ª¸§´ë·ÎÀÇ ¸í·ÉÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

³ª.¸ÅÅ©·Î Ŭ·¡½º

È£½ºÆ® ÀÔÀå¿¡¼­ ¸ÅÅ©·Î´Â ½ÇÇà ´ë»óÀ̸鼭 µ¿½Ã¿¡ ÆíÁý ´ë»óÀÌ´Ù. ¾ðÁ¦µçÁö ¸í·É¾î¸¦ ÷»èÇÒ ¼ö ÀÖ°í ÆÄÀÏÀ̳ª ·¹Áö½ºÆ®¸®·Î ÀúÀå ¶Ç´Â º¹±¸ÇÒ ¼ö ÀÖ´Ù. ¸ÅÅ©·Î¸¦ °ü¸®Çϱâ À§ÇØ ¿©·¯ °¡Áö Á¤º¸¿Í ÇÔ¼öµéÀÌ ÇÊ¿äÇϹǷΠ¸ÅÅ©·Î¸¦ À§ÇÑ Å¬·¡½º¸¦ ÀÛ¼ºÇÑ´Ù. Macro.h¿¡ ´ÙÀ½ Ŭ·¡½º¸¦ ¼±¾ðÇÑ´Ù.

 

struct SMacro

{

     TCHAR Name[65];

     TCHAR *Content;

};

 

class CMacro

{

public:

     CMacro();

     ~CMacro();

 

     SMacro *arMacro;

     int Size;

     int Num;

 

     int Find(const TCHAR *Name);

     void Set(int idx,const TCHAR *szCon);

     void Add(const TCHAR *Name,const TCHAR *szCon);

     void Delete(int idx);

     void LoadFromReg(TCHAR *Key);

     void SaveToReg(TCHAR *Key);

     void LoadFromFile(TCHAR *Path);

     void SaveToFile(TCHAR *Path);

};

 

SMacro ±¸Á¶Ã¼´Â ÇϳªÀÇ ¸ÅÅ©·Î¿¡ ´ëÇÑ À̸§°ú ³»¿ëÀ» °¡Áø´Ù. À̸§Àº ÃÖ´ë 64ÀÚ±îÁö °¡´ÉÇѵ¥ ³Î Á¾·á ¹®ÀÚ±îÁö °í·ÁÇÏ¿© 65ÀÇ Å©±â¸¦ °¡Áø´Ù. ¸ÅÅ©·ÎÀÇ ³»¿ëÀº ±æÀÌ°¡ °¡º¯ÀûÀ̹ǷΠContent ¸â¹ö´Â Æ÷ÀÎÅͷθ¸ ¼±¾ðÇÏ°í Æ÷ÇԵǴ ¸í·ÉÀÇ ±æÀÌ¿¡ µû¶ó µ¿ÀûÀ¸·Î ÇÒ´çÇÒ °ÍÀÌ´Ù. CMacro Ŭ·¡½º´Â ¸ÅÅ©·ÎÀÇ ÁýÇÕÀ» ´Ù·ç´Â Ŭ·¡½ºÀÌ´Ù. arMacro ¹è¿­À» ¸â¹ö·Î °¡Áö¸ç ¸ÅÅ©·Î °³¼ö°¡ °¡º¯ÀûÀ̹ǷΠÀÌ ¹è¿­µµ ¿ª½Ã µ¿ÀûÀ¸·Î ÇÒ´çµÈ´Ù. ¸â¹ö ÇÔ¼öµéÀº Macro.cpp¿¡ ÀÛ¼ºÇÑ´Ù.

 

// »ý¼ºÀÚ. ¿ÏÀüÈ÷ ºó »óÅ·Π°´Ã¼ »ý¼º

CMacro::CMacro()

{

     Size=0;

     Num=0;

     arMacro=NULL;

}

 

CMacro::~CMacro()

{

     int i;

 

     for (i=0;i<Num;i++) {

          free(arMacro[i].Content);

     }

     if (arMacro) {

          free(arMacro);

     }

}

 

// À̸§À¸·ÎºÎÅÍ ¸ÅÅ©·Î ¹øÈ£ ãÀ½. ¾øÀ¸¸é -1

int CMacro::Find(const TCHAR *Name)

{

     int i;

 

     for (i=0;i<Num;i++) {

          if (strcmpi(Name,arMacro[i].Name)==0) {

              return i;

          }

     }

     return -1;

}

 

// ¸ÅÅ©·Î ³»¿ë ´ëÀÔ. ´ëÀÔÀü¿¡ Å©±â Á¡°Ë

void CMacro::Set(int idx,const TCHAR *szCon)

{

     unsigned size;

 

     // ¸ÅÅ©·Î ¹öÆÛÀÇ Å©±â Á¡°Ë

     size=lstrlen(szCon)+1;

     if (arMacro[idx].Content==NULL || _msize(arMacro[idx].Content) < size) {

          arMacro[idx].Content=(TCHAR *)realloc(arMacro[idx].Content,size);

     }

 

     lstrcpy(arMacro[idx].Content,szCon);

}

 

void CMacro::Add(const TCHAR *Name,const TCHAR *szCon)

{

     // °°À» ¶§ ÀçÇÒ´ç. Çѹø¿¡ 1ÀÌ»ó Ä¿Áö¸é ¾ÈµÊ. »õ·Î ÇÒ´çµÈ ¸ÅÅ©·Î´Â Å©±â 0À¸·Î ÁÖ¾î ´ÙÀ½¿¡ ¹Ù·Î ÀçÇÒ´çµÇµµ·Ï ÇÔ

     if (Size == Num) {

          Size++;

          arMacro=(SMacro *)realloc(arMacro,sizeof(SMacro)*Size);

          arMacro[Num].Content=NULL;

     }

     lstrcpy(arMacro[Num].Name,Name);

     Set(Num,szCon);

     Num++;

}

 

void CMacro::Delete(int idx)

{

     int i;

 

     free(arMacro[idx].Content);

     for (i=idx;i<Num-1;i++) {

          arMacro[i]=arMacro[i+1];

     }

     // ¸¶Áö¸· ¿ä¼Ò´Â ºñ¿ö¼­ ´ÙÀ½¿¡ ÀçÇÒ´çµÇµµ·Ï ÇÑ´Ù.

     arMacro[Num-1].Content=NULL;

     Num--;

}

 

void CMacro::LoadFromReg(TCHAR *Key)

{

     int i,count;

     TCHAR *szMacro;

     TCHAR szKey[MAX_PATH];

     TCHAR szSub[12];

     TCHAR szName[32];

 

     lstrcpy(szKey,Key);

     lstrcat(szKey,"Macro");

    

     count=SHRegReadInt(SHCU,szKey,"nMacro",0);

     szMacro=(TCHAR *)malloc(16384);

     for (i=0;i<count;i++) {

          wsprintf(szSub,"Macro%d",i);

          SHRegReadString(SHCU,szKey,szSub,"",szMacro,16384);

          wsprintf(szSub,"Name%d",i);

          SHRegReadString(SHCU,szKey,szSub,"",szName,32);

          Add(szName,szMacro);

     }

     free(szMacro);

}

 

void CMacro::SaveToReg(TCHAR *Key)

{

     int i;

     TCHAR szKey[MAX_PATH];

     TCHAR szSub[12];

 

     lstrcpy(szKey,Key);

     lstrcat(szKey,"Macro");

 

     SHRegWriteInt(SHCU,szKey,"nMacro",Num);

     for (i=0;i<Num;i++) {

          wsprintf(szSub,"Macro%d",i);

          SHRegWriteString(SHCU,szKey,szSub,arMacro[i].Content);

          wsprintf(szSub,"Name%d",i);

          SHRegWriteString(SHCU,szKey,szSub,arMacro[i].Name);

     }

}

 

void CMacro::LoadFromFile(TCHAR *Path)

{

}

 

void CMacro::SaveToFile(TCHAR *Path)

{

}

 

ÃʱâÈ­, ÇØÁ¦, Ãß°¡, »èÁ¦ µîÀÇ ¸â¹ö ÇÔ¼öµé°ú ·¹Áö½ºÆ®¸®·ÎÀÇ ÀÔÃâ·Â ÇÔ¼öµéÀÌ ÀÛ¼ºµÇ¾î ÀÖ´Ù. ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö´Â ½ºÆÑ¿¡¸¸ ±âȹµÇ¾î ÀÖ°í ¾ÆÁ÷ ±¸ÇöÇÏÁö´Â ¾Ê¾Ò´Âµ¥ ¸ÅÅ©·ÎÀÇ ¹®¹ýÀÌ È®Á¤ÀûÀÌÁö ¾Ê±â ¶§¹®¿¡ Àá½Ã º¸·ùÇØ µÎ¾ú´Ù. ¸ÅÅ©·Î ±â´ÉÀÌ Á» ´õ Á¤±³ÇÏ°Ô ´Ùµë¾îÁö¸é Àüü ¸ÅÆ®·Î¸¦ ÆÄÀÏ·Î ÀúÀåÇÏ¿© »ç¿ëÀÚ³¢·Î ±³È¯ÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÆÄÀÏ ÀÔÃâ·Â ±â´ÉÀÌ ¾ÆÁ÷ ÀÛ¼ºµÇÁö ¾Ê¾ÒÀ¸¹Ç·Î ¸ÅÅ©·Î´Â ·¹Áö½ºÆ®¸®¿¡¸¸ Áö¿ªÀûÀ¸·Î Á¸ÀçÇÒ ¼ö ÀÖ´Ù.

SMacro °´Ã¼ Çϳª¸é ¸ÅÅ©·ÎÀÇ ÁýÇÕÀ» ¸ðµÎ °ü¸®ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ´ç±ÙÀº ¸ÅÅ©·Î °´Ã¼¸¦ Àü¿ªÀ¸·Î ´Ü Çϳª¸¸ ¼±¾ðÇÑ´Ù. ¸ÅÅ©·ÎÀÇ °ü¸®ÀÇ ÁÖü´Â ÄÁÆ®·ÑÀÌ ¾Æ´Ï¶ó È£½ºÆ®À̹ǷΠÀÌ °´Ã¼´Â Dangeun.cpp¿¡ ¼±¾ðÇÑ´Ù.

 

CMacro DgMacro;

 

¿ÜºÎ¿¡¼­ ÀÌ °´Ã¼¸¦ ¾ðÁ¦µçÁö ¾×¼¼½ºÇÒ ¼ö ÀÖ¾î¾ß ÇϹǷΠglobal.h¿¡µµ extern ¼±¾ðÇÑ´Ù.

 

extern CMacro DgMacro;

 

ÀÌ °´Ã¼´Â ÀüÀûÀ¸·Î ¸ÅÅ©·Î ´ëÈ­»óÀÚ¿¡¼­ °ü¸®µÉ °Í´Ù. ´ç±ÙÀº OnCreate, OnDestroy¿¡¼­ ÀÌ °´Ã¼°¡ ·¹Áö½ºÆ®¸®¿¡ ÀÚ½ÅÀ» ÀúÀåÇÒ ¼ö ÀÖ°Ô¸¸ ÇÏ¸é µÈ´Ù.

 

int OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     if (SHRegReadInt(SHCU,KEY"Setting","StartAction",1000) == 1000) {

          Option.GetStyleColor();

          FindFlag=AE_FIND_WRAP | AE_FIND_RECURSIVE;

          arFind[3].num=2;

          arFind[3].Set(0,"*.*");

          arFind[3].Set(1,"*.cpp;*.hpp;*.c;*.h;*.inl");

     } else {

          Option.Load(KEY);

        DgMacro.LoadFromReg(KEY);

          ....

 

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

{

     ....

     Option.Save(KEY);

    DgMacro.SaveToReg(KEY);

     ....

 

Ŭ·¡½º ÀÚü¿¡ ·¹Áö½ºÆ®¸® ÀÔÃâ·Â¹®ÀÌ ¿ÏºñµÇ¾î ÀÖÀ¸¹Ç·Î ·¹Áö½ºÆ®¸® ·çƮŰ¿Í ÇÔ²² ¸â¹ö ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù.

´Ù.¸í·É ½ÇÇà

È£½ºÆ®ÀÇ ¸í·ÉÀ» ½ÇÇàÇÏ´Â ÇÔ¼ö¸¦ Macro.cpp¿¡ ÀÛ¼ºÇÑ´Ù. ¹æ½ÄÀº ApiEdit¿Í °ÅÀÇ À¯»çÇѵ¥ È£Ãâ °ü°è°¡ ´Ù¼Ò º¹ÀâÇÏ´Ù.

 

// ¸í·É ½ÇÇà.

// 0: Á¤»ó ½ÇÇà

// -1:µ¿»ç ¾øÀ½

// -2:Áö¿øµÇÁö ¾Ê´Â ¸ñÀû¾î

// -3:´Ý´Â µû¿ÈÇ¥ ¾øÀ½

int DoCommand(const TCHAR *szCom)

{

     int comlen;

     const TCHAR *pc, *ps, *p;

     TCHAR *Com, *pCom ;

     int Verb, Object;

     HWND hActive;

     SInfo *pSi;

     int Result=0;

     TCHAR *str;

     int count,Value;

     int i;

 

     // ¼±Çà °ø¹éÀº ¹«½ÃÇÑ´Ù.

     ps=szCom;

     SkipSpace(ps);

 

     // ÁÖ¼®ÀÌ¸é ¸í·É Àüü¸¦ ¹«½ÃÇÑ´Ù.

     if (*ps=='/' && *(ps+1)=='/') {

          return 0;

     }

 

     // ¸í·É¾îÀÇ ±æÀ̸¦ ±¸ÇÑ´Ù. ³Î, °³Çà, ¼¼¹ÌÄÝ·ÐÀÌ ¹®ÀåÀÇ ³¡ÀÌ´Ù.

     for (pc=ps;;pc++) {

          if (*pc==NULL || *pc=='\r' || *pc==';') {

              break;

          }

          if (SkipString(pc)==FALSE) {

              return -3;

          }

     }

     comlen=pc-ps;

 

     // szComÀÇ ¸ðµç ¹®ÀÚ´Â ¼Ò¹®ÀÚ·Î, ´Ü µû¿ÈÇ¥ ¾ÈÀº Á¦¿Ü. ´Ý´Â µû¿ÈÇ¥°¡ ÀÖ´ÂÁö´Â ÀÌ¹Ì Ã¼Å©ÇßÀ½

     Com=(TCHAR *)malloc(comlen+1);

     lstrcpyn(Com,ps,comlen+1);

     for (pCom=Com;*pCom;pCom++) {

          SkipString(const_cast<const TCHAR *&>(pCom));

          if (IsCharUpper(*pCom)) {

              *pCom+=0x20;

          }

     }

 

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

     if (hActive) {

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

     } else {

          return 0;

     }

 

     // µ¿»ç¸¦ ¸ÕÀú ã´Â´Ù. ¾øÀ¸¸é ¿¡·¯·Î ó¸®ÇÑ´Ù.

     p=Com;

     Verb=GetComVerb(p,arHostVerb);

     if (Verb==-1) {

          Result=-1;

          goto End;

     }

 

     switch (Verb) {

     case DGC_CALL:

          GetComString(p,str);

          count=GetComNumber(p,1);

          if (str) {

              for (i=0;i<count;i++) {

                   Result=ExecMacro(str);

                   if (Result != 0) {

                        break;

                   }

              }

              free(str);

          } else {

              Result=-3;

              goto End;

          }

          break;

     case DGC_CLIP:

          break;

     case DGC_NAVI:

          // ¸ÅÅ©·Î ½ÇÇàÁß¿¡´Â »ç¿ëÇÒ ¼ö ¾ø´Ù.

          if (pSi->Ae.GetActiveView()->AeMc.runlevel==0) {

              Object=GetComObject(Verb,p,arHostObject,arObjOfVerbHost);

              switch (Object) {

              case 0:

                   SendMessage(g_hMDIClient,WM_MDINEXT,NULL,(LPARAM)TRUE);

                   break;

              case 1:

                   SendMessage(g_hMDIClient,WM_MDINEXT,NULL,(LPARAM)FALSE);

                   break;

              }

          }

          break;

     case DGC_SET:

          Object=GetComObject(Verb,p,arHostObject,arObjOfVerbHost);

          Value=GetComNumber(p,0);

          switch (Object) {

          case 0:

              pSi->Ae.SetShowState(SHOWENTER,Value!=0);

              break;

          case 1:

              pSi->Ae.SetShowState(SHOWTAB,Value!=0);

              break;

          case 2:

              pSi->Ae.SetShowState(SHOWSPACE,Value!=0);

              break;

          case 3:

              pSi->Ae.SetShowState(SHOWLINENUM,Value!=0);

              break;

          case 4:

              pSi->Ae.SetShowState(SHOWMARGIN,Value!=0);

              break;

          case 5:

              pSi->Ae.SetShowCurLine(Value);

              break;

          case 6:

              pSi->Ae.SetHideSelType(Value);

              break;

          }

          break;

     case DGC_TOGGLE:

          Object=GetComObject(Verb,p,arHostObject,arObjOfVerbHost);

          switch (Object) {

          case 0:

              pSi->Ae.SetShowState(SHOWENTER,!pSi->Ae.GetShowState(SHOWENTER));

              break;

          case 1:

              pSi->Ae.SetShowState(SHOWTAB,!pSi->Ae.GetShowState(SHOWTAB));

              break;

          case 2:

              pSi->Ae.SetShowState(SHOWSPACE,!pSi->Ae.GetShowState(SHOWSPACE));

              break;

          case 3:

              pSi->Ae.SetShowState(SHOWLINENUM,!pSi->Ae.GetShowState(SHOWLINENUM));

              break;

          case 4:

              pSi->Ae.SetShowState(SHOWMARGIN,!pSi->Ae.GetShowState(SHOWMARGIN));

              break;

          }

          break;

     }

 

End:

     free(Com);

     return Result;

}

 

// ¸ÅÅ©·Î ½ÇÇà.

int ExecMacro(const TCHAR *szMacro)

{

     int idx;

     HWND hActive;

     SInfo *pSi;

 

     idx=DgMacro.Find(szMacro);

     if (idx==-1) {

          return -1;

     }

 

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

     if (hActive==NULL) {

          return -1;

     }

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

     pSi->Ae.ExecMacro(DgMacro.arMacro[idx].Content);

     return 0;

}

 

ExecMacro´Â DgMacro °´Ã¼¿¡¼­ À̸§À¸·Î ¸ÅÅ©·Î¸¦ ã°í È°¼º âÀÇ ÇÒ¼º ºä·Î ÀÌ ¸ÅÅ©·Î¸¦ Àü´ÞÇÑ´Ù. ºäÀÇ ExecMacro ÇÔ¼ö´Â ºäÀÇ DoCommand ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÆíÁý ¸í·ÉÀ» ó¸®Ç쵂 ºä°¡ ÀÌÇØÇÏÁö ¸øÇÏ´Â µ¿»ç´Â È£½ºÆ®ÀÇ DoCommand ÇÔ¼ö·Î ³Ñ±ä´Ù. Áï ApiEditÀÇ ¸í·ÉÀº ApiEdit°¡ ó¸®ÇÏ°í ´ç±ÙÀÇ ¸í·ÉÀº ´ç±ÙÀÌ Ã³¸®Ç쵂 ¿ì¼±±ÇÀº ApiEdit°¡ °¡Áø´Ù. ¸¸¾à È£½ºÆ®°¡ ÀÌÇØÇÏÁö ¸øÇÏ´Â µ¿»ç°¡ ÀÖ´Ù¸é À̶§´Â ¿¡·¯·Î ó¸®ÇÑ´Ù.

È°¼ºÃ¢À» º¯°æÇÏ´Â navi ¸í·ÉÀº ¸ÅÅ©·Î ½ÇÇàÁß¿¡´Â ¹«½ÃµÈ´Ù. ÀÌ ¸í·ÉÀº ¸ÅÅ©·Î¸¦ À§ÇØ ¸¸µç °ÍÀÌ ¾Æ´Ï¶ó ´ÜÃàÅ°¸¦ À§ÇØ ¸¸µç °ÍÀÌ´Ù. »ó¿ë±¸ »ðÀÔ ¸í·ÉÀº ¾ÆÁ÷ »ó¿ë±¸ ±â´ÉÀ» ±¸ÇöÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ ½ÇÇàÇÏÁö ¾Ê´Â´Ù. Â÷ÈÄ »ó¿ë±¸ ±â´ÉÀ» ¿Ï¼ºÇϸé ÀÌ ¸í·É ½ÇÇà Äڵ嵵 ÀÛ¼ºÇÒ °ÍÀÌ´Ù.

¶ó.¸ÅÅ©·ÎÀÇ Áßø

´ç±ÙÀº ¸ÅÅ©·Î°¡ ¸ÅÅ©·Î¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. Áï Áßø °¡´ÉÇÏ´Ù. ¸ÅÅ©·Î ÁßøÀº È£½ºÆ®ÀÇ call ¸í·É¿¡ ÀÇÇØ ½ÇÇàµÇ´Âµ¥ ÀÌ ¸í·ÉÀÌ ½ÇÇàµÇ´Â °úÁ¤ÀÌ ±²ÀåÈ÷ º¹ÀâÇÏ´Ù. ´ÙÀ½ µÎ °¡Áö »ç½ÇÀ» ¸ÕÀú Á¤¸®Çϵµ·Ï ÇÏÀÚ.

 

1.¸ÅÅ©·Î ½ÇÇàÀÇ ÁÖü´Â ÄÁÆ®·ÑÀÌ´Ù. ¸ÅÅ©·Î¿¡ Æ÷ÇÔµÈ ¸í·ÉµéÀÌ ´ëºÎºÐ ÆíÁý °ü·Ã ¸í·ÉÀ̹ǷΠÄÁÆ®·ÑÀÌ Á÷Á¢ ½ÇÇàÇÏ´Â °ÍÀÌ È¿À²ÀûÀÌ´Ù. ¹°·Ð È£½ºÆ®°¡ ¸ÅÅ©·ÎÀÇ ¸í·ÉÀ» Çϳª¾¿ ÃßÃâÇؼ­ ÄÁÆ®·ÑÀÇ DoCommand¸¦ È£ÃâÇÒ ¼öµµ ÀÖÁö¸¸ ÀÌ °æ¿ì ÆíÁýµ¿ÀÛµéÀÌ ±×·ìÀ» ±¸¼ºÇÒ ¼ö ¾ø´Ù. ¸ÅÅ©·Î¿¡ ¼ÓÇÑ ¸ðµç ¸í·ÉµéÀº ÇϳªÀÇ ÆíÁý ±×·ìÀ» ±¸¼ºÇØ¾ß ÇÑ´Ù.

2.¸ÅÅ©·Î °ü¸®ÀÇ ÁÖü´Â È£½ºÆ®ÀÌ´Ù. ÄÁÆ®·ÑÀº ·¹Áö½ºÆ®¸®³ª ÆÄÀÏ¿¡ ´ëÇÑ Á¦¾î±ÇÀÌ ¾øÀ¸¸ç ¶ÇÇÑ ¸ÅÅ©·Î¸¦ °ü¸®ÇÏ´Â ´ëÈ­»óÀÚ¸¦ °¡ÁöÁö ¸øÇÑ´Ù. µû¶ó¼­ ÄÁÆ®·ÑÀº DgMacro °´Ã¼ µûÀ§´Â ¾Æ¿¹ Á¸Àç ÀÚü¸¦ ¸ð¸¥´Ù. ±×·¡¼­ ApiEdit::ExecMacro´Â ¸ÅÅ©·ÎÀÇ À̸§ÀÌ ¾Æ´Ñ ¸ÅÅ©·Î ³»¿ëÀ» Àμö·Î Àü´Þ¹Þ´Â´Ù.

 

ÀÌ·¸°Ô ¿ªÇÒ ºÐ´ãÀÌ µÇ¾î Àֱ⠶§¹®¿¡ call ¸í·ÉÀÇ Ã³¸®°¡ ¾ÆÁÖ ¾î·Á¿öÁø´Ù. call ¸í·É ´ÙÀ½¿¡´Â ¸ÅÅ©·Î À̸§ÀÌ ¿À´Âµ¥ ÄÁÆ®·ÑÀº ¸ÅÅ©·ÎÀÇ À̸§À¸·ÎºÎÅÍ ³»¿ëÀ» ¾òÀ» ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ call ¸í·ÉÀÌ ÄÁÆ®·ÑÀÇ ¸í·ÉÀÌ µÉ ¼ö ¾ø´Â °ÍÀÌ´Ù. Áï ¸ÅÅ©·ÎÀÇ ÁßøÀº ApiEditÀÇ ±â´ÉÀÌ ¾Æ´Ï°í ´ç±ÙÀÇ ±â´ÉÀÌ´Ù.

´ë½Å ApiEdit´Â ÀÚ½ÅÀÌ ÀÌÇØÇÏÁö ¸øÇÏ´Â ¸í·É¿¡ ´ëÇØ È£½ºÆ®¿¡°Ô UserBase+2 ¸Þ½ÃÁö¸¦ º¸³» ÀÏ´Ü Ã³¸®ÇÒ ±âȸ¸¦ Á¦°øÇÑ´Ù. ºñ´Ü call ¸í·É »Ó¸¸ ¾Æ´Ï¶ó set, toggle, navi µîÀÇ ¸í·É¿¡ ´ëÇؼ­µµ ¸¶Âù°¡ÁöÀÌ´Ù. ApiEditÀÇ DoCommand°¡ ÀÚ½ÅÀÌ Á¤ÀÇÇÏÁö ¾Ê´Â µ¿»ç¿¡ ´ëÇØ È£½ºÆ®¿¡°Ô 󸮸¦ À§ÀÓÇÔÀ¸·Î½á È£½ºÆ®´Â ³ª¸§´ë·ÎÀÇ ¸í·É ü°è¸¦ ±¸¼ºÇÒ ¼ö ÀÖ´Â ÀÚÀ¯¸¦ Á¦°ø¹Þsms´Ù.

±×·¸´Ù¸é ¿Ö ¸Þ½ÃÁö¸¦ º¸³»´Â°¡? ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ´õ Á÷°üÀûÀÌ°í ºü¸¦ÅÙµ¥ ¸»ÀÌ´Ù. ÀÌ´Â ÄÁÆ®·ÑÀÇ µ¶¸³¼ºÀ» È®º¸Çϱâ À§Çؼ­ÀÌ´Ù. ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÏÁö ¾Ê´Â È£½ºÆ®¿Íµµ »ç¿ëµÉ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. Áï, È£½ºÆ®ÀÇ ¸í·ÉÀÌ ÀüÇô ¾ø¾îµµ ÄÁÆ®·ÑÀº ÀÚ½ÅÀÇ ¸Þ½ÃÁö¸¸ ó¸®ÇÒ ¼ö ÀÖ´Ù. ApiEdit::ExecMacro°¡ È£½ºÆ®¿¡ UserBase+2¸¦ ºÎ¸ð À©µµ¿ì¿¡°Ô º¸³»¹Ç·Î ºÎ¸ð´Â ÀÌ ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ lParamÀ¸·Î Àü´ÞµÈ ¸í·ÉÀ» ½ÇÇàÇØ¾ß ÇÑ´Ù. ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

     pSi=(SInfo *)GetWindowLongPtr(hWnd,0);

     if (pSi && iMessage > WM_USER) {

          if (iMessage == pSi->Ae.GetUserBase()+1) {

              SetSettingView((CApiEditText *)lParam);

              return 0;

          }

        if (iMessage == pSi->Ae.GetUserBase()+2) {

           return DoCommand((TCHAR *)lParam);

          }

     }

 

DoCommand ÇÔ¼ö´Â DGC_CALL ¸í·É¿¡ ´ëÇØ str·Î ÃßÃâµÈ ¸ÅÅ©·Î¸¦ count ȸ¼ö¸¸Å­ ½ÇÇàÇÑ´Ù. À̶§ ExecMacro ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ÀÌ ÇÔ¼ö´Â ¸ÅÅ©·ÎÀÇ ³»¿ëÀ» Àμö·Î Àü´Þ¹ÞÁö ¾Ê°í ¸ÅÅ©·ÎÀÇ À̸§À» Àü´Þ¹Þ´Â´Ù´Â Á¡ÀÌ ApiEditÀÇ °æ¿ì¿Í ´Ù¸£´Ù. È£½ºÆ®´Â DgMacro¸¦ °ü¸®ÇÏ°í ÀÖÀ¸¹Ç·Î À̸§À¸·Î ¸ÅÅ©·Î¸¦ ½ÇÇàÇÒ ¼ö ÀÖ°í µû¶ó¼­ call ¸í·É¿¡ ´ëÇÑ Ã³¸®°¡ °¡´ÉÇÏ´Ù. ¸ÅÅ©·Î °ü·Ã ÇÔ¼öµéÀÇ È£Ãâ °ü°è°¡ º¹ÀâÇѵ¥ ±×¸²À¸·Î ±×·Á º¸¸é ´ÙÀ½°ú °°´Ù.

 

È£ÃâµÈ ÇÔ¼ö°¡ È£ÃâÇÑ ÇÔ¼ö¸¦ ´Ù½Ã È£ÃâÇÏ´Â ¼ÀÀ̹ǷΠÀÏÁ¾ÀÇ Àç±Í È£ÃâÀÎ ¼ÀÀÌ´Ù. Á» ´õ ±¸Ã¼ÀûÀ¸·Î move right;call "MyMacro";move left ¸ÅÅ©·ÎÀÇ ½ÇÇàÀ» ÃßÀûÇØ º¸ÀÚ. MyMacro¿¡´Â insert "1" ¸í·É Çϳª¸¸ µé¾î ÀÖ´Ù°í ÇÏÀÚ. À̶§ ÀÌ ¸ÅÅ©·Î°¡ 󸮵Ǵ °úÁ¤Àº ´ÙÀ½°ú °°´Ù.

1.½ÇÇàÀÇ ÁÖü°¡ ÄÁÆ®·ÑÀ̹ǷΠ¸ÅÅ©·Î´Â ÃÖÃÊ CApiEdit::ExecMacro·Î Àü´ÞµÈ´Ù. ÀÌ ÇÔ¼ö¿¡¼­ ÆíÁý ±×·ìÀ» ½ÃÀÛÇÏ°í URnest, runlevelÀ» 1·Î ¸¸µç´Ù. ÀÌÈÄ ¸í·É ±â·ÏÀº ÇÏÁö ¾ÊÀ¸¸ç ¸ðµç ÆíÁý ¸í·ÉÀº ±×·ìÀ¸·Î ¹­ÀδÙ.

2.¸ÅÅ©·ÎÀÇ Ã¹¹ø° ¸í·ÉÀÎ move right°¡ ½ÇÇàµÈ´Ù. ÄÁÆ®·ÑÀÇ DoCommand ÇÔ¼ö°¡ È£ÃâµÉ °ÍÀÌ´Ù.

3.µÎ¹ø° ¸í·ÉÀº callÀε¥ ÀÌ ¸í·ÉÀº ÄÁÆ®·ÑÀÌ ÀÌÇØÇÏÁö ¸øÇϱ⠶§¹®¿¡ UserBase+2 ¸Þ½ÃÁö¸¦ ÅëÇØ °£Á¢ÀûÀ¸·Î ´ç±ÙÀÇ DoCommand ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

4.DoCommand ÇÔ¼ö´Â call ¸í·É¿¡ ´ëÇØ ExecMacro ÇÔ¼ö¸¦ È£ÃâÇϸç ÀÌ ÇÔ¼ö´Â DgMacro¿¡¼­ ¸ÅÅ©·Î ³»¿ëÀ» ÀÐ¾î ´Ù½Ã CApiEdit::ExecMacro¸¦ È£ÃâÇÑ´Ù.

5.ÁßøµÈ MyMacro°¡ ´Ù½Ã ½ÇÇàµÈ´Ù. runlevelÀº 2°¡ µÇ°í URnestµµ 2°¡ µÉ °ÍÀÌ´Ù.

6.¸ÅÅ©·Î ³»ÀÇ insert "1" ¸í·ÉÀÌ ½ÇÇàµÈ´Ù. ÀÌ ¸í·ÉÀº CApiEdit::DoCommand°¡ ó¸®ÇÑ´Ù. ¸í·ÉÀ» ó¸®ÇÑ ÈÄ MyMacro´Â Á¾·áµÇ´Âµ¥ À̶§ runlevel°ú URnest´Â ´Ù½Ã 1À̵ȴÙ. ¾ÆÁ÷ ¸ÅÅ©·Î ½ÇÇàÁßÀ̸ç ÆíÁý ±×·ìµµ °è¼Ó À¯ÁöµÈ´Ù. CApiEdit::ExecMacro°¡ ¸®ÅϵǾî 3¹ø È£Ãâ ÀüÀ¸·Î µ¹¾Æ°£´Ù.

7.¸¶Áö¸· ¸í·ÉÀÎ move left°¡ CApiEdit::DoCommand¿¡ ÀÇÇØ ½ÇÇàµÇ°í Àüü ExecMacro ½ÇÇàÀÌ Á¾·áµÈ´Ù. runlevel°ú URnest´Â ¸ðµÎ 0ÀÌ µÇ¾î ÆíÁý ±×·ìµµ ÇØÁ¦µÇ°í ¸í·É ±â·Ïµµ Àç°³µÈ´Ù.

 

ÀÌ·± ½ÄÀ̶ó¸é 3Áß 4ÁßÀÇ ¸ÅÅ©·Î Áßøµµ ¹«¸®¾øÀÌ Ã³¸®Çس½´Ù. ´Ù¸¥ ¹æ½Äµµ °¡´ÉÇѵ¥ ´ç±ÙÀÇ ExecMacro ÇÔ¼ö°¡ ¸ÅÅ©·Î ½ÇÇàÀÇ ÁÖü°¡ µÉ ¼öµµ ÀÖ´Ù. Á÷Á¢ ÄÁÆ®·ÑÀÇ StartUndoGroup, EndUndoGroupÀ» È£ÃâÇÏ°í runlevelÀ» °ü¸®Çϸ鼭 ¸í·ÉÀÇ µ¿»ç¸¦ º¸°í ´©±¸°ÍÀÎÁö ÆǺ°Çؼ­ ÀûÀýÇÑ DoCommand¸¦ È£ÃâÇÏ¸é µÈ´Ù. call ¸í·É¿¡ ´ëÇؼ­´Â ÀÚ±â ÀÚ½ÅÀ» ´Ù½Ã Àç±Í È£ÃâÇϱ⸸ ÇÏ¸é µÈ´Ù. ÀÌ·¸°Ô Çصµ º° ¹®Á¦´Â ¾øÁö¸¸ ¿ÜºÎ¿¡¼­ È°¼º ÄÁÆ®·ÑÀÇ È°¼º ºä¸¦ °Çµå·Á¾ß ÇÑ´Ù´Â Á¡ÀÌ ¸¶À½¿¡ ¾Èµç´Ù. ¶ÇÇÑ ¸ÅÅ©·Î ½ÇÇà ±â´ÉÀÌ È£½ºÆ® Á¦ÀÛÀÚ¿¡°Ô Àü°¡µÈ´Ù´Â Á¡ÀÌ Å« ºÎ´ãÀÌ´Ù.