À©µµ¿ìÁîÀÇ Å¬¸³º¸µå´Â ´Ü ÇϳªÀÇ µ¥ÀÌÅ͸¸ ÀúÀåÇÒ ¼ö ÀÖÀ¸¸ç »õ·Î¿î µ¥ÀÌÅ͸¦ º¹»çÇϸé Ŭ¸³º¸µå¿¡ µé¾îÀÖ´ø ¿ø·¡ µ¥ÀÌÅÍ´Â Æı«µÈ´Ù. ±×·¡¼ ºÐ¸®µÇ¾î ÀÖ´Â ¿©·¯ °³ÀÇ ÅؽºÆ®¸¦ Çϳª·Î ÇÕÄ¡·Á¸é ÀÏÀÏÀÌ º¹»ç, ºÙÀ̱⸦ ¹Ýº¹Çؾ߸¸ ÇÑ´Ù. µ¡ºÙÀ̱⠱â´ÉÀº Ŭ¸³º¸µå¿¡ ÀÌ¹Ì µé¾î ÀÖ´Â µ¥ÀÌÅÍ¿Í »õ·Î º¹»çµÈ µ¥ÀÌÅ͸¦ Çϳª·Î ÇÕÃÄ ´Ù½Ã Ŭ¸³º¸µå¿¡ ³Ö´Â ±â´ÉÀÌ´Ù. Èð¾îÁø ÅؽºÆ®¸¦ Çϳª·Î ÇÕÃļ ´Ù¸¥ °÷À¸·Î º¹»çÇÏ°íÀÚ ÇÒ ¶§ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÀÌ ±â´ÉÀº ¹®¼ÀÇ ³»¿ë°ú Ŭ¸³º¸µåÀÇ ³»¿ëÀ» ÇÕÄ¡´Â °ÍÀ̹ǷΠÄÁÆ®·ÑÀÌ Á÷Á¢ Á¦°øÇØ¾ß ÇÑ´Ù. ApiEdit´Â Ŭ¸³º¸µå °ü·Ã ¸í·ÉÀ» WM_COMMAND·Î ¸Þ½ÃÁö¸¦ º¸³» ó¸®ÇϹǷΠµ¡ºÙÀ̱⠸í·Éµµ °°Àº ¹æ½ÄÀ¸·Î ó¸®Çϵµ·Ï ÇÏÀÚ. ApiEdit.hÀÇ ¼±µÎ¿¡ Á¤ÀÇµÈ ¸í·É ID¿¡ ´ÙÀ½ µÎ °³¸¦ ´õ Ãß°¡ÇÑ´Ù.
#define IDM_AE_CUT 40001
#define IDM_AE_COPY 40002
#define IDM_AE_PASTE 40003
#define IDM_AE_SELALL 40004
#define IDM_AE_COPYAPPEND 40005
#define IDM_AE_CUTAPPEND 40006
°¢°¢ º¹»çÇؼ Ãß°¡Çϱâ, À߶ó¼ Ãß°¡Çϱ⠸í·ÉÀÌ´Ù. CApiEdit::OnCommand¿¡ ÀÌ µÎ ¸í·É¿¡ ´ëÇÑ Äڵ带 ÀÛ¼ºÇÑ´Ù.
void CApiEdit::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
TCHAR *ptr2;
switch (id) {
....
case IDM_AE_CUTAPPEND:
if (!IsClipboardFormatAvailable(CF_TEXT)) {
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUT,0),0);
return;
}
if (SelStart != SelEnd && bReadOnly==FALSE && bCapture==FALSE) {
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPYAPPEND,0),0);
DeleteSelection();
Invalidate(FindParaStart(off));
SetCaret();
}
return;
case IDM_AE_COPYAPPEND:
if (!IsClipboardFormatAvailable(CF_TEXT)) {
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPY,0),0);
return;
}
if (SelStart != SelEnd) {
OpenClipboard(hWnd);
hmem=GetClipboardData(CF_TEXT);
ptr=(TCHAR *)GlobalLock(hmem);
GlobalUnlock(hmem);
CloseClipboard();
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
hmem=GlobalAlloc(GHND, lstrlen(ptr)+SelSecond-SelFirst+1);
ptr2=(TCHAR *)GlobalLock(hmem);
lstrcpy(ptr2,ptr);
memcpy(ptr2+lstrlen(ptr2),buf+SelFirst,SelSecond-SelFirst);
GlobalUnlock(hmem);
if (OpenClipboard(hWnd)) {
EmptyClipboard();
SetClipboardData(CF_TEXT,hmem);
CloseClipboard();
}
}
return;
±â´ÉÀÇ °³³äÀÌ °£´ÜÇϱ⠶§¹®¿¡ Äڵ嵵 ¾ÆÁÖ ¿ø·ÐÀûÀÌ´Ù. Ŭ¸³º¸µåÀÇ ÅؽºÆ®¸¦ ¸ÕÀú ÀÐ¾î ³õ°í ¿©±â¿¡ ¼±Åÿµ¿ªÀÇ ÅؽºÆ®¸¦ µ¡ºÙ¿©¼ ´Ù½Ã Ŭ¸³º¸µå·Î ¹Ð¾î ³ÖÀ¸¸é µÈ´Ù. º° Ưº°ÇÑ ±â±³ °°Àº °ÍÀº ¾ø°í ¾ÆÁÖ Æò¹üÇÑ ÄÚµåÀÏ »ÓÀÌ´Ù. À߶ó¼ Ãß°¡Çϱâ´Â º¹»çÇؼ Ãß°¡ÇÑ ÈÄ ¼±Åÿµ¿ªÀ» »èÁ¦ÇÏ¸é µÈ´Ù. ¸¸¾à Ŭ¸³º¸µå¿¡ ÅؽºÆ®°¡ ¾ø´Ù¸é, Áï µ¡ºÙÀÏ ¿øº»ÀÌ ¾ø´Ù¸é Ãß°¡ ±â´ÉÀº Ãë¼ÒµÇ°í º¹»ç, ÀÚ¸£±â¿Í µ¿ÀÏÇØÁø´Ù. À̶§´Â ¸Þ½ÃÁö¸¦ º¹»ç, ÀÚ¸£±â·Î ¹Ù²ã¼ ´Ù½Ã Àڽſ¡°Ô º¸³»¸é µÈ´Ù.
ApiEdit°¡ µ¡ºÙÀ̱⠱â´ÉÀ» ±¸ÇöÇÏ°í ÀÌ ±â´É¿¡ ´ëÇÑ ¸í·É ID¸¦ Á¤ÀÇÇÏ°í ÀÖÀ¸¹Ç·Î È£½ºÆ®´Â ¸í·É ID¿Í ÇÔ²² WM_COMMAND ¸Þ½ÃÁö¸¸ º¸³»ÁÖ¸é µÈ´Ù. ´ÙÀ½ Äڵ带 Ãß°¡Çϵµ·Ï ÇÏÀÚ.
void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
case IDM_EDIT_COPYAPPEND:
SendMessage(pSi->Ae.hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPYAPPEND,0),0);
break;
case IDM_EDIT_CUTAPPEND:
SendMessage(pSi->Ae.hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUTAPPEND,0),0);
break;
´Ù¸¥ Ŭ¸³º¸µå ¸í·É°ú ¸¶Âù°¡Áö·Î ÀÌ µÎ ±â´Éµµ ¼±Åÿµ¿ªÀÌ ÀÖ¾î¾ß¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. OnInitMenu¿¡¼ ÀÌ µÎ ¸Þ´º ¸í·ÉÀ» °ü¸®ÇØ¾ß ÇÑ´Ù.
void OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (s == e) {
EnableMenuItem(hMenu, IDM_EDIT_CUT, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_EDIT_COPY, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_EDIT_CUTAPPEND, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_EDIT_COPYAPPEND, MF_BYCOMMAND | MF_GRAYED);
....
} else {
EnableMenuItem(hMenu, IDM_EDIT_CUT, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_EDIT_COPY, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_EDIT_CUTAPPEND, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_EDIT_COPYAPPEND, MF_BYCOMMAND | MF_ENABLED);
....
ÀÌ ±â´É¿¡ ´ëÇؼ´Â <Ctrl+Shift+C>, <Ctrl+Shift+X> ¾×¼¿·¯·¹ÀÌÅÍ°¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ´ÜÃàÅ°·Îµµ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ApiEdit ÄÁÆ®·Ñ ÀÚü´Â ÀÌ ¸í·É¿¡ ´ëÇÑ UI¸¦ Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î È£½ºÆ®°¡ Áö¿øÇÏÁö ¾ÊÀ¸¸é ÀÌ ±â´ÉÀº »ç¿ëÇÒ ¼ö ¾øµµ·Ï µÇ¾î ÀÖ´Ù. ¸¸¾à ApiEdit ÄÁÆ®·ÑÀÌ ÀÚüÀûÀ¸·Î ÀÌ ¸í·ÉÀ» Áö¿øÇÏ°íÀÚ ÇÑ´Ù¸é Æ˾÷¸Þ´º¿¡ ¸í·É Ç׸ñÀ» ³Ö°Å³ª ¾Æ´Ï¸é OnChar¿¡¼ ´ÜÃàÅ° 󸮸¦ ÇØ¾ß ÇÑ´Ù.