¸í·ÉÀ̶õ °¢Á¾ ÆíÁý µ¿ÀÛÀ» À¯¹ß½ÃÅ°´Â Áö½Ã¾îÀÌ´Ù. »ðÀÔ, »èÁ¦, À̵¿, ¼±ÅÃ, ½ºÅ©·Ñ, º¹»ç µîÀÇ ÆíÁý µ¿ÀÛµéÀÌ ¸ðµÎ ¸í·ÉµéÀ̸ç ÀÌ¿Ü¿¡ ¹®¼³ª âÀ» °ü¸®ÇÏ´Â µ¿ÀÛµµ ¸í·ÉÀÌ µÉ ¼ö ÀÖ´Ù. ÀÌ·± µ¿ÀÛµéÀº Åë»ó »ç¿ëÀÚ°¡ Å°º¸µå³ª ¸¶¿ì½º·Î ÆíÁý±â¸¦ Á÷Á¢ Á¶ÀÛÇÏ¿© ½ÇÇàµÇ´Â °ÍÀÌ º¸ÅëÀÌÁö¸¸ ÇÁ·Î±×·¥ ³»ºÎ¿¡¼ ÇÊ¿ä¿¡ ÀÇÇØ ¸í·ÉÀ» ¹ß»ý½ÃÅ°°í ó¸®ÇÒ ¼öµµ ÀÖ´Ù. ÆíÁý±â¿¡ ¸í·ÉÀ» ó¸®ÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» ÀÛ¼ºÇØ ³õÀ¸¸é »ç¿ëÀÚÀÇ °³ÀÔ¾øÀÌ ÀÚµ¿ÈµÈ 󸮸¦ ÇÒ ¼ö ÀÖÀ¸¸ç ±× ´ëÇ¥ÀûÀÎ ¿¹°¡ ¹Ù·Î ¸ÅÅ©·ÎÀÌ´Ù.
¸ÅÅ©·Î´Â ¸í·ÉÀÇ ÁýÇÕÀ¸·Î Á¤ÀÇµÇ¾î ¹Ýº¹ÀûÀÎ ÀÛ¾÷À» ÇÒ ¶§ Å°µ¿ÀÛÀ» ±â¾ïÇØ ³õ°í ÇѲ¨¹ø¿¡ ¿©·¯ °³ÀÇ ¸í·ÉÀ» ¿©·¯ ¹ø ½ÇÇàÇÏ´Â ÀåÄ¡ÀÌ´Ù. ÆíÁý µ¿ÀÛÀº ´Ü¼ø ¹Ýº¹ÀûÀÎ °æ¿ì°¡ ¸¹Àºµ¥ ÀÌ·± Áö·çÇÑ ÀÛ¾÷À» »ç¿ëÀÚ ´ë½Å ¼öÇàÇÏ´Â °ÍÀÌ ¹Ù·Î ¸ÅÅ©·ÎÀÌ´Ù. ¸ÅÅ©·Î´Â ¹Ýº¹ÀûÀΠ󸮿¡ »ç¿ëµÇ±âµµ ÇÏÁö¸¸ ¿©·¯ °³ÀÇ ´Ü¼øÇÑ ¸í·ÉÀ» Á¶ÇÕÇÏ¿© »õ·Î¿î º¹ÀâÇÑ ¸í·ÉÀ» Á¤ÀÇÇÏ´Â ¼ö´ÜÀ̱⵵ ÇÏ´Ù. ¿¹¸¦ µé¾î µÎ Ä ¾ÕÀ¸·Î °¡¼ ±ÛÀÚ Áö¿ì±â, ¾ÕµÚ ±ÛÀÚ ¹Ù²Ù±â, ÇöÀç ¹®´ÜÀÇ »çº»À» ¾Æ·¡ÂÊ ¹®´Ü¿¡ ÀÛ¼ºÇϱ⠵îÀÇ °¡´ÉÇØÁø´Ù.
´Ù¼Ò °í±Þ ±â´ÉÀÌ´Ù º¸´Ï »ç¿ë¹ýÀ» ÀÍÇô¾ß ¾µ ¼ö ÀÖ°í Ãʺ¸ÀÚµéÀÌ ¾²±â¿¡´Â Á¶±Ý ¾î·Æ±â´Â ÇÏÁö¸¸ Á¦´ë·Î È°¿ëÇϸé ªÀº ½Ã°£¿¡ ´ë·®ÀÇ ÆíÁýÀ» Á¤È®ÇÏ°Ô ÇÒ ¼ö ÀÖ´Â °·ÂÇÑ ±â´ÉÀÌ´Ù. ¸ÅÅ©·Î´Â ÃÖ¼ÒÇÑ µÎ °³ ÀÌ»óÀÇ ¸í·ÉÀÌ ¸ð¿©¾ß ½Ç¿ëÀûÀÎ °¡Ä¡°¡ ÀÖ´Ù. ¸ÅÅ©·Î¿¡ Æ÷ÇÔµÈ ¸í·ÉµéÀ» ±â¾ïÇÏ´Â ¹æ½ÄÀº ´ÙÀ½ µÎ °¡Áö°¡ ÀÖ´Ù.
¡á ¹®ÀÚ¿ : ¸í·ÉÀ» ¹®ÀÚ¿·Î Ç¥±âÇÑ´Ù. ¹Ù·Î Àаí ÆíÁýÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏÁö¸¸ ½ÇÇàÇÒ ¶§¸¶´Ù ¹®ÀÚ¿À» Çؼ®ÇØ¾ß ÇϹǷΠ¼Óµµ°¡ ´À¸®°í ¿ë·®ÀÌ Å©´Ù. ¶ÇÇÑ ¹®ÀÚ¿ ÀÔ·Â °úÁ¤¿¡¼ ¿ÀŸ°¡ ¹ß»ýÇÒ °¡´É¼ºÀÌ ³ôÀ¸¹Ç·Î ¼¶¼¼ÇÑ ¿¡·¯ 󸮵µ ÇÊ¿äÇÏ´Ù.
¡á ºÎÈ£È : °¢ ¸í·É¿¡ °íÀ¯ÇÑ Äڵ带 ÇÒ´çÇÏ°í ÀÌ·± ÄÚµåÀÇ ÁýÇÕÀ» ±â¾ïÇÏ´Â ¹æ½ÄÀÌ´Ù. ÀÌÁø Æ÷¸ËÀÌ¸ç ¸ÞŸ ÆÄÀÏ Çü½Ä°ú ºñ½ÁÇÏ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. Á÷Á¢ ÆíÁýÀº ºÒ°¡´ÉÇÏÁö¸¸ ÀÛ¼ºÇÒ ¶§ ¹Ù·Î Çؼ®µÇ¹Ç·Î ¿¡·¯ 󸮰¡ ¿ëÀÌÇÏ°í ½ÇÇà ¼Óµµ°¡ ºü¸£´Ù.
µÑ ´Ù ³ª¸§´ë·ÎÀÇ Àå´ÜÁ¡ÀÌ Àִµ¥ ´ç±ÙÀº ¹®ÀÚ¿ ¹æ½ÄÀ» äÅÃÇϱâ·Î ÇÑ´Ù. ¼Óµµ°¡ ´À¸®°í ¿ë·®ÀÌ Å©±â´Â ÇÏÁö¸¸ ¿äÁòÀÇ Çϵå¿þ¾î ȯ°æ¿¡¼´Â ¼º´Éº¸´Ù »ç¿ëÀÚÀÇ ÆíÀǼºÀÌ ´õ Áß¿äÇϹǷΠģ±ÙÇÑ Æ÷¸ËÀÎ ¹®ÀÚ¿ ¹æ½ÄÀ» äÅÃÇß´Ù. ¸í·ÉÀº Çѱ۷ΠÁ¤ÀÇÇÒ ¼öµµ ÀÖÀ¸³ª ±¹Á¦È ½Ã´ë¿¡ ¸ÂÃç °£´ÜÇÑ ¿µ¹® ´Ü¾î·Î ¸í·ÉÀ» ±¸¼ºÇÑ´Ù. ¸ÅÅ©·Î ±¸¹®Àº °¢ ¸í·É¸¶´Ù Á¶±Ý¾¿ ´Ù¸¥µ¥ ´ëü·Î µ¿»ç+¸ñÀû¾î+ȸ¼öÀÇ ÇüŸ¦ °¡Áø´Ù. ´ÙÀ½Àº ApiEdit°¡ Á¤ÀÇÇÏ´Â ¸í·É ¸ñ·ÏÀÌ´Ù.
µ¿ÀÛ |
¸ñÀû¾î |
¼³¸í |
move |
left right up down home end pgup pgdn wleft wright wordhome wordend dochome docend paren last nextpara prevpara parahome paraend |
À̵¿ |
movesel |
left right up down home end pgup pgdn wleft wright wordhome worded dochome docend paren last nextpara prevpara parahome paraend |
ÇöÀç À§Ä¡¿¡¼ ~±îÁö ¼±Åà |
insert |
"¹®ÀÚ¿" |
|
delete |
|
|
bs |
char word |
|
select |
word line para doc |
|
copy |
|
|
copyapp |
|
|
cut |
|
|
cutapp |
|
|
paste |
|
|
convert |
upper lower reversecase upperfirst uppersent totab tospace removespace indent unindent comment uncomment |
|
copychar |
up down |
|
scroll |
up down pgup pgdn halfup halfdown left right pageleft pageright |
|
setmark |
unname 1~0 |
Åä±Û ¹æ½Ä |
gomark |
next prior 1~0 |
ºÏ¸¶Å© À̵¿ |
find |
"¹®ÀÚ¿" |
ÇöÀç À§Ä¡¿¡¼ ¾Æ·¡·Î. ½ÇÆнà ¸ÅÅ©·Î Á¾·á |
replace |
"¹®ÀÚ¿1" "¹®ÀÚ¿2" |
|
focus |
next prev |
|
¿©·¯ °¡Áö Å×½ºÆ®¸¦ ÅëÇØ ÇʼöÀûÀÎ ¸í·É ¸ñ·ÏÀ» ¸¸µç °ÍÀε¥ ¾ÕÀ¸·Î ´õ ¸¹Àº ¸í·ÉµéÀÌ Ãß°¡µÉ °ÍÀÌ´Ù. ÀÌ ¸í·ÉµéÀÌ ¸ÅÅ©·Î¿¡ ±â·ÏµÇ¸ç ¸ÅÅ©·Î³»ÀÇ ¸í·ÉÀº ¼ø¼´ë·Î ½ÇÇàµÈ´Ù. °¢ ¸í·ÉÀº °³Çà ÄÚµå ¶Ç´Â ¼¼¹ÌÄÝ·ÐÀ¸·Î ±¸ºÐµÇ¸ç ÇÑ ¸ÅÅ©·Î¿¡ Æ÷Ç﵃ ¼ö ÀÖ´Â ¸í·ÉÀÇ °³¼ö¿¡´Â Á¦ÇÑÀÌ ¾ø´Ù.
°ü¸®ÀÇ ÆíÀÇ»ó ¸í·ÉÀ» ±¸¼ºÇÏ´Â µ¿»ç, ¸ñÀû¾îµéÀº ¿°ÅÇüÀ¸·Î Á¤ÀÇÇÑ´Ù. ¸í·ÉÀ» ½ÇÇàÇÒ ¶§¸¶´Ù ¹®ÀÚ¿ ÆĽÌÀ» ÇÒ ¼ö´Â ¾øÀ¸¹Ç·Î ÇÑ ¹ø ºÐ¼®ÇÑ ¸í·ÉÀº ¿°ÅÇüÀ¸·Î °ü¸®ÇÏ´Â °ÍÀÌ È¿À²ÀûÀÌ´Ù. ¸í·É ±¸¹® ÀÚü´Â ApiEdit ÄÁÆ®·Ñ°ú Á÷Á¢ÀûÀÎ ¿¬°üÀÌ ¾øÀ¸¹Ç·Î ÀÏ¹Ý ÇÔ¼öµéÀÌ °ü¸®ÇÑ´Ù. Áï ApiEdit ÄÁÆ®·Ñ ÀÚü´Â ¸í·ÉÀÇ ÆíÁýÀ̳ª °ü¸®¿¡ °ü¿©ÇÏÁö ¾Ê°í ÇÔ¼öµéÀÌ ½ÃÅ°´Â µ¿ÀÛ¸¸ Çؼ®ÇÏ¿© ó¸®ÇÑ´Ù. AeUtil.h¿¡ ¿°ÅÇüÀ» ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù.
enum {AEC_MOVE, AEC_MOVESEL, AEC_INSERT, AEC_DELETE, AEC_BS, AEC_SELECT,
AEC_COPY, AEC_COPYAPP, AEC_CUT, AEC_CUTAPP, AEC_PASTE, AEC_CONVERT, AEC_COPYCHAR,
AEC_SCROLL, AEC_SETMARK, AEC_GOMARK, AEC_FIND,AEC_REPLACE,AEC_FOCUS};
enum {AECM_LEFT, AECM_RIGHT, AECM_UP, AECM_DOWN, AECM_HOME, AECM_END, AECM_PGUP,
AECM_PGDN, AECM_WLEFT, AECM_WRIGHT, AECM_WORDHOME, AECM_WORDEND, AECM_DOCHOME,
AECM_DOCEND, AECM_PAREN,AECM_LAST, AECM_NEXTPARA, AECM_PREVPARA, AECM_PARAHOME,
AECM_PARAEND};
enum {AECS_WORD, AECS_LINE, AECS_PARA, AECS_DOC};
enum {AECC_UPPER, AECC_LOWER, AECC_REVERSECASE, AECC_UPPERFIRST, AECC_UPPSERSENT,
AECC_TOTAB, AECC_TOSAPCE, AECC_REMOVESPACE, AECC_INDENT, AECC_UNINDENT,
AECC_COMMENT, AECC_UNCOMMENT};
enum {AECS_UP, AECS_DOWN, AECS_PGUP, AECS_PGDN, AECS_HALFUP, AECS_HALFDOWN,
AECS_LEFT, AECS_RIGHT, AECS_PAGELEFT, AECS_PAGERIGHT};
AEC_·Î ½ÃÀ۵Ǵ °ÍÀº ¸í·ÉÀÌ°í ³ª¸ÓÁö´Â ¸í·ÉÀÇ ¸ñÀûÀÌ´Ù. ¿°ÅÇüÀÇ À̸§À» Á÷°üÀûÀ¸·Î ÀÛ¼ºÇØ ³õ¾ÒÀ¸¹Ç·Î À̸§À» º¸¸é ¾î¶² ¸í·ÉÀÎÁö¸¦ ½±°Ô ¾Ë ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î AECM_DOCHOMEÀº À̵¿ ¸í·É Áß ¹®¼ÀÇ Ã³À½À¸·Î °¡¶ó´Â ¶æÀÌ´Ù.
ApiEdit°¡ ¸ÅÅ©·Î¸¦ Áö¿øÇÏ·Á¸é »ç¿ëÀÚÀÇ Á÷Á¢ÀûÀÎ Á¶ÀÛ¿Ü¿¡µµ ¿ÜºÎ¿¡¼ ÁÖ¾îÁø ¸í·É¿¡ ÀÇÇØ ¿òÁ÷ÀÏ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸í·É Áö¿øÀ» À§ÇØ ´ÙÀ½ ³× °³ÀÇ ¸â¹ö ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
class CApiEditText : public CWindow
{
....
virtual void ProcessKey(UINT vk,BOOL bControl,BOOL bShift);
virtual void Select(int n);
virtual void Move(int n, BOOL bSelect);
virtual void Scroll(int nLine, int nCode=0);
ÆÄ»ý Ŭ·¡½º¿¡¼ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼öµµ ÀÖÀ¸¹Ç·Î °¡»ó ÇÔ¼ö·Î ¼±¾ðÇß´Ù. ÀÌ ÇÔ¼öµéÀº Å° ÀÔ·Â, ¼±ÅÃ, À̵¿, ½ºÅ©·Ñ µîÀÇ µ¿ÀÛÀ» ó¸®Çϴµ¥ ¿ø·¡ ÀÌ ÄÚµåµéÀº »ç¿ëÀÚÀÇ Å° Á¶ÀÛ¿¡ ÀÇÇؼ¸¸ È£ÃâµÇ¾ú´Ù. ±×·¯³ª ÀÌÁ¦´Â ¸í·É¿¡ ÀÇÇؼµµ È£ÃâµÉ ¼ö ÀÖÀ¸¹Ç·Î Á» ´õ ¹ü¿ëÀûÀÎ µ¿ÀÛÀ» Áö¿øÇϱâ À§ÇØ ÇÔ¼ö·Î ºÐ¸®Çß´Ù.
¿¹¸¦ µé¾î Å°º¸µå ÀÔ·ÂÀ» ó¸®ÇÏ´Â OnKey ÇÔ¼ö´Â ½¬ÇÁÆ®, ÄÁÆ®·Ñ Å°ÀÇ »óŸ¦ ½Ç½Ã°£À¸·Î Á¶»çÇÏ¿© ¼±ÅÃ, ´Ü¾î ´ÜÀ§ À̵¿À» ÇÑ´Ù. ±×·¯³ª ¸í·ÉÀº ÀÌ Å°ÀÇ »óŸ¦ ÂüÁ¶ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¸ñÀû¾î¸¦ ÂüÁ¶ÇϹǷΠ¸ñÀû¾î´ë·Î µ¿ÀÛÇÏ´Â ÇÔ¼ö°¡ ÇÊ¿äÇÑ °ÍÀÌ´Ù. ProcessKey ÇÔ¼ö´Â ±âÁ¸ OnKeyÀÇ µ¿ÀÛÀ» ¼öÇàÇÏµÇ Å°º¸µå°¡ ¾Æ´Ñ ÀμöÀÇ Áö½Ã¸¦ µû¸¥´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. ProcessKey ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
void CApiEditText::ProcessKey(UINT vk,BOOL bControl,BOOL bShift)
{
int r,c;
int oldr;
int OldOff;
int toff;
switch (vk) {
....
}
}
switch (vk)ÀÌÇÏÀÇ ÄÚµå´Â OnKey¿¡ ÀÖ´Â switch ºí·°À» ±×´ë·Î °¡Á®¿Â °ÍÀÌ´Ù. ½ÇÁ¦ ó¸® Äڵ尡 ProcessKey·Î ¿Å°ÜÁ³À¸¹Ç·Î OnKey´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤µÈ´Ù.
void CApiEditText::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
{
BOOL bShift, bControl;
bShift=((GetKeyState(VK_SHIFT) & 0x8000) != 0);
....
if (vk>='0' && vk<='9' && bControl) {
if (bShift) {
ToggleBookmark(-1,vk-'0');
} else {
GotoBookmark(vk-'0');
}
}
ProcessKey(vk,bControl,bShift);
if (bShift && !bColumnMode) {
ignoreVirt--;
}
if (bShift && bColumnMode && SelStart != SelEnd) {
SelExtraX=ExtraX;
}
}
bDragSel ¸ðµå¿Í ºÏ¸¶Å© ´ÜÃàÅ° ó¸®, ¿¸ðµå ó¸® µîÀº ±×´ë·Î µÎ°í Å°¸¦ Á÷Á¢ ó¸®ÇÏ´Â ¸ðµç ÄÚµå´Â ProcessKey·Î À̵¿µÇ¾ú´Ù. Áö¿ª º¯¼ö´Â µÎ ÇÔ¼ö°¡ Àû´çÈ÷ ³ª´©¾î °¡Á®¾ß ÇÑ´Ù. ProcessKey´Â Àμö·Î Àü´ÞµÈ bShift, bControlÀÇ Áö½Ã´ë·Î À̵¿ ¹× ¼±Åà µ¿ÀÛÀ» ó¸®Çϸç bUseLineEnd, bLineEnd, ExtraX µîÀº Àü¿ª ¼³Á¤ »óÅÂÀÇ ¿µÇâÀ» ¹Þ´Â´Ù.
ÀÌ·¸°Ô µÇ¸é OnKey ÇÔ¼ö´Â ÀÚ½ÅÀÇ ÄÚµå ÀϺθ¦ Á¹º´ ÇÔ¼ö¿¡°Ô ³ª´©¾î Áֱ⸸ ÇßÀ» »Ó ±â´É»óÀÇ º¯È°¡ ¾ø´Ù. ±×·¯³ª ½Ç¹« µ¿ÀÛÀ» ó¸®ÇÏ´Â ÇÔ¼ö¸¦ Çϳª ´õ ºÐ¸®ÇØ ³õÀ¸¸é ¸ÅÅ©·Îµµ ÀÌ µ¿ÀÛÀÌ ÇÊ¿äÇÒ ¶§ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ¾î È°¿ë¼ºÀÌ ´õ ³ô¾ÆÁø´Ù.
¸¸¾à ÀÌ·¸°Ô ÇÔ¼ö¸¦ ºÐ¸®ÇÏÁö ¾Ê´Â´Ù¸é À̵¿ÇÏ¸é¼ ¼±ÅÃÇÒ ¶§ ½¬ÇÁÆ® Å°°¡ ´·¯Áø °Íó·³ OnKey ÇÔ¼ö¸¦ ¼Ó¿©¾ß Çϴµ¥ »ý°¢Ã³·³ ½±Áö°¡ ¾Ê´Ù. ÇÔ¼ö·Î ºÐ¸®µÇ¾î ÀÖÀ¸¸é bShift¸¦ FALSE·Î ÇÏ¿© ProcessKey ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù. ÇÁ·Î±×·¡¹Ö¿¡¼´Â ÇÔ¼ö¸¦ Àß ºÐ¸®ÇÏ´Â ±â¼úÀÌ ¾ÆÁÖ Áß¿äÇÏ´Ù.
Move, Select ÇÔ¼ö¸¦ ¸¸µç ÀÌÀ¯µµ ProcessKey ÇÔ¼ö¸¦ ¸¸µç ÀÌÀ¯¿Í ºñ½ÁÇѵ¥ »ç¿ëÀÚÀÇ Á¶ÀÛ¾øÀ̵µ À̵¿À̳ª ¼±Åà ¸í·ÉÀ» ó¸®ÇØ¾ß ÇÏ°í ¶ÇÇÑ Å°º¸µå·Î Á÷Á¢ ó¸®ÇÒ ¼ö ¾ø´Â ¸í·Éµéµµ ½ÇÇàÇØ¾ß ÇÑ´Ù. Move´Â Àμö·Î Àü´ÞµÈ n¿¡ µû¶ó À̵¿ ¹× ¼±Åà ´ë»óÀÌ ´Þ¶óÁö´Âµ¥ ÀÌ °ªÀº ¸ÅÅ©·Î ¸í·É¾îÀÇ ¸ñÀû¾î¿Í ÀÏÄ¡½ÃÄÑ µÎ¾ú´Ù. bSelect°¡ TRUEÀ̸é À̵¿ÇÑ °÷±îÁö ¼±ÅÃÀ» È®ÀåÇÑ´Ù.
void CApiEditText::Move(int n, BOOL bSelect)
{
int pr, pc;
int toff;
GetParaFromOff(off,pr,pc);
switch (n) {
case AECM_LAST:
toff=pFrame->LastEditOff;
break;
case AECM_WORDHOME:
toff=off;
if (toff == 0)
break;
// ´Ü¾î ³¡ ±¸ºÐÀÚ¿¡ ÀÖ´Â °æ¿ì¸¦ À§ÇØ ÀÏ´Ü ÇÑÄ ¾ÕÀ¸·Î À̵¿.
for (toff--;;toff--) {
if (IsDelimiter(toff) || toff==0)
break;
}
if (toff !=0)
toff++;
break;
case AECM_WORDEND:
for (toff=off;;toff++) {
if (IsDelimiter(toff))
break;
}
break;
case AECM_NEXTPARA:
pr++;
toff=GetOffFromPara(pr,0);
if (toff==-1) {
return;
}
break;
case AECM_PREVPARA:
pr--;
toff=GetOffFromPara(pr,0);
if (toff==-1) {
return;
}
break;
case AECM_PARAHOME:
toff=pLine[GetParaFirstLine(pr)].Start;
break;
case AECM_PARAEND:
GetParaFromOff(off,pr,pc);
toff=pLine[GetParaLastLine(pr)].End;
break;
default:
return;
}
if (bSelect) {
ExpandSelection(off,toff);
off=toff;
} else {
off=toff;
ClearSelection();
}
SetCaret();
}
void CApiEditText::Select(int n)
{
int r,c;
int pr,pc;
switch (n) {
case AECS_WORD:
GetNowWord(off,SelStart,SelEnd);
SetSelect(SelStart,SelEnd,FALSE);
break;
case AECS_LINE:
GetRCFromOff(off,r,c);
SelStart=pLine[r].Start;
SelEnd=pFrame->IncludeEnter(pLine[r].End);
SetSelect(SelStart,SelEnd,FALSE);
break;
case AECS_PARA:
GetParaFromOff(off,pr,pc);
SelStart=pLine[GetParaFirstLine(pr)].Start;
SelEnd=pFrame->IncludeEnter(pLine[GetParaLastLine(pr)].End);
SetSelect(SelStart,SelEnd,FALSE);
break;
case AECS_DOC:
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_SELALL,0),0);
break;
default:
return;
}
}
¹®´ÜÀ̳ª ÁÙÀ» ¼±ÅÃÇÒ ¶§´Â µÞºÎºÐÀÇ °³Çà Äڵ嵵 Æ÷ÇÔÇØ¾ß ÇϹǷΠIncludeEnter ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. Scroll ÇÔ¼ö´Â nLine¸¸Å ½ºÅ©·ÑÇ쵂 nCode°¡ 0ÀÌ ¾Æ´Ò ¶§´Â nCode°¡ Áö½ÃÇϴ¸¸Å ½ºÅ©·Ñ ÁÙ ¼ö¸¦ Á÷Á¢ °è»êÇÑ´Ù. nCode°¡ 1, -1ÀÏ ¶§´Â ÆäÀÌÁö ´ÜÀ§·Î ¾Æ·¡, À§·Î ½ºÅ©·ÑÇÏ´Â °ÍÀÌ°í 2, -2ÀÏ ¶§´Â ¹Ý ÆäÀÌÁö ´ÜÀ§·Î ¾Æ·¡, À§·Î ½ºÅ©·Ñ ÇÏ´Â °ÍÀÌ´Ù.
ÆäÀÌÁö ´ÜÀ§·Î ½ºÅ©·Ñ ÇÏ·Á¸é frt¿Í LineHeight·ÎºÎÅÍ ½ºÅ©·ÑÇÒ ÁÙ ¼ö¸¦ °è»êÇØ¾ß Çϴµ¥ ÀÌ ¸â¹öµéÀº ¼û°ÜÁ® ÀÖÀ¸¹Ç·Î ¿ÜºÎ¿¡¼´Â ÇÑ ÆäÀÌÁö°¡ ¸î ÁÙÀÎÁö °è»êÇÒ ¼ö ¾ø´Ù. ±×·¡¼ nCode·Î ½ºÅ©·ÑÇÒ ³í¸®ÀûÀÎ ºÐ·®À» Àü´ÞÇÏ¸é ºä°¡ Á÷Á¢ ½ºÅ©·ÑÇÒ ¾çÀ» °è»êÇÑ´Ù. Scroll ÇÔ¼ö´Â nLineÀ¸·Î ÁöÁ¤ÇÑ Àý´ë ÁÙ ¼ö¸¸Å ¶Ç´Â nCode·Î ÁöÁ¤ÇÑ ³í¸®ÀûÀÎ ¾ç¸¸Å ½ºÅ©·ÑÇÑ´Ù.
void CApiEditText::Scroll(int nLine, int nCode/*=0*/)
{
int yInc;
int LinePerPage;
RECT srt;
if (nCode) {
switch (nCode) {
case 1:
SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEDOWN,0),0);
return;
case -1:
SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEUP,0),0);
return;
case 2:
nLine=frt.bottom/LineHeight/2;
break;
case -2:
nLine=-frt.bottom/LineHeight/2;
break;
}
}
LinePerPage=(frt.bottom/LineHeight)*LineHeight;
yInc=LineHeight*nLine;
yInc=max(-yPos, min(yInc, yMax-yPos-LinePerPage));
yInc=yInc-(yInc % LineHeight);
yPos=yPos+yInc;
srt=frt;
srt.left=0;
ScrollWindow(hWnd, 0, -yInc, &srt, &srt);
if (IsWindowEnabled(hVertScroll)) {
SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);
}
SetCaret(FALSE,FALSE);
}
¸í·É¿¡ ÀÇÇØ À̵¿ÇÏ´Â Move ÇÔ¼ö°¡ ¸¸µé¾îÁ³°í ÀÌ ÇÔ¼öÀÇ ¸ñÀû¾î Áß¿¡ ÃÖÈÄ ÆíÁý À§Ä¡·Î À̵¿ÇÏ´Â AECM_LAST°¡ ÀÖÀ¸¹Ç·Î GotoLastEditOff ÇÔ¼ö´Â »ç½Ç»ó Move(AECM_LAST ,FALSE)¿Í µ¿ÀÏÇÏ´Ù. ±×·¡¼ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::GotoLastEditOff()
{
Move(AECM_LAST,FALSE);
}
¹°·Ð ¿ø·¡ Äڵ嵵 Àß µ¿ÀÛÇϹǷΠ±×´ë·Î µÎ¾îµµ »ó°ü¾øÁö¸¸ ÀÏ°ü¼ºÀ» À§ÇØ ¼öÁ¤Çß´Ù. Move ¸í·É¿¡ ÃÖÈÄ ÆíÁý À§Ä¡·Î À̵¿ Äڵ尡 ÀÛ¼ºµÇ¾úÀ¸¹Ç·Î »ç½Ç GotoLastEditOff ÇÔ¼ö ÀÚü°¡ ºÒÇÊ¿äÇÏÁö¸¸ ÀÎÅÍÆäÀ̽º À¯Áö¸¦ À§ÇØ ÀÌ ÇÔ¼ö´Â ±×´ë·Î µÎ±â·Î ÇÑ´Ù. º° ½Ç¿ë¼ºÀº ¾øÁö¸¸ Move(AECM_LAST,TRUE) ¸í·ÉÀº ÇöÀç À§Ä¡¿¡¼ ÃÖÈÄ ÆíÁý À§Ä¡±îÁö ¼±ÅÃÇ϶ó´Â »õ·Î¿î ¸í·ÉÀÌ µÈ´Ù.
¸í·ÉÀ» ó¸®Çϱâ À§ÇØ ±âº» ºäÀÇ Å°º¸µå ó¸®, À̵¿, ¼±Åà µ¿ÀÛÀ» ÇÔ¼ö·Î ºÐ¸®Çß´Ù. Çí»ç ºä´Â ÀÌ µ¿ÀÛµéÀÌ ±âº» ºä¿Í´Â ´Ù¼Ò ´Ù¸£¹Ç·Î ProcessKey, Move, Select ÇÔ¼öµéÀ» ÀçÁ¤ÀÇÇØ¾ß ÇÑ´Ù. ´Ü, Scroll ÇÔ¼ö´Â Àç»ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±×´ë·Î »ó¼Ó¹ÞÀ¸¸é µÈ´Ù.
class CApiEditHexa : public CApiEditText
{
....
void ProcessKey(UINT vk,BOOL bControl,BOOL bShift);
void Select(int n);
void Move(int n, BOOL bSelect);
};
±âº» ºä¿¡¼¿Í ¸¶Âù°¡Áö·Î OnKey ÇÔ¼öÀÇ switch¹®°ú Áö¿ª º¯¼ö¸¸ ProcessKey ÇÔ¼ö·Î °¡Á®¿Â´Ù. Çí»çºä¿¡¼ÀÇ Å°ÀԷ ó¸®´Â ÅؽºÆ® ºä¿Í´Â »ó´çÈ÷ ´Ù¸£´Ù.
void CApiEditHexa::ProcessKey(UINT vk,BOOL bControl,BOOL bShift)
{
int r,c;
int oldr;
int OldOff;
switch (vk) {
....
}
}
void CApiEditHexa::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
{
BOOL bShift, bControl;
bShift=((GetKeyState(VK_SHIFT) & 0x8000) != 0);
....
bFindSelect=FALSE;
ProcessKey(vk,bControl,bShift);
}
Move¿Í Select ÇÔ¼öµµ ÀçÁ¤ÀÇÇ쵂 ÀÌ ÇÔ¼öµéÀº ±âº» ºäÀÇ Äڵ带 ´ëºÎºÐ Àç»ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±æÀÌ°¡ ÈξÀ ´õ ª´Ù. ´ëºÎºÐÀÇ Ã³¸®¸¦ ±âº» ºä·Î ³Ñ±â±â¸¸ ÇÏ¸é µÈ´Ù.
void CApiEditHexa::Move(int n, BOOL bSelect)
{
switch (n) {
case AECM_LAST:
case AECM_WORDHOME:
case AECM_WORDEND:
CApiEditText::Move(n,bSelect);
break;
case AECM_NEXTPARA:
case AECM_PREVPARA:
case AECM_PARAHOME:
case AECM_PARAEND:
break;
}
}
void CApiEditHexa::Select(int n)
{
switch (n) {
case AECS_WORD:
case AECS_DOC:
CApiEditText::Select(n);
break;
case AECS_LINE:
case AECS_PARA:
break;
}
}
Çí»ç ºä´Â ÃÖÈÄ ÆíÁý À§Ä¡³ª ´Ü¾îÀÇ °³³äÀº ÀÖÁö¸¸ ¹®´ÜÀÇ °³³äÀÌ ¾øÀ¸¹Ç·Î ÀÌ ¸í·ÉµéÀº ½ÇÇàÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù. Çí»ç ºä´Â pLineÀ» ÂüÁ¶ÇÏ´Â ¸ðµç ¸í·ÉÀ» ¹«½ÃÇØ¾ß ÇÑ´Ù. ¿©±â±îÁö ÀÛ¼ºÇÑ ÈÄ ½ÇÇàÇØ º¸¸é ¾ÆÁ÷±îÁö ´Þ¶óÁø °ÍÀº ¾Æ¹« °Íµµ ¾øÀ¸¸ç ÀÌÀü ¹öÀü°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÑ´Ù. ±×·¯³ª ³»ºÎ ±¸Á¶´Â ¸¹ÀÌ ¼öÁ¤µÇ¾ú´Âµ¥ ¸í·ÉÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Â ÇÔ¼ö±ºÀ» º¸À¯ÇÏ°Ô µÇ¾ú´Ù.
¾Õ¿¡¼ µµÇ¥·Î ÀÛ¼ºÇß´ø ¸í·ÉµéÀº Äڵ忡¼ ±¸Á¶Ã¼·Î Ç¥ÇöµÇ¸ç ¸í·ÉÀÇ ÁýÇÕÀº ±¸Á¶Ã¼ ¹è¿·Î ÀÛ¼ºµÈ´Ù. »ç¿ëÀÚ°¡ ¸í·ÉÀÇ ¸ñ·ÏÀ» ¿Ü¿ìÁö´Â ¸øÇϹǷΠ´ëÈ»óÀÚ¿¡ ¸ñ·ÏÀ» Ç¥½ÃÇØ¾ß ÇϹǷΠ¹®ÀÚ¿ ÇüÅ·ΠµÈ ¸í·É ¸ñ·ÏÀÌ ÇÊ¿äÇÏ´Ù. ´ÙÀ½ µÎ ±¸Á¶Ã¼¸¦ AeUtil.h¿¡ ¼±¾ðÇÑ´Ù.
struct SMacVerb
{
TCHAR *Name;
TCHAR *Desc;
DWORD Flag;
};
struct SMacObject
{
TCHAR *Name;
TCHAR *Desc;
};
extern SMacVerb arComVerb[];
extern SMacObject arComObject[];
extern int arObjOfVerb[];
SMacVerb´Â ¸ÅÅ©·Î ¸í·É Çϳª¿¡ ´ëÇÑ Á¤º¸ÀÌ´Ù. NameÀº ¸í·ÉÀÇ À̸§, Desc´Â ¸í·É¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀ̸ç Flag´Â ¸í·ÉÀÇ ¼Ó¼ºÀÌ´Ù. Falg´Â µÎ °³ÀÇ ºñÆ®·Î ±¸¼ºµÈ´Ù. b0´Â ¸í·ÉÀ» ¹Ýº¹ÀûÀ¸·Î ½ÇÇàÇÒ ¼ö Àִ°¡¸¦ ÁöÁ¤Çϸç ÀÌ Ç÷¡±×¿¡ µû¶ó Ä«¿îÆ®°ªÀ» °¡Áö´Â°¡ ¾Æ´Ñ°¡¸¦ °áÁ¤ÇÑ´Ù. À̵¿À̳ª »èÁ¦ µîÀº ¹Ýº¹ÀûÀ¸·Î ½ÇÇàÇÒ ¼ö ÀÖÁö¸¸ º¹»ç³ª »ðÀÔÀº ¹Ýº¹ÀûÀ¸·Î ½ÇÇàÇÒ ¼ö ¾ø´Ù. b1Àº ¸ñÀû¾î°¡ ÀÖ´ÂÁö¸¦ ÁöÁ¤Çϴµ¥ ÀÌ °ªÀÌ 0ÀÌ¸é ¸ñÀû¾î°¡ ¾ø´Â ´Üµ¶ ¸í·ÉÀÌ´Ù.
SMacObject´Â ¸í·ÉÀÇ ¸ñÀû¾î¿¡ ´ëÇÑ Á¤º¸ÀÌ´Ù. NameÀº ¸ñÀû¾îÀÇ À̸§ÀÌ°í Desc´Â ¸ñÀû¾î¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀÌ´Ù. ÀÌ µÎ ±¸Á¶Ã¼ÀÇ ¹è¿·Î ¸í·É¾î¿Í ¸ñÀû¾î ¸ñ·ÏÀ» ÀÛ¼ºÇϸç ÀÌ ¸ñ·ÏÀº ¿ÜºÎ¿¡¼µµ ÀÚÁÖ ÂüÁ¶µÇ¹Ç·Î ¹Ì¸® extern ¼±¾ðÇØ µÎ¾ú´Ù. AeUtil.cpp¿¡´Â ±¸Á¶Ã¼ ¹è¿À» ´ÙÀ½°ú °°ÀÌ ÃʱâÈÇÑ´Ù.
// µ¿»ç ¹è¿
// FlagÀÇ b0=¹Ýº¹ °¡´É¼º, b1=¸ñÀû¾î À¯¹«(¹®ÀÚ¿ ¸ñÀû¾î´Â Á¦¿Ü)
SMacVerb arComVerb[]={
{"move","À̵¿",0x03},
{"movesel","¼±ÅÃÀ̵¿",0x03},
{"insert","»ðÀÔ",0x00},
{"delete","»èÁ¦",0x01},
{"bs","¾Õ¹®ÀÚ »èÁ¦",0x03},
{"select","¼±ÅÃ",0x02},
{"copy","º¹»ç",0x00},
{"copyapp","º¹»çÇؼ Ãß°¡",0x00},
{"cut","À߶󳻱â",0x00},
{"cutapp","À߶ó¼ Ãß°¡",0x00},
{"paste","ºÙ¿©³Ö±â",0x01},
{"convert","º¯È¯",0x03},
{"copychar","À§¾Æ·¡ ¹®ÀÚ ¹Ýº¹",0x03},
{"scroll","½ºÅ©·Ñ",0x03},
{"setmark","Ã¥°¥ÇÇ ¼³Á¤",0x02},
{"gomark","Ã¥°¥ÇÇ À̵¿",0x02},
{"find","ã±â",0x00},
{"replace","¹Ù²Ù±â",0x00},
{"focus","ºä Àüȯ",0x03},
{"","",0x00}
};
// ¸ñÀû¾î ¹è¿
SMacObject arComObject[]={
{"left","¿ÞÂÊ"}, // move:0
{"right","¿À¸¥ÂÊ"},
{"up","À§·Î"},
{"down","¾Æ·¡·Î"},
{"home","Á٠óÀ½À¸·Î"},
{"end","ÁÙ ³¡À¸·Î"},
{"pgup","ÆäÀÌÁö À§·Î"},
{"pgdn","ÆäÀÌÁö ¾Æ·¡·Î"},
{"wleft","ÀÌÀü ´Ü¾î·Î"},
{"wright","ÀÌÈÄ ´Ü¾î"},
{"wordhome","´Ü¾î óÀ½À¸·Î"},
{"wordend","´Ü¾î ³¡À¸·Î"},
{"dochome","¹®¼ óÀ½"},
{"docend","¹®¼ ³¡"},
{"paren","´ëÀÀµÇ´Â °ýÈ£"},
{"last","¸¶Áö¸· ÆíÁý À§Ä¡"},
{"nextpara","´ÙÀ½ ¹®´Ü"},
{"prevpara","ÀÌÀü ¹®´Ü"},
{"parahome","¹®´Ü óÀ½"},
{"paraend","¹®´Ü ³¡"},
{NULL,NULL},
{"char","¹®ÀÚ"}, // bs:21
{"word","´Ü¾î"},
{NULL,NULL},
{"word","´Ü¾î"}, // select:24
{"line","ÁÙ"},
{"para","¹®´Ü"},
{"doc","¹®¼"},
{NULL,NULL},
{"upper","´ë¹®ÀÚ·Î"}, // convert:29
{"lower","¼Ò¹®ÀÚ·Î"},
{"reversecase","´ë¼Ò ¹Ý´ë·Î"},
{"upperfirst","ù±ÛÀÚ¸¸ ´ë¹®ÀÚ·Î"},
{"uppersent","¹®Àå óÀ½¸¸ ´ë¹®ÀÚ·Î"},
{"totab","°ø¹éÀ» ÅÇÀ¸·Î"},
{"tospace","ÅÇÀ» °ø¹éÀ¸·Î"},
{"removespace","ºÒÇÊ¿äÇÑ °ø¹é Á¦°Å"},
{"indent","µé¿©¾²±â"},
{"unindent","³»¾î¾²±â"},
{"comment","ÁÖ¼®À¸·Î"},
{"uncomment","ÁÖ¼®Á¦°Å"},
{NULL,NULL},
{"up","ÀÁÙ ¹®ÀÚ"}, // copychar:42
{"down","¾Æ·¡ÁÙ ¹®ÀÚ"},
{NULL,NULL},
{"up","ˤ"}, // scroll:45
{"down","¾Æ·¡"},
{"pgup","ÆäÀÌÁö À§"},
{"pgdn","ÆäÀÌÁö ¾Æ·¡"},
{"halfup","¹Ý ÆäÀÌÁö À§"},
{"halfdown","¹Ý ÆäÀÌÁö ¾Æ·¡"},
{"left","¿ÞÂÊ"},
{"right","¿À¸¥ÂÊ"},
{"pageleft","ÆäÀÌÁö ¿ÞÂÊ"},
{"pageright","ÆäÀÌÁö ¿À¸¥ÂÊ"},
{NULL,NULL},
{"unname","À̸§¾ø´Â ºÏ¸¶Å©"}, // setmark:56
{"0","0¹ø ºÏ¸¶Å©"},
{"1","1¹ø ºÏ¸¶Å©"},
{"2","2¹ø ºÏ¸¶Å©"},
{"3","3¹ø ºÏ¸¶Å©"},
{"4","4¹ø ºÏ¸¶Å©"},
{"5","5¹ø ºÏ¸¶Å©"},
{"6","6¹ø ºÏ¸¶Å©"},
{"7","7¹ø ºÏ¸¶Å©"},
{"8","8¹ø ºÏ¸¶Å©"},
{"9","9¹ø ºÏ¸¶Å©"},
{NULL,NULL},
{"next","´ÙÀ½ ºÏ¸¶Å©"}, // gomark:68
{"prev","ÀÌÀü ºÏ¸¶Å©"},
{"0","0¹ø ºÏ¸¶Å©"},
{"1","1¹ø ºÏ¸¶Å©"},
{"2","2¹ø ºÏ¸¶Å©"},
{"3","3¹ø ºÏ¸¶Å©"},
{"4","4¹ø ºÏ¸¶Å©"},
{"5","5¹ø ºÏ¸¶Å©"},
{"6","6¹ø ºÏ¸¶Å©"},
{"7","7¹ø ºÏ¸¶Å©"},
{"8","8¹ø ºÏ¸¶Å©"},
{"9","9¹ø ºÏ¸¶Å©"},
{"next","´ÙÀ½ º¸±â"}, // focus:80
{"prev","ÀÌÀü º¸±â"},
{NULL,NULL}
};
// °¢ µ¿»çº° ¸ñÀû¾î ¹è¿»óÀÇ ½ÃÀÛ Ã·ÀÚ
int arObjOfVerb[]={0,0,-1,-1,21,24,-1,-1,-1,-1,-1,29,42,45,56,68,-1,-1,80};
arComVerb´Â ¸í·ÉÀ» ±¸¼ºÇÏ´Â µ¿»çÀÇ ¸ñ·ÏÀÌ°í arComObject´Â ¸ñÀû¾îÀÇ ¸ñ·ÏÀÌ´Ù. µ¿»çº°·Î ¸ñÀû¾îÀÇ ¸ñ·Ï°ú °³¼ö°¡ ´Ù¸£¹Ç·Î ¸ðµç ¸ñÀû¾î¸¦ ÇϳªÀÇ ¹è¿¿¡ ÀÛ¼ºÇÏ°í °¢ µ¿»çº° ¸ñÀû¾îÀÇ ½ÃÀÛ À妽º¸¦ arObjOfVerb ¹è¿¿¡ µû·Î ÀÛ¼ºÇß´Ù. ¿¹¸¦ µé¾î À̵¿°ú ¼±ÅÃÀ̵¿ µ¿»çÀÇ ¸ñÀû¾î´Â 0ºÎÅÍ ½ÃÀÛÇÏ°í »ðÀÔ, »èÁ¦´Â ¸ñÀû¾î°¡ ¾øÀ¸¸ç ¾Õ¹®ÀÚ »èÁ¦ÀÇ ¸ñÀû¾î´Â 21ºÎÅÍÀÌ´Ù.
ƯÁ¤ µ¿»çÀÇ ¸ñÀû¾î ½ÃÀÛ À§Ä¡´Â arObjOfVerb¿¡¼ ±¸ÇÒ ¼ö ÀÖ°í arComObject ¹è¿¿¡¼ ÀÌ À§Ä¡ ÀÌÈÄ À̸§ÀÌ NULLÀÌ ¾Æ´Ñ ¿ä¼Ò¸¦ ¸ðµÎ ÀÐÀ¸¸é ¸ñÀû¾î ¸ñ·ÏÀ» ±¸ÇÒ ¼ö ÀÖ´Ù. Á¶±Ý º¹ÀâÇØ º¸À̱â´Â Çѵ¥ ¸Þ¸ð¸®¸¦ ¾Æ³¢±â À§ÇØ ÀÌ·± ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. AeUtil.h¿¡¼ extern ¼±¾ðÀ» ÇØ µÎ¾úÀ¸¹Ç·Î È£½ºÆ®¿¡¼ ÀÌ ¹è¿À» °ð¹Ù·Î ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.
¸ÅÅ©·Î´Â ¹®ÀÚ¿ Æ÷¸ËÀ¸·Î ÀÛ¼ºµÇ´Âµ¥ ¹®ÀÚ¿Àº ºÎÈ£ÈµÈ Äڵ忡 ºñÇØ ´Ù·ç±â°¡ ±²ÀåÈ÷ ±î´Ù·Ó´Ù. ¸í·ÉÀ̳ª ¸ñÀûÀ¸·Î ÃßÃâÇϱâ À§Çؼ´Â ¹®ÀÚ¿ ºñ±³¸¦ ÇØ¾ß ÇÑ´Ù. °Ô´Ù°¡ »ç¿ëÀÚ°¡ Á¤È®ÇÏ°Ô ¸í·ÉÀ» ÀÛ¼ºÇÑ´Ù¸é °£´ÜÇØÁö°ÚÁö¸¸ °ø¹éÀ̳ª µû¿ÈÇ¥ µîÀÇ ±¸µÎÁ¡À» ÀÓÀÇ´ë·Î ÀÛ¼ºÇÒ ¼ö ÀÖ¾î ÀÌ·± ¿¡·¯ 󸮱îÁö ÇÏÀÚ¸é ¹«Ã´ º¹ÀâÇØÁø´Ù. ±×·¡¼ ¸ÅÅ©·Î ±¸¹® Çؼ®À» À§ÇÑ µµ¿ì¹Ì ÇÔ¼öµéÀ» ÀÛ¼ºÇÏ°í ÀÌ ÇÔ¼öµé·Î ¸ÅÅ©·Î¸¦ Çؼ®ÇÑ´Ù. ´ÙÀ½ ÇÔ¼öÀÇ ¿øÇüÀ» AeUtil.h¿¡ ¼±¾ðÇÑ´Ù.
void SkipSpace(const TCHAR *&pc);
BOOL SkipString(const TCHAR *&pc);
void AeEscapeChar(const TCHAR *&s,TCHAR *&d);
int GetComVerb(const TCHAR *&szCom,SMacVerb *arVerb);
int GetComObject(int Verb,const TCHAR *&szCom,SMacObject *arObject,int *arObj);
void GetComString(const TCHAR *&szCom,TCHAR *&str,BOOL bEscape=TRUE);
int GetComNumber(const TCHAR *szCom,int Min);
ÀÌ ÇÔ¼öµéÀº ÀϹÝÀûÀÎ ¹®ÀÚ¿À» ´Ù·ç±â ¶§¹®¿¡ ¸â¹ö ÇÔ¼ö°¡ ¾Æ´Ï¶ó ÀÏ¹Ý ÇÔ¼öÀÌ´Ù. FindString ÇÔ¼ö ´ÙÀ½¿¡ ¿øÇüÀ» ¼±¾ðÇÏ¸é µÈ´Ù. ÇÔ¼öÀÇ º»Ã¼´Â ¹°·Ð AeUtil.cpp¿¡ ÀÛ¼ºÇÑ´Ù. ´ÙÀ½ µÎ ÇÔ¼ö´Â ¹®ÀÚ¿ 󸮸¦ À§ÇÑ À¯Æ¿¸®Æ¼ ÇÔ¼öÀÌ´Ù.
// °ø¹éÀ» °Ç³Ê¶Ú´Ù.
void SkipSpace(const TCHAR *&pc)
{
for (;*pc;pc++) {
if (*pc!=' ' && *pc!='\t')
break;
}
}
// ¹®ÀÚ¿À» ¸¸³ª¸é ¹®ÀÚ¿ ³¡±îÁö °Ç³Ê¶Ü. pc´Â ´Ý´Â µû¿ÈÇ¥¿¡ À§Ä¡ÇÔ.
// ´Ý´Â µû¿ÈÇ¥°¡ ¾øÀ¸¸é FALSE¸¦ ¸®ÅÏÇÑ´Ù.
BOOL SkipString(const TCHAR *&pc)
{
if (*pc=='\"') {
for (pc++;;pc++) {
if (*pc==NULL) {
return FALSE;
}
if (*pc=='\"' && *(pc-1)!='\\') {
break;
}
}
}
return TRUE;
}
SkipSpace ÇÔ¼ö´Â °ø¹éÀ» °Ç³Ê ¶Ú´Ù. "move right"¶ó°í Ç×»ó ¶È¹Ù·Î ½á ÁÖ¸é ÀÌ·± 󸮰¡ ÇÊ¿ä¾øÀ¸³ª "move right" ¿ä·¸°Ô ¾²´Â »ç¶÷µµ ÀÖ°í µ¿»ç¿Í ¸ñÀû¾î »çÀÌ¿¡ ÅÇÀ» ¾²´Â »ç¶÷µµ Àֱ⠶§¹®¿¡ ÀÌ ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù. SkipString ÇÔ¼ö´Â ¹®ÀÚ¿À» °Ç³Ê ¶Ú´Ù. ¿©´Â µû¿ÈÇ¥ À§Ä¡¿¡¼ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ´Ý´Â µû¿ÈÇ¥ À§Ä¡¸¦ ã´Â´Ù. ±²ÀåÈ÷ °£´ÜÇÒ °Í °°Áö¸¸ ´Ý´Â µû¿ÈÇ¥°¡ ¾øÀ» ¼öµµ ÀÖ°í ¹®ÀÚ¿ ³»ÀÇ È®Àå¿À» °í·ÁÇØ¾ß Çϱ⠶§¹®¿¡ °è»êÀÌ ÇÊ¿äÇÏ´Ù.
È®Àå¿À̶õ ¹®ÀÚ¿³»¿¡ Æ÷ÇԵǴ ÀÏÁ¾ÀÇ Æ¯¼ö ¹®ÀÚÀε¥ C¾ð¾îÀÇ È®Àå¿°ú °³³äÀûÀ¸·Î µ¿ÀÏÇÏ´Ù. µû¿ÈÇ¥¾È¿¡ µû¿ÈÇ¥³ª °³ÇàÄڵ带 ´ãÀ» ¼ö ¾ø±â ¶§¹®¿¡ È®Àå¿ÀÌ ÇÊ¿äÇÏ´Ù. È®Àå¿Àº \·Î ½ÃÀÛÇÏ¸ç ´ÙÀ½°ú °°Àº Á¾·ù°¡ ÀÖ´Ù. ´ëü·Î C¾ð¾îÀÇ È®Àå¿°ú À¯»çÇÏ°Ô Á¤ÀÇÇß´Ù.
È®Àå¿ |
¹®ÀÚ |
\n |
°³Çà ÄÚµåÀÌ´Ù. \r\nÀ¸·Î È®ÀåµÈ´Ù. |
\t |
ÅÇÀÌ´Ù. \t·Î È®ÀåµÈ´Ù. |
\x |
16Áø ¹®ÀÚ ÄÚµå. µÚ¿¡ ¹Ýµå½Ã µÎÀÚ¸®ÀÇ 16Áø¼ö°¡ ¿Í¾ß ÇÑ´Ù. |
\i |
10Áø ¹®ÀÚ ÄÚµå, µÚ¿¡ ¹Ýµå½Ã ¼¼ÀÚ¸®ÀÇ 255ÀÌÇÏÀÇ 10Áø¼ö°¡ ¿Í¾ß ÇÑ´Ù. |
\" |
µû¿ÈÇ¥ ¹®ÀÚ·Î È®ÀåµÈ´Ù. ´Ý´Â µû¿ÈÇ¥·Î ÀÎÁ¤µÇÁö ¾Ê´Â´Ù. |
\\ |
¿ª½½·¹½¬ ¹®ÀÚ ÀÚüÀÌ´Ù. |
\rÀ̳ª ±âŸ \a, \b°°ÀÌ Áö¿øµÇÁö ¾Ê´Â È®À念éÀº ¹«½ÃµÈ´Ù. \x ´ÙÀ½¿¡ ¹Ýµå½Ã µÎ ÀÚ¸®ÀÇ 16Áø¼ö°¡ ¿Í¾ß ÇÏ´Â Á¦¾àÀÌ Á» ¸¶À½¿¡ ¾È µé ¼öµµ ÀÖ´Ù. \x0¶ó°í ÇÏ¸é ±×³É ³Î ¹®ÀÚ¸¦ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù¸é ÁÁ°ÚÁö¸¸ ¹Ýµå½Ã \x00·Î ½á¾ß ÇÑ´Ù. ÀÌ·± Á¦¾àÀÌ ¾ø´Ù¸é \xbapple°°Àº °Ë»ö½ÄÀÇ °æ¿ì 16Áø¼ö 0xba ´ÙÀ½ÀÇ pple¸¦ ÀǹÌÇÏ´Â °ÍÀÎÁö ¾Æ´Ï¸é 0xb ´ÙÀ½ÀÇ appleÀ» ¸»ÇÏ´Â ²¯ÀÎÁö ±¸ºÐµÇÁö ¾Ê´Â ¹®Á¦°¡ ÀÖ´Ù. ±×·¡¼ µÎÀÚ¸®±îÁö ¹«Á¶°Ç Àд´Ù. AeEscapeChar ÇÔ¼ö´Â µû¿ÈÇ¥³ª \r, \t µîÀÇ È®Àå¿À» ½ÇÁ¦ ¹®ÀÚ·Î ´ëüÇÑ´Ù.
// ¹®ÀÚ Çϳª¸¦ À̽ºÄÉÀÌÇÁÇÑ´Ù. À§Ä¡ À̵¿±îÁö ÇØ ÁØ´Ù.
void AeEscapeChar(const TCHAR *&s,TCHAR *&d)
{
TCHAR high,low,third;
int code;
if (*s=='\\') {
s++;
switch (*s) {
case '\\':
*d++='\\';
break;
// Á¦ÀÏ ³¡¿¡ \Çϳª¸¸ ÀÖ´Â °æ¿ì. \¹®ÀÚ·Î ÀÎÁ¤ÇÏ°í s¸¦ Áõ°¡½ÃÅ°Áö ¾Ê°í ¸®ÅÏ
case NULL:
*d++='\\';
return;
case 'n':
case 'N':
*d++='\r';
*d++='\n';
break;
case 't':
case 'T':
*d++='\t';
break;
// ã±â¿¡¼´Â ²À ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ¹Ù·Î "¸¦ ¾µ ¼öµµ ÀÖ´Ù.
case '\"':
*d++='\"';
break;
// 16Áø ÄÚµå ó¸®
case 'x':
case 'X':
s++;
if (*s==NULL) return;
high=*s;
s++;
if (*s==NULL) return;
if (IsCharLower(high)) high-=0x20;
if (high >= '0' && high <= '9') {
high=high-'0';
} else if (high >= 'A' && high <= 'F') {
high=high-'A'+10;
} else {
break;
}
low=*s;
if (IsCharLower(low)) low-=0x20;
if (low >= '0' && low <= '9') {
low=low-'0';
} else if (low >= 'A' && low <= 'F') {
low=low-'A'+10;
} else {
break;
}
*d++=(high << 4 | low);
break;
// 10Áø ÄÚµå ó¸®
case 'i':
case 'I':
s++;
if (*s==NULL) return;
high=*s;
s++;
if (*s==NULL) return;
if (high >= '0' && high <= '9') {
high=high-'0';
} else {
s++;
break;
}
low=*s;
s++;
if (*s==NULL) return;
if (low >= '0' && low <= '9') {
low=low-'0';
} else {
break;
}
third=*s;
if (third >= '0' && third <= '9') {
third=third-'0';
} else {
break;
}
code=high*100+low*10+third;
if (code < 256) {
*d++=code;
}
break;
// È®Àå¿ÀÌ ¾Æ´Ñ ¹®ÀÚ´Â ¹«½ÃÇÔ. ¿¹¸¦ µé¾î È¥ÀÚ ¿À´Â \rµî.
default:
break;
}
} else {
*d++=*s;
}
s++;
}
´ë¼Ò¹®ÀÚ´Â ±¸ºÐÇÏÁö ¾ÊÀ¸¸ç ¿¡·¯°¡ ÀÖÀ» °æ¿ì ¹«½ÃÇÑ´Ù. ¿¹¸¦ µé¾î \xgg³ª \a, \i567 ÀÌ·± °ÍÀº Åë°·Î ¾ø´Â °ÍÀ¸·Î Ãë±ÞÇÑ´Ù. ³¡¿¡ \È¥ÀÚ¸¸ ÀÖÀ¸¸é \¹®ÀÚ·Î ÀÎÁ¤ÇÑ´Ù. \x ´ÙÀ½¿¡ µÎ ÀÚ¸® ¼ýÀÚ°¡ ¾ø°Å³ª \i´ÙÀ½¿¡ ¼¼ ÀÚ¸® ¼ýÀÚ°¡ ¾øÀ¸¸é ¹«½ÃÇÑ´Ù. ´ÙÀ½ µÎ ÇÔ¼ö´Â µ¿»ç¿Í ¸ñÀûÀ¸·Î ã´Â´Ù. ãÀº ÈÄ Æ÷ÀÎÅÍ´Â Ç×»ó ±× ´ÙÀ½ À§Ä¡·Î À̵¿½ÃÅ°´Â Ư¼ºÀÌ ÀÖ´Ù.
// µ¿»ç¸¦ ã¾ÆÁØ´Ù. ¿¡·¯ÀÏ °æ¿ì -1À» ¸®ÅÏÇÑ´Ù. µ¿»ç ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ ¿Å°Ü ÁØ´Ù.
int GetComVerb(const TCHAR *&szCom,SMacVerb *arVerb)
{
TCHAR szVerb[32];
TCHAR *p;
int idx;
// µ¿»ç ºÎºÐ¸¸ µû·Î ºÐ¸®ÇÑ´Ù.
lstrcpyn(szVerb,szCom,32);
for (p=szVerb;*p!=NULL;p++) {
if (*p==' ') {
*p=NULL;
break;
}
}
for (idx=0;;idx++) {
if (lstrlen(arVerb[idx].Name) == 0) {
idx=-1;
break;
}
if (strcmpi(arVerb[idx].Name,szVerb)==0) {
break;
}
}
szCom += lstrlen(szVerb);
SkipSpace(szCom);
return idx;
}
// ¸ñÀû¾î¸¦ ã¾ÆÁØ´Ù. ¿¡·¯ÀÏ °æ¿ì -1À» ¸®ÅÏÇÑ´Ù. ¸ñÀû¾î°¡ ÀÖ´Â µ¿»ç¸¸ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϹǷΠ-1À» ¸®ÅÏÇصµ º° »ó°ü¾ø´Ù.
// ¸ñÀû¾î ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ ¿Å°Ü ÁØ´Ù.
int GetComObject(int Verb,const TCHAR *&szCom,SMacObject *arObject,int *arObj)
{
TCHAR szObject[32];
TCHAR *p;
int stidx;
int idx;
// ¸ñÀû¾î ¹è¿¿¡¼ ½ÃÀÛ À妽º ãÀ½. ½ÃÀÛÀÌ -1ÀÌ¸é ¸ñÀû¾î°¡ ¾ø´Â µ¿»çÀÓ
stidx=arObj[Verb];
if (stidx==-1) {
return -1;
}
// ¸ñÀû¾î ºÎºÐ¸¸ µû·Î ºÐ¸®ÇÑ´Ù. °ø¹éÀ̳ª ÅÇÀ» ¸¸³ª¸é ¸ñÀû¾îÀÇ ³¡
lstrcpyn(szObject,szCom,32);
for (p=szObject;*p!=NULL;p++) {
if (*p==' ' || *p=='\t') {
*p=NULL;
break;
}
}
for (idx=stidx;arObject[idx].Name!=NULL;idx++) {
if (strcmpi(arObject[idx].Name,szObject)==0) {
break;
}
}
if (arObject[idx].Name==NULL) {
idx=-1;
} else {
idx-=stidx;
}
// ¸ñÀû¾î ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ ¿Å°ÜÁØ´Ù.
szCom += lstrlen(szObject);
SkipSpace(szCom);
return idx;
}
´ÙÀ½ ÇÔ¼ö´Â ¹®ÀÚ¿À» ÃßÃâÇÑ´Ù. ¹®ÀÚ¿ÀÇ ±æÀ̸¦ ¹Ì¸® ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ ÀÌ ÇÔ¼ö¿¡¼ ¹®ÀÚ¿ ÀúÀåÀ» À§ÇÑ ¹öÆÛ¸¦ ÇÒ´çÇÏ°í È£Ãâ¿ø¿¡¼ ÇØÁ¦ÇØ¾ß ÇÑ´Ù. ¹®ÀÚ¿³»ÀÇ È®Àå¿À» Áö¿øÇÑ´Ù.
// µû¿ÈÇ¥ ´ÙÀ½¿¡ ÀÖ´Â ¹®ÀÚ¿À» ÃßÃâÇØ ÁØ´Ù. ¸Þ¸ð¸®¸¦ ¿©±â¼ ÇÒ´çÇÏ°í È£Ãâ¿ø¿¡¼ ÇØÁ¦ÇÑ´Ù.
// ¹®ÀÚ¿ ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ ¿Å°ÜÁØ´Ù.
void GetComString(const TCHAR *&szCom,TCHAR *&str,BOOL bEscape/*=TRUE*/)
{
int len;
const TCHAR *pc;
TCHAR *p;
// ÃßÃâµÉ ÃÖ´ë ¹®ÀÚ¿ÀÇ ±æÀ̸¸Å ÇÒ´ç
len=lstrlen(szCom);
str=(TCHAR *)malloc(len);
// µû¿ÈÇ¥ ´ÙÀ½ ¹®ÀÚºÎÅÍ º¹»ç¸¦ ½ÃÀÛÇÑ´Ù. È®Àå¿ Ã³¸®
for (pc=szCom+1,p=str;;) {
// ´Ý´Â µû¿ÈÇ¥°¡ ¾ø´Ù´Â ¶æÀÓ. ¿¡·¯·Î 󸮵ȴÙ.
if (*pc==NULL) {
free(str);
str=NULL;
break;
}
// ´Ý´Â µû¿ÈÇ¥. ¹®ÀÚ¿ÀÇ ³¡
if (*pc=='\"') {
*p=0;
break;
}
if (bEscape) {
AeEscapeChar(pc,p);
// È®Àå¿À» È®ÀåÇÏÁö ¾ÊÀ» ¶§. ¸ðµç ¹®ÀÚ¸¦ ±×´ë·Î Á¶»çÇ쵂 ´Ü, À§ ·çÇÁ¿¡¼ \"¸¦ ÀνÄÇÏÁö ¾Êµµ·Ï
// ÀÌ È®À忸¸ µû·Î º¹»çÇØÁØ´Ù.
} else {
if (*pc=='\\' && *(pc+1)=='\"') {
*p++=*pc++;
*p++=*pc++;
} else {
*p++=*pc++;
}
}
}
// ¹®ÀÚ¿ ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ º¸³½´Ù.
szCom = pc+1;
SkipSpace(szCom);
}
// szCom ¹®ÀÚ¿¿¡¼ ¼ýÀÚ¸¦ ÀоîÁØ´Ù. ÃÖ¼ÒÇÑÀÇ °ªÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
int GetComNumber(const TCHAR *szCom,int Min)
{
return max(Min,atoi(szCom));
}
È®Àå¿Àº ¿¡·¯ ¹ß»ý °¡´É¼ºÀÌ ³ôÀ¸·Î ¿¡·¯¸¦ Àß Ã³¸®ÇØ¾ß ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀº ¸ÅÅ©·Î ±¸¹®À» Çؼ®ÇÒ ¶§ »ç¿ëµÈ´Ù.
´ç±ÙÀº ¿©·¯ °´Ã¼¿¡ ¹®ÀÚ¿·Î À̸§À» Áֱ⠶§¹®¿¡ ¹®ÀÚ¿¿¡ ´ëÇÑ ¿¹¿Ü 󸮰¡ ÇÊ¿äÇÏ´Ù. ¿¹¸¦ µé¾î ¸ÅÅ©·Î À̸§ÀÌ Á¦´ë·Î ÀԷµǾú´ÂÁö °Ë»çÇÒ ¶§ ÀÌ ¹®ÀÚ¿ÀÌ ºñ¾î ÀÖ´ÂÁö ¾Æ´ÑÁö ºÁ¾ß ÇÑ´Ù. ±æÀ̸¦ Á¡°ËÇÏ´Â °Í¸¸À¸·Î´Â ºÎÁ¤È®ÇÏ´Ù. °ø¹éÀ̳ª ÅÇÀº ¾Æ¹«¸® ¸¹ÀÌ µé¾î°¡ À־ À̸§À¸·Î ÀÎÁ¤µÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù.
¶ÇÇÑ ¹®ÀÚ¿À» Á¤±ÔÈÇÒ ÇÊ¿äµµ ÀÖ´Ù. "move right"¿Í " move right", "move right "´Â °ø¹é ±¸¼º¸¸ Á¦¿ÜÇÏ°í´Â ¿ÏÀüÈ÷ °°´Ù. ÇÏÁö¸¸ ¹®ÀÚ¿À» ºñ±³ÇÏ´Â strcmp ÇÔ¼ö´Â ´Ù¸¥ °ÍÀ¸·Î ÆǺ°ÇÑ´Ù. ±×·¡¼ ¾ÕµÚÀÇ ºÒÇÊ¿äÇÑ °ø¹éÀº Á¦°ÅÇÏ°í Áß°£ÀÇ °ø¹éÀ̳ª ÅÇÀº Çϳª·Î Á¤±ÔÈÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¸¶Ä¡ À¥ ºê¶ó¿ìÀú°¡ HTML ¹®¼ÀÇ ºÒÇÊ¿äÇÑ °ø¹éÀ» ¸ðµÎ Á¦°ÅÇÏ´Â °Í°ú °°´Ù. ´ÙÀ½ µÎ ÇÔ¼ö¸¦ Util.cpp¿¡ Ãß°¡ÇÏ°í Çì´õ ÆÄÀÏ¿¡ ¿øÇüµµ ¼±¾ðÇÑ´Ù.
BOOL IsStrEmpty(TCHAR *str)
{
int len,i;
BOOL bEmpty=TRUE;
len=lstrlen(str);
// ±æÀÌ°¡ 0ÀÌ¸é ºñ¾îÀÖ´Ù.
if (len == 0) {
return TRUE;
}
// °ø¹éÀ̳ª ÅÇ ¹®ÀÚ ¿Ü¿¡ ´Ù¸¥ ¹®ÀÚ°¡ ÀÖÀ¸¸é ºñ¾îÀÖÁö ¾Ê´Ù.
for (i=0;i<len;i++) {
if ((str[i]!=' ') && (str[i]!='\t')) {
bEmpty=FALSE;
break;
}
}
return bEmpty;
}
void StringNormalize(TCHAR *src, TCHAR *dest)
{
TCHAR *s,*d;
TCHAR *dest2;
s=src;
if (dest==NULL) {
d=dest2=(TCHAR *)malloc(lstrlen(src)+1);
} else {
d=dest;
}
SkipSpace(const_cast<const TCHAR *&>(s));
// Áß°£ÀÇ °ø¹é Á¤¸®
for (;*s;) {
if (*s==' ' || *s=='\t') {
*d++=' ';
SkipSpace(const_cast<const TCHAR *&>(s));
} else {
*d++=*s++;
}
}
*d=0;
// ³¡ °ø¹é Çϳª°¡ ÀÖÀ¸¸é Á¦°Å
if (d > dest && d[-1]==' ') {
d[-1]=0;
}
if (dest==NULL) {
lstrcpy(src,dest2);
free(dest2);
}
}
IsStrEmpty ÇÔ¼ö´Â str ¹®ÀÚ¿ÀÌ ºñ¾î ÀÖ´ÂÁö ¾Æ´ÑÁö¸¦ Á¡°ËÇÑ´Ù. ÄÚµå´Â ÀÐÀ¸¸é ¹Ù·Î Çؼ®µÉ Á¤µµ·Î ½±´Ù. ±æÀÌ°¡ 0À̸é ÀÌ ¹®ÀÚ¿Àº ´õ º¼ °Íµµ ¾øÀÌ ºó °ÍÀÌ´Ù. ±×·¸Áö ¾ÊÀ» °æ¿ì ¹®ÀÚ¿ Àüü¸¦ ¼øȸÇÏ¸ç °ø¹éÀ̳ª ÅÇÀÌ ¾Æ´Ñ ¹®ÀÚ°¡ ÀÖ´ÂÁö Á¡°ËÇϴµ¥ ÃÖ¼ÒÇÑ Çϳª ÀÌ»óÀÇ ¹®ÀÚ°¡ ÀÖ¾î¾ß ºñ¾î ÀÖÁö ¾Ê´Ù. ¸¸¾à ¹®ÀÚ¿ Àüü°¡ ÅÇÀ̳ª °ø¹éÀ¸·Î¸¸ ±¸¼ºµÇ¾î ÀÖ´Ù¸é ÀÌ ¹®ÀÚ¿Àº ½ÇÁ¦ ³»¿ëÀÌ ¾ø´Â ºó ¹®ÀÚ¿ÀÌ´Ù.
StringNormalize ÇÔ¼ö´Â ¹®ÀÚ¿À» Á¤±ÔÈÇÑ´Ù. ¾ÕÂÊÀÇ °ø¹éÀ» Á¦°ÅÇÏ°í Áß°£ÀÇ °ø¹éÀº ½ºÆäÀ̽º Çϳª·Î Á¤¸®ÇÏ°í µÚÂÊÀÇ °ø¹éµµ Á¦°ÅÇÑ´Ù. dest´Â ¹Ýµå½Ã src¿Í °°°Å³ª ´õ ±æ¾î¾ß ÇÑ´Ù. ¾Æ´Ï¸é ¾Æ¿¹ NULL·Î ÁÖ¾î src¿¡ º¯È¯ °á°ú¸¦ µ¹·Á ¹ÞÀ» ¼öµµ ÀÖ´Ù. ±×·¡¼ src´Â »ó¼ö¼ºÀ» °¡ÁöÁö ¾ÊÀ¸¸ç SkipSpace·Î srcÀÇ Æ÷ÀÎÅ͸¦ Àü´ÞÇÒ ¶§´Â »ó¼ö ij½ºÆÃÀ» ÇØ¾ß ÇÑ´Ù. ÀÌ Ä³½ºÆÃÀÎ ºñÁÖ¾ó C++ 6.0¿¡¼´Â ÇÊ¿äÄ¡ ¾ÊÁö¸¸ ÈξÀ ´õ ¾ö°ÝÇÑ Å¸ÀÔüũ¸¦ ÇÏ´Â VC 8.0¿¡¼´Â ÇÊ¿äÇÏ´Ù.
¹®ÀÚ¿ Á¤±Ôȸ¦ À§ÇØ AeUtil.cpp¿¡ Á¤ÀǵǾî ÀÖ´Â SkipSpace ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ´ç±ÙÀº ApiEdit¿¡ Á¾¼ÓÀûÀ̹ǷΠÀÌ·¸°Ô Çصµ »ó°ü¾ø´Ù. ¹°·Ð ±× ¹Ý´ë¿©¼´Â ¾ÈµÈ´Ù. ¸¸¾à StringNormalize ÇÔ¼ö¸¦ ´Ù¸¥ ÇÁ·ÎÁ§Æ®¿¡ ¾²°í ½Í´Ù¸é SkipString ÇÔ¼öµµ °°ÀÌ °¡Áö°í °¡¾ß ÇÑ´Ù. ºó ¹®ÀÚ¿ Á¡°Ë°ú Á¤±ÔÈ ÇÔ¼ö´Â ÀÌÈÄ ¸ÅÅ©·Î À̸§ µîÀÇ À¯È¿¼ºÀ» Á¡°ËÇÒ ¶§ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼öµéÀÌ ¿Ï¼ºµÈ ±è¿¡ 1.0ÀÇ »ç¼ÒÇÑ ¹ö±× ¸î °³µµ ¼öÁ¤ÇÏÀÚ. ÇÁ·ÎÁ§Æ®ÀÇ À̸§À» ÀԷ¹޴ ºÎºÐ¿¡ ÀÌ ÇÔ¼öµéÀ» Àû¿ëÇØ¾ß Çϴµ¥ Project.cppÀÇ ¿ø·¡ Äڵ带 º¸¸é ¹®Á¦°¡ ÀÖ´Ù.
BOOL CALLBACK DgNewProjectProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
case IDOK:
....
GetDlgItemText(hDlg,IDC_PRJNEWNAME,Header.Name,32);
if (lstrlen(Header.Name)==0) {
MessageBox(hDlg,"ÇÁ·ÎÁ§Æ®ÀÇ À̸§Àº ¹Ýµå½Ã ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù","¾Ë¸²",MB_OK);
return TRUE;
}
ÇÁ·ÎÁ§Æ® À̸§ÀÇ ±æÀÌ°¡ 0ÀÌ¸é ¹«È¿¶ó°í ÆÇ´ÜÇÏ°í °æ°í ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. À̸§ÀÌ ¾øÀ¸¸é ±¸ºÐÀÌ µÇÁö ¾Ê±â ¶§¹®¿¡ ¹Ýµå½Ã À̸§À» ÀÔ·ÂÇϵµ·Ï °Á¦ÇÏ´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é °ø¹é Çϳª¸¸ ÀÔ·ÂÇϸé À¯È¿ÇÏ´Ù°í ÆÇ´ÜÇϴµ¥ À̰͵µ »ç½Ç ¹®Á¦°¡ ÀÖ´Â °ÍÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
case IDOK:
....
GetDlgItemText(hDlg,IDC_PRJNEWNAME,Header.Name,32);
if (IsStrEmpty(Header.Name)) {
MessageBox(hDlg,"ÇÁ·ÎÁ§Æ®ÀÇ À̸§Àº ¹Ýµå½Ã ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù","¾Ë¸²",MB_OK);
return TRUE;
}
StringNormalize(Header.Name,NULL);
°ø¹éÀ¸·Î¸¸ ±¸¼ºµÈ À̸§Àº ÇÁ·ÎÁ§Æ® À̸§À¸·Î ÀÎÁ¤ÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù. ¿©±â¿¡ Á¤±ÔȱîÁö ÇÏ¿© ÇÁ·ÎÁ§Æ® À̸§ÀÌ ÀÏÁ¤ÇÑ Çü½ÄÀ» °¡Áö°Ô Çß´Ù. Inertnet.cpp¿¡ ÀÖ´Â FTP ¼¹öÀÇ µî·Ï Á¤º¸µµ ¸¶Âù°¡Áö·Î ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
BOOL CALLBACK DGFtpConfigProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
static int idx;
TCHAR szTemp[256];
switch(iMessage) {
case WM_INITDIALOG:
....
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
GetDlgItemText(hDlg,IDC_FTPNAME,szTemp,32);
if (IsStrEmpty(szTemp)) {
MessageBox(hDlg,"Á¢¼Ó¸íÀ» ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);
return TRUE;
}
GetDlgItemText(hDlg,IDC_FTPADDR,szTemp,256);
if (IsStrEmpty(szTemp)) {
MessageBox(hDlg,"¼¹öÀÇ ÁÖ¼Ò¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);
return TRUE;
}
GetDlgItemText(hDlg,IDC_FTPUSER,szTemp,32);
if (IsStrEmpty(szTemp)) {
MessageBox(hDlg,"»ç¿ëÀÚ ID¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);
return TRUE;
}
GetDlgItemText(hDlg,IDC_FTPPASS,szTemp,32);
if (IsStrEmpty(szTemp)) {
MessageBox(hDlg,"ºñ¹Ð¹øÈ£¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);
return TRUE;
}
GetDlgItemText(hDlg,IDC_FTPPORT,szTemp,32);
if (IsStrEmpty(szTemp)) {
MessageBox(hDlg,"Á¢¼Ó Æ÷Æ® ¹øÈ£¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);
return TRUE;
}
if (idx==-1) {
for (idx=0;;idx++) {
if (lstrlen(Option.arFtp[idx].Name)==0)
break;
}
}
GetDlgItemText(hDlg,IDC_FTPNAME,Option.arFtp[idx].Name,32);
StringNormalize(Option.arFtp[idx].Name,NULL);
GetDlgItemText(hDlg,IDC_FTPADDR,Option.arFtp[idx].Addr,256);
GetDlgItemText(hDlg,IDC_FTPUSER,Option.arFtp[idx].User,32);
GetDlgItemText(hDlg,IDC_FTPPASS,Option.arFtp[idx].Pass,32);
Option.arFtp[idx].Port=GetDlgItemInt(hDlg,IDC_FTPPORT,NULL,FALSE);
EndDialog(hDlg,IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg,IDCANCEL);
return TRUE;
}
return FALSE;
}
return FALSE;
}
¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ Á¤º¸ÀÇ ±æÀ̸¸À¸·Î Á¤º¸ÀÇ À¯È¿¼ºÀ» Á¡°ËÇÏÁö ¾Ê°í IsStrEmpty ÇÔ¼ö·Î Á¦´ë·Î Á¡°ËÇß´Ù. Á¢¼Ó¸í¿¡ ´ëÇؼ´Â Á¤±ÔȱîÁö Çß´Ù. ÀÌ·± ¿¡·¯ 󸮴 ¾î¶»°Ô º¸¸é ±²ÀåÈ÷ »ç¼ÒÇÑ ¹®Á¦ÀÏ ¼öµµ ÀÖÁö¸¸ Á» ´õ ¿ÏÀüÇÑ ÇÁ·Î±×·¥ÀÌ µÇ±â À§Çؼ´Â ¹«½ÃÇÒ ¼ö ¾ø´Â ºÎºÐÀÌ´Ù.
±×·³ ÀÌÁ¦ °ü·Ã ÇÔ¼öµéÀÌ ¿ÏºñµÇ¾úÀ¸¹Ç·Î ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î º¸ÀÚ. ¹®ÀÚ¿·Î µÈ ¸ÅÅ©·Î¸¸ Àü´ÞÇÏ¸é ¸ÅÅ©·Î¿¡ Æ÷ÇÔµÈ ¸í·ÉµéÀ» ÃßÃâÇÏ¿© ÆíÁý µ¿ÀÛÀ» ¼ø¼´ë·Î ½ÇÇàÇØ¾ß ÇÑ´Ù. ±×·¸´Ù¸é ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ÁÖü´Â °ú¿¬ ´©±¸Àϱî? ¸ÅÅ©·Î´Â È£½ºÆ®°¡ ½ÇÇàÇÒ ¼öµµ ÀÖ°í ÄÁÆ®·ÑÀÌ ½ÇÇàÇÒ ¼öµµ Àִµ¥ ´ç±ÙÀº ÄÁÆ®·ÑÀÌ ½ÇÇàÇÏ´Â °ÍÀÌ ¿©·¯ °¡Áö ¸é¿¡¼ ´õ È¿À²ÀûÀÌ´Ù.
È£½ºÆ®°¡ ApiEditÀÇ ÆíÁý ¸í·ÉÀ» ÀÏÀÏÀÌ È£ÃâÇÏ¿© ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â °Íµµ ÇϳªÀÇ ¹æ¹ýÀ̱â´Â ÇÏÁö¸¸ ÀÌ·¸°Ô µÇ¸é ¸ÅÅ©·Î´Â ApiEdit ±â´É ¸ñ·Ï¿¡¼ Á¦¿ÜµÇ¾î ¹ö¸®¹Ç·Î ÁÁÁö ¾Ê´Ù. ¶ÇÇÑ ¸ÅÅ©·Î³»ÀÇ ÆíÁý ¸í·ÉµéÀÌ ±×·ìÀ» ±¸¼ºÇØ¾ß Çϱ⠶§¹®¿¡ È£½ºÆ®°¡ ÀÌ ÀÛ¾÷À» Çϱ⿡´Â ÀûÀýÇÏÁö ¾Ê´Ù. ApiEdit¿¡ ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â µÎ °³ÀÇ ¸â¹ö ÇÔ¼ö¸¦ ¼±¾ðÇÑ´Ù.
class CApiEdit : public CWindow
{
....
int DoCommand(const TCHAR *szCom);
void ExecMacro(const TCHAR *szMacro);
¸ÅÅ©·Î´Â ¸í·ÉµéÀÇ ÁýÇÕÀ¸·Î ±¸¼ºµÈ´Ù. DoCommand ÇÔ¼ö´Â ¸í·É Çϳª¸¸ ½ÇÇàÇÏ´Â ÇÔ¼öÀ̸ç ExecMacro´Â ¸ÅÅ©·Î Àüü¸¦ ½ÇÇàÇÏ´Â ¸í·ÉÀÌ´Ù. ExecMacro°¡ ¸ÅÅ©·ÎÀÇ ¸í·ÉÀ» ºÐ¸®ÇÏ¿© DoCommand ÇÔ¼ö¸¦ Â÷·Ê´ë·Î È£ÃâÇÏ´Â ±¸Á¶ÀÌ´Ù. DoCommand´Â ¸ðµç ¸ÅÅ©·Î ¸í·ÉÀ» ½ÇÇàÇØ¾ß ÇϹǷΠµ¢Ä¡°¡ ±²ÀåÈ÷ Å©´Ù. °¢ ¸í·É¿¡ ´ëÇØ ¶Ç ¸ñÀû¾î¿¡ ´ëÇØ ºÐ±âÇÏ´Â °Å´ëÇÑ switch ¹®À¸·Î ±¸¼ºµÈ´Ù.
// ¸í·É ½ÇÇà. NULL ¶Ç´Â °³ÇàÀ» ¸¸³¯ ¶§±îÁö¸¦ ÇϳªÀÇ ¸í·ÉÀ¸·Î º»´Ù.
// 0: Á¤»ó ½ÇÇà
// -1:µ¿»ç ¾øÀ½
// -2:Áö¿øµÇÁö ¾Ê´Â ¸ñÀû¾î
// -3:´Ý´Â µû¿ÈÇ¥ ¾øÀ½
int CApiEdit::DoCommand(const TCHAR *szCom)
{
int comlen;
const TCHAR *pc, *ps, *p;
TCHAR *Com, *pCom;
int Verb, Object;
TCHAR *str,*str2;
BOOL bShift;
int Result=0;
int Count, nCount;
DWORD tFlag;
CApiEditText *pView;
// Ç×»ó È°¼ººä¿¡ ´ëÇØ µ¿ÀÛÇØ¾ß ÇÑ´Ù.
pView=GetActiveView();
// ¼±Çà °ø¹éÀº ¹«½ÃÇÑ´Ù.
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;
}
}
// µ¿»ç¸¦ ¸ÕÀú ã´Â´Ù.
p=Com;
Verb=GetComVerb(p,arComVerb);
if (Verb==-1) {
Result=-1;
goto End;
}
switch (Verb) {
case AEC_MOVE:
case AEC_MOVESEL:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
if (Verb==AEC_MOVE) {
bShift=FALSE;
} else {
bShift=TRUE;
}
Count=GetComNumber(p,1);
for (nCount=0;nCount<Count;nCount++) {
switch (Object) {
default:
case -1:
Result=-2;
goto End;
case AECM_LEFT:
pView->ProcessKey(VK_LEFT,FALSE,bShift);
break;
case AECM_RIGHT:
pView->ProcessKey(VK_RIGHT,FALSE,bShift);
break;
case AECM_UP:
pView->ProcessKey(VK_UP,FALSE,bShift);
break;
case AECM_DOWN:
pView->ProcessKey(VK_DOWN,FALSE,bShift);
break;
case AECM_HOME:
pView->ProcessKey(VK_HOME,FALSE,bShift);
break;
case AECM_END:
pView->ProcessKey(VK_END,FALSE,bShift);
break;
case AECM_PGUP:
pView->ProcessKey(VK_PRIOR,FALSE,bShift);
break;
case AECM_PGDN:
pView->ProcessKey(VK_NEXT,FALSE,bShift);
break;
case AECM_WLEFT:
pView->ProcessKey(VK_LEFT,TRUE,bShift);
break;
case AECM_WRIGHT:
pView->ProcessKey(VK_RIGHT,TRUE,bShift);
break;
case AECM_WORDHOME:
case AECM_WORDEND:
case AECM_LAST:
case AECM_NEXTPARA:
case AECM_PREVPARA:
case AECM_PARAHOME:
case AECM_PARAEND:
pView->Move(Object,bShift);
break;
pView->Move(2,bShift);
break;
case AECM_DOCHOME:
pView->ProcessKey(VK_HOME,TRUE,bShift);
break;
case AECM_DOCEND:
pView->ProcessKey(VK_END,TRUE,bShift);
break;
case AECM_PAREN:
pView->FindParen(bShift);
break;
}
}
break;
case AEC_INSERT:
GetComString(p,str);
if (str) {
Count=GetComNumber(p,1);
for (nCount=0;nCount<Count;nCount++) {
pView->InsertText(str);
}
free(str);
} else {
Result=-3;
goto End;
}
break;
case AEC_DELETE:
Count=GetComNumber(p,1);
for (nCount=0;nCount<Count;nCount++) {
pView->ProcessKey(VK_DELETE,FALSE,FALSE);
}
break;
case AEC_BS:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
Count=GetComNumber(p,1);
switch (Object) {
default:
case -1:
Result=-2;
goto End;
case 0:
for (nCount=0;nCount<Count;nCount++) {
pView->ProcessKey(VK_BACK,FALSE,FALSE);
}
break;
case 1:
for (nCount=0;nCount<Count;nCount++) {
pView->ProcessKey(VK_BACK,TRUE,FALSE);
}
break;
}
break;
case AEC_SELECT:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
switch (Object) {
default:
case -1:
Result=-2;
goto End;
case AECS_WORD:
case AECS_LINE:
case AECS_PARA:
case AECS_DOC:
pView->Select(Object);
break;
}
break;
case AEC_COPY:
SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPY,0),0);
break;
case AEC_COPYAPP:
SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPYAPPEND,0),0);
break;
case AEC_CUT:
SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUT,0),0);
break;
case AEC_CUTAPP:
SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUTAPPEND,0),0);
break;
case AEC_PASTE:
Count=GetComNumber(p,1);
for (nCount=0;nCount<Count;nCount++) {
SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_PASTE,0),0);
}
break;
case AEC_CONVERT:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
switch (Object) {
default:
case -1:
Result=-2;
goto End;
case AECC_UPPER:
pView->ChangeCase(0);
break;
case AECC_LOWER:
pView->ChangeCase(1);
break;
case AECC_REVERSECASE:
pView->ChangeCase(2);
break;
case AECC_UPPERFIRST:
pView->ChangeCase(3);
break;
case AECC_UPPSERSENT:
pView->ChangeCase(4);
break;
case AECC_TOTAB:
pView->ConvertSpaceTab(FALSE);
break;
case AECC_TOSAPCE:
pView->ConvertSpaceTab(TRUE);
break;
case AECC_REMOVESPACE:
pView->RemoveExtraSpace();
break;
case AECC_INDENT:
pView->BlockIndent(FALSE);
break;
case AECC_UNINDENT:
pView->BlockIndent(TRUE);
break;
case AECC_COMMENT:
pView->InsertComment(FALSE);
break;
case AECC_UNCOMMENT:
pView->InsertComment(TRUE);
break;
}
break;
case AEC_COPYCHAR:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
Count=GetComNumber(p,1);
for (nCount=0;nCount<Count;nCount++) {
switch (Object) {
default:
case -1:
Result=-2;
goto End;
case 0:
pView->CopyChar(0);
break;
case 1:
pView->CopyChar(1);
break;
}
}
break;
case AEC_SCROLL:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
Count=GetComNumber(p,1);
for (nCount=0;nCount<Count;nCount++) {
switch (Object) {
default:
case -1:
Result=-2;
goto End;
case AECS_UP:
pView->Scroll(-1);
break;
case AECS_DOWN:
pView->Scroll(1);
break;
case AECS_PGUP:
pView->Scroll(0,-1);
break;
case AECS_PGDN:
pView->Scroll(0,1);
break;
case AECS_HALFUP:
pView->Scroll(0,-2);
break;
case AECS_HALFDOWN:
pView->Scroll(0,2);
break;
case AECS_LEFT:
if (pView->GetWrap()==0) {
SendMessage(pView->hWnd,WM_HSCROLL,MAKELONG(SB_LINEUP,0),0);
}
break;
case AECS_RIGHT:
if (pView->GetWrap()==0) {
SendMessage(pView->hWnd,WM_HSCROLL,MAKELONG(SB_LINEDOWN,0),0);
}
break;
case AECS_PAGELEFT:
if (pView->GetWrap()==0) {
SendMessage(pView->hWnd,WM_HSCROLL,MAKELONG(SB_PAGEUP,0),0);
}
break;
case AECS_PAGERIGHT:
if (pView->GetWrap()==0) {
SendMessage(pView->hWnd,WM_HSCROLL,MAKELONG(SB_PAGEDOWN,0),0);
}
break;
}
}
break;
case AEC_SETMARK:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
if (Object == 0) {
pView->ToggleBookmark(-1,100);
} else {
pView->ToggleBookmark(-1,Object-1);
}
break;
case AEC_GOMARK:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
switch (Object) {
case 0:
pView->GotoBookmark(10);
break;
case 1:
pView->GotoBookmark(11);
break;
default:
pView->GotoBookmark(Object-2);
}
break;
case AEC_FIND:
GetComString(p,str);
if (str) {
tFlag=AE_FIND_WRAP;
if (strstr(p,"nowrap")) {
tFlag=tFlag & ~AE_FIND_WRAP;
}
if (strstr(p,"up")) {
tFlag=tFlag | AE_FIND_UP;
}
if (strstr(p,"word")) {
tFlag=tFlag | AE_FIND_WHOLEWORD;
}
if (strstr(p,"case")) {
tFlag=tFlag | AE_FIND_MATCHCASE;
}
pView->FindText(-1,str,tFlag);
free(str);
} else {
Result=-3;
goto End;
}
break;
case AEC_REPLACE:
GetComString(p,str);
if (str==NULL) {
Result=-3;
goto End;
}
GetComString(p,str2);
if (str2==NULL) {
free(str);
Result=-3;
goto End;
}
tFlag=AE_FIND_WRAP;
if (strstr(p,"nowrap")) {
tFlag=tFlag & ~AE_FIND_WRAP;
}
if (strstr(p,"up")) {
tFlag=tFlag | AE_FIND_UP;
}
if (strstr(p,"word")) {
tFlag=tFlag | AE_FIND_WHOLEWORD;
}
if (strstr(p,"case")) {
tFlag=tFlag | AE_FIND_MATCHCASE;
}
// 0(¾øÀ½), 2(±³Ã¼ ¿Ï·á)ÀÎ °æ¿ì´Â ´Ù½Ã È£ÃâÇÒ ÇÊ¿ä°¡ ¾øÀ½. 1(°Ë»ö¸¸)ÀÎ °æ¿ì´Â ´Ù½Ã Çѹø ´õ È£ÃâÇÑ´Ù.
if (pView->ReplaceText(-1,str,tFlag,str2)==1) {
pView->ReplaceText(-1,str,tFlag,str2);
}
free(str);
free(str2);
break;
case AEC_FOCUS:
Object=GetComObject(Verb,p,arComObject,arObjOfVerb);
switch (Object) {
default:
case 0:
ChangeActiveView(GetActiveView(),1);
goto End;
case 1:
ChangeActiveView(GetActiveView(),1);
break;
}
break;
}
End:
free(Com);
return Result;
}
°¢°¢ÀÇ case°¡ °íÀ¯ÀÇ ¸í·É°ú ¸ñÀû¾î¸¦ ó¸®ÇÏ´Â ±¸Á¶À̹ǷΠ±æÀÌ°¡ ±æ¾îµµ ¼Ò½º¸¦ Àбâ´Â ½±´Ù. Àμö·Î Àü´ÞµÈ ¸í·ÉÀ» ÀÏÂ÷·Î Çؼ®ÇÏ°í ÇÊ¿äÇÒ °æ¿ì ¸ñÀû¾î±îÁö Çؼ®ÇÏ¿© È°¼º ºä¿¡°Ô Àü´ÞÇϱ⸸ ÇÏ¸é µÈ´Ù. ApiEdit¿¡ °ü·Ã ¸í·ÉÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Â ÇÔ¼ö ÁýÇÕµéÀÌ Àß ±¸ºñµÇ¾î ÀÖÀ¸¹Ç·Î DoCommand ÇÔ¼ö´Â ÇÔ¼ö¸¦ È£ÃâÇϰųª ¸Þ½ÃÁö¸¦ º¸³»´Â °ÍÀ¸·Î ¸í·ÉÀ» °£´ÜÈ÷ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.
find ¸í·ÉÀÇ °æ¿ì ÇöÀç´Â ´Ü¼øÇÑ À̵¿ ¸í·ÉÀ̶ó°í º¼ ¼ö ÀÖ´Ù. °Ë»ö °á°ú¿¡ µû¸¥ ¿¡·¯ 󸮸¦ Çϸé È°¿ë¼ºÀÌ ´õ ³ô¾ÆÁöÁö¸¸ ±×·¸°Ô ÇÏ·Á¸é ¸í·ÉÀÌ °á°ú¸¦ ¸®ÅÏÇØ¾ß ÇÏ¸ç ¸®ÅÏ°ªÀ» ¹ÞÀ» ¼ö ÀÖ´Â º¯¼öÀÇ °³³äÀÌ ÇÊ¿äÇÏ´Ù. º¯¼ö°ªÀ» ºñ±³ÇÏ·Á¸é ºñ±³ ¿¬»êÀÚ°¡ ÇÊ¿äÇÏ°í Á¶°Ç¹®ÀÌ ÀÖ¾î¾ß ÇÏ¸ç º¯¼ö¸¦ °¡°øÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀÇ °³³ä, ¹Ýº¹¹® µîÀÇ ÇÊ¿äÇØ Áø´Ù. °á±¹ °£´ÜÇÑ ¸ÅÅ©·Î ¼öÁØ¿¡¼´Â ºÒ°¡´ÉÇÏ¸ç ´ÙÀ½ ¹öÀü¿¡¼³ª ½ÃµµÇØ º¼ °ÍÀÌ´Ù.
DoCommand ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ ¹®ÀÚ¿¿¡¼ µ¿»ç¿Í ¸ñÀû¾î¸¦ ºÐ¸®ÇØ °ü·Ã ¸í·ÉÀ» ½ÇÇàÇÏ°í ¸®ÅÏÇϹǷΠ´Ü ÇϳªÀÇ ¸í·É¸¸ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ¸í·ÉÀÇ ÁýÇÕÀÎ ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ÇÔ¼ö´Â ExecMacroÀε¥ ¸ÅÅ©·Î ½ÇÇàÀÇ ÁÖü¶ó°í ÇÒ ¼ö ÀÖ´Ù. ¸ÅÅ©·Î¿¡ Æ÷ÇԵǴ ¸í·ÉÀÌ º¹ÀâÇؼ ´ë´ÜÈ÷ °Å´ëÇÒ °Í °°Áö¸¸ °ü·Ã ¼ºê ·çƾÀÌ Àß ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î »ý°¢º¸´Ù ±æÁö ¾Ê´Ù.
void CApiEdit::ExecMacro(const TCHAR *szMacro)
{
const TCHAR *pc;
int Result,ParentResult;
StartUndoGroup(21);
for (pc=szMacro;;) {
if (*pc==NULL) {
break;
}
// ¸í·É ½ÇÇà.
Result=DoCommand(pc);
// ±¸¹®»óÀÇ ¿¡·¯ÀÌ¸é ¸ÅÅ©·Î Á¾·á
if (Result < -1) {
break;
}
// µ¿»ç°¡ ¾øÀ¸¸é ÀÏ´Ü ºÎ¸ð¿¡°Ô ¸ÕÀú ¹°¾îº»´Ù.
if (Result==-1) {
ParentResult=SendMessage(GetParent(hWnd),UserBase+2,0,(LPARAM)pc);
// ºÎ¸ð°¡ ó¸®ÇØ ÁÖÁö ¾ÊÀ¸¸é ¸ÅÅ©·Î Á¾·á.
// 0ÀÎ °æ¿ì : Á¤»ó ½ÇÇà, ¶Ç´Â ¹«½ÃµÈ »óȲ => °è¼Ó ½ÇÇàÇÑ´Ù.
if (ParentResult < 0) {
break;
}
}
// ´ÙÀ½ ¸í·É ãÀ½
for (;;pc++) {
// °³Çà Äڵ带 ã¾ÒÀ¸¸é ´ÙÀ½ ÁÙ·Î
if (*pc=='\r') {
pc+=2;
break;
}
if (*pc==';') {
pc++;
break;
}
// NULLÀ» ã¾ÒÀ¸¸é ±×³É ³ª°¨. ¹Ù±ù ·çÇÁ ¼±µÎ¿¡¼ Å»ÃâÇÔ
if (*pc==NULL) {
break;
}
// ¹®ÀÚ¿ °Ç³Ê ¶Ü. ÀÌ ½ÃÁ¡¿¡¼´Â ÀÌ¹Ì ½ÇÇàµÈ ¸í·ÉÀ» °Ç³Ê¶Ù´Â ÁßÀ̹ǷΠ´Ý´Â µû¿ÈÇ¥°¡ ¹Ýµå½Ã ÀÖÀ½
// ¸¸¾à ¾ø¾ú´Ù¸é ¾ÕÂÊ DoCommand¿¡¼ ÀÌ¹Ì ¿¡·¯¸¦ ¸®ÅÏÇß°í ¸ÅÅ©·Î Á¾·áµÇ¾úÀ½
SkipString(pc);
}
}
EndUndoGroup();
}
¸í·É ÁýÇÕ¿¡¼ ¸í·ÉÀ» ÃßÃâÇÏ¿© ¼ø¼´ë·Î ½ÇÇàÇϱ⸸ ÇÏ¸é µÈ´Ù. ¸ÅÅ©·Î³»ÀÇ ¸í·ÉµéÀº °³Çà Äڵ峪 ¼¼¹ÌÄÝ·ÐÀ¸·Î ±¸ºÐµÇ¹Ç·Î ±¸ºÐÀÚ¸¦ °Ç³Ê¶Ù¸é¼ ¸í·ÉµéÀ» ÃßÃâÇÏ¿© DoCommand¸¦ È£ÃâÇÑ´Ù. DoCommand ÇÔ¼ö´Â ¸í·É ½ÇÇà °á°ú¸¦ ¸®ÅÏÇϴµ¥ ¸®ÅÏ°ªÀÇ Àǹ̴ ÁÖ¼®¿¡ Àß ±â·ÏµÇ¾î ÀÖ´Ù. ¸¸¾à µ¿»ç¾øÀ½ ÀÌ¿ÜÀÇ ±¸¹® ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é À̶§´Â ¸ÅÅ©·Î ½ÇÇà Àüü¸¦ Á¾·áÇÑ´Ù.
¸®ÅÏ°ªÀÌ -1À̸é ÄÁÆ®·ÑÀÌ Á÷Á¢ ÀÌÇØÇÏÁö ¸øÇÏ´Â µ¿»ç¶ó´Â ¶æÀε¥ À̶§´Â ºÎ¸ð À©µµ¿ì¿¡°Ô UserBase+2¸¦ º¸³» 󸮸¦ ÀÇ·ÚÇÑ´Ù. ÇÔ¼ö¸¦ ºÎ¸£Áö ¸øÇÏ°í ¸Þ½ÃÁö¸¦ º¸³»´Â ÀÌÀ¯´Â ÄÁÆ®·ÑÀÇ µ¶¸³¼º È®º¸¸¦ À§ÇؼÀε¥ È£½ºÆ®°¡ ÀÌ ¸Þ½ÃÁö¸¦ ¹«½ÃÇÏ°Ç Á¦´ë·Î ó¸®ÇØ ÁÖ°Ç »ó°ü¾øÀÌ ÄÁÆ®·ÑÀ» ½ÇÇàµÇ¾î¾ß ÇÑ´Ù. ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ±¸Á¶¶ó¸é È£½ºÆ®´Â ¹Ýµå½Ã ÄÁÆ®·ÑÀÇ ¸ÅÅ©·Î È£ÃâÀ» ó¸®ÇÏ´Â ÇÔ¼ö¸¦ Á¦°øÇØ¾ß ÇÏ´Â °Á¦ Àǹ«¸¦ ºÎ¿©¹Þ°Ô µÈ´Ù. ÀÌ Á¡¿¡ ´ëÇؼ´Â ¾Õ¿¡¼µµ ¼³¸íÇÑ ÀûÀÌ ÀÖ´Ù.
UserBase+2°¡ 0À» ¸®ÅÏÇÑ °æ¿ì´Â ½ÇÇà¿¡ ¼º°øÇ߰ųª ¶Ç´Â ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÏÁö ¾Ê°í ¹«½ÃÇÏ´Â °æ¿ì µÎ °¡Áö°¡ ÀÖ´Ù. ApiEdit´Â È£½ºÆ®°¡ ¹«½ÃÇß´õ¶óµµ ¼º°øÀ¸·Î °£ÁÖÇϴµ¥ Áï, È£½ºÆ®°¡ ó¸®ÇÏÁö ¾Ê´Â ¸í·ÉÀº ±×³É ¹«½ÃÇÏ´Â °ÍÀÌ´Ù. ApiEditÀÇ ¸ÅÅ©·Î´Â ÅؽºÆ® ÆíÁý¿¡ °ü·ÃµÈ ¸í·ÉÀ¸·Î ±¸¼ºµÇÁö¸¸ È£½ºÆ®ÀÇ ¸ÅÅ©·Î´Â À̺¸´Ù ÈξÀ ´õ È®ÀåµÈ Àǹ̸¦ °¡Áú ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î ¹®¼ ¿ÜºÎ¿¡¼ ó¸®ÇØ¾ß ÇÏ´Â Àϵµ ¸í·ÉÀ¸·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. È£½ºÆ®ÀÇ ¸í·ÉÀº Àá½Ã ÈÄ¿¡ ÀÛ¼ºÇÒ °ÍÀÌ´Ù.
¸ÅÅ©·Î¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Â ÇÔ¼öµéÀÌ ¿Ï¼ºµÇ¾ú´Âµ¥ ¾ÆÁ÷ ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇÏ´Â UI´Â ¸¸µé¾îÁöÁö ¾Ê¾Ò´Ù. ±×·¡¼ Å×½ºÆ®¸¦ À§ÇØ ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ÀÓ½ÃÀûÀÎ ´ÜÃàÅ°¸¦ ¸¸µé°í ¿©±â¿¡ °£´ÜÇÑ ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇØ º¸ÀÚ. ProcessKey¿¡¼ VK_F4, VK_F5 µîÀÇ Å°¿¡¼ °£´ÜÇÑ ¸ÅÅ©·Î·Î ExecMacroÇÔ¼ö¸¦ È£ÃâÇØ º¸ÀÚ.
void CApiEditText::ProcessKey(UINT vk,BOOL bControl,BOOL bShift)
{
...
switch (vk) {
case VK_F4:
pFrame->ExecMacro("movesel left;cut;move right;paste;move left");
break;
case VK_F5:
pFrame->ExecMacro("move wordhome;insert \"<\";move wordend;insert \">\";move wright");
break;
¸ÅÅ©·ÎÀÇ ³»¿ëÀº ¾î·ÆÁö ¾Ê°Ô Çؼ®µÈ´Ù. F4´Â ¿ÞÂÊÀ¸·Î ÇÑÄ ¼±ÅÃÀ̵¿ÇÑ ÈÄ Àß¶ó³»°í ¿À¸¥ÂÊÀ¸·Î À̵¿ÇÏ¿© ºÙÀÌ°í ´Ù½Ã ¿ÞÂÊÀ¸·Î À̵¿ÇÔÀ¸·Î½á ¾ÕµÚ ±ÛÀÚ¸¦ ±³Ã¼ÇÑ´Ù. ½ÇÁ¦ Å°º¸µå·Î ÀÌ µ¿ÀÛÀ» ¿¬¼ÓÀûÀ¸·Î ÇØ º¸¸é ¹®ÀÚ ±³È¯À̶ó´Â °ÍÀ» ½±°Ô ¾Ë ¼ö ÀÖ´Ù. F5´Â ÇöÀç ´Ü¾î¸¦ < >°ýÈ£·Î °¨½Î°í ´ÙÀ½ ´Ü¾î·Î À̵¿ÇÑ´Ù.
º¸´Ù½ÃÇÇ ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¸é µÎ °³ ÀÌ»óÀÇ ¸í·ÉÀ» ÇѲ¨¹ø¿¡ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. À§ ¸ÅÅ©·Î ±¸¹®Àº ºñ±³Àû °£´ÜÇÑ ÆíÀε¥ Á» ´õ º¹ÀâÇÏ°Ô ÀÛ¼ºÇÏ¸é ¾ó¸¶µçÁö ½Ç¿ëÀûÀ¸·Î ÀÀ¿ëÇÒ ¼ö ÀÖ´Â °÷ÀÌ ¸¹´Ù. Å×½ºÆ®°¡ ³¡³µÀ¸¸é ÀÌ ÄÚµå´Â »èÁ¦ÇÏÀÚ. Àá½Ã ÈÄ ¸ÅÅ©·Î ÀÛ¼º ´ëÈ»óÀÚ¸¦ ¸¸µé¸é ¾ó¸¶µçÁö º¹ÀâÇÑ ¸ÅÅ©·Î¸¦ Á÷Á¢ ¸¸µé ¼ö ÀÖ´Ù.