´Ù.¸ÞŸ »ðÀÔ

¸ÞŸ ÆÄÀÏÀº ºñÆ®¸Ê°ú´Â ´Þ¸® È®´ë¸¦ Çصµ ¸ð¾çÀ» À¯ÁöÇÏ´Â º¤ÅÍ Æ÷¸ËÀÇ ±×·¡ÇÈ ÆÄÀÏÀÌ´Ù. ¿ÜºÎ ÆÄÀÏ¿¡¼­ ÀÐ¾î ¿À´Â °ÍÀ̹ǷΠºñÆ®¸ÊÀ» »ðÀÔÇÏ´Â ¹æ¹ý°ú °ÅÀÇ À¯»çÇÑ ¹æ¹ýÀ¸·Î »ðÀÔÇÒ ¼ö ÀÖ´Ù. ¸ÞŸ ÆÄÀÏÀ» »ðÀÔÇÏ´Â ´ÙÀ½ ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.

 

void InsertMeta(int x,int y)

{

   OPENFILENAME OFN;

   char lpstrFile[MAX_PATH]="";

   HANDLE hFile;

   DWORD FileSize, dwRead;

   BYTE *pMeta;

 

   memset(&OFN, 0, sizeof(OPENFILENAME));

   OFN.lStructSize = sizeof(OPENFILENAME);

   OFN.hwndOwner=hWndMain;

   OFN.lpstrFilter="¸ÞŸ ÆÄÀÏ\0*.wmf\0¸ðµç ÆÄÀÏ(*.*)\0*.*\0";

   OFN.lpstrFile=lpstrFile;

   OFN.nMaxFile=256;

   if (GetOpenFileName(&OFN)!=0) {

      hFile=CreateFile(lpstrFile,GENERIC_READ,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

      if (hFile!=INVALID_HANDLE_VALUE) {

          FileSize=GetFileSize(hFile,NULL);

          pMeta=(BYTE *)malloc(FileSize);

          ReadFile(hFile,pMeta,FileSize,&dwRead,NULL);

          CloseHandle(hFile);

          if(*((DWORD *)pMeta) != 0x9ac6cdd7l) {

             free(pMeta);

             return;

          }

          AppendObject(DT_META,x,y,x+100,y+100);

          arObj[arNum-1]->Meta=pMeta;

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

 

          InvalidateRect(hWndMain,NULL,TRUE);

          NowTool=DT_SELECT;

          NowSel=arNum-1;

      }

   }

}

 

ÆÄÀÏ ¿­±â ´ëÈ­»óÀÚ·Î ¸ÞŸ ÆÄÀÏÀÇ °æ·Î¸¦ ÀÔ·Â¹Þ¾Æ ÀÌ ÆÄÀÏ Å©±â¸¸Å­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í pMeta ¸â¹ö¿¡ ±× Æ÷ÀÎÅ͸¦ ³Ö¾î µÎ¸é µÈ´Ù. Ç÷¹À̽ººí ¸ÞŸ ÆÄÀÏÀÇ °æ¿ì¸¸ »ðÀÔÇÒ ¼ö ÀÖµµ·Ï Çߴµ¥ Á¸ÀçÇÏ´Â ´ëºÎºÐÀÇ ¸ÞŸ ÆÄÀÏÀÌ Ç÷¹À̽ººíÀ̹ǷΠÀÌ·¸°Ô Çصµ Å« ÁöÀåÀº ¾ø´Ù. »ðÀԵǴ ¸ÞŸ ÆÄÀÏÀÇ Å©±â´Â 100,100À¸·Î ¼³Á¤Çߴµ¥ ÀÌ´Â ¾îµð±îÁö³ª µðÆúÆ®ÀÏ »ÓÀÌ¸ç »ðÀÔ ÈÄ¿¡ »ç¿ëÀÚ°¡ ¸¶À½´ë·Î Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸¦ ¶§ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸ÞŸ ÆÄÀÏÀ» »ðÀÔÇÑ´Ù.

 

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

{

   ....

   if (NowTool==DT_META) {

      InsertMeta(LOWORD(lParam),HIWORD(lParam));

      return 0;

   }

 

NowToolÀÌ DT_METAÀÏ ¶§ Ŭ¸¯ÇÑ À§Ä¡¿¡ ¸ÞŸ ÆÄÀÏÀ» »ðÀÔÇß´Ù. OnLButtonDown¿¡¼­ ¸ÞŸ ÆÄÀÏÀ» »ðÀÔÇÏ´Â ÄÚµå¿Í ºñÆ®¸ÊÀ» »ðÀÔÇÏ´Â ÄÚµåÀÇ ¼ø¼­´Â Áß¿äÇÏÁö ¾Ê´Ù. ¾îÂ÷ÇÇ NowToolÀÌ µÎ °ªÀ» µ¿½Ã¿¡ °¡Áú ¼ö´Â ¾øÀ¸¹Ç·Î Á¶°Ç¿¡ ¸Â´Â Äڵ常 ½ÇÇàÇÏ°í ¸®ÅÏÇϱ⠶§¹®ÀÌ´Ù. ¿©±â±îÁö ÀÛ¼ºÇϸé arObj¿¡ ¸ÞŸ °´Ã¼°¡ »ðÀÔµÇ¸ç ³²Àº ÀÏÀº »ðÀÔµÈ ¸ÞŸ ÆÄÀÏÀ» È­¸é¿¡ ±×¸®´Â °ÍÀÌ´Ù. ´ÙÀ½ ¸ÞŸ Ãâ·Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.

 

#pragma pack(push)

#pragma pack(2)

typedef struct

{

   DWORD     dwKey;

   WORD      hmf;

   SMALL_RECT   bbox;

   WORD      wInch;

   DWORD     dwReserved;

   WORD      wCheckSum;

} APMHEADER, *PAPMHEADER;

#pragma pack(pop)

 

void PlayPlaceableMeta(HDC hdc,BYTE *pMeta,int len,RECT *rt)

{

   HENHMETAFILE hEnh;

   PAPMHEADER pHeader=(PAPMHEADER)pMeta;

   METAFILEPICT mp;

 

   if(pHeader->dwKey == 0x9ac6cdd7l) {

      mp.mm = MM_ANISOTROPIC;

      mp.xExt = pHeader->bbox.Right - pHeader->bbox.Left;

      mp.xExt = ( mp.xExt * 2540l ) / (DWORD)(pHeader->wInch);

      mp.yExt = pHeader->bbox.Bottom - pHeader->bbox.Top;

      mp.yExt = ( mp.yExt * 2540l ) / (DWORD)(pHeader->wInch);

      mp.hMF = NULL;

 

      hEnh = SetWinMetaFileBits(len, &(pMeta[sizeof(APMHEADER)]), hdc, &mp);

      PlayEnhMetaFile(hdc,hEnh,rt);

      DeleteEnhMetaFile(hEnh);

   }

}

 

Ç÷¹À̽ººí ¸ÞŸ ÆÄÀÏÀ» À©µµ¿ìÁî API°¡ Á÷Á¢ Áö¿øÇÏ´Â 32ºñÆ® ¸ÞŸ ÆÄÀÏ·Î ¹Ù²Û ÈÄ ÁöÁ¤ÇÑ »ç°¢ ¿µ¿ª¿¡ Àç»ýÇß´Ù. OnPaint¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

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

{

   ....

      case DT_META:

          PlayPlaceableMeta(hMemDC,arObj[idx]->Meta,arObj[idx]->Len,&arObj[idx]->rt);

          break;

 

¸ÞŸ ÆÄÀÏÀÇ À̹ÌÁö¸¦ ±×´ë·Î °¡Áö°í ÀÖ´Â Meta¸â¹ö¿Í Ãâ·Â ¿µ¿ªÀÎ rt ¸â¹ö¸¦ Ãâ·Â ÇÔ¼ö·Î Àü´ÞÇϱ⸸ Çϸé ÀÌ À§Ä¡¿¡ ¸ÞŸ ÆÄÀÏÀÌ ±×·ÁÁú °ÍÀÌ´Ù. ±×¿Ü À̵¿À̳ª Å©±â º¯°æ, »èÁ¦ µîÀÇ Ã³¸®´Â ±âÁ¸ µµÇü°ú µ¿ÀÏÇϹǷΠº°µµÀÇ Äڵ带 ´õ ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ µÈ´Ù.