º¹ÀâÇÑ ¸ÅÅ©·Î ±¸¹®À» Á¤ÀÇÇÏ°í ¾×¼¿·¯·¹ÀÌÅÍ ´ë½Å 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¿¡¼ºÎÅÍ Á¸ÀçÇß´ø ¿À·¡µÈ ¹ö±×ÀÌ´Ù. ÇÑ±Û Á¶¸³Áß¿¡ ´Ù¸¥ âÀ¸·Î ÀüȯÇÏ´Â ÀÏÀº Á¾Á¾ ÀÖÀ¸¹Ç·Î ±×¸¸Å Á¾Á¾ Á×¾ú´Ù´Â ¾ê±â´Ù.