´ÜÃàÅ° ±â´ÉÀ» Á¦°øÇϴ Ŭ·¡½º¸¦ ¿Ï¼ºÇßÀ¸¹Ç·Î È£½ºÆ®´Â ÀÌ °´Ã¼¸¦ »ç¿ëÇϱ⸸ ÇÏ¸é µÈ´Ù. Dangeun.cpp¿¡¼ ÀÌ °´Ã¼¸¦ ¼±¾ðÇÑ´Ù.
CShortCut DgShortCut;
CShortCur Ŭ·¡½º°¡ ´ÜÃàÅ° ÁýÇÕ Àüü¸¦ °ü¸®ÇϹǷΠÀü¿ª °´Ã¼ Çϳª¸¸ ¼±¾ðÇÏ¸é µÈ´Ù. ´ÜÃàÅ° ¼³Á¤ »óŵµ ÀúÀå ´ë»óÀ̱â´Â ÇÏÁö¸¸ °´Ã¼°¡ Å©°í ±æÀÌ°¡ °¡º¯À̱⠶§¹®¿¡ Option ±¸Á¶Ã¼¿¡´Â Æ÷ÇÔ½ÃÅ°Áö ¾Ê´Â´Ù. ´ë½Å °´Ã¼ ½º½º·Î°¡ ·¹Áö½ºÆ®¸®¿¡ ÀÚ½ÅÀÇ »óŸ¦ ÀúÀåÇÏ°í º¹±¸ÇÏ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Ù. ¿ÜºÎ¿¡¼µµ ÀÌ °´Ã¼¸¦ ÀÚÁÖ ÂüÁ¶ÇϹǷΠglobal.h¿¡ extern ¼±¾ðÀ» ÇØ µÐ´Ù.
extern CShortCut DgShortCut;
ÀÌÁ¦ ´ç±ÙÀº ¾×¼¿·¯·¹ÀÌÅÍ ´ë½Å ÀÌ °´Ã¼°¡ Á¤ÀÇÇÏ´Â ´ÜÃàÅ° ¸ñ·ÏÀ» º¸°í ¸í·ÉÀ» ½ÇÇàÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö°¡ ´ÜÃàÅ° ÆǺ° ¹× ½ÇÇàÀ» ó¸®ÇÑ´Ù. Dangeun.cpp¿¡ ÀÛ¼ºÇÑ´Ù.
// µî·ÏµÈ ´ÜÃàÅ°ÀÎÁö º¸°í ´ÜÃàÅ°ÀÌ¸é ½ÇÇà ÈÄ TRUE¸¦ ¸®ÅÏÇÑ´Ù.
BOOL TestShortCut(HWND hWnd,LPMSG msg)
{
int i;
BOOL bFind=FALSE;
BOOL bShift,bControl,bAlt;
DWORD Flag=0;
SShortCut *psc;
HWND hActive;
SInfo *pSi;
UINT vk;
if (msg->message != WM_KEYDOWN && msg->message != WM_SYSKEYDOWN) {
return FALSE;
}
bShift=((GetKeyState(VK_SHIFT) & 0x8000) != 0);
bControl=((GetKeyState(VK_CONTROL) & 0x8000) != 0);
bAlt=((GetKeyState(VK_MENU) & 0x8000) != 0);
if (bControl) Flag |= SC_CTRL;
if (bAlt) Flag |= SC_ALT;
if (bShift) Flag |= SC_SHIFT;
// ÇÑ±Û Á¶¸³ÁßÀÌ¸é °¡»óÅ°¸¦ µû·Î ±¸ÇÑ´Ù.
if (msg->wParam==VK_PROCESSKEY) {
vk=ImmGetVirtualKey(hWnd);
} else {
vk=msg->wParam;
}
for (i=0;DgShortCut.arShortCut[i].vk;i++) {
psc=&DgShortCut.arShortCut[i];
// ¸í·É ¸ðµå°¡ ¾Æ´Ò ¶§´Â ¸í·É ¸ðµå¿¡¼¸¸ ¾µ ¼ö ÀÖ´Â ´ÜÃàÅ° ¹«½Ã
// Ctrl, Alt°¡ ÁöÁ¤µÇ¾î ÀÖÁö ¾ÊÀº ¹®ÀÚÅ°´Â ¸í·É ¸ðµå Àü¿ëÀÌ´Ù.
if (!bComMode && (psc->Flag & (SC_CTRL | SC_ALT)) == 0 &&
(psc->vk >= '0' && psc->vk <= 'Z')) {
continue;
}
if ((psc->vk == vk) && (psc->Flag == Flag)) {
bFind=TRUE;
break;
}
}
// ¸í·É ½ÇÇà
if (bFind) {
if (psc->id) {
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(psc->id,0),0);
} else {
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,(LPARAM)NULL);
if (hActive==NULL) {
return FALSE;
}
pSi=(SInfo *)GetWindowLong(hActive,0);
pSi->Ae.ExecMacro(psc->Com);
}
return TRUE;
}
// ´ÜÃàÅ°°¡ ¾Æ´Ñ °æ¿ì¶óµµ ¸í·É ¸ðµå¿¡¼ Á¤ÀǵÇÁö ¾ÊÀº ¹®ÀÚÅ°´Â ¹«½ÃÇÑ´Ù.
if (bComMode) {
if ((Flag & (SC_CTRL | SC_ALT)) == 0 &&
(msg->wParam >= '0' && msg->wParam <= 'Z')) {
return TRUE;
}
}
return FALSE;
}
ÀÌ ÇÔ¼ö´Â msg·Î Àü´ÞµÈ ¸Þ½ÃÁö°¡ ´ÜÃàÅ°ÀÎÁö Á¡°ËÇØ º¸°í ´ÜÃàÅ°ÀÌ¸é ±â¾ïµÈ ¸í·ÉÀ» ½ÇÇàÇÑ´Ù. ´ÜÃàÅ°°¡ ÀԷµǷÁ¸é ÀÏ´Ü Å°º¸µåÀÇ Å°°¡ ´·¯Á®¾ß ÇϹǷΠWM_(SYS)KEYDOWN ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¾ß ÇÑ´Ù. ´Ü, ÇÑ±Û ÀÔ·Â ¸ðµå¿¡¼´Â wParamÀ¸·Î VK_PROCESSKEY°¡ Àü´ÞµÇ´Âµ¥ ½ÇÁ¦ ´·¯Áø °¡»ó Å°´Â ImmGetVirtualKey ÇÔ¼ö·Î Á¶»çÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϸé ÇѱÛ/¿µ¹® ÀÔ·Â ¸ðµå¿¡ »ó°ü¾øÀÌ ´·¯Áø °¡»óÅ°¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. ¿Ü±¹ ÇÁ·Î±×·¥ÀÌ ÇѱÛÈµÈ °æ¿ì´Â ÀÌ·± 󸮰¡ Àß ¾ÈµÇ¾î ÀÖ´Â °æ¿ì°¡ ¸¹´Ù. ¿¹¸¦ µé¾î Æ÷Åä¼¥ÀÇ °æ¿ì Ctrl+S, Ctrl+O µîÀÇ ´ÜÃàÅ°°¡ ¿µ¹®ÀÏ ¶§¸¸ µ¿ÀÛÇÏ´Â ¹®Á¦°¡ ÀÖ´Ù.
´·¯Áø °¡»óÅ°¿Í Á¶ÇÕÅ°¸¦ arShortCut ¹è¿¿¡ ÀúÀåµÈ ¸ñ·Ï°ú ºñ±³ÇÏ¿© ´ÜÃàÅ° ¸ñ·Ï¿¡ ÀÖ´Â Å° ÀÔ·ÂÀÎÁö °Ë»çÇÑ´Ù. ¸Þ´º ¸í·ÉÀÎ °æ¿ì WM_COMMAND¸¦ º¸³»¸é »ç¿ëÀÚ°¡ Å°¸¦ ´©¸¥ °Í°ú ¶È°°ÀÌ Ã³¸®µÉ °ÍÀÌ´Ù. ¸ÅÅ©·Î ¸í·ÉÀÏ °æ¿ì È°¼ºÃ¢ÀÇ ExecMacro¸¦ È£ÃâÇÏ¸é ¸ÅÅ©·Î ³»ÀÇ ¸í·ÉµéÀÌ ¼ø¼´ë·Î ½ÇÇàµÈ´Ù. ´ÜÃàÅ° ¸í·ÉÀ» ½ÇÇàÇßÀ¸¸é TRUE¸¦ ¸®ÅÏÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é FALSE¸¦ ¸®ÅÏÇÑ´Ù. WinMainÀÇ ¸Þ½ÃÁö ·çÇÁ´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤µÈ´Ù.
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
....
HACCEL hAccel;
hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
for (;;) {
do {
if (!GetMessage(&Message,NULL,0,0))
goto endloop;
if (Message.message != 0x118/*WM_SYSTIMER*/) {
AllowIdle=TRUE;
}
if (!IsWindow(g_FindDlg) || !IsDialogMessage(g_FindDlg,&Message)) {
if (!TranslateMDISysAccel(g_hMDIClient, &Message)) {
if (!TestShortCut(hWnd,&Message)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
}
}
} while (PeekMessage(&Message,NULL,0,0,PM_NOREMOVE));
TranslatAccelerator ÇÔ¼ö ´ë½Å TestShortCut ÇÔ¼ö¸¦ »ç¿ëÇß´Ù. ¾×¼¼·¯·¹ÀÌÅÍ ´ë½Å Á÷Á¢ ¸¸µç ´ÜÃàÅ° ¸ñ·ÏÀ» »ç¿ëÇϹǷΠhAccel º¯¼ö ¼±¾ð¹®°ú LoadAccelerator ÇÔ¼ö È£ÃâÀº ÀÌÁ¦ ÇÊ¿ä¾ø´Ù. ¸®¼Ò½º¿¡¼ ¾×¼¿·¯·¹ÀÌÅ͵µ »èÁ¦Çصµ µÇ³ª ½Ç½ÀÁß¿¡ ¸®¼Ò½º´Â Àбâ Àü¿ëÀ̹ǷΠÀÏ´Ü ±×³É µÎ±â·Î ÇÑ´Ù. ´ÙÀ½ ÄÚµå´Â ´ÜÃàÅ° ¸ñ·ÏÀ» ÃʱâÈÇÑ´Ù.
int OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (SHRegReadInt(SHCU,KEY"Setting","StartAction",1000) == 1000) {
Option.GetStyleColor();
DgShortCut.Init();
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);
DgShortCut.Load(KEY);
DgMacro.LoadFromReg(KEY);
....
ÃÖÃÊ ¼³Ä¡½Ã¿¡´Â Init ÇÔ¼ö¸¦ È£ÃâÇÏ¿© µðÆúÆ® ´ÜÃàÅ° ¸ñ·ÏÀ¸·Î ÃʱâÈÇÏ°í ÀÌÈĺÎÅÍ´Â ·¹Áö½ºÆ®¸®¿¡¼ ¸ñ·ÏÀ» Àд´Ù. ¸Å ½ÇÇàÇÒ ¶§¸¶´Ù ´ÜÃàÅ° ¸ñ·ÏÀÌ ÆíÁýµÉ ¼ö ÀÖÀ¸¹Ç·Î OnDestroy¿¡¼´Â ÆíÁýµÈ ¸ñ·ÏÀ» ÀúÀåÇÑ´Ù.
void OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
Option.Save(KEY);
DgShortCut.Save(KEY);
DgMacro.SaveToReg(KEY);
°³¹ßÁß¿¡ ´ÜÃàÅ° ¸ñ·ÏÀ» ÃʱâÈÇÏ·Á¸é ¼³Ä¡ ÇØÁ¦ ÈÄ¿¡ ´Ù½Ã ½ÇÇàÇϵ簡 ¾Æ´Ï¸é Init¸¦ Àá½Ã ¹ÛÀ¸·Î »© ³õ¾Æ OnCreateÀÇ ³¡ ºÎºÐ¿¡ ¿Å°Ü µÎ¾î¾ß ÇÑ´Ù. °³¹ßÁßÀ̱⠶§¹®¿¡ ÀÌ·± ºÒÆíÇÔÀÌ ÀÖÁö¸¸ ÃÖÁ¾ »ç¿ëÀÚµéÀÌ Ã³À½ºÎÅÍ ¼³Ä¡ÇØ »ç¿ëÇÒ ¶§´Â ÀÌ·± ¹®Á¦°¡ ¾øÀ» °ÍÀÌ´Ù. DgShortCut °´Ã¼°¡ ¾×¼¿·¯·¹ÀÌÅÍ Å×À̺íÀ» ¿ÏÀüÈ÷ ´ëüÇÏ°í ÀÖÀ¸¹Ç·Î ÀÌÀü ¹öÀü°ú µ¿ÀÛÀº µ¿ÀÏÇÏ´Ù. ´Ü, ÀÌÁ¦ DgShortCutÀ» Á¶ÀÛÇÏ¸é ´ÜÃàÅ°¸¦ ¿øÇϴ´ë·Î ÆíÁýÇÒ ¼ö ÀÖ´Ù.
¸í·É ¸ðµå¶õ A~Z, 1~0±îÁöÀÇ ÀϹÝÀûÀÎ ¹®ÀÚÅ°¸¦ ´ÜÃàÅ°·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ¸ðµåÀÌ´Ù. ÀÌ Å°µéÀº ÀÏ¹Ý ¸ðµå¿¡¼´Â ¹®ÀÚ ÀÔ·ÂÀ¸·Î Çؼ®µÇÁö¸¸ ¸í·É ¸ðµå¿¡¼´Â ¸í·ÉÀ¸·Î Çؼ®µÈ´Ù. ¹Ýº¹ÀûÀÎ ÆíÁýÀ» ÇÒ ¶§´Â Ctrl+X, Ctrl+V °°Àº ´ÜÃàÅ°¸¦ ¹Ýº¹ÀûÀ¸·Î ´©¸¦ ÀÏÀÌ ¸¹Àºµ¥ CtrlÀ» °è¼Ó ´©¸£°í ÀÖÁö¸¸ ¿ÞÂÊ »õ³¢ ¼Õ°¡¶ôÀÌ ¾îÁö°£È÷ ÇÇ°ïÇØÁø´Ù. ÀÌ·² ¶§ ¸í·É ¸ðµå¸¦ »ç¿ëÇÏ¸é ¹®ÀÚÅ°¸¶´Ù °íÀ¯ÀÇ ´ÜÃàÅ°¸¦ ÇÒ´çÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù.
¸í·É ¸ðµåÀÇ ¹Ý´ë ¸ðµå´Â ÆíÁý ¸ðµåÀ̸ç ÀÌ ¸ðµå¿¡¼´Â Æã¼ÇÅ° µî ¸î °¡Áö Å°¸¸ ´Üµ¶À¸·Î ´ÜÃàÅ°°¡ µÉ ¼ö ÀÖ´Ù. ¸í·É ¸ðµå¿¡¼´Â ¹°·Ð ¹®ÀÚ ÀÔ·ÂÀ» ÇÒ ¼ö ¾øÀ¸¹Ç·Î µÎ ¸ðµå »çÀ̸¦ Àû´çÀÌ ¿Ô´Ù °¬´Ù ÇÏ¸é¼ ÆíÁý ¹× ÀÔ·Â ÀÛ¾÷À» ÇØ¾ß ÇÑ´Ù. µÎ ¸ðµå¸¦ ±¸ºÐÇϱâ À§ÇØ ´ÙÀ½ Àü¿ª º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.
BOOL bComMode;
º°µµ·Î ÃʱâÈÇÏÁö ¾ÊÀ¸¹Ç·Î FALSE·Î ÃʱâÈµÇ¸ç µðÆúÆ® ¸ðµå´Â ÆíÁý ¸ðµåÀÌ´Ù. ÆíÁý/¸í·É ¸ðµå Ç׸ñÀ¸·Î ÀÌ º¯¼ö¸¦ Åä±ÛÇϸç OnInitMenu¿¡¼ ÇöÀç ¸ðµå¸¦ Ç¥½ÃÇÑ´Ù.
void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
...
case IDM_EDIT_COMMODE:
bComMode=!bComMode;
break;
void OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (bComMode) {
CheckMenuItem(hMenu, IDM_EDIT_COMMODE, MF_BYCOMMAND | MF_CHECKED);
} else {
CheckMenuItem(hMenu, IDM_EDIT_COMMODE, MF_BYCOMMAND | MF_UNCHECKED);
}
}
´ÜÃàÅ°´Â Å°°¡ ´·¯Áú ¶§¸¸ »ç¿ëµÇ´Â °ÍÀ̹ǷΠ¸ðµå°¡ ¹Ù²ï´Ù°í Çؼ ´çÀå ¾î¶² µ¿ÀÛÀ» ÇÒ ÇÊ¿ä´Â ¾ø´Ù. DefaultShortCut¿¡ ¸í·É ¸ðµåÀÇ ´ÜÃàÅ°µéÀÌ ÀÌ¹Ì Ãß°¡µÇ¾î ÀÖÀ¸¸ç TestShortCut ÇÔ¼ö¿¡¼ ¸í·É ¸ðµå¸¦ ÀÌ¹Ì Ã³¸®ÇÏ°í ÀÖ´Ù. ¸í·É ¸ðµå¿¡¼´Â CÅ°·Î º¹»çÇÒ ¼ö ÀÖ°í VÅ°·Î ºÙ¿© ³ÖÀ» ¼ö ÀÖ´Ù. OnIdle¿¡¼ ¸í·É ¸ðµå Åø¹Ù¸¦ °ü¸®ÇÑ´Ù.
void OnIdle()
{
....
if (hActive) {
....
if (bComMode) {
SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_COMMODE,
MAKELONG(TBSTATE_ENABLED | TBSTATE_CHECKED,0));
} else {
SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_COMMODE,MAKELONG(TBSTATE_ENABLED,0));
}
} else {
....
SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_COMMODE,MAKELONG(0,0));
}
}
¸í·É ¸ðµåÀ̸é Åø ¹öÆ°À» üũÇÏ°í È°¼ºÃ¢ÀÌ ¾øÀ¸¸é ¸í·É ¹öÆ°À» »ç¿ëÇÒ ¼ö ¾ø´Ù. ¸í·É ¸ðµå¿¡ Àͼ÷ÇÏÁö ¾ÊÀº »ç¶÷Àº ÀÌ ¸ðµå°¡ ¹«Ã´ ÀÌ»óÇØ º¸ÀÏ °ÍÀÌ´Ù. ±×·¯³ª À¯´Ð½ºÀÇ vi ¿¡µðÅÍ¿¡ Àͼ÷ÇÑ »ç¶÷Àº ¸ðµå¸¦ ¹Ù²ã°¡¸ç ÆíÁýÇÏ´Â °ÍÀÌ ¹«Ã´ Æí¸®ÇÏ´Ù°í ÇÑ´Ù. ¿Ö³ÄÇÏ¸é ¼Õ°¡¶ôÀÌ Å°º¸µå¸¦ ¶°³ªÁö ¾Ê°íµµ ±²ÀåÈ÷ º¹ÀâÇÑ µ¿ÀÛµéÀ» ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¹°·Ð ÀÌ·¸°Ô µÇ·Á¸é Àڽſ¡°Ô ²À ¸Â´Â ´ÜÃàÅ° ±¸¼ºÀ» °³¹ßÇÏ°í Àͼ÷ÇØÁ®¾ß ÇÑ´Ù.
Á¸ÀçÇÏÁö ¾Ê´Â ¸Þ´º¸¦ ¼±ÅÃÇÒ ¼ö´Â ¾ø±â ¶§¹®¿¡ CMru´Â ¿äûÇÑ ÆÄÀϸíÀÇ À妽º¸¦ Á¡°ËÇÏÁö ¾Ê¾Ò´Ù. ±×·¯³ª ÀÌÁ¦ ´ÜÃàÅ°·Îµµ ÃÖ±Ù ÆÄÀÏÀ» ºÒ·¯³¾ ¼ö Àֱ⠶§¹®¿¡ ÇØ´ç ´ÜÃàÅ°¿Í ´ëÀÀµÇ´Â ÃÖ±Ù ÆÄÀÏÀÌ Ç×»ó ÀÖ´Ù°í º¸ÀåÇÒ ¼ö ¾ø´Ù. ±×·¡¼ CMruÀÇ GetFilePath ÇÔ¼ö¸¦ ¼öÁ¤ÇÏ¿© ¹«È¿ÇÑ ÆÄÀÏÀÎ °æ¿ìÀÇ ¿¡·¯¸¦ ó¸®ÇØ¾ß ÇÑ´Ù.
BOOL CMru::GetFilePath(int nIndex,TCHAR *buf)
{
if (nIndex >= arMru.num) {
return FALSE;
}
lstrcpy(buf,arMru.Get(nIndex));
return TRUE;
}
¿ø·¡´Â ¸®ÅÏ°ªÀÌ ¾ø¾úÀ¸³ª nIndexÀÇ ¹üÀ§°¡ Ʋ¸®¸é FALSE¸¦ ¸®ÅÏÇϵµ·Ï ¼öÁ¤Çß´Ù. CHistroy Ŭ·¡½ºÀÇ numÀÌ º¸È£µÈ ¸â¹ö¶ó¸é CHistoryÀÇ GetÇÔ¼öºÎÅÍ ¼öÁ¤ÇØ¾ß Çϳª ´ÙÇàÈ÷ ±×·² ÇÊ¿ä±îÁö´Â ¾ø´Ù. OnCommand´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤µÈ´Ù.
void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (LOWORD(wParam) >= Mru.MenuID && LOWORD(wParam) < Mru.MenuID+Mru.MaxMru) {
idx=LOWORD(wParam)-Mru.MenuID;
if (Mru.GetFilePath(idx,Path)==FALSE) {
return;
}
if (strnicmp(Path,"http",4) != 0 && strnicmp(Path,"ftp",3) != 0) {
....
¼±ÅÃÇÑ ÃÖ±Ù ÆÄÀÏ ¸Þ´º°¡ Ç×»ó ÀÖ´Ù°í °¡Á¤ÇÏÁö ¾Ê°í ¸®ÅÏ°ªÀ» Á¡°ËÇØ º¸°í FALSE¸¦ ¸®ÅÏÇÏ¸é ¾Æ¹« Àϵµ ÇÏÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾î ´Ù¼¸°³ÀÇ ÃÖ±Ù ÆÄÀÏÀÌ µî·ÏµÇ¾î Àִµ¥ Ctrl+Alt+6À» ´©¸£¸é ¿ ÆÄÀÏÀÌ ¾ø´Ù. ±×³É ³»¹ö·Á µÎ¸é Path¿¡ ¾²·¹±â°ªÀÌ ¸®ÅϵǹǷΠÆÄÀÏÀ» ¿Áö ¸øÇÏ°í ÀÖÁöµµ ¾ÊÀº ÃÖ±Ù ÆÄÀÏ ¸ñ·ÏÀ» »èÁ¦ÇÏ·Á°í ½ÃµµÇÒ °ÍÀÌ´Ù. ÀÌÀü ¹öÀü¿¡¼´Â ¹®Á¦°¡ ¾ø¾úÀ¸³ª ±â´ÉÀÌ Ãß°¡µÇ¸é ¹®Á¦°¡ µÇ´Â ºÎºÐÀÌ »õ·Î »ý±â±âµµ ÇÑ´Ù. CMru´Â ¸Þ´º·Î¸¸ ¼±ÅÃÇÑ´Ù¸é Á¤È®ÇÏ°Ô µ¿ÀÛÇÏÁö¸¸ ´ÜÃàÅ° ¶§¹®¿¡ À߸øµÈ µ¿ÀÛÀ» ÇÒ ¼öµµ ÀÖ´Ù.
±×·¡¼ ¸ðµç ÇÔ¼ö´Â °¡±ÞÀûÀÌ¸é ¸®ÅÏ°ªÀ¸·Î ¿¡·¯ ¿©ºÎ¸¦ ¸®ÅÏÇÏ´Â °ÍÀÌ ÁÁ´Ù°í ÇÑ´Ù. ¿øÄ¢ÀûÀ¸·Î CHistoryÀÇ Get ÇÔ¼öµµ ´çÀåÀº ¹®Á¦°¡ ¾øÁö¸¸ idx°¡ ¹üÀ§¸¦ ³Ñ¾î ¼³ ¶§¸¦ ó¸®ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ±×·¯³ª ¿ø·ÐÀûÀ¸·Î´Â ±×·¸Áö¸¸ ¸ðµç ÇÔ¼ö¸¦ ÀÌ·± ½ÄÀ¸·Î ÀÛ¼ºÇÏÀÚ¸é ³Ê¹« ³Ê¹« ÇÇ°ïÇØÁö±â ¶§¹®¿¡ Àû´çÇÑ ¼öÁرîÁö¸¸ ÇÏ´Â °ÍÀÌ ÁÁ´Ù°í »ý°¢ÇÑ´Ù. ÀÌ°ÍÀÌ À̷аú ½ÇÁ¦ÀÇ Â÷ÀÌÀÎ °Í °°´Ù.