¸ÞŸ ÆÄÀÏÀº ºñÆ®¸Ê°ú´Â ´Þ¸® È®´ë¸¦ ÇØµµ ¸ð¾çÀ» À¯ÁöÇÏ´Â º¤ÅÍ Æ÷¸ËÀÇ ±×·¡ÇÈ ÆÄÀÏÀÌ´Ù. ¿ÜºÎ ÆÄÀÏ¿¡¼ ÀÐ¾î ¿À´Â °ÍÀ̹ǷΠºñÆ®¸ÊÀ» »ðÀÔÇÏ´Â ¹æ¹ý°ú °ÅÀÇ À¯»çÇÑ ¹æ¹ýÀ¸·Î »ðÀÔÇÒ ¼ö ÀÖ´Ù. ¸ÞŸ ÆÄÀÏÀ» »ðÀÔÇÏ´Â ´ÙÀ½ ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.
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 ¸â¹ö¸¦ Ãâ·Â ÇÔ¼ö·Î Àü´ÞÇϱ⸸ Çϸé ÀÌ À§Ä¡¿¡ ¸ÞŸ ÆÄÀÏÀÌ ±×·ÁÁú °ÍÀÌ´Ù. ±×¿Ü À̵¿À̳ª Å©±â º¯°æ, »èÁ¦ µîÀÇ Ã³¸®´Â ±âÁ¸ µµÇü°ú µ¿ÀÏÇϹǷΠº°µµÀÇ Äڵ带 ´õ ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ µÈ´Ù.