Áö±Ý±îÁö ÀÛ¼ºÇß´ø ¸í·ÉµéÀº ÄÁÆ®·Ñ ¼öÁØÀÇ ÆíÁý ¸í·ÉµéÀ̾ú´Âµ¥ Á» ´õ °Å½ÃÀûÀÎ Â÷¿ø¿¡¼ º¸¸é È£½ºÆ® ¼öÁØÀÇ ¸í·Éµµ Á¸ÀçÇÑ´Ù. ÆíÁý ¸í·ÉÀº ¹®¼ÀÇ ³»ºÎ µ¥ÀÌÅ͸¦ ´Ù·çÁö¸¸ È£½ºÆ®ÀÇ ¸í·ÉÀº ¹®¼ ÀÚü³ª ¹®¼Ã¢À» °ü¸®ÇÏ¸ç ¶ÇÇÑ ÄÁÆ®·Ñ ÀÚüÀÇ ¼³Á¤À» Á¶»çÇϱ⵵ ÇÑ´Ù. È£½ºÆ®ÀÇ ¸í·ÉÀº »ç½Ç ¹Ýº¹ÀÇ Àǹ̴ °ÅÀÇ ¾øÀ¸¸ç ´ÜÃàŰ Á¤ÀǸ¦ À§ÇØ Á¸ÀçÇÑ´Ù. ¹°·Ð ¿øÇÑ´Ù¸é ¸ÅÅ©·Î¿¡ Æ÷ÇÔ½Ãų ¼ö´Â ÀÖ´Ù. È£½ºÆ® ¼öÁØÀÇ ¸í·É ¸ñ·ÏÀº ´ÙÀ½°ú °°´Ù.
|
µ¿»ç |
¸ñÀû¾î |
¼³¸í |
|
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 ¸í·É¿¡ ´ëÇØ¼´Â ÀÚ±â ÀÚ½ÅÀ» ´Ù½Ã Àç±Í È£ÃâÇϱ⸸ ÇÏ¸é µÈ´Ù. ÀÌ·¸°Ô ÇØµµ º° ¹®Á¦´Â ¾øÁö¸¸ ¿ÜºÎ¿¡¼ Ȱ¼º ÄÁÆ®·ÑÀÇ È°¼º ºä¸¦ °Çµå·Á¾ß ÇÑ´Ù´Â Á¡ÀÌ ¸¶À½¿¡ ¾Èµç´Ù. ¶ÇÇÑ ¸ÅÅ©·Î ½ÇÇà ±â´ÉÀÌ È£½ºÆ® Á¦ÀÛÀÚ¿¡°Ô Àü°¡µÈ´Ù´Â Á¡ÀÌ Å« ºÎ´ãÀÌ´Ù.