°¡.Ŭ¸³º¸µå

ApiDraw11¿¡¼­´Â Ŭ¸³º¸µå·Î µµÇüÀ» º¹»çÇÏ°í ºÙ¿© ³Ö´Â ½Ç½ÀÀ» ÇØ º¸ÀÚ. ÇÁ·ÎÁ§Æ®ÀÇ »çº»À» ÀÛ¼ºÇÑ ÈÄ ´ÙÀ½ Àü¿ª º¯¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

UINT ClipFormat;

int PasteX, PasteY;

 

ClipFormatÀº ApiDrawÀÇ µµÇü¿¡ ´ëÇÑ Å¬¸³º¸µå Æ÷¸Ë IDÀÌ´Ù. À©µµ¿ìÁî°¡ ApiDrawÀÇ µµÇü Æ÷¸ËÀ» ¾Ë ¸®°¡ ¾øÀ¸¹Ç·Î ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Å¬¸³º¸µå Æ÷¸ËÀ» Á÷Á¢ µî·ÏÇؼ­ »ç¿ëÇØ¾ß ÇÑ´Ù. ¸ÞÀÎ À©µµ¿ì°¡ »ý¼ºµÉ ¶§ Ŭ¸³º¸µå Æ÷¸ËÀ» µî·ÏÇϵµ·Ï ÇÏÀÚ.

 

LRESULT Main_OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   ClipFormat=RegisterClipboardFormat("ApiDraw1.0_ClipboardFormat_"

      "RegisteredBy_KoreaKimSangHyung_When_20041108_03:58:12");

   return 0;

}

 

¾ÆÁÖ ±ä À̸§À¸·ÎµÈ ¹®ÀÚ¿­À» ÁÖ°í ApiDraw¿¡ ´ëÇÑ Å¬¸³º¸µå Æ÷¸ËÀÇ ID¸¦ ¹ß±Þ¹Þ¾Ò´Ù. ÀÌ ¹®ÀÚ¿­¿¡´Â ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ À̸§°ú ¹öÀü, ¸¸µç »ç¶÷ÀÇ À̸§°ú ³¯Â¥ µîÀÌ Æ÷ÇԵǾî ÀÖÀ¸¹Ç·Î ¿ì¿¬È÷ °°Àº À̸§À¸·Î Æ÷¸ËÀ» µî·ÏÇÏ´Â ÀÏÀº ¾øÀ» °ÍÀÌ´Ù. ÀÌÈÄ ApiDraw´Â ClipFormatÀ¸·Î ÀÚ½ÅÀÇ µµÇüÀ» Ŭ¸³º¸µå¿¡ ³ÖÀ» ¼ö ÀÖ°í Ŭ¸³º¸µå¿¡ ÀÌ·± Çü½ÄÀÇ µ¥ÀÌÅÍ°¡ µé¾î ÀÖ´ÂÁö Á¶»çÇÒ ¼öµµ ÀÖÀ¸¸ç ´Ù½Ã ²¨³¾ ¼öµµ ÀÖ´Ù. ÀÌ Æ÷¸ËÀ» ¾Æ´Â À¯ÀÏÇÑ ÇÁ·Î±×·¥Àº ApiDraw»ÓÀÌÁö¸¸ ApiDraw³¢¸®´Â ÀÌ Æ÷¸ËÀ» ÀνÄÇϹǷΠµÎ °³ÀÇ ApiDraw°¡ Ŭ¸³º¸µå·Î ¼­·ÎÀÇ ÀڷḦ ±³È¯ÇÒ ¼ö ÀÖ´Ù.

PasteX, PasteY´Â ºÙ¿© ³Ö±â¸¦ ÇÒ ¶§ µµÇüÀÌ »ý¼ºµÉ À§Ä¡Àε¥ ¶È°°Àº µµÇüÀ» º¹»çÇؼ­ ºÙÀδ٠ÇÏ´õ¶óµµ À§Ä¡¸¸Àº ´Þ¶ó¾ß ÇÑ´Ù. ¸ðµç Á¤º¸¸¦ ¿ÏÀüÈ÷ ¶È°°ÀÌ º¹»çÇØ ¹ö¸®¸é µÎ µµÇüÀÌ °ãÃļ­ ÀÏÀÏÀÌ ºÐ¸®Çؾ߸¸ ÇÒ °ÍÀÌ´Ù. ±×·¡¼­ ´ÙÀ½ ºÙ¿© ³ÖÀ» ÁÂÇ¥´Â º°µµÀÇ º¯¼ö·Î °ü¸®ÇÏ¸ç ºÙÀ̱⸦ ÇÒ ¶§¸¶´Ù ¿ìÇÏÇâÀ¸·Î ÀÏÁ¤ÇÑ °Å¸®¸¸Å­ À̵¿Çϵµ·Ï ÇÑ´Ù. º¹»ç ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

void Copy()

{

   HGLOBAL hmem;

   int size;

   BYTE *ptr;

  

   if (NowSel == -1) {

      return;

   }

   size=sizeof(DObject);

   if (arObj[NowSel]->Type >= DT_TEXT && arObj[NowSel]->Type <= DT_META) {

      size += arObj[NowSel]->Len;

   }

 

   hmem=GlobalAlloc(GHND,size);

   ptr=(BYTE *)GlobalLock(hmem);

   memcpy(ptr,arObj[NowSel],sizeof(DObject));

   if (arObj[NowSel]->Type >= DT_TEXT && arObj[NowSel]->Type <= DT_META) {

      memcpy(ptr+sizeof(DObject),arObj[NowSel]->Text,arObj[NowSel]->Len);

   }

   GlobalUnlock(hmem);

   if (OpenClipboard(hWndMain)) {

      EmptyClipboard();

      SetClipboardData(ClipFormat,hmem);

      CloseClipboard();

      PasteX=arObj[NowSel]->rt.left+16;

      PasteY=arObj[NowSel]->rt.top+16;

   }

}

 

ÀÏ´ÜÀº ¼±ÅÃµÈ µµÇüÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ¼±ÅÃµÈ µµÇüÀÇ DObject ±¸Á¶Ã¼¸¦ Ŭ¸³º¸µå¿¡ º¹»çÇ쵂 ÅؽºÆ® µî ºÎ°¡ µ¥ÀÌÅ͸¦ °¡Áø °´Ã¼µéÀº ÀÌ µ¥ÀÌÅ͵µ Ŭ¸³º¸µå¿¡ °°ÀÌ ÀúÀåÇØ¾ß ÇÑ´Ù. ºÙ¿© ³Ö´Â ÂÊ¿¡¼­ Ŭ¸³º¸µå ³»ÀÇ °´Ã¼¿¡ ´ëÇÑ ¸ðµç Á¤º¸¸¦ ¾Ë ¼ö ÀÖµµ·Ï ÇØ¾ß ÇϹǷΠµµÇü Çϳª¿¡ ´ëÇÑ ¿ÏÀüÇÑ Á¤º¸¸¦ ¾î¶² Çü½ÄÀ¸·Îµç Ŭ¸³º¸µå¿¡ ´Ù ³Ö¾î¾ß ÇÏ´Â °ÍÀÌ´Ù. ÀÏ¹Ý µµÇüÀº DObject°´Ã¼¸¸ º¹»çÇÏ°í ÅؽºÆ® µîÀº DObject ´ÙÀ½¿¡ Len ±æÀ̸¸Å­ÀÇ µ¥ÀÌÅ͵µ °°ÀÌ ³Ö¾î µÎ¾ú´Ù.

ºÙ¿© ³Ö´Â ÄÚµå´Â DObjectÀÇ TypeÀ¸·ÎºÎÅÍ ¿©ºÐÀÇ µ¥ÀÌÅÍ°¡ ´õ ÀÖ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ°í LenÀ¸·ÎºÎÅÍ ±× ±æÀ̸¦ ¾Ë ¼ö ÀÖÀ¸¹Ç·Î ¹«Á¶°Ç µÚ¿¡ µ¡ºÙ¿© ³õ±â¸¸ ÇÏ¸é µÈ´Ù. PasteX, PasteY´Â º¹»çÇÑ µµÇüÀÇ ÁÂÇ¥º¸´Ù ¿À¸¥ÂÊ ¾Æ·¡·Î 16Çȼ¿¸¸Å­ À̵¿ÇÑ ÁÂÇ¥¸¦ ´ëÀÔÇÏ¿© º¹»ç ÈÄ °ð¹Ù·Î ºÙ¿© ³ÖÀ» ¶§ ¿øº»°ú Á¶±Ý ´Ù¸¥ À§Ä¡¿¡ µµÇüÀÌ »ý¼ºµÇµµ·Ï Çß´Ù. ´ÙÀ½Àº ºÙ¿© ³Ö±â¸¦ ÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇØ º¸ÀÚ.

 

void Paste()

{

   HGLOBAL hmem;

   DObject *pNew;

   RECT nrt;

 

   if (IsClipboardFormatAvailable(ClipFormat)) {

      OpenClipboard(hWndMain);

      hmem=GetClipboardData(ClipFormat);

      pNew=(DObject *)GlobalLock(hmem);

      nrt.left=PasteX;

      nrt.top=PasteY;

      nrt.right=nrt.left+pNew->rt.right-pNew->rt.left;

      nrt.bottom=nrt.top+pNew->rt.bottom-pNew->rt.top;

      PasteX+=16;

      PasteY+=16;

      AppendObject(pNew->Type,&nrt);

      arObj[arNum-1]->LineWidth=pNew->LineWidth;

      arObj[arNum-1]->LineColor=pNew->LineColor;

      arObj[arNum-1]->PlaneColor=pNew->PlaneColor;

      arObj[arNum-1]->Len=pNew->Len;

      arObj[arNum-1]->FontSize=pNew->FontSize;

      arObj[arNum-1]->FontColor=pNew->FontColor;

      lstrcpy(arObj[arNum-1]->FontFace,pNew->FontFace);

 

      if (pNew->Type >= DT_TEXT && pNew->Type <= DT_META) {

          arObj[arNum-1]->Text=(TCHAR *)malloc(pNew->Len);

          memcpy(arObj[arNum-1]->Text,(BYTE *)pNew+sizeof(DObject),pNew->Len);

      }

      GlobalUnlock(hmem);

      CloseClipboard();

      NowSel=arNum-1;

      InvalidateRect(hWndMain,NULL,TRUE);

   }

}

 

ºÙ¿© ³Ö±â¸¦ ÇÏ·Á¸é Ŭ¸³º¸µå¿¡ ClipFormat Çü½ÄÀÇ µ¥ÀÌÅÍ°¡ µé¾î ÀÖ¾î¾ß ÇÑ´Ù. ÅؽºÆ®³ª HTML, ºñÆ®¸Ê µûÀ§ÀÇ µ¥ÀÌÅÍ°¡ µé¾î ÀÖ´Ù¸é ÀÌ µ¥ÀÌÅÍ´Â ApiDraw°¡ Á÷Á¢ ÀνÄÇÒ ¼ö ¾ø´Ù. ApiDraw´Â ¿À·ÎÁö ÀÚ½ÅÀÇ °íÀ¯ Æ÷¸ËÀÎ ClipFormat¸¸ ÀνÄÇÒ »ÓÀÌ´Ù. Ŭ¸³º¸µå·ÎºÎÅÍ DObjectÇü µ¥ÀÌÅ͸¦ ±¸ÇÏ°í PasteX, PasteY·ÎºÎÅÍ ºÙ¿© ³ÖÀ» ÁÂÇ¥¸¦ °è»êÇÑ ÈÄ AppendObject·Î ÀÏ´Ü µµÇüÀ» Ãß°¡ÇÑ´Ù. ±×¸®°í µµÇüÀÇ ¼Ó¼ºÀº ¸ðµÎ Ŭ¸³º¸µå¿¡ ÀúÀåµÈ ¼Ó¼º´ë·Î Àç¼³Á¤ÇÑ´Ù. ÅؽºÆ®, ºñÆ®¸Ê, ¸ÞŸÀÎ °æ¿ì´Â Ãß°¡ µ¥ÀÌÅ͵µ °°ÀÌ Àоî¿Í¾ß ÇÑ´Ù.

arObj¿¡ µµÇüÀ» Ãß°¡ÇÑ ÈÄ InvalidateRect¸¦ È£ÃâÇÏ¸é »õ·Î Ãß°¡µÈ µµÇüÀÌ È­¸é¿¡ ±×·ÁÁø´Ù. º¹»ç ¹× ºÙ¿©³Ö±â Äڵ尡 ÀÛ¼ºµÇ¾úÀ¸¹Ç·Î ÀÌÁ¦ Àû´çÇÑ ¸Þ´º¿¡¼­ ÀÌ ÇÔ¼öµéÀ» ºÎ¸£±â¸¸ ÇÏ¸é µÈ´Ù. ¸ÞÀÎ ¸Þ´ºÀÇ ÆíÁý Æ˾÷ ¾Æ·¡¿¡ ÀÖ´Â º¹»ç, À߶󳻱â, ºÙ¿© ³Ö±â¿¡¼­ ÀÌ ÇÔ¼öµéÀ» È£ÃâÇÑ´Ù.

 

LRESULT Main_OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   case IDM_EDIT_CUT:

      Copy();

      SendMessage(hCanvas,WM_COMMAND,MAKEWPARAM(IDM_POPUP_DELETE,0),0);

      break;

   case IDM_EDIT_COPY:

      Copy();

      break;

   case IDM_EDIT_PASTE:

      Paste();

      break;

 

À߶󳻱â´Â º¹»çÇÑ ÈÄ »èÁ¦ÇÏ´Â °Í°ú µ¿ÀÏÇϹǷΠº°µµÀÇ Äڵ带 µû·Î ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é Àß µ¿ÀÛÇÒ °ÍÀÌ´Ù. ¼±ÅÃµÈ µµÇüÀÇ À¯¹«¿Í Ŭ¸³º¸µå¿¡ µé¾î ÀÖ´Â µ¥ÀÌÅÍÀÇ Çü½Ä¿¡ µû¶ó ¸Þ´º Ç׸ñÀ» ÀûÀýÈ÷ °ü¸®ÇÑ´Ù.

 

LRESULT Main_OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   if (NowSel == -1) {

      EnableMenuItem((HMENU)wParam, IDM_EDIT_CUT, MF_BYCOMMAND | MF_GRAYED);

      EnableMenuItem((HMENU)wParam, IDM_EDIT_COPY, MF_BYCOMMAND | MF_GRAYED);

   } else {

      EnableMenuItem((HMENU)wParam, IDM_EDIT_CUT, MF_BYCOMMAND | MF_ENABLED);

      EnableMenuItem((HMENU)wParam, IDM_EDIT_COPY, MF_BYCOMMAND | MF_ENABLED);

   }

   if (IsClipboardFormatAvailable(ClipFormat)) {

      EnableMenuItem((HMENU)wParam, IDM_EDIT_PASTE, MF_BYCOMMAND | MF_ENABLED);

   } else {

      EnableMenuItem((HMENU)wParam, IDM_EDIT_PASTE, MF_BYCOMMAND | MF_GRAYED);

   }

   return 0;

}

 

º¹»ç, À߶󳻱â´Â ¼±ÅÃµÈ µµÇüÀÌ ÀÖÀ» ¶§¸¸ »ç¿ëÇÒ ¼ö ÀÖ°í ºÙ¿© ³Ö±â´Â Ŭ¸³º¸µå¿¡ ClipFormatÀÌ ÀÖÀ» ¶§¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Åø¹ÙÀÇ ¹öÆ°µéµµ µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î °ü¸®ÇÑ´Ù.

 

void OnIdle()

{

   static DTool OldTool=(DTool)-1;

 

   if (NowSel == -1) {

      SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_CUT,MAKELONG(0,0));

      SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_COPY,MAKELONG(0,0));

   } else {

      SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_CUT,MAKELONG(TBSTATE_ENABLED,0));

      SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_COPY,MAKELONG(TBSTATE_ENABLED,0));

   }

   if (IsClipboardFormatAvailable(ClipFormat)) {

      SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_PASTE,MAKELONG(TBSTATE_ENABLED,0));

   } else {

      SendMessage(hToolBar,TB_SETSTATE,IDM_EDIT_PASTE,MAKELONG(0,0));

   }

 

   if (OldTool == NowTool) {

      return;

   }

 

Á¶°ÇÀº ¸Þ´ºÀÇ °æ¿ì¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. Åø ¹öÆ°°ú´Â ´Þ¸® Ŭ¸³º¸µå °ü·Ã ¸í·ÉÀº ¾ðÁ¦µçÁö ¹Ù²ð ¼ö Àֱ⠶§¹®¿¡ OnIdleÀÌ È£ÃâµÉ ¶§¸¶´Ù Á¡°ËÇØ º¸¾Æ¾ß ÇÑ´Ù.