»ó¿ë±¸¸¦ »ðÀÔÇÏ·Á¸é »ó¿ë±¸ â¿¡¼ ¿øÇÏ´Â »ó¿ë±¸¸¦ °ñ¶ó ´õºíŬ¸¯ÇØ¾ß ÇÑ´Ù. Áï, »ó¿ë±¸¸¦ ¾²°í ½ÍÀ¸¸é ŸÀÌÇÁÁß¿¡ ¸¶¿ì½º·Î ¼ÕÀÌ °¡¾ß ÇÑ´Ù´Â ¾ê±âÀε¥ ÀÌ´Â ¿ÀÈ÷·Á ŸÀÌÇÎ ¼Óµµ¸¦ ¶³¾î¶ß¸®°í Á¤½ÅÀ» »ê¸¸ÇÏ°Ô ¸¸µé¾î ¾È ¾²´À´Ï¸¸µµ ¸øÇÑ °á°ú¸¦ ÃÊ·¡Çϱ⵵ ÇÑ´Ù. ÀÚµ¿ »ó¿ë±¸ ±â´ÉÀº ¹Ì¸® µî·ÏµÈ ¹®ÀÚ¿À» ÀÔ·ÂÇϱ⸸ ÇÏ¸é »ó¿ë±¸·Î ´ëÃ¼ÇØ ÁÖ´Â ±â´ÉÀÌ´Ù. Űº¸µå·Î »ó¿ë±¸¸¦ ¹Ù·Î ÀÔ·ÂÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÀÛ¾÷ ¼Óµµ°¡ ÈξÀ ´õ ºü¸£´Ù.
ÀÚµ¿ »ó¿ë±¸¸¦ »ðÀÔÇÒ ½ÃÁ¡Àº ÄÁÆ®·ÑÀÌ ¹®ÀåÀ» ¹Ì¸® ¾à¼ÓµÈ ¹®ÀÚ¿À» ÀԷ¹޾ÒÀ» ¶§ÀÌ°í »ó¿ë±¸ ¹À½Àº È£½ºÆ®°¡ °ü¸®ÇϹǷΠÀÌ ±â´ÉÀ» ±¸ÇöÇÏ·Á¸é ÄÁÆ®·Ñ°ú È£½ºÆ®°¡ »óÈ£ ±ä¹ÐÈ÷ ÇùÁ¶ÇØ¾ß ÇÑ´Ù. ÄÁÆ®·ÑÀº ÀÔ·ÂµÈ ¹®ÀÚ¿ÀÌ ÀÚµ¿ »ó¿ë±¸ »ðÀÔ¸íÀ̸é È£½ºÆ®¿¡¼¼ »ðÀÔ¸íÀ» °¡Áö´Â »ó¿ë±¸°¡ ÀÖ´ÂÁö ¹°¾îº¸¾Æ¾ß Çϰí È£½ºÆ®´Â »ó¿ë±¸ÀÇ ³»¿ëÀ» ÄÁÆ®·Ñ¿¡°Ô Àü´ÞÇØ¾ß ÇÑ´Ù. ÀÌ ±â´ÉÀ» ±¸ÇöÇÏ·Á¸é È£½ºÆ®¿¡ ÇöÀç ¿·ÁÁø »ó¿ë±¸ ¹À½¿¡¼ »ðÀÔ¸íÀ¸·Î »ó¿ë±¸¸¦ °Ë»öÇÏ´Â ±â´ÉÀÌ ÇÊ¿äÇÏ´Ù. Clip.cpp¿¡ ´ÙÀ½ µÎ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
// ¿·ÁÁø »ó¿ë±¸¿¡¼ »ó¿ë±¸¸¦ °Ë»öÇÑ´Ù.
CClipRecord *FindClipRecord(TCHAR *Name,BOOL bAutoName)
{
HTREEITEM hRoot;
CClipRecord *cr;
hRoot=TreeView_GetRoot(hClipTree);
while (hRoot) {
cr=FindClipRecordSub(hRoot,Name,bAutoName);
if (cr) {
return cr;
}
hRoot=TreeView_GetNextSibling(hClipTree,hRoot);
}
return NULL;
}
// hRoot Æ®¸®¿¡¼ »ó¿ë±¸¸¦ °Ë»öÇÑ´Ù.
CClipRecord *FindClipRecordSub(HTREEITEM hRoot,TCHAR *Name,BOOL bAutoName)
{
HTREEITEM hChild;
TVITEM TV;
CClipRecord *cr;
hChild=TreeView_GetChild(hClipTree,hRoot);
while (hChild) {
TV.mask=TVIF_PARAM | TVIF_IMAGE;
TV.hItem=hChild;
TreeView_GetItem(hClipTree,&TV);
// Æú´õÀ̸é Àç±ÍÈ£ÃâÇÑ´Ù.
if (TV.iImage==DGI_CLIPFOLDER) {
cr=FindClipRecordSub(hChild,Name,bAutoName);
if (cr) {
return cr;
}
} else {
// ÀÚµ¿ »ðÀÔ¸í ¶Ç´Â À̸§À¸·Î °Ë»öÇÑ´Ù.
cr=(CClipRecord *)TV.lParam;
if (bAutoName) {
if (lstrcmpi(cr->AutoName,Name) == 0) {
return cr;
}
} else {
if (lstrcmpi(cr->Name,Name) == 0) {
return cr;
}
}
}
hChild=TreeView_GetNextSibling(hClipTree,hChild);
}
return NULL;
}
»ó¿ë±¸ Æ®¸®ÀÇ ¸ðµç ³ëµå¸¦ ´Ù ¼øÈ¸ÇÏ¸é¼ À̸§, ÀÚµ¿»ðÀÔ¸íÀ¸·Î °Ë»öÇØ¾ß ÇϹǷΠÀç±Í È£ÃâÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ´ÙÇàÈ÷ ¸Þ¸ð¸®³»¿¡¼ÀÇ °Ë»öÀ̶ó ºü¸£±â´Â ÇÏÁö¸¸ ¸ðµç ³ëµå¸¦ °Ë»öÇØ¾ß ÇϹǷΠ»ó¿ë±¸ ¹À½ÀÌ Å©´Ù¸é ½Ã°£ÀÌ Á¶±Ý °É¸± ¼öµµ ÀÖ´Ù. ¶ÇÇÑ ½ºÆäÀ̽º³ª ÅÇÀ» ÀÔ·ÂÇÒ ¶§¸¶´Ù ¹Ýº¹µÇ±â ¶§¹®¿¡ ÀüüÀûÀÎ ¼º´ÉÀ» ÀúÇϽÃŰ´Â ¿äÀÎÀÌ µÉ ¼öµµ ÀÖ´Ù. ÀÌ µ¿ÀÛÀ» Á» ´õ ºü¸£°Ô ÇÏ°í ½Í´Ù¸é º°µµÀÇ À妽º¸¦ À¯ÁöÇϰųª ij½Ã ±â¹ýÀ» µµÀÔÇÏ´Â °ÍÀÌ ÁÁ´Ù.
»ðÀÔ¸í °Ë»ö¿¡ ´ë¼Ò¹®ÀÚ ±¸ºÐÀº ÇÏÁö ¾Ê¾Ò´Âµ¥ »ó¿ë±¸³¢¸® ´ë¼Ò¹®ÀÚ°¡ ´Ù¸¥ »ðÀÔ¸íÀ» ÁöÁ¤ÇÏ´Â °æ¿ì´Â °ÅÀÇ ¾øÀ» °ÍÀ̹ǷΠ±¸ºÐÇÏÁö ¾Ê´Â °ÍÀÌ ´õ ¹Ù¶÷Á÷ÇÏ´Ù. ÇÊ¿äÇÏ´Ù¸é ´ë¼Ò¹®ÀÚ ±¸ºÐ ¿©ºÎ¸¦ ¿É¼ÇÀ¸·Î ¸¸µé ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. °Ë»öµÇ¾úÀ¸¸é »ó¿ë±¸ ·¹ÄÚµåÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÌ Æ÷ÀÎÅÍ´Â Æ®¸®ÀÇ °¢ ³ëµå¿¡ ÇÒ´çµÇ¾î ÀÖÀ¸¹Ç·Î Ç×»ó ½Å¼ÓÇÏ°Ô ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.
ApiEdit ¿¡ ÀÚµ¿ »ó¿ë±¸ 󸮸¦ À§ÇÑ ¿É¼Ç º¯¼öµéÀ» Ãß°¡ÇÑ´Ù. ÀÚµ¿ »ó¿ë±¸ ±â´ÉÀ» »ç¿ëÇÒ °ÍÀΰ¡¿Í ÅÇŰ·Î ÀÚµ¿ »ó¿ë±¸¸¦ »ðÀÔÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù.
class CApiEdit : public CWindow
{
private:
....
BOOL bUseAutoClip;
BOOL bAutoClipByTab;
public:
....
BOOL GetUseAutoClip() { return bUseAutoClip; }
void SetUseAutoClip(BOOL aValue) { bUseAutoClip=aValue; }
BOOL GetAutoClipByTab() { return bAutoClipByTab; }
void SetAutoClipByTab(BOOL aValue) { bAutoClipByTab=aValue; }
};
ÀÌ ¿É¼Ç°ªÀº ½Ç½Ã°£À¸·Î Á¡°ËµÇ¸ç ¿É¼ÇÀÌ º¯°æµÉ ¶§ Ưº°ÇÑ ºÎ°¡ 󸮰¡ ÇÊ¿ä¾øÀ¸¹Ç·Î Set ÇÔ¼öµµ ÀζóÀÎÀ¸·Î ÀÛ¼ºÇß´Ù. Å×½ºÆ®¸¦ À§ÇØ »ý¼ºÀÚ¿¡¼ µÑ ´Ù TRUE ·Î ÃʱâÈÇÑ´Ù.
CApiEdit::CApiEdit()
{
....
bUseAutoClip=TRUE;
bAutoClipByTab=TRUE;
}
Á¡°ËÇÒ ÁÖü´Â ¹®ÀÚ¿ ÀÔ·ÂÀ» ¹Þ´Â ºä, Áï ÅØ½ºÆ® ºä¿¡¸¸ ±¹ÇѵȴÙ. Çí»çºä¿¡¼´Â ¹®ÀÚ¸¦ ÀÔ·ÂÇÏ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î Àǹ̾ø´Ù. ÅØ½ºÆ® ºä¿¡ ´ÙÀ½ ¼¼ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
class CApiEditText : public CWindow
{
....
virtual void TestAutoClip(int ch);
virtual int GetAutoClipName();
virtual void ReplaceClipText(TCHAR *Text);
};
Çí»ç ºä´Â ÀÌ ÇÔ¼ö¸¦ ¾²Áö ¾ÊÁö¸¸ Â÷ÈÄ¿¡ ´Ù¸¥ ºä´Â ÀÌ ÇÔ¼ö¸¦ ¾µ ¼öµµ ÀÖÀ¸¹Ç·Î °¡»ó ÇÔ¼ö·Î ¼±¾ðÇØ¾ß ÇÑ´Ù. ´ÙÀ½ µÎ ÇÔ¼ö´Â ÀÚµ¿ »ó¿ë±¸ ÀÔ·ÂÀ» °Ë»çÇÑ´Ù.
void CApiEditText::TestAutoClip(int ch)
{
TCHAR *pWord;
int toff,len;
// ÃÖ¼ÒÇÑ 2±ÛÀÚ´Â ÀԷµǾî ÀÖ¾î¾ß °Ë»öÀÇ Àǹ̰¡ ÀÖ´Ù.
if (pFrame->bUseAutoClip && off >= 2) {
if ((pFrame->bAutoClipByTab && ch=='\t') ||
(pFrame->bAutoClipByTab==FALSE && ch==' ')) {
toff=GetAutoClipName();
len=off-1-toff;
// lenÀÌ 0ÀÎ °æ¿ì : °è¼Ó °ø¹é¸¸ À̾îÁö´Â °æ¿ì. ¾ÕÂÊ ´Ü¾î°¡ ¾øÀ½
if (len) {
pWord=(TCHAR *)calloc(len+1,1);
memcpy(pWord,pFrame->buf+toff,len);
if (SendMessage(GetParent(pFrame->hWnd),pFrame->UserBase+3,0,(LPARAM)pWord)) {
Invalidate(pFrame->FindParaStart(toff));
}
free(pWord);
}
}
}
}
int CApiEditText::GetAutoClipName()
{
int toff;
// ¾ÕÂÊÀÇ °ø¹é ¾Æ´Ñ ¹®ÀÚ¸¦ ãÀ½. ±¸ºÐÀÚ °³³äÀÌ ¾øÀ¸¹Ç·Î GetPrevWord µîÀ» ¾µ ¼ö ¾øÀ½
for (toff=off-2;;toff--) {
if (AeIsWhiteSpace(pFrame->buf[toff]) || pFrame->buf[toff] == '\n') {
toff++;
break;
}
if (toff==0) {
break;
}
}
return toff;
}
ÀÚµ¿ »ó¿ë±¸ ¿É¼ÇÀÌ ÄÑÁ® ÀÖ¾î¾ß Çϰí ÃÖ¼ÒÇÑ 2 ±ÛÀÚ´Â ÀԷµǾî ÀÖ¾î¾ß ÇÑ´Ù. ¿Ö ÃÖ¼ÒÇÑ µÎ ±ÛÀÚÀΰ¡ Çϸé ÀÚµ¿»ðÀÔ¸í 1ÀÚ, ½ºÆäÀ̽º³ª ÅÇ 1ÀÚ ±îÁö´Â ÀԷµǾî ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ÀÌ Á¶°ÇÀÌ ¸ÂÀ» ¶§ ÀÚµ¿ »ó¿ë±¸ »ðÀÔ¸íÀÌ ÀԷµǾú´ÂÁö º»´Ù. GetAutoClipName ÇÔ¼ö´Â ÇöÀç À§Ä¡¿¡¼ µÎ Ä ¾ÕÂÊÀÇ ´Ü¾î¸¦ ±¸ÇÑ´Ù. »ðÀÔ¸í ÃßÃâ¿¡ °ø¹é(ÅÇ Æ÷ÇÔ)À̳ª °³Çà Äڵ常 ±¸ºÐÀÚ°¡ µÇ¸ç µû¶ó¼ GetPrevWord µûÀ§ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ÀÌ ÇÔ¼ö°¡ Á¶»çÇÑ ¿ÀÇÁ¼Â¿¡¼ ÇöÀç À§Ä¡-1±îÁö, Áï °ø¹éÀ̳ª ÅÇÀº Á¦¿ÜÇÑ ´Ü¾î¸¦ ÃëÇϸé ÀÌ ´Ü¾î°¡ »ðÀÔ¸íÀÌ´Ù.
Àӽà ¹öÆÛ¸¦ ÇÒ´çÇÑ ÈÄ ÇÁ·¹ÀÓÀÇ ºÎ¸ð À©µµ¿ì, ±×·¯´Ï±î ApiEdit ÄÁÆ®·ÑÀÇ ºÎ¸ð À©µµ¿ì¿¡°Ô UserBase+3 ¸Þ½ÃÁö¸¦ º¸³» ÀÚµ¿ »ó¿ë±¸ Á¡°ËÀ» ¿äûÇÑ´Ù. »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁö¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯¿¡ ´ëÇØ¼´Â ¾Õ¼ ¸î ¹ø ¼³¸íÇÑ ¹Ù ÀÖ´Ù. À̶§ lParamÀ¸·Î ÃßÃâµÈ ¾ÕÂÊ ´Ü¾î¸¦ Àü´ÞÇÑ´Ù. ApiEditÀÇ ºÎ¸ð À©µµ¿ì´Â UserBase+3À» ¹Þ¾ÒÀ» ¶§ »ó¿ë±¸ ¹À½¿¡¼ »ðÀÔ¸í °Ë»öÀ» ÇÑ ÈÄ ÀÚµ¿ »ó¿ë±¸À̸é ReplaceClipText ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
CClipRecord *cr;
pSi=(SInfo *)GetWindowLongPtr(hWnd,0);
if (pSi && iMessage > WM_USER) {
....
if (iMessage == pSi->Ae.GetUserBase()+3) {
cr=FindClipRecord((TCHAR *)lParam,TRUE);
if (cr) {
hActive=(HWND)SendMessage(g_hMDIClient, WM_MDIGETACTIVE,0,NULL);
pSi=(SInfo *)GetWindowLong(hActive,0);
pSi->Ae.GetActiveView()->ReplaceClipText(cr->Content);
return 1;
}
return 0;
}
}
lParamÀ¸·Î Àü´ÞµÈ ´Ü¾î¸¦ °Ë»öÇØ º¸°í ÀÖÀ¸¸é ÀÚµ¿ »ó¿ë±¸·Î ´ëüÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö°¡ ÀÚµ¿»ó¿ë±¸ ´ëü¸¦ ÇÑ´Ù.
// Á÷ÀüÀÇ ´Ü¾î¸¦ Text »ó¿ë±¸·Î ´ëüÇÑ´Ù.
void CApiEditText::ReplaceClipText(TCHAR *Text)
{
int toff;
toff=GetAutoClipName();
pFrame->StartUndoGroup(23);
Delete(toff,off-toff);
off=toff;
InsertClipText(Text);
pFrame->EndUndoGroup();
}
InsertClipText ÇÔ¼ö¿Í À¯»çÇ쵂 ÀÚµ¿»ðÀÔ¸íÀ» ã¾Æ¼ ´ëüÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. À̶§ ÀÚµ¿ »ó¿ë±¸ °Ë»çŰÀÎ ÅÇÀ̳ª °ø¹é±îÁö °°ÀÌ ´ëÃ¼ÇØ¾ß ÇÑ´Ù. ÇѰ¡Áö ¾Æ½¬¿î Á¡Àº ÀÚµ¿ µé¿©¾²±â±îÁö Á¶Á¤ÇÏÁö´Â ¸øÇÑ´Ù´Â Á¡Àε¥ ¿¹¸¦ µé¾î for¹®À» »ðÀÔÇϸé ÇöÀç »ðÀԵǴ ºí·ÏÀÇ µé¿©¾²±â »óÅ¿¡ µû¶ó µé¿©¾²±â°¡ Á¶Á¤µÇ´Â °ÍÀÌ ÁÁ´Ù. ÀÌ ±â´ÉÀº ÄÄÆÄÀÏ·¯ ¼öÁØÀÇ ±¸¹® ºÐ¼® ´É·ÂÀ» ¿ä±¸ÇϹǷΠÀÏ´ÜÀº ÀÖ´Â ±×´ë·Î »ðÀÔÇϱâ·Î ÇÏ°í ´ÙÀ½¿¡ °³¼±ÇØ º¼ »ý°¢ÀÌ´Ù. TestAutoClip ÇÔ¼ö´Â ´ÙÀ½ µÎ ÇÔ¼ö¿¡¼ È£ÃâÇÑ´Ù.
void CApiEditText::OnChar(HWND hWnd, TCHAR ch, int cRepeat)
{
....
SetCaret();
TestAutoClip(ch);
}
LRESULT CApiEditText::OnImeChar(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
SetCaret();
TestAutoClip(wParam);
return 0;
}
¹®ÀÚ ÀԷ¿¡ ´ëÇÑ ¸ðµç 󸮰¡ ³¡³ ÈÄ ÀÚµ¿ »ó¿ë±¸¸¦ Á¡°Ë ÇÑ´Ù. ÇÑ±Û ´ÙÀ½¿¡ À̾îÁö´Â °ø¹éÀ̳ª ÅÇÀº OnImeChar ÇÔ¼ö·Î Àü´ÞµÇ¹Ç·Î ÀÌ ÇÔ¼ö¿¡¼µµ ÀÚµ¿»ó¿ë±¸ Á¡°ËÀ» ÇØ¾ß ÇÑ´Ù. ÀÚµ¿ »ó¿ë±¸ »ðÀÔ ¹®ÀÚ·Î °ø¹éÀ̳ª ÅÇÀ» ¼±ÅÃÇÒ ¼ö Àִµ¥ °ø¹éÀº ³Ê¹« ÀÚÁÖ ÀÔ·ÂµÇ°í ¿ì¿¬È÷¶óµµ »ðÀÔ¸í°ú °°Àº ¹®ÀÚ¿ÀÌ ÀÔ·ÂµÉ ¼öµµ ÀÖÀ¸¹Ç·Î °¡±ÞÀûÀ̸é ÅÇÀ» »ç¿ëÇÏ´Â °ÍÀÌ È¿À²»ó À¯¸®ÇÏ´Ù.
¿©±â±îÁö ÀÛ¾÷ÇÏ¸é »ó¿ë±¸¿¡ ´ëÇÑ ¸ðµç 󸮴 ¿Ï·áµÇ¾ú´Ù. ¸¶Áö¸·À¸·Î ¸ÅÅ©·Î ¸í·ÉÁß¿¡ »ó¿ë±¸¸¦ »ðÀÔÇÏ´Â clipÀ̶ó´Â ¸í·ÉÀ» ó¸®ÇÑ´Ù.
int DoCommand(const TCHAR *szCom)
{
....
switch (Verb) {
case DGC_CALL:
....
case DGC_CLIP:
CClipRecord *cr;
GetComString(p,str);
count=GetComNumber(p,1);
if (str) {
cr=FindClipRecord(str,FALSE);
if (cr) {
for (i=0;i<count;i++) {
pSi->Ae.GetActiveView()->InsertClipText(cr->Content);
}
}
free(str);
} else {
Result=-3;
goto End;
}
break;
....
À̸§À¸·Î °Ë»öÇØ¼ ¹ß°ßµÇ¸é »ó¿ë±¸¸¦ »ðÀÔÇÑ´Ù. µû¶ó¼ ÀÌ ¸í·ÉÀº ¾î¶² »ó¿ë±¸ ¹À½ÀÌ ¿·Á Àִ°¡¿¡ µû¶ó ¼º°ø ¿©ºÎ°¡ ´Þ¶óÁö±âµµ ÇÑ´Ù. Macro1¿¡ clip "test"¶ó´Â ¸í·ÉÀÌ µé¾î ÀÖ°í ÀÌ ¸ÅÅ©·Î¿¡ F12 ´ÜÃà۰¡ ÁöÁ¤µÇ¾î ÀÖÀ» ¶§ F12¸¦ ´©¸£¸é ´ÙÀ½ °úÁ¤À» °ÅÃÄ »ó¿ë±¸°¡ »ðÀԵȴÙ.

¸®Å쵃 ¶§´Â ÀÌ ¼ø¼ÀÇ ¿ª¼øÀ¸·Î ¸®Å쵃 °ÍÀ̸ç ÀÌ °úÁ¤¿¡¼ ¸ÅÅ©·Î ±¸¹®ÀÇ ¿À·ù¸¦ ó¸®Çϰųª Á¸ÀçÇÏÁö ¾Ê´Â »ó¿ë±¸¸¦ ¹«½ÃÇÑ´Ù. ¾îÁö°£È÷µµ º¹ÀâÇѵ¥ ±×¸¸Å ´ç±Ù°ú ApiEditÀÇ ±â´ÉÀÌ ¸¹ÀÌ È®ÀåµÇ¾ú´Ù´Â ¶æÀÌ´Ù. ¸¸¾à Áßø ¸ÅÅ©·Î¿¡¼ »ó¿ë±¸¸¦ »ðÀÔÇϸé À̺¸´Ù È£Ãâ ±¸Á¶´Â ÈξÀ ´õ º¹ÀâÇØÁú °ÍÀÌ´Ù.