4.´ÜÃàÅ° ÀçÁ¤ÀÇ

°¡.´ÜÃàÅ° ´ëÈ­»óÀÚ

º¹ÀâÇÑ ¸ÅÅ©·Î ±¸¹®À» Á¤ÀÇÇÏ°í ¾×¼¿·¯·¹ÀÌÅÍ ´ë½Å CShortCut Ŭ·¡½º¸¦ ¸¸µç ÀÌÀ¯°¡ ´ÜÃàÅ°¸¦ »ç¿ëÀÚ°¡ ¸¶À½´ë·Î º¯°æÇÏ°í º¹ÀâÇÑ µ¿ÀÛÀ» ÇϳªÀÇ Å°·Î ¼öÇàÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­ÀÌ´Ù. ÀÌÁ¦ ´ÜÃàÅ°¸¦ º¯°æÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ ÀÛ¼ºÇØ º¸ÀÚ. µµ±¸/´ÜÃàÅ° Á¤ÀÇ Ç׸ñ¿¡¼­ ´ÜÃàÅ° °ü¸® ´ëÈ­»óÀÚ¸¦ È£ÃâÇÑ´Ù.

 

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

{

     ....

     case IDM_TOOL_SHORTCUT:

          DialogBox(g_hInst,MAKEINTRESOURCE(IDD_SHORTCUTLIST),hWnd,ShortCutListProc);

          break;

 

ÀÌ ´ëÈ­»óÀÚ¿¡¼­ ´ÜÃàÅ°¿Í °ü·ÃµÈ ¸ðµç ÆíÁýÀ» ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ´ëÈ­»óÀÚ¸¦ ¶ç¿ì±â¸¸ ÇÏ¸é µÈ´Ù. ShortCut.h¿¡ ÇÊ¿äÇÑ ÇÔ¼öÀÇ ¿øÇüÀ» ¼±¾ðÇÑ´Ù.

 

void DisplayShortCutList(HWND hDlg);

BOOL CALLBACK ShortCutListProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);

BOOL CALLBACK ShortCutProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);

int GetDlgShortCut(HWND hDlg);

void SetDlgShortCut(HWND hDlg,int idx);

void DisplayShortCutStatus(HWND hDlg);

void UpdateMenuCaption(HMENU hMenu);

void UpdateItemCaption(HMENU hMenu,int idx,UINT ID,TCHAR *Caption);

 

´ÜÃàÅ° Á¤ÀÇ ´ëÈ­»óÀÚÀÇ ¸ð½ÀÀ» ¸ÕÀú º¸ÀÚ.

Á¤ÀÇµÈ ´ÜÃàÅ°ÀÇ ¸ñ·ÏÀ» ¸®½ºÆ® ºä¿¡ ±ò²ûÇÏ°Ô º¸¿©ÁÖ¸ç ¾Æ·¡ÂÊ¿¡ ´ÜÃàÅ°¸¦ °ü¸®ÇÒ ¼ö ÀÖ´Â ¹öÆ°µéÀÌ ³ª¿­µÇ¾î ÀÖ´Ù. ÀÌ ´ëÈ­»óÀÚÀÇ ÇÁ·Î½ÃÀú´Â ShortCut.cpp¿¡ ÀÛ¼ºÇÑ´Ù.

 

BOOL CALLBACK ShortCutListProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     static HWND hList;

     LVCOLUMN COL;

     LVITEM LI;

     int idx;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          hList=GetDlgItem(hDlg,IDC_SHORTCUTLIST);

          COL.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;

          COL.fmt=LVCFMT_LEFT;

          COL.cx=50;

          COL.pszText="Å°";

          COL.iSubItem=0;

          ListView_InsertColumn(hList,0,&COL);

 

          COL.cx=80;

          COL.pszText="Á¶ÇÕÅ°";

          COL.iSubItem=1;

          ListView_InsertColumn(hList,1,&COL);

 

          COL.cx=60;

          COL.pszText="Á¾·ù";

          COL.iSubItem=2;

          ListView_InsertColumn(hList,2,&COL);

 

          COL.cx=200;

          COL.pszText="±â´É";

          COL.iSubItem=3;

          ListView_InsertColumn(hList,3,&COL);

 

          ListView_SetExtendedListViewStyle(hList,LVS_EX_FULLROWSELECT);

          DisplayShortCutList(hDlg);

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDC_BTNADD:

              if (DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_SHORTCUT),

                   hDlg, ShortCutProc,(LPARAM)-1)==IDOK) {

                   DisplayShortCutList(hDlg);

                   ListView_SetItemState(hList,ListView_GetItemCount(hList),

                        LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED);

              }

              return TRUE;

          case IDC_BTNEDIT:

              idx=ListView_GetNextItem(hList,-1,LVNI_ALL | LVNI_SELECTED);

              if (idx != -1) {

                   LI.iItem=idx;

                   LI.mask=LVIF_PARAM;

                   ListView_GetItem(hList,&LI);

                   if (DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_SHORTCUT),

                        hDlg, ShortCutProc,(LPARAM)LI.lParam)==IDOK) {

                        DisplayShortCutList(hDlg);

                   }

              }

              return TRUE;

          case IDC_BTNDELETE:

              idx=ListView_GetNextItem(hList,-1,LVNI_ALL | LVNI_SELECTED);

              if (idx != -1) {

                   LI.iItem=idx;

                   LI.mask=LVIF_PARAM;

                   ListView_GetItem(hList,&LI);

                   DgShortCut.Delete(LI.lParam);

                   DisplayShortCutList(hDlg);

              }

              return TRUE;

          case IDC_BTNDEFAULT:

              if (MessageBox(hDlg,"¸ðµç ´ÜÃàÅ° ¼³Á¤À» ¼³Ä¡ Ãʱ⠻óÅ·Π¹Ù²Ù½Ã°Ú½À´Ï±î?",

                   "Áú¹®",MB_YESNO)==IDYES) {

                   DgShortCut.Init();

                   DisplayShortCutList(hDlg);

              }

              return TRUE;

          case IDCANCEL:

              EndDialog(hDlg,IDCANCEL);

              return TRUE;

          }

          return FALSE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          hdr=(LPNMHDR)lParam;

          if (hdr->hwndFrom == hList) {

              switch (hdr->code) {

              case LVN_ITEMCHANGED:

                   idx=ListView_GetNextItem(hList,-1,LVNI_ALL | LVNI_SELECTED);

                   EnableWindow(GetDlgItem(hDlg,IDC_BTNEDIT),(idx != -1));

                   EnableWindow(GetDlgItem(hDlg,IDC_BTNDELETE),(idx != -1));

                   break;

              case NM_DBLCLK:

                   PostMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_BTNEDIT,0),0);

                   return TRUE;

              }

          }

          break;

     }

     return FALSE;

}

 

´ÜÃàÅ°ÀÇ Ãß°¡, »èÁ¦, ¼öÁ¤ ¹× ÃʱâÈ­ µîÀÇ Ã³¸®¸¦ ÇÑ´Ù. ÀÌ ´ëÈ­»óÀÚ È¥ÀÚ¼­ ¸ðµç 󸮸¦ ´Ù ÇÒ ¼ö ¾øÀ¸¹Ç·Î ¸î °³ÀÇ ¼­ºê ÇÔ¼ö¿Í ´ëÈ­»óÀÚµéÀ» °Å´À¸°´Ù.

³ª.´ÜÃàÅ° ¸ñ·Ï

DisplayShortCutList ÇÔ¼ö´Â ´ÜÃàÅ°ÀÇ ¸ñ·ÏÀ» ´ëÈ­»óÀÚÀÇ ¸®½ºÆ® ºä¿¡ Ãâ·ÂÇÑ´Ù. DgShortCut °´Ã¼ÀÇ arShortCut ¹è¿­À» º¸±â ÁÁ°Ô ´ýÇÁÇÑ´Ù.

 

// ÇöÀç ´ÜÃàÅ° ¼³Á¤ »óÅ Ãâ·Â. Å°·Î Á¤·ÄÇÑ´Ù.

void DisplayShortCutList(HWND hDlg)

{

     HWND hList;

     int i,j;

     LVITEM LI,LI2;

     int idx;

     TCHAR szTemp[128];

     TCHAR Text[12];

 

     hList=GetDlgItem(hDlg,IDC_SHORTCUTLIST);

     ListView_DeleteAllItems(hList);

     for (i=0;DgShortCut.arShortCut[i].vk;i++) {

          LI.mask=LVIF_TEXT | LVIF_PARAM;

          LI.iSubItem=0;

          LI.lParam=i;

          j=GetVirtKeyIndex(DgShortCut.arShortCut[i].vk);

          LI.pszText=arVirtKey[j].Name;

 

          // »ðÀÔÇÒ À§Ä¡ ¼±Á¤

          for (idx=0;;idx++) {

              LI2.mask=LVIF_TEXT;

              LI2.iItem=idx;

              LI2.iSubItem=0;

              LI2.pszText=Text;

              LI2.cchTextMax=12;

              if (ListView_GetItem(hList,&LI2)==FALSE) {

                   break;

              }

              if (lstrcmpi(LI.pszText, Text) < 0) {

                   break;

              }

          }

 

          LI.iItem=idx;

          ListView_InsertItem(hList,&LI);

 

          lstrcpy(szTemp,"");

          if (DgShortCut.arShortCut[i].Flag & SC_CTRL) {

              lstrcpy(szTemp,"Ctrl");

          }

          if (DgShortCut.arShortCut[i].Flag & SC_ALT) {

              if (lstrlen(szTemp)) {

                   lstrcat(szTemp,"+");

              }

              lstrcat(szTemp,"Alt");

          }

          if (DgShortCut.arShortCut[i].Flag & SC_SHIFT) {

              if (lstrlen(szTemp)) {

                   lstrcat(szTemp,"+");

              }

              lstrcat(szTemp,"Shift");

          }

 

          ListView_SetItemText(hList,idx,1,szTemp);

         

          if (DgShortCut.arShortCut[i].id) {

              ListView_SetItemText(hList,idx,2,"¸Þ´º");

              j=GetMenuComIndex(DgShortCut.arShortCut[i].id);

              ListView_SetItemText(hList,idx,3,arMenuCom[j].Name);

          } else {

              ListView_SetItemText(hList,idx,2,"¸ÅÅ©·Î");

              ListView_SetItemText(hList,idx,3,DgShortCut.arShortCut[i].Com);

          }

     }

}

 

»ç¿ëÀÚ°¡ ´ÜÃàÅ° ¸ñ·ÏÀ» ±Ý¹æ ÆľÇÇÒ ¼ö ÀÖµµ·Ï °¡»óÅ°°ªÀ¸·Î Á¤·ÄÇß´Ù. ³ª¸ÓÁö ÄÚµå´Â Á¶ÇÕÅ°¸¦ Àб⠽±°Ô ¸¸µå´Â ´Ü¼øÇÑ ¹®ÀÚ¿­ Á¶¸³¹®°ú Ãâ·Â¹®µéÀÌ´Ù. ¸®½ºÆ® ºä °¢ Ç׸ñÀÇ lParam¿¡ arShortCut ¹è¿­ÀÇ À妽º¸¦ ÀúÀåÇØ ³õ¾Ò´Âµ¥ ÀÌ °ªÀº ´ÜÃàÅ°¸¦ ¼öÁ¤, »èÁ¦ÇÒ ¶§ ´ë»óÀ» ã±â À§ÇØ »ç¿ëµÈ´Ù.

´Ù.´ÜÃàÅ° ¼öÁ¤

»èÁ¦, ±âº» ¹öÆ°¿¡ ´ëÇÑ Ã³¸®´Â °£´ÜÇϹǷΠ´ÜÃàÅ° °ü¸® ´ëÈ­»óÀÚ°¡ Á÷Á¢ÇÑ´Ù. »èÁ¦´Â DgShortCut °´Ã¼ÀÇ Delete ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÇ°í ±âº» ¸ñ·ÏÀ¸·Î ÃʱâÈ­´Â Init ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù. Ãß°¡, ¼öÁ¤ ¹öÆ°¿¡ ´ëÇÑ Ã³¸®´Â Á¶±Ý º¹ÀâÇϹǷΠº°µµÀÇ ÆíÁý ´ëÈ­»óÀÚ¸¦ È£ÃâÇÑ´Ù.

 

// ´ÜÃàÅ° Ãß°¡ ¹× ¼öÁ¤ ´ëÈ­»óÀÚ. ÆĶó¹ÌÅÍ´Â ¼öÁ¤ ´ë»ó ´ÜÃàÅ°ÀÌµÇ -1À̸é Ãß°¡

BOOL CALLBACK ShortCutProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     static int objidx;

     int oriidx;

     int vk,id;

     int i;

     TCHAR szCom[1024];

     TCHAR *szMacro, *Com;

     TCHAR Mes[256];

     SShortCut sc;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          objidx=(int)lParam;

          for (i=0;i<ARSIZE(arVirtKey);i++) {

              SendDlgItemMessage(hDlg,IDC_CBKEY,CB_ADDSTRING,0,(LPARAM)arVirtKey[i].Name);

          }

          for (i=0;i<ARSIZE(arMenuCom);i++) {

              SendDlgItemMessage(hDlg,IDC_CBMENUCOM,CB_ADDSTRING,0,(LPARAM)arMenuCom[i].Name);

          }

          // ÆíÁýÀÌ¸é ¼³Á¤µÈ ´ÜÃàÅ°¸¦ º¸¿©ÁØ´Ù.

          if (objidx != -1) {

              SetDlgShortCut(hDlg,objidx);

 

              // ÆíÁý ´ë»ó ´ÜÃàÅ°ÀÇ ³»¿ëÀ» º¸¿©ÁØ´Ù.

              oriidx=GetDlgShortCut(hDlg);

              if (DgShortCut.arShortCut[oriidx].id) {

                   CheckRadioButton(hDlg,IDC_RADIOID,IDC_RADIOCOMMAND,IDC_RADIOID);

                   SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_RADIOID,0),0);

                   id=GetMenuComIndex(DgShortCut.arShortCut[oriidx].id);

                   SendDlgItemMessage(hDlg,IDC_CBMENUCOM,CB_SELECTSTRING,-1,

                        (LPARAM)arMenuCom[id].Name);

              } else {

                   CheckRadioButton(hDlg,IDC_RADIOID,IDC_RADIOCOMMAND,IDC_RADIOCOMMAND);

                   SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_RADIOCOMMAND,0),0);

                   SetDlgItemText(hDlg,IDC_EDCOMMAND,DgShortCut.arShortCut[oriidx].Com);

              }

          // Ãß°¡ÀÌ¸é ¸Þ´º ¸í·É ¼±Åà »óÅ·Π¸¸µé¾î ÁØ´Ù. CtrlÅ°´Â ±âº» ¼±ÅÃÇØ ÁØ´Ù.

          } else {

              CheckDlgButton(hDlg,IDC_CHKCTRL,BST_CHECKED);

              CheckRadioButton(hDlg,IDC_RADIOID,IDC_RADIOCOMMAND,IDC_RADIOID);

              SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_RADIOID,0),0);

          }

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          // ¸Þ´º ¸í·É ¼±Åà ¸ðµå

          case IDC_RADIOID:

              EnableWindow(GetDlgItem(hDlg,IDC_CBMENUCOM),TRUE);

              EnableWindow(GetDlgItem(hDlg,IDC_EDCOMMAND),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNADDCOMMAND),FALSE);

              return TRUE;

          // ¸ÅÅ©·Î ÀÔ·Â ¸ðµå

          case IDC_RADIOCOMMAND:

              EnableWindow(GetDlgItem(hDlg,IDC_CBMENUCOM),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_EDCOMMAND),TRUE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNADDCOMMAND),TRUE);

              return TRUE;

          // »õ ¸í·É Ãß°¡

          case IDC_BTNADDCOMMAND:

              szMacro=(TCHAR *)malloc(256);

              if (DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_ADDCOMMAND),hDlg,

                   AddCommandDlgProc,(LPARAM)szMacro)==IDOK) {

                   GetDlgItemText(hDlg,IDC_EDCOMMAND,szCom,1024);

                   if (lstrlen(szCom) && szCom[lstrlen(szCom)-1]!=';') {

                        lstrcat(szCom,";");

                   }

                   lstrcat(szCom,szMacro);

                   SetDlgItemText(hDlg,IDC_EDCOMMAND,szCom);

              }

              free(szMacro);

              return TRUE;

          case IDOK:

              // ÀÏ´Ü ÀÛ¼ºÇÑ ´ÜÃàÅ° Á¤º¸¸¦ Á¶»çÇØ ³õ´Â´Ù.

              vk=SendDlgItemMessage(hDlg,IDC_CBKEY,CB_GETCURSEL,0,0);

              if (vk==-1) {

                   MessageBox(hDlg,"Å°¸¦ ¼±ÅÃÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                   return TRUE;

              }

              sc.vk=arVirtKey[vk].vk;

              sc.Flag=0;

 

              if (IsDlgButtonChecked(hDlg,IDC_CHKCTRL))

                   sc.Flag |= SC_CTRL;

              if (IsDlgButtonChecked(hDlg,IDC_CHKALT))

                   sc.Flag |= SC_ALT;

              if (IsDlgButtonChecked(hDlg,IDC_CHKSHIFT))

                   sc.Flag |= SC_SHIFT;

 

              if (IsDlgButtonChecked(hDlg,IDC_RADIOID)) {

                   id=SendDlgItemMessage(hDlg,IDC_CBMENUCOM,CB_GETCURSEL,0,0);

                   if (id==-1) {

                        MessageBox(hDlg,"¸Þ´º ¸í·ÉÀ» ¼±ÅÃÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                        return TRUE;

                   }

                   sc.id=arMenuCom[id].id;

                   sc.Com=NULL;

              } else {

                   sc.id=0;

                   GetDlgItemText(hDlg,IDC_EDCOMMAND,szCom,1024);

                   StringNormalize(szCom,NULL);

                   if (IsStrEmpty(szCom)) {

                        MessageBox(hDlg,"¸í·ÉÀ» ÀÛ¼ºÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                        return TRUE;

                   }

                   sc.Com=szCom;

              }

 

              // Ãß°¡½Ã ÀÌ¹Ì »ç¿ëÁßÀÎ ´ÜÃàÅ°¸¦ ÁöÁ¤Ç߰ųª ÆíÁý½Ã ÆíÁý ´ë»ó°ú ´Ù¸¥ ´ÜÃàÅ°¸¦ ÁöÁ¤ÇßÀ¸¸é

              // Áú¹®À» ÅëÇØ ±âÁ¸ ´ÜÃàÅ°¸¦ »èÁ¦ÇÑ´Ù. ´Ü ÆíÁý½Ã ÇÒ´çµÇÁö ¾ÊÀº ´ÜÃàÅ°¸¦ ÁöÁ¤ÇßÀ¸¸é Áú¹® ºÒÇÊ¿ä

              oriidx=GetDlgShortCut(hDlg);

              if ((objidx == -1 && oriidx != -1) || (objidx != -1 && oriidx != objidx && oriidx!=-1)) {

                   if (DgShortCut.arShortCut[oriidx].id != 0) {

                        int tid=DgShortCut.arShortCut[oriidx].id;

                        Com=arMenuCom[GetMenuComIndex(tid)].Name;

                   } else {

                        Com=DgShortCut.arShortCut[oriidx].Com;

                   }

                   wsprintf(Mes,"ÀÌ ´ÜÃàÅ°´Â ÀÌ¹Ì [%s] ¸í·ÉÀ¸·Î »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù. "

                        "±âÁ¸ ´ÜÃàÅ°¸¦ »èÁ¦ÇÏ°í »õ·Î ¸¸µå½Ã°Ú½À´Ï±î?",Com);

                   if (MessageBox(hDlg,Mes,"Áú¹®",MB_YESNO)==IDNO) {

                        return TRUE;

                   } else {

                        DgShortCut.Delete(oriidx);

                   }

              }

 

              // ÆíÁýÇßÀ¸¸é °»½Å¸¸ ÇÑ´Ù. Ãß°¡½Ã´Â »èÁ¦ÇÑ´Ù.

              if (objidx!=-1) {

                   DgShortCut.Modify(objidx,&sc);

              } else {

                   DgShortCut.Add(&sc);

              }

              EndDialog(hDlg,IDOK);

              return TRUE;

          case IDCANCEL:

              EndDialog(hDlg,IDCANCEL);

              return TRUE;

          // ´ÜÃàÅ° ÁöÁ¤ ÄÁÆ®·ÑÀÌ º¯°æµÇ¸é ½ºÅÂƽ¿¡ ÀÌ Å°ÀÇ ÇöÀç »óŸ¦ Ãâ·ÂÇÑ´Ù.

          case IDC_CBKEY:

              if (HIWORD(wParam) == CBN_SELCHANGE) {

                   DisplayShortCutStatus(hDlg);

              }

              return TRUE;

          case IDC_CHKCTRL:

          case IDC_CHKALT:

          case IDC_CHKSHIFT:

              DisplayShortCutStatus(hDlg);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

lParamÀ¸·Î ÆíÁý ´ë»ó ´ÜÃàÅ°ÀÇ À妽º¸¦ Àü´Þ¹Þ´Âµ¥ -1ÀÌ¸é »õ·Î¿î ´ÜÃàÅ°¸¦ Ãß°¡Ç϶ó´Â ¸í·ÉÀÌ´Ù. ´ÜÃàÅ°¿¡´Â ¸Þ´º ¸í·ÉÀ̳ª ¸ÅÅ©·Î¸¦ ÀúÀåÇÒ ¼ö Àִµ¥ ¸ÅÅ©·Î ÀÛ¼ºÀ» À§ÇØ ¾ÕÀå¿¡¼­ ¸¸µé¾î ³õÀº ¸í·É Ãß°¡ ´ëÈ­»óÀÚ¸¦ È°¿ëÇÑ´Ù. ÀÔ·ÂµÈ ¸í·ÉÀº °¡±ÞÀû Á¤±ÔÈ­ÇÏ¿© ÀúÀåÇÏ´Â °ÍÀÌ ÁÁ´Ù. ÀÌ ´ëÈ­»óÀÚ´Â ´ÙÀ½ ¼¼ °³ÀÇ À¯Æ¿¸®Æ¼ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

 

// ´ëÈ­»óÀÚ¿¡ ¼±ÅÃµÈ ´ÜÃàÅ°ÀÇ À妽º¸¦ ã¾ÆÁØ´Ù.

int GetDlgShortCut(HWND hDlg)

{

     DWORD Flag=0;

     UINT vk;

 

     if (IsDlgButtonChecked(hDlg,IDC_CHKCTRL))

          Flag |= SC_CTRL;

     if (IsDlgButtonChecked(hDlg,IDC_CHKALT))

          Flag |= SC_ALT;

     if (IsDlgButtonChecked(hDlg,IDC_CHKSHIFT))

          Flag |= SC_SHIFT;

 

     vk=arVirtKey[SendDlgItemMessage(hDlg,IDC_CBKEY,CB_GETCURSEL,0,0)].vk;

     return DgShortCut.Find(vk,Flag);

}

 

// idx¹ø ´ÜÃàÅ°¸¦ ´ëÈ­»óÀÚ¿¡ º¸¿©ÁØ´Ù.

void SetDlgShortCut(HWND hDlg,int idx)

{

     int i;

 

     for (i=0;i<ARSIZE(arVirtKey);i++) {

          if (arVirtKey[i].vk == DgShortCut.arShortCut[idx].vk)

              break;

     }

     SendDlgItemMessage(hDlg,IDC_CBKEY,CB_SELECTSTRING,-1,

          (LPARAM)arVirtKey[i].Name);

 

     if (DgShortCut.arShortCut[idx].Flag & SC_CTRL) {

          CheckDlgButton(hDlg,IDC_CHKCTRL,BST_CHECKED);

     }

     if (DgShortCut.arShortCut[idx].Flag & SC_ALT) {

          CheckDlgButton(hDlg,IDC_CHKALT,BST_CHECKED);

     }

     if (DgShortCut.arShortCut[idx].Flag & SC_SHIFT) {

          CheckDlgButton(hDlg,IDC_CHKSHIFT,BST_CHECKED);

     }

}

 

// ´ëÈ­»óÀÚ¿¡¼­ ¼±ÅÃµÈ ´ÜÃàÅ°¸¦ ½ºÅÂƽ¿¡ Ãâ·ÂÇÑ´Ù.

void DisplayShortCutStatus(HWND hDlg)

{

     int idx;

     TCHAR *Name;

     TCHAR Status[256];

 

     idx=GetDlgShortCut(hDlg);

     if (idx == -1) {

          SetDlgItemText(hDlg,IDC_STSHORTCUT,"ÀÌ ´ÜÃàÅ°ÀÇ ÇöÀç ±â´É : ÇÒ´çµÇÁö ¾Ê¾ÒÀ½");

     } else {

          if (DgShortCut.arShortCut[idx].id != 0) {

              Name=arMenuCom[GetMenuComIndex(DgShortCut.arShortCut[idx].id)].Name;

          } else {

              Name=DgShortCut.arShortCut[idx].Com;

          }

          wsprintf(Status,"ÀÌ ´ÜÃàÅ°ÀÇ ÇöÀç ±â´É : %s",Name);

          SetDlgItemText(hDlg,IDC_STSHORTCUT,Status);

     }

}

 

´ëÈ­»óÀÚ ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ ´ÜÃàÅ°¸¦ Á¶»çÇϰųª ´ÜÃàÅ° ¼³Á¤À» ´ëÈ­»óÀÚ ÄÁÆ®·Ñ¿¡ Ç¥½ÃÇÑ´Ù. DisplayShortCutStatus ÇÔ¼ö´Â ¼±ÅÃÇÑ ´ÜÃàÅ°¿¡ Áö±Ý ¾î¶² ±â´ÉÀÌ ÇÒ´çµÇ¾î ÀÖ´ÂÁö IDC_STSHORTCUT ½ºÅÂƽ¿¡ Ãâ·ÂÇÑ´Ù. ´ÜÃàÅ° ÀÔ·ÂÀ» À§ÇØ ÇÖÅ° ÄÁÆ®·ÑÀ» »ç¿ëÇÒ ¼öµµ ÀÖÀ¸³ª ÇÖÅ°´Â ¹Ýµå½Ã Å°º¸µå¸¦ ´­·¯¾ß ÇÑ´Ù´Â Á¡ÀÌ ºÒÆíÇؼ­ ÄÞº¸ ¹Ú½º¿Í üũ ¹Ú½º·Î ÀԷ¹޾ҴÙ. ´ÜÃàÅ° °ü¸® ´ëÈ­»óÀÚ¸¦ ÅëÇØ DgShortCut °´Ã¼¸¸ ÆíÁýÇϸé TestShortCut ÇÔ¼ö¿¡¼­ ÀÌ °´Ã¼ÀÇ ³»¿ë´ë·Î ´ÜÃàÅ°¸¦ °ü¸®ÇÑ´Ù.

¶ó.¸ÅÅ©·Î ´ÜÃàÅ°

È£½ºÆ® ¼öÁØÀÇ ¸ÅÅ©·Î ¸í·ÉÁß¿¡ callÀ̶ó´Â ¸í·ÉÀÌ ÀÖ¾î ¸ÅÅ©·Î°¡ ¸ÅÅ©·Î¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. ÀÌ ¸í·ÉÀ» »ç¿ëÇÏ¸é ´ÜÃàÅ°¿¡ ¸ÅÅ©·Î È£Ãâ ¸í·ÉÀ» Æ÷ÇÔÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¸ÅÅ©·Î ´ëÈ­»óÀÚ¿¡¼­ Á÷Á¢ ´ÜÃàÅ°¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ°Ô ÇØ º¸ÀÚ. MacroEditDlgProc ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

BOOL CALLBACK MacroEditDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     static TCHAR *pName;

     int i;

     TCHAR NewMacro[256];

    TCHAR szCom[1024];

    TCHAR *Com;

    TCHAR Mes[2048];

    static int objidx;

    int oriidx;

    BOOL bEnable,bShortCut;

    SShortCut sc;

 

     switch(iMessage) {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          SendDlgItemMessage(hDlg,IDC_MACRONAME,EM_LIMITTEXT,64,0);

          pName=(TCHAR *)lParam;

        for (i=0;i<59/*ARSIZE(arVirtKey)*/;i++) {

           SendDlgItemMessage(hDlg,IDC_CBKEY,CB_ADDSTRING,0,(LPARAM)arVirtKey[i].Name);

        }

          if (lstrlen(pName)==0) {

              SetWindowText(hDlg,"»õ ¸ÅÅ©·Î");

              for (i=1;;i++) {

                   wsprintf(NewMacro,"¸ÅÅ©·Î%d",i);

                   if (DgMacro.Find(NewMacro)==-1) {

                        break;

                   }

              }

              SetDlgItemText(hDlg,IDC_MACRONAME,NewMacro);

           CheckDlgButton(hDlg,IDC_CHKMACROSHORTCUT,BST_UNCHECKED);

          } else {

              SetWindowText(hDlg,"¸ÅÅ©·Î À̸§ º¯°æ");

              SetDlgItemText(hDlg,IDC_MACRONAME,pName);

           // ÁöÁ¤µÈ ´ÜÃàÅ°°¡ ÀÖ´ÂÁö Á¶»çÇØ º»´Ù.

           wsprintf(szCom,"call \"%s\"",pName);

           objidx=DgShortCut.Find(0,szCom);

           if (objidx==-1) {

               CheckDlgButton(hDlg,IDC_CHKMACROSHORTCUT,BST_UNCHECKED);

           } else {

               CheckDlgButton(hDlg,IDC_CHKMACROSHORTCUT,BST_CHECKED);

               SetDlgShortCut(hDlg,objidx);

           }

          }

        SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_CHKMACROSHORTCUT,0),0);

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

        case IDC_CHKMACROSHORTCUT:

           if (IsDlgButtonChecked(hDlg,IDC_CHKMACROSHORTCUT)) {

               bEnable=TRUE;

           } else {

               bEnable=FALSE;

           }

           EnableWindow(GetDlgItem(hDlg,IDC_CBKEY),bEnable);

           EnableWindow(GetDlgItem(hDlg,IDC_CHKCTRL),bEnable);

           EnableWindow(GetDlgItem(hDlg,IDC_CHKALT),bEnable);

           EnableWindow(GetDlgItem(hDlg,IDC_CHKSHIFT),bEnable);

           return TRUE;

          case IDOK:

              GetDlgItemText(hDlg,IDC_MACRONAME,pName,64);

              StringNormalize(pName,NULL);

              if (IsStrEmpty(pName)) {

                   MessageBox(hDlg,"¸ÅÅ©·Î À̸§À» ÁöÁ¤ÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                   return TRUE;

              }

              if (strchr(pName,'\"') || strchr(pName,'\\')) {

                   MessageBox(hDlg,"¸ÅÅ©·Î À̸§¿¡ \"¿Í \\´Â ¾µ ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

                   return TRUE;

              }

 

           // ´ÜÃàÅ°°¡ ÁöÁ¤µÇ¾ú´ÂÁö Á¶»ç

           if (IsDlgButtonChecked(hDlg,IDC_CHKMACROSHORTCUT)) {

               bShortCut=TRUE;

           } else {

               bShortCut=FALSE;

           }

 

           // ÀÏ´Ü ÀÛ¼ºÇÑ ´ÜÃàÅ° Á¤º¸¸¦ Á¶»çÇØ ³õ´Â´Ù.

           if (bShortCut) {

               i=SendDlgItemMessage(hDlg,IDC_CBKEY,CB_GETCURSEL,0,0);

               if (i==-1) {

                   MessageBox(hDlg,"Å°¸¦ ¼±ÅÃÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                   return TRUE;

               }

               sc.vk=arVirtKey[i].vk;

               sc.Flag=0;

 

               if (IsDlgButtonChecked(hDlg,IDC_CHKCTRL))

                   sc.Flag |= SC_CTRL;

               if (IsDlgButtonChecked(hDlg,IDC_CHKALT))

                   sc.Flag |= SC_ALT;

               if (IsDlgButtonChecked(hDlg,IDC_CHKSHIFT))

                   sc.Flag |= SC_SHIFT;

 

               sc.id=0;

               wsprintf(szCom,"call \"%s\"",pName);

               sc.Com=szCom;

           }

 

           // Áö±Ý ÁöÁ¤ÇÑ ´ÜÃàÅ°°¡ Áߺ¹µÈ °ÍÀÎÁö º¸°í °æ°í ¹®±¸¸¦ ¹Ì¸® ¸¸µé¾î ³õ´Â´Ù.

           oriidx=GetDlgShortCut(hDlg);

           if (oriidx != -1) {

               if (DgShortCut.arShortCut[oriidx].id != 0) {

                   Com=arMenuCom[GetMenuComIndex(DgShortCut.arShortCut[oriidx].id)].Name;

               } else {

                   Com=DgShortCut.arShortCut[oriidx].Com;

               }

               wsprintf(Mes,"ÀÌ ´ÜÃàÅ°´Â ÀÌ¹Ì [%s] ¸í·ÉÀ¸·Î »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù. "

                   "±âÁ¸ ´ÜÃàÅ°¸¦ »èÁ¦ÇÏ°í »õ·Î ¸¸µå½Ã°Ú½À´Ï±î?",Com);

           }

 

           if (objidx==-1) {

               // ¿ø·¡ ¾ø¾ú´Âµ¥ »õ·Î ÁöÁ¤µÈ °æ¿ì

               if (bShortCut) {

                   // ±âÁ¸ ´ÜÃàÅ°¿Í Áߺ¹µÈ °æ¿ì´Â ¼öÁ¤, ¾Æ´Ï¸é Ãß°¡

                   if (oriidx!=-1) {

                       if (MessageBox(hDlg,Mes,"Áú¹®",MB_YESNO)==IDYES) {

                          DgShortCut.Modify(oriidx,&sc);

                       } else {

                          return TRUE;

                       }

                   } else {

                       DgShortCut.Add(&sc);

                   }

               }

           } else {

               // ¿ø·¡ ÀÖ¾ú´Âµ¥ »èÁ¦µÈ °æ¿ì

               if (!bShortCut) {

                   DgShortCut.Delete(objidx);

               } else {

                   // ¼öÁ¤µÈ °æ¿ì

                   if (oriidx!=-1) {

                       if (MessageBox(hDlg,Mes,"Áú¹®",MB_YESNO)==IDYES) {

                          DgShortCut.Modify(oriidx,&sc);

                       } else {

                          return TRUE;

                       }

                   // »õ·Î Ãß°¡µÈ °æ¿ì

                   } else {

                       DgShortCut.Add(&sc);

                   }

               }

           }

 

              EndDialog(hDlg,IDOK);

              return TRUE;

          case IDCANCEL:

              EndDialog(hDlg,IDCANCEL);

              return TRUE;

        // ´ÜÃàÅ° ÁöÁ¤ ÄÁÆ®·ÑÀÌ º¯°æµÇ¸é ½ºÅÂƽ¿¡ ÀÌ Å°ÀÇ ÇöÀç »óŸ¦ Ãâ·ÂÇÑ´Ù.

        case IDC_CBKEY:

           if (HIWORD(wParam) == CBN_SELCHANGE) {

               DisplayShortCutStatus(hDlg);

           }

           return TRUE;

        case IDC_CHKCTRL:

        case IDC_CHKALT:

        case IDC_CHKSHIFT:

           DisplayShortCutStatus(hDlg);

           return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

´Ü¼øÈ÷ À̸§¸¸ ÀԷ¹޴ø ´ëÈ­»óÀÚ¿¡ ´ÜÃàÅ° ÆíÁý ±â´ÉÀÌ Ãß°¡µÇ¾ú´Ù. WM_INITDIALOG¿¡¼­ ¸ÅÅ©·Î¿¡ ÇÒ´çµÈ ´ÜÃàÅ°¸¦ º¸¿©ÁÖ°í IDOK¿¡¼­ º¯°æµÈ ´ÜÃàÅ° ¼³Á¤À» ÀúÀåÇÑ´Ù. À̶§ ´ÜÃàÅ°¸¦ ´Ù·ç´Â ¼ø¼­µµ´Â ´ÙÀ½°ú °°´Ù.

 

Àú ªÀº Äڵ尡 ÀÌ·¸°Ô º¹ÀâÇÏ´Ù´Ï ³î¶øÁö ¾ÊÀº°¡? sc¿¡ ÇöÀç ¼³Á¤µÈ ´ÜÃàÅ° Á¶»ç, oriidx¿¡ Áߺ¹µÈ ´ÜÃàÅ°¸¦ Á¶»çÇØ ³õ°í Á¶°ÇµéÀ» Á¡°ËÇØ ³ª°£´Ù.

¸¶.¸Þ´º °ü¸®

ÀÌÁ¦ ±âÁ¸ ¹öÀüÀÇ ¾×¼¿·¯·¹ÀÌÅÍ´Â ´ÜÃàÅ°¿¡ ÀÇÇØ ¿ÏÀüÈ÷ ´ëüµÇ¾ú´Ù. ÀÌ·¸°Ô µÇ¸é ¸Þ´º¿¡ Ç¥½ÃµÈ ¾×¼¿·¯·¹ÀÌÅÍ ¼³¸íµµ ¸Å¹ø ¹Ù²ð ¼ö ÀÖÀ¸¹Ç·Î ¸Þ´º°¡ ¿­¸± ¶§¸¶´Ù ¿¬°áµÈ ´ÜÃàÅ°¸¦ °»½ÅÇØ¾ß ÇÑ´Ù. ÀÌ ÀÛ¾÷À» Çϱâ À§ÇØ ´ÙÀ½ µÎ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù. ¸ÞÀÎ ¸Þ´º¸¦ ´Ù·ç´Â ÇÔ¼öÀ̱â´Â ÇÏÁö¸¸ ´ÜÃàÅ°¿Í °ü·Ã¼ºÀÌ ±íÀ¸¹Ç·Î ShortCut.cpp¿¡ ÀÛ¼ºÇÏ´Â °ÍÀÌ ÁÁÀ» °Í °°´Ù.

 

// hMenu ¸Þ´º ¾Æ·¡ÀÇ ¸ðµç Ç׸ñ ĸ¼ÇÀ» ´Ù½Ã ÀÛ¼ºÇÑ´Ù.

void UpdateMenuCaption(HMENU hMenu)

{

     int i,count;

     MENUITEMINFO mi;

     TCHAR Caption[256];

 

     count=GetMenuItemCount(hMenu);

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

          mi.cbSize=sizeof(MENUITEMINFO);

          mi.fMask=MIIM_ID | MIIM_TYPE | MIIM_SUBMENU;

          mi.dwTypeData=Caption;

          mi.cch=256;

          GetMenuItemInfo(hMenu,i,TRUE,&mi);

          if (mi.fType==MFT_SEPARATOR) {

              continue;

          }

          if (mi.hSubMenu!=NULL) {

              UpdateMenuCaption(mi.hSubMenu);

          } else {

              if (mi.fType == MFT_STRING) {

                   UpdateItemCaption(hMenu,i,mi.wID,Caption);

              }

          }

     }

}

 

// ¸Þ´º Ç׸ñµÚ¿¡ ĸ¼ÇÀ» »õ·Î ºÙÀδÙ.

void UpdateItemCaption(HMENU hMenu,int idx,UINT ID,TCHAR *Caption)

{

     int sc,vkidx;

     TCHAR szName[256]={0,};

     TCHAR szShortCut[256]={0,};

     TCHAR NewShortCut[256];

     TCHAR NewCaption[256];

     TCHAR *s,*d;

     BOOL NewExist=FALSE, OldExist=FALSE;

 

     // ±âÁ¸ ĸ¼ÇÀ» ¸Þ´º¸í°ú ´ÜÃàÅ° ¹®ÀÚ¿­·Î ºÐ¸®. ÅÇ µÚÂÊÀÌ ´ÜÃàÅ° ¹®ÀÚ¿­ÀÌ´Ù.

     for (s=Caption,d=szName;*s!=0 && *s!='\t';) {

          *d++=*s++;

     }

     if (*s=='\t') {

          OldExist=TRUE;

          for (d=szShortCut,s++;*s;) {

              *d++=*s++;

          }

     }

 

     // ¸Þ´º Ç׸ñÀÇ ÇöÀç ´ÜÃàÅ° ¹®ÀÚ¿­À» ±¸ÇÑ´Ù.

     sc=DgShortCut.Find(ID,(TCHAR *)NULL);

     if (sc != -1) {

          NewExist=TRUE;

          lstrcpy(NewShortCut,"");

          if (DgShortCut.arShortCut[sc].Flag & SC_CTRL) {

              lstrcpy(NewShortCut,"Ctrl");

          }

          if (DgShortCut.arShortCut[sc].Flag & SC_ALT) {

              if (lstrlen(NewShortCut)) {

                   lstrcat(NewShortCut,"+");

              }

              lstrcat(NewShortCut,"Alt");

          }

          if (DgShortCut.arShortCut[sc].Flag & SC_SHIFT) {

              if (lstrlen(NewShortCut)) {

                   lstrcat(NewShortCut,"+");

              }

              lstrcat(NewShortCut,"Shift");

          }

          if (lstrlen(NewShortCut)) {

              lstrcat(NewShortCut,"+");

          }

          vkidx=GetVirtKeyIndex(DgShortCut.arShortCut[sc].vk);

          lstrcat(NewShortCut,arVirtKey[vkidx].Name);

     }

 

     // ´ÜÃàÅ° ¼öÁ¤

     if (OldExist) {

          if (NewExist) {

              // ´ÜÃàÅ°°¡ ¹Ù²ï °æ¿ì

              if (strcmp(szShortCut,NewShortCut)!=0) {

                   wsprintf(NewCaption,"%s\t%s",szName,NewShortCut);

                   ModifyMenu(hMenu,idx,MF_BYPOSITION | MF_STRING,ID,NewCaption);

              }

          } else {

              // ¿ø·¡ ÀÖ¾ú´Âµ¥ ¾ø¾îÁø °æ¿ì-´ÜÃàÅ° Á¦°Å

              ModifyMenu(hMenu,idx,MF_BYPOSITION | MF_STRING,ID,szName);

          }

     } else {

          if (NewExist) {

              // ¿ø·¡ ¾ø¾ú´Âµ¥ »õ·Î »ý±ä °æ¿ì

              wsprintf(NewCaption,"%s\t%s",szName,NewShortCut);

              ModifyMenu(hMenu,idx,MF_BYPOSITION | MF_STRING,ID,NewCaption);

          }

          // ¿ø·¡ ¾ø¾ú´Âµ¥ Áö±Ýµµ ¾ø´Â °æ¿ì. ¾Æ¹«°Íµµ ÇÒ ÇÊ¿ä¾øÀ½

     }

}

 

UpdateMenuCaption ÇÔ¼ö´Â ÁöÁ¤ÇÑ ¸Þ´ºÀÇ ¸ðµç Ç׸ñµé¿¡ ´ëÇØ UpdateItemCaptionÀ» È£ÃâÇÏ¿© ´ÜÃàÅ° ¼³¸í ¹®ÀÚ¿­À» ÀÛ¼ºÇÑ´Ù. ¸Þ´º´Â µð·ºÅ丮ó·³ Àç±ÍÀûÀÎ ±¸Á¶¸¦ °¡Áö¹Ç·Î UpdateMenuCaption ÇÔ¼ö´Â Àç±Í È£Ãâ ±¸Á¶·Î ÀÛ¼ºÇß´Ù. ¸ðµç ¸Þ´º¸¦ ¼øȸÇϸ鼭 ´Þ¶óÁø ´ÜÃàÅ°¸¦ ã¾Æ ĸ¼ÇÀ» ¼öÁ¤ÇÑ´Ù. OnInitMenu ÇÔ¼ö¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

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

{

     HMENU hMenu;

     HWND hActive;

     SInfo *pSi;

     int s,e;

     CApiEditText *pView;

 

     hMenu=(HMENU)wParam;

    UpdateMenuCaption(hMenu);

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

     if (hActive) {

 

¸Þ´º°¡ ¿­¸®±â Á÷Àü¿¡ ¸ðµç ¸Þ´ºÀÇ ´ÜÃàÅ°¸¦ º¯°æÇÒ °ÍÀÌ´Ù. ¸Å¹ø ´ÜÃàÅ° ºñ±³¸¦ ÇÑ´Ù´Ï ÄÄÇ»ÅÍ°¡ Á» ºÒ½ÖÇÏ´Ù´Â »ý°¢ÀÌ µé±âµµ Çϴµ¥ ´ÙÇàÈ÷ º¯°æÀÌ ¾øÀ» ¶§´Â ĸ¼ÇÀ» º¯°æÇÏÁö ¾ÊÀ¸¹Ç·Î ½Ã°£ÀÌ °ÅÀÇ µéÁö ¾Ê´Â´Ù.

¹Ù.¹Ì¿Ï¼º ÇÑ±Û ¹®Á¦

´ç±ÙÀº ÇÑ±Û IME¸¦ ºñ±³Àû Á¤È®ÇÏ°Ô Ã³¸®ÇϹǷΠÇÑ±Û Á¶¸³¿¡´Â º° ¹®Á¦°¡ ¾ø´Ù. ±×·¯³ª ÇѱÛÀ» Á¶¸³ÁßÀÎ »óÅ¿¡¼­ ´Ù¸¥ ÀÛ¾÷À» ÇÏ¸é ´Ù¿îµÇ´Â Ä¡¸íÀûÀÎ ¹®Á¦°¡ ÀÖ´Ù. Áö±Ý±îÁö ÀÛ¾÷ÇÑ °á°ú³ª ¶Ç´Â ¾ËÆÄ 4 ¹öÀüÀ¸·Î ÀÌ ¹ö±×¸¦ ½±°Ô ÀçÇöÇÒ ¼ö Àִµ¥ ´ÙÀ½ ¼ø¼­´ë·Î Å×½ºÆ®ÇØ º¸ÀÚ. Àû´çÇÑ ÅؽºÆ® ¹®¼­¸¦ ¿­¾î ³õ°í ¹®¼­»óÀÇ ´Ü¾î Çϳª¸¦ °Ë»öÇÑ´Ù. °Ë»öµÈ »óÅ¿¡¼­ F3Å°¸¦ ´©¸£¸é ÃÖÈÄ °Ë»öµÈ ´Ü¾îÀÇ ´ÙÀ½ À§Ä¡·Î ã¾Æ°¥ °ÍÀÌ´Ù.

±×·±µ¥ ÇÑ±Û Á¶¸³Áß¿¡ F3Å°¸¦ ´©¸£¸é Á¶¸³»óŸ¦ À¯ÁöÇÑ Ã¤·Î ´ÙÀ½ À§Ä¡·Î ij·µÀ» ¿Å°Ü ¹ö¸°´Ù. °Ë»öµÈ ¹®ÀÚ¿­Àº ¿Ï¼ºµÈ ÇѱÛÀÌÁö¸¸ ¿©ÀüÈ÷ Á¶¸³ÁßÀÎ °ÍÀ¸·Î »óŸ¦ °ü¸®ÇÏ°í Àֱ⠶§¹®¿¡ ÀÌ »óÅ¿¡¼­ ij·µÀ» ¿Å±â¸é À̶§ Ʋ¸° À§Ä¡¿¡¼­ ÇѱÛÀ» ¿Ï¼ºÇÏ·Á°í ½ÃµµÇϹǷΠ¾ÆÁÖ °£´ÜÇÏ°Ô Á×¾î ¹ö¸°´Ù. ¶§·Î´Â F3À» ´©¸£ÀÚ ¸¶ÀÚ Á×¾î ¹ö¸®±âµµ ÇÑ´Ù. F3Å° »Ó¸¸ ¾Æ´Ï¶ó ¸ÅÅ©·Î µîÀ» ½ÇÇàÇصµ Á×°í ¸Þ´º¸¦ È£ÃâÇÏ´Â ´ÜÃàÅ°¸¦ ´­·¯µµ ¸¶Âù°¡ÁöÀÌ´Ù. ÇÑ±Û Á¶¸³À» ³¡³»Áö ¾Ê°í ´Ù¸¥ µ¿ÀÛÀ» ÇÏ·Á°í ½ÃµµÇϱ⠶§¹®ÀÌ´Ù.

´ç±Ù 1.0¿¡¼­´Â ÀÌ·± ¹®Á¦°¡ ¾ø¾úÀ¸¸ç ¹Ù·Î Á÷ÀüÀÇ Dangeun20 ÇÁ·ÎÁ§Æ®¿¡µµ º° ¹®Á¦°¡ ¾ø¾ú´Âµ¥ ¿Ö³ÄÇÏ¸é ´ëºÎºÐÀÇ ¸í·ÉµéÀÌ ¾×¼¿·¯·¹ÀÌÅÍ·Î µÇ¾î ÀÖ¾ú°í ¾×¼¿·¯·¹ÀÌÅÍ°¡ ÀԷµǾúÀ» °æ¿ì ½Ã½ºÅÛÀÌ ¾Ë¾Æ¼­ ÇÑ±Û Á¶¸³À» ³¡³½ ÈÄ ÀÌ ¸í·ÉÀ» Àü´ÞÇϱ⠶§¹®ÀÌ´Ù. ´ç±Ù 2.0Àº ¾×¼¿·¯·¹ÀÌÅÍ ´ë½Å Á÷Á¢ ¸¸µç ´ÜÃàÅ° ¹è¿­À» »ç¿ëÇϱ⠶§¹®¿¡ Á¶¸³Áß¿¡ ÀÚµ¿À¸·Î Á¶¸³À» ³¡³»´Â ±â´ÉÀÌ ¾ø´Ù. °á±¹ ´ÜÃàÅ° ÀçÁöÁ¤ ±â´ÉÀÌ ¹®Á¦ÀÇ ¿øÀÎÀ̾ú´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ´ÜÃàÅ° ÀԷ½à ÇÑ±Û Á¶¸³À» °­Á¦·Î ÁßÁöÇØ¾ß ÇÑ´Ù. ºä¿¡ ´ÙÀ½ ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.

 

void CApiEditText::EndComp()

{

     HIMC hImc;

     if (bComp) {

          hImc=ImmGetContext(hWnd);

          ImmNotifyIME(hImc,NI_COMPOSITIONSTR,CPS_COMPLETE,0);

          ImmReleaseContext(hWnd,hImc);

     }

}

 

Çí»ç ºä¿¡µµ µ¿ÀÏÇÑ À̸§ÀÇ ÇÔ¼ö°¡ Àִµ¥ Çí»ç ºäÀÇ EndComp´Â ¹ÙÀÌÆ® Á¶¸³À» °­Á¦·Î Á¾·áÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌÁ¦ ÅؽºÆ® ºä¿¡µµ ±â´ÉÀº ´Ù¸£Áö¸¸ ºñ½ÁÇÑ ¿ªÇÒÀ» ÇÏ´Â ÇÔ¼ö°¡ ÇÊ¿äÇØÁ³À¸¹Ç·Î °°Àº À̸§À¸·Î EndComp¸¦ ¸¸µç´Ù. Çí»ç ºä¿¡¼­ ÀÌ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇϹǷΠ¹Ýµå½Ã °¡»óÀ¸·Î ¼±¾ðÇØ¾ß ÇÑ´Ù. ¿ø·¡ ±â¹Ý Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö°¡ ¸ÕÀú Á¤Àǵǰí ÆÄ»ý Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö°¡ ÀçÁ¤ÀǵǴ °æ¿ì°¡ º¸ÅëÀε¥ ÀÌ °æ¿ì´Â ¾îÂî ÇÏ´Ù º¸´Ï ²¨²Ù·Î µÇ¾ú´Ù.

ImmNotifyIME ÇÔ¼ö´Â IME¿¡°Ô ÅëÁö ¸Þ½ÃÁö¸¦ º¸³» IMEÀÇ »óŸ¦ °­Á¦·Î º¯°æÇÑ´Ù. µÎ ¹ø° Àμö·Î NI_COMPOSITIONSTRÀ» ÁÖ°í ¼¼ ¹ø° Àμö·Î CPS_COMPLETE¸¦ ÁöÁ¤Çϸé Á¶¸³ÁßÀÎ ¹®ÀÚ ÀÔ·ÂÀ» ¿Ï·áÇÑ´Ù. ÀÌ ÇÔ¼ö È£Ãâ¿¡ ÀÇÇØ WM_IME_ENDCOMPOSITION ¸Þ½ÃÁö°¡ Àü´ÞµÇ¸ç ÀÌ ¸Þ½ÃÁö¸¦ µðÆúÆ® ó¸®Çϸé ÇÑ±Û Á¶¸³ÀÌ °­Á¦·Î ¿Ï·áµÈ´Ù. TestShortCut ÇÔ¼ö¿¡¼­ ´ÜÃàÅ° ÀԷ½à ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

BOOL TestShortCut(HWND hWnd,LPMSG msg)

{

     ....

     if (bFind) {

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

        if (hActive) {

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

           pSi->Ae.GetActiveView()->EndComp();

        }

          if (psc->id) {

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(psc->id,0),0);

          } else {

           if (hActive==NULL) {

               return FALSE;

           }

           pSi->Ae.ExecMacro(psc->Com);

          }

          return TRUE;

     }

 

È°¼ºÃ¢ÀÇ ÇÔ¼ö¸¦ È£ÃâÇϱâ À§ÇØ ¸ÕÀú È°¼ºÃ¢À» ±¸ÇØ¾ß ÇÑ´Ù. È°¼ºÃ¢ÀÇ ApiEdit ÄÁÆ®·ÑÀ» ã°í È°¼ººäÀÇ EndComp ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Ȥ½Ã ÇѱÛÀ» Á¶¸³ÁßÀÌ¸é °­Á¦·Î Á¶¸³À» ¿Ï·á½ÃÄ×´Ù. ¸¸¾à È°¼ºÃ¢ÀÌ ¾ø´Ù¸é ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä´Â ¾ø´Ù. EndComp È£ÃâÀ» À§ÇØ È°¼ºÃ¢À» ¹Ì¸® ±¸ÇßÀ¸¹Ç·Î ¸ÅÅ©·Î È£Ãâ Äڵ嵵 Á¶±Ý ¼öÁ¤µÇ¾ú´Ù.

¿©±â±îÁö ¼öÁ¤ÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é ¾î¶² ´ÜÃàÅ°¸¦ ´©¸£´õ¶óµµ ÇÑ±Û Á¶¸³ÀÌ Ç®¸° ÈÄ ´ÙÀ½ ¸í·ÉÀ» ½ÇÇàÇϹǷΠ¾ÈÀüÇÏ´Ù. ±×·¯³ª ÀÌ Á¶Ä¡´Â È£½ºÆ®°¡ Á÷Á¢ ÇÑ °ÍÀÌ°í ÄÁÆ®·Ñ Â÷¿ø¿¡¼­µµ ÀÌ ¹®Á¦¸¦ Àû±ØÀûÀ¸·Î ÇØ°áÇØ¾ß ÇÑ´Ù. ¾î¶² ¹®Á¦°¡ ÀÖ´ÂÁö °£´ÜÇÏ°Ô Å×½ºÆ®ÇØ º¼ ¼ö ÀÖ´Ù. ÇѱÛÀ» ÀÔ·ÂÁßÀÎ »óÅ¿¡¼­ ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°í ´Ù½Ã ´ç±ÙÀ¸·Î µ¹¾Æ¿Í ¹®¼­ÀÇ ÀÓÀÇ ºÎºÐÀ» Ŭ¸¯ÇÑ ÈÄ Ä³·µÀ» À̵¿Çϸé Áï»çÇÑ´Ù. Æ÷Ä¿½º¸¦ ÀÒ±â Àü¿¡ ÇÑ±Û Á¶¸³»óÅ¿´°í ´Ù½Ã Æ÷Ä¿½º¸¦ ¾òÀ» ¶§µµ ¿©ÀüÈ÷ ÇÑ±Û Á¶¸³»óÅÂÀε¥ ÀÌ »óÅ¿¡¼­ ¹®¼­ÀÇ ´Ù¸¥ ºÎºÐÀ¸·Î °©ÀÚ±â À̵¿ÇØ ¹ö·È´Ù.

ÀÌ·¸°Ô µÇ¸é SetCaret¿¡¼­ ij·µÀÇ À§Ä¡¸¦ offÀÇ 2¹ÙÀÌÆ® ¾ÕÂÊÀ¸·Î °è»êÇϴµ¥ ÀÌ À§Ä¡°¡ ÇѱÛÀÇ °¡¿îµ¥¿¡ °ÉÄ¥ ¼öµµ ÀÖÀ¸¸ç ¹«È¿ÇÑ ÀÚ¸®¿¡ ´ëÇØ È­¸é ÁÂÇ¥¸¦ °è»êÇÏ´Ù°¡ Á×´Â °ÍÀÌ´Ù. ÇÑ±Û Á¶¸³ »óÅ¿¡¼­ ij·µÀÌ ¿òÁ÷ÀÌ´Â °Í ÀÚü°¡ ±ÔÄ¢¿¡ ¸ÂÁö ¾Ê´Ù. ¹®Á¦ÀÇ ÇØ°á ¹æ¹ýÀº ºñ±³Àû °£´ÜÇѵ¥ Æ÷Ä¿½º¸¦ ÀÒÀ» ¶§ ÇÑ±Û Á¶¸³À» ¿Ï·áÇÏ¸é µÈ´Ù.

 

void CApiEditText::OnKillFocus(HWND hWnd, HWND hwndNewFocus)

{

    EndComp();

     DestroyCaret();

 

     if ((pFrame->HideSelType != 2 && SelStart != SelEnd) ||

          (pFrame->bHideCurLine == TRUE && pFrame->nShowCurLine != 0)) {

          Invalidate(-1);

     }

}

 

ÀÌ·¸°Ô Çϸé Á¶¸³Áß¿¡ ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´õ¶óµµ ÀÏ´Ü ÇÑ±Û Á¶¸³ÀÌ ¿Ï·áµÇ¹Ç·Î ´Ù½Ã Æ÷Ä¿½º¸¦ ¾ò¾úÀ» ¶§ ij·µ À̵¿¿¡ ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù. ÀÌ ¹ö±×´Â ´ÜÃàÅ° ±â´É°ú´Â »ó°üÀÌ ¾øÀ¸¸ç ´ç±Ù 1.0¿¡¼­ºÎÅÍ Á¸ÀçÇß´ø ¿À·¡µÈ ¹ö±×ÀÌ´Ù. ÇÑ±Û Á¶¸³Áß¿¡ ´Ù¸¥ âÀ¸·Î ÀüȯÇÏ´Â ÀÏÀº Á¾Á¾ ÀÖÀ¸¹Ç·Î ±×¸¸Å­ Á¾Á¾ Á×¾ú´Ù´Â ¾ê±â´Ù.