¸¶.ÆÄÀÏ ¿­±â

´ÙÀ½Àº ÀúÀåµÈ ¹®¼­¸¦ Àоî¿À´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇØ º¸ÀÚ. ÀúÀå°ú´Â ´Þ¸® ¸Å¹ø ÆÄÀÏ À̸§À» ÀÔ·Â¹Þ¾Æ¾ß ÇϹǷΠÇÑ ÇÔ¼ö¿¡¼­ ¸ðµç µ¿ÀÛÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù. ÆÄÀÏÀ» ¿©´Â ¹æ¹ýÀÌ ´Ù¾çÇÏ´Ù¸é, ¿¹¸¦ µé¾î µå·¡±× & µå·ÓÀ̳ª MRU µîÀÇ ±â´ÉÀÌ Á¦°øµÈ´Ù¸é ÆÄÀϸíÀ» ¾ò´Â ÇÔ¼ö, ÆÄÀÏÀ» Àд ÇÔ¼ö¸¦ µû·Î ¸¸µé¾î¾ß ÇÑ´Ù.

 

void Open()

{

   FileHeader Header;

   OPENFILENAME OFN;

   TCHAR lpstrFile[MAX_PATH]="";

   HANDLE hFile;

   DWORD dwRead;

   int idx;

 

   if (ConfirmSave() == IDCANCEL) {

      return;

   }

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

   OFN.lStructSize = sizeof(OPENFILENAME);

   OFN.hwndOwner=hWndMain;

   OFN.lpstrFilter="ApiDrawFile(*.adr)\0*.adr\0Every File(*.*)\0*.*\0";

   OFN.lpstrFile=lpstrFile;

   OFN.nMaxFile=256;

   OFN.lpstrDefExt="adr";

   if (GetOpenFileName(&OFN)==FALSE) {

      return;

   }

 

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

      OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

   if (hFile==INVALID_HANDLE_VALUE) {

      MessageBox(hWndMain,"ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.","¿¡·¯",MB_OK);

      return;

   }

 

   ReadFile(hFile,&Header,sizeof(Header),&dwRead,NULL);

   if (strcmp(Header.szHeader,"ApiDraw File") != 0) {

      MessageBox(hWndMain,"ApiDraw ÆÄÀÏÀÌ ¾Æ´Õ´Ï´Ù.","¿¡·¯",MB_OK);

      CloseHandle(hFile);

      return;

   }

   if (Header.version != 100) {

      MessageBox(hWndMain,"¹öÀüÀÌ 1.0ÀÌ ¾Æ´Õ´Ï´Ù.","¿¡·¯",MB_OK);

      CloseHandle(hFile);

      return;

   }

 

   FreeDoc();

   InitDoc();

 

   arNum=Header.arNum;

   if (arNum >= arSize) {

      arSize=arNum+arGrowBy;

      arObj=(DObject **)realloc(arObj,sizeof(DObject *)*arSize);

   }

   for (idx=0;idx<arNum;idx++) {

      arObj[idx]=(DObject *)malloc(sizeof(DObject));

      ReadFile(hFile,arObj[idx],sizeof(DObject),&dwRead,NULL);

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

          arObj[idx]->Text=(TCHAR *)malloc(arObj[idx]->Len);

          ReadFile(hFile,arObj[idx]->Text,arObj[idx]->Len,&dwRead,NULL);

      }

   }

   CloseHandle(hFile);

   InvalidateRect(hWndMain,NULL,TRUE);

   ChangeCaption(OFN.lpstrFile);

}

 

ÆÄÀÏÀ» ¿­±â Àü¿¡ ¸ÕÀú ConfirmSave¸¦ È£ÃâÇÏ¿© ÆíÁýÇÏ´ø ÆÄÀϺÎÅÍ Ã³¸®ÇÑ´Ù. ÀÌ ÇÔ¼ö È£Ãâ¿¡ ÀÇÇØ »ç¿ëÀÚ´Â ¹ÌÀúÀå ¹®¼­¸¦ ÀúÀåÇϰųª ¹ö¸± °ÍÀÌ¸ç ¸¸¾à Ãë¼Ò¸¦ ¼±ÅÃÇϸé ÆÄÀÏ ¿­±â µ¿ÀÛµµ Ãë¼ÒÇØ¾ß ÇÑ´Ù. ¹ÌÀúÀå ¹®¼­¸¦ ó¸®ÇßÀ¸¸é ÆÄÀÏ ¿­±â °øÅë ´ëÈ­»óÀÚ·Î ÀÐÀ» ÆÄÀϸíÀ» ÀԷ¹ްí ÆÄÀÏÀ» ÀÐÀ» Áغñ¸¦ ÇÑ´Ù. ÀÌ °úÁ¤¿¡¼­ ´Ù¼öÀÇ ¿¡·¯ 󸮹®ÀÌ µé¾î°¡´Âµ¥ »ç¿ëÀÚ°¡ ÆÄÀÏ ¿­±â ´ëÈ­»óÀÚ¿¡¼­ Ãë¼Ò¸¦ Ç߰ųª ÁöÁ¤ÇÑ ÆÄÀÏÀ» ¿­ ¼ö ¾øÀ» ¶§´Â ¹Ì·Ã¾øÀÌ ¸®ÅÏÇØ¾ß ÇÑ´Ù. Ãë¼Ò½Ã´Â ±»ÀÌ ¸Þ½ÃÁö ¹Ú½º¸¦ ¿­ ÇÊ¿ä°¡ ¾øÁö¸¸ ÆÄÀÏ ¿ÀÇ ½ÇÆнô ¸Þ½ÃÁö ¹Ú½º·Î ½ÇÆÐÇßÀ½À» ¾Ë¸®´Â °ÍÀÌ ÁÁ´Ù. ¿¹Á¦¿¡¼­´Â ´Ü¼øÈ÷ ½ÇÆÐ »ç½Ç¸¸ ¾Ë·Á ÁÖ¾úÁö¸¸ °¡±ÞÀûÀÌ¸é ¾î¶² ÀÌÀ¯·Î ½ÇÆÐÇß´ÂÁöµµ »ó¼¼ÇÑ Á¤º¸¸¦ Á¦°øÇÏ´Â °ÍÀÌ ´õ ¹Ù¶÷Á÷ÇÏ´Ù.

ÆÄÀÏ ¿­±â¿¡ ¼º°øÇßÀ¸¸é ¸ÕÀú Çì´õ¸¦ ÀÐ¾î º¸°í ó¸® °¡´ÉÇÑ ÆÄÀÏÀÎÁö¸¦ ¸ÕÀú È®ÀÎÇØ¾ß ÇÑ´Ù. ApiDraw¹®¼­´Â ÆÄÀÏ ¼±µÎ¿¡ ¹Ýµå½Ã "ApiDraw File"À̶ó´Â ¹®ÀÚ¿­ÀÌ ±â·ÏµÇ¾î ÀÖ¾î¾ß Çϴµ¥ ÀÌ ¹®ÀÚ¿­ÀÌ ¾øÀ¸¸é ApiDraw ÆÄÀÏÀÌ ¾Æ´Ï´Ù. ¶ÇÇÑ ¼³»ç ¸Â´Ù°í ÇÏ´õ¶óµµ ¹öÀüÀÌ 1.0ÀÌ ¾Æ´Ï¸é ÀÌ ¹®¼­µµ ¿ª½Ã ÀÐÀ» ¼ö ¾ø´Ù. Àå·¡¿¡ ApiDraw°¡ È®ÀåµÇ¾î 1.5³ª 2.0ÀÌ °î¼±, ´Ù°¢Çü, JPG µîÀÇ °´Ã¼µéÀ» ´õ ó¸®ÇÒ ¼ö ÀÖ´Ù¸é ApiDrawÀÇ ÇöÀç ¹öÀüÀº ÀÌ ¹®¼­¸¦ Á¦´ë·Î ó¸®ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù.

ApiDrawÀÇ ´ÙÀ½ ¹öÀüµµ ¶È°°Àº È®ÀåÀÚ adrÀ» »ç¿ëÇÒ °ÍÀ̹ǷΠÀÌ·± °è»êÀÌ Ã³À½ºÎÅÍ µé¾î°¡¾ß ÇÑ´Ù. ÇöÀçÀÇ ÇÁ·Î±×·¥ÀÌ ¹Ì·¡¿¡ ¸¸µé¾îÁú »óÀ§ ¹öÀüÀÇ ¹®¼­¸¦ ¿­Áö ¸øÇÏ´Â °ÍÀº ´ç¿¬ÇÑ ÀÏÀÌÁö¸¸ ÃÖ¼ÒÇÑ ¿¡·¯ 󸮴 Á¦´ë·Î ÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. ApiDrawÀÇ »óÀ§ ¹öÀüÀº ¾Æ¸¶µµ 1.0°ú ȣȯ¼ºÀÌ Àְųª, ÀÚ·á ±¸Á¶ÀÇ º¯È­·Î ÀÎÇØ Á÷Á¢ ÀÐÀ» ¼ö ¾ø´õ¶óµµ º¯È¯ ÇÊÅ͸¦ Á¦°øÇÏ°Ô µÉ °ÍÀÌ´Ù. Çì´õ Á¤º¸°¡ ÀÌ ÇÁ·Î±×·¥°ú ¸ÂÁö ¾ÊÀ» °æ¿ì ÆÄÀÏÀ» ´Ý°í Áï½Ã ¸®ÅÏÇÑ´Ù.

¿ÀÇÂÇÑ ÆÄÀÏÀÌ Ã³¸® °¡´ÉÇÑ ÆÄÀÏÀÓÀÌ È®ÀεǾúÀ¸¸é FreeDoc, InitDoc ÇÔ¼ö¸¦ ¼ø¼­´ë·Î È£ÃâÇÏ¿© ¹®¼­¸¦ ÀçÃʱâÈ­ÇÑ´Ù. ÀÌÀü¿¡ ÆíÁýÇÏ´ø ¹®¼­ÀÇ µµÇüµéÀº ¸ðµÎ »èÁ¦µÉ °ÍÀ̸ç arObj¹è¿­Àº Ãʱâ Å©±â¸¸Å­ ÇÒ´çµÉ °ÍÀÌ´Ù. ÀÌ µÎ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ½ÃÁ¡¿¡ ÁÖÀÇÇϵµ·Ï ÇÏÀÚ. ÆÄÀÏÀ» ¿­ ¶§ ¹®¼­¸¦ ÀçÃʱâÈ­ÇÒ ÇÊ¿ä°¡ ºÐ¸íÈ÷ ÀÖÀ¸¹Ç·Î Open ÇÔ¼öÀÇ ¼±µÎ¿¡¼­ ÀÌ ÇÔ¼öµéÀ» È£ÃâÇÒ ¼öµµ Àִµ¥ ÀÌ´Â Çö¸íÇÏÁö ¸øÇÏ´Ù. ÆÄÀÏÀ» ÀÐÀ» ¼ö ÀÖ´Ù´Â »ç½ÇÀÌ ¿ÏÀüÈ÷ È®Á¤µÇ±â Àü¿¡´Â ÀÌÀü ¹®¼­¸¦ ÀÏ´ÜÀº °¡Áö°í ÀÖ¾î¾ß »ç¿ëÀÚÀÇ Ãë¼Ò³ª ¿¡·¯ »óȲ¿¡ ´ëºñÇÒ ¼ö ÀÖ´Ù.

·¹Äڵ带 Àоî¿Ã ¶§´Â AppendObject¸¦ ÀÏÀÏÀÌ È£ÃâÇÏÁö ¾Ê°í ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦ ¹Ì¸® È®Àå ÇÒ´çÇÑ ÈÄ ÇѲ¨¹ø¿¡ ÀоîµéÀ̵µ·Ï Çß´Ù. °´Ã¼ÀÇ ¼ö°¡ ´ë´ÜÈ÷ ¸¹À» ¶§´Â ¸Å¹ø ÀçÇÒ´çÇØ°¡¸ç ¹è¿­¿¡ Ãß°¡ÇÏ´Â °ÍÀÌ ºñÈ¿À²ÀûÀ̱⠶§¹®ÀÌ´Ù. ¸Å ¿ÀºêÁ§Æ®¸¶´Ù DObject ±¸Á¶Ã¼¸¦ ÇÒ´çÇÏ°í °´Ã¼¸¦ ÀÐ¾î µéÀ̸ç ÅؽºÆ®, ºñÆ®¸Ê, ¸ÞŸÀÎ °æ¿ì´Â °ü·Ã µ¥ÀÌÅ͵µ º°µµÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇؼ­ Àоîµé¿´´Ù. ÀúÀåÇÒ ¶§ °´Ã¼ÀÇ µ¥ÀÌÅÍ ±æÀ̸¸Å­ Á¤È®ÇÏ°Ô ÀúÀåÇßÀ¸¹Ç·Î ÀÐÀ» ¶§µµ ±æÀ̸¸Å­¸¸ ÀоîµéÀÌ¸é ¿ÀÂ÷¾øÀÌ ·¹Äڵ带 ¼ø¼­´ë·Î ÀÐÀ» ¼ö ÀÖ´Ù.

¸ðµç ·¹Äڵ带 ´Ù ÀÐ¾î µé¿´À¸¸é »õ·Î ÀÐÀº ÆÄÀϸíÀ» ŸÀÌƲ ¹Ù¿¡ Ãâ·ÂÇÏ°í È­¸éÀ» ¹«È¿È­ÇÏ¿© »õ·Î ÀÐÀº ¹®¼­¸¦ Ãâ·ÂÇÑ´Ù. OnPaint´Â »õ·Î ¸¸µé¾îÁø arObjÀÇ ³»¿ëÀ» ±×´ë·Î È­¸éÀ¸·Î Ãâ·ÂÇÒ °ÍÀÌ´Ù. ´ÙÀ½Àº ¼¼ °³ÀÇ µµÇü°ú ÇϳªÀÇ ºñÆ®¸ÊÀ¸·Î ±¸¼ºµÈ °¡»óÀÇ ¹®¼­¸¦ ÆÄÀÏ·Î Ãâ·ÂÇÏ´Â ¿¹¸¦ º¸ÀÎ °ÍÀÌ´Ù.

arObj ¹è¿­¿¡ ÀÔüÀûÀ¸·Î ±¸Á¶Ã¼¿Í À̹ÌÁö µ¥ÀÌÅÍ µîÀÌ Àü°³µÇ¾î Àִµ¥ ÀÌ µ¥ÀÌÅ͵éÀ» ÆÄÀÏ¿¡ ¼±ÇüÀûÀ¸·Î ±â·ÏÇß´Ù. ÀÐÀ» µéÀÏ ¶§´Â ¹Ý´ë·Î ¼±ÇüÀÇ ÆÄÀϷκÎÅÍ Àоîµé¿© ¸Þ¸ð¸®¿¡ ÀÔüÀûÀ¸·Î Àü°³ÇÏ¸é ¿ø·¡ ¹®¼­°¡ º¹¿øµÈ´Ù. ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼öµéÀÌ ¸ðµÎ ÀÛ¼ºµÇ¾úÀ¸¸ç ÀÌÁ¦ ¸Þ´º ¼±Åýà ÀûÀýÇÑ ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù.

 

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

{

   switch(LOWORD(wParam)) {

   case IDM_FILE_NEW:

      New();

      break;

   case IDM_FILE_OPEN:

      Open();

      break;

   case IDM_FILE_SAVE:

      Save();

      break;

   case IDM_FILE_SAVEAS:

      SaveAs();

      break;

   ....

 

°¢ ¸í·ÉÀÇ ¾×¼¿·¯·¹ÀÌÅÍ¿Í Åø ¹öÆ°µµ µ¿ÀÏÇÑ ID·Î Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î »ç¿ëÀÚ´Â ÆíÇÑ ¹æ¹ýÀ¸·Î ¸í·ÉÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ÆÄÀÏ ÀÔÃâ·Â°ú °ü·ÃµÈ ¸¶Áö¸· ÀÛ¾÷Àº ¹ÌÀúÀå ¹®¼­¸¦ È®ÀÎÇÏ´Â °ÍÀÌ´Ù. ÆíÁýÁß¿¡ ÇÁ·Î±×·¥À» Á¾·áÇÒ ¶§ ÀÌ ¹®¼­ÀÇ ÀúÀå ¿©ºÎ¸¦ »ç¿ëÀÚ¿¡°Ô ¹°¾î º¸¾Æ¾ß ÇÑ´Ù. ¸ÞÀÎ À©µµ¿ì°¡ WM_CLOSE ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ¹ÌÀúÀå ¹®¼­¸¦ ó¸®ÇÑ´Ù.

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

....

#ifndef _DEBUG

   case WM_QUERYENDSESSION:

   case WM_CLOSE:

      if (ConfirmSave() == IDCANCEL) {

          return TRUE;

      } else {

          break;

      }

#endif

   }

   return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

ConfirmSave¶ó´Â ÇÔ¼ö°¡ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù. »ç¿ëÀÚ°¡ ÀÌ ÇÔ¼ö¿¡¼­ Ãë¼Ò¸¦ ´©¸£¸é ÇÁ·Î±×·¥ÀÇ Á¾·á¸¦ °ÅºÎÇØ¾ß Çϴµ¥ À̶§´Â WM_CLOSE°¡ DefWindowProcÀ¸·Î °¡Áö ¸øÇϵµ·Ï ¸·±â¸¸ ÇÏ¸é µÈ´Ù. WM_QUERYENDSESSION ¸Þ½ÃÁö´Â ¿î¿µÃ¼Á¦¸¦ Á¾·áÇÒ ¶§ º¸³»Áö´Âµ¥ À̶§µµ ¹ÌÀúÀå ¹®¼­¸¦ È®ÀÎÇØ¾ß ÇÑ´Ù. ¿î¿µÃ¼Á¦°¡ Á¾·áµÉ ¶§´Â ºü¸¥ Á¾·á¸¦ À§ÇØ °¢ ÇÁ·Î¼¼½º¸¦ ÀÏÀÏÀÌ Á¾·áÇÏÁö ¾Ê±â ¶§¹®¿¡ º°µµÀÇ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¾ß ÇÑ´Ù.

µÎ ¸Þ½ÃÁö¿¡ ´ëÇÑ Ã³¸® ÄÚµå´Â _DEBUG ¸ÅÅ©·Î°¡ Á¤ÀǵǾî ÀÖÁö ¾ÊÀ» ¶§¸¸ ÄÄÆÄÀÏÇϵµ·Ï ÇÏ¿© °³¹ßÁß¿¡´Â ¹ÌÀúÀå ¹®¼­¸¦ È®ÀÎÇÏÁö ¾Êµµ·Ï Çß´Ù. °³¹ßÁß¿¡´Â Å×½ºÆ®¸¦ À§ÇØ Àӽà ¹®¼­¸¦ ¸¹ÀÌ ¸¸µé¾î º¸´Âµ¥ ÀÌ ¹®¼­´Â µû·Î ÀúÀåÇÏÁö ¾Ê¾Æµµ º° »ó°üÀÌ ¾ø´Ù. ÀÌ·± ¹®¼­¿¡ ´ëÇؼ­µµ ÀÏÀÏÀÌ ÀúÀåÀ» Áú¹®ÇÏ¸é °³¹ßÀÚ°¡ ¹«Ã´ ÇÇ°ïÇØÁú °ÍÀÌ´Ù. µð¹ö±ëÁßÀÇ ¹®¼­´Â ÀúÀå ´ë»óÀÌ ¾Æ´Ï¶ó ´Ü¼øÇÑ Å×½ºÆ® ´ë»óÀÏ »ÓÀÌ´Ù.