¸¶.ÅؽºÆ® ¿É¼Ç ¼³Á¤

ÅؽºÆ®´Â ´Ù¸¥ °´Ã¼¿¡ ºñÇØ ±Û²ÃÀÌ Àû¿ëµÇ±â ¶§¹®¿¡ ¼³Á¤ÇÒ ¼ö ÀÖ´Â ¿É¼ÇÀÇ ¼öµµ Á» ´õ ¸¹´Ù. ±ÛÀÚÀÇ Å©±â³ª »ö»óÀº »ç¿ëÀÚ°¡ ÀÔ·ÂÇϰųª ¼±ÅÃÇϵµ·Ï ÇÒ ¼ö ÀÖÁö¸¸ ±Û²ÃÀº ½Ã½ºÅÛ¸¶´Ù ¼³Ä¡µÈ ¸ñ·ÏÀÌ ´Þ¶óÁö¹Ç·Î Á÷Á¢ ÀÔ·ÂÇÏ´Â ¹æ¹ýÀº ÁÁÁö ¾Ê´Ù. ±Û²ÃÀ» ¼±ÅÃÇÏ·Á¸é ¿­°Å¸¦ ¸ÕÀú ÇØ¾ß ÇÑ´Ù. ¿­°ÅÇÑ °á°ú¸¦ ÀúÀåÇϱâ À§ÇØ ´ÙÀ½ º¯¼ö¸¦ Ãß°¡Çϵµ·Ï ÇÏÀÚ.

 

LOGFONT logfont[500];

int FontNum;

 

¿­°ÅµÈ º¯¼öµéÀÇ ¸ñ·ÏÀ» ÀúÀåÇϱâ À§ÇØ Å©±â 500ÀÇ LOGFONT ¹è¿­À» ¼±¾ðÇßÀ¸¸ç ¿­°ÅµÈ ±Û²ÃÀÇ °³¼ö¸¦ ÀúÀåÇϱâ À§ÇØ FontNumÀ̶ó´Â Á¤¼öÇü º¯¼ö¸¦ ¼±¾ðÇß´Ù. ¿­°Å ÇÔ¼ö¿¡¼­´Â ¿­°ÅµÈ °á°ú¸¦ ÀÌ ¹è¿­¿¡ ÀÏ´Ü ¸ðµÎ ÀúÀåÇØ µÐ´Ù.

 

int CALLBACK EnumFamCallBack(ENUMLOGFONT FAR *lpelf, NEWTEXTMETRIC FAR *lpntm,

                       int FontType, LPARAM lParam)

{

   if (FontNum < 500) {

      if (lpelf->elfLogFont.lfFaceName[0] != '@') {

          logfont[FontNum] = lpelf->elfLogFont;

          FontNum++;

      }

      return TRUE;

   } else {

      return FALSE;

   }

}

 

void ReEnum()

{

   HDC hdc;

 

   FontNum=0;

   hdc=GetDC(hWndMain);

   EnumFontFamilies(hdc, NULL, (FONTENUMPROC)EnumFamCallBack, (LPARAM)NULL);

   ReleaseDC(hWndMain, hdc);

}

 

¼Ó¼º ´ëÈ­»óÀÚ¿¡¼­ ÄÞº¸ ¹Ú½º¿¡ ¿­°ÅµÈ ±Û²ÃÀÇ ¸ñ·ÏÀ» º¸¿© ÁÖ°í ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ¶ÇÇÑ ±ÛÀÚ Å©±â¿Í »ö»ó¿¡ ´ëÇÑ Ã³¸®µµ ÇØ¾ß ÇÑ´Ù. ¼Ó¼º ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀú¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤Çϵµ·Ï ÇÏÀÚ.

 

BOOL CALLBACK PropertyDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

   ....

   switch(iMessage) {

   case WM_INITDIALOG:

      if (FontNum==0) {

          ReEnum();

      }

      for (i=0;i<FontNum;i++) {

         SendDlgItemMessage(hDlg,IDC_CBFONTFACE,CB_ADDSTRING,0,(LPARAM)logfont[i].lfFaceName);

      }

 

      for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) {

          SendDlgItemMessage(hDlg,IDC_CBLINECOLOR,CB_ADDSTRING,0,(LPARAM)arColor[i]);

          SendDlgItemMessage(hDlg,IDC_CBPLANECOLOR,CB_ADDSTRING,0,(LPARAM)arColor[i]);

          SendDlgItemMessage(hDlg,IDC_CBFONTCOLOR,CB_ADDSTRING,0,(LPARAM)arColor[i]);

      }

      SendDlgItemMessage(hDlg,IDC_SPLINEWIDTH,UDM_SETRANGE,0,MAKELONG(10,0));

 

      Obj=(DObject *)lParam;

      SetDlgItemInt(hDlg,IDC_EDLINEWIDTH,Obj->LineWidth,FALSE);

      for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) {

          if (arColor[i] == Obj->LineColor) {

             break;

          }

      }

      SendDlgItemMessage(hDlg,IDC_CBLINECOLOR,CB_SETCURSEL,i,0);

      for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) {

          if (arColor[i] == Obj->PlaneColor) {

             break;

          }

      }

      SendDlgItemMessage(hDlg,IDC_CBPLANECOLOR,CB_SETCURSEL,i,0);

      SendDlgItemMessage(hDlg,IDC_SPFONTSIZE,UDM_SETRANGE,0,MAKELONG(72,6));

      SetDlgItemInt(hDlg,IDC_EDFONTSIZE,Obj->FontSize,FALSE);

      for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) {

          if (arColor[i] == Obj->FontColor) {

             break;

          }

      }

      SendDlgItemMessage(hDlg,IDC_CBFONTCOLOR,CB_SETCURSEL,i,0);

      for (i=0;i<FontNum;i++) {

          if (lstrcmp(logfont[i].lfFaceName,Obj->FontFace) == 0) {

             break;

          }

      }

      SendDlgItemMessage(hDlg,IDC_CBFONTFACE,CB_SETCURSEL,i,0);

      if (Obj->Type != -1) {

          if (Obj->Type != DT_TEXT) {

             EnableWindow(GetDlgItem(hDlg,IDC_EDFONTSIZE),FALSE);

             EnableWindow(GetDlgItem(hDlg,IDC_CBFONTCOLOR),FALSE);

             EnableWindow(GetDlgItem(hDlg,IDC_CBFONTFACE),FALSE);

          } else {

             EnableWindow(GetDlgItem(hDlg,IDC_EDLINEWIDTH),FALSE);

             EnableWindow(GetDlgItem(hDlg,IDC_CBLINECOLOR),FALSE);

          }

      }

      return TRUE;

   case WM_MEASUREITEM:

      ....

   case WM_DRAWITEM:

      ....

   case WM_COMMAND:

      switch (wParam) {

      case IDOK:

          ....

          i=SendDlgItemMessage(hDlg,IDC_CBFONTCOLOR,CB_GETCURSEL,0,0);

          Obj->FontColor=arColor[i];

          Obj->FontSize=GetDlgItemInt(hDlg,IDC_EDFONTSIZE,NULL,FALSE);

          GetDlgItemText(hDlg,IDC_CBFONTFACE,Obj->FontFace,32);

          EndDialog(hDlg,IDOK);

          ....

 

´ëÈ­»óÀÚ¸¦ ¿­ÀÚ ¸¶ÀÚ ¿­°Å°¡ µÇ¾î ÀÖ´ÂÁö Á¶»çÇØ º¸°í FontNumÀÌ 0À̶ó¸é À̶§ ¿­°Å¸¦ Çϵµ·Ï Çß´Ù. ±Û²Ã ¿­°Å¸¦ ÇÁ·Î±×·¥ ½ÃÀÛ½ÃÀÎ OnCreate¿¡¼­ ÇÏÁö ¾Ê°í ÃÖÃÊ·Î ´ëÈ­»óÀÚ°¡ ¿­¸± ¶§ ÇÏ´Â ÀÌÀ¯´Â ÇÁ·Î±×·¥ÀÇ ½ÃÀÛ ¼Óµµ¸¦ ºü¸£°Ô Çϱâ À§Çؼ­ÀÌ´Ù. ¸Å¹ø ÇÁ·Î±×·¥À» ½ÃÀÛÇÒ ¶§¸¶´Ù ±Û²Ã ¿­°Å¸¦ ÇÑ´Ù¸é ±âµ¿ ½Ã°£ÀÌ ¿À·¡ °É·Á »ç¿ëÀÚµéÀÌ Â¥ÁõÀ» ³»Áö¸¸ ´ëÈ­»óÀÚ°¡ ¿­¸± ¶§´Â »ç¿ëÀÚµéÀÌ ¾î´À Á¤µµÀÇ Àγ»½ÉÀ» ¹ßÈÖÇÏ¿© ±â´Ù¸®¹Ç·Î À̶§ ¿­°Å¸¦ ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¹°·Ð ÀÏ´Ü Çѹø ¿­°Å°¡ µÇ¸é ´Ù½Ã ¿­°ÅÇÏÁö´Â ¾Ê´Â´Ù.

¿­°ÅµÈ °á°ú¸¦ ÆùÆ® ÄÞº¸ ¹Ú½º¿¡ Ãâ·ÂÇÏ°í »ö»ó ÄÞº¸ ¹Ú½ºµµ ¸éÀ̳ª ¼±ÀÇ »ö»ó°ú ¸¶Âù°¡Áö·Î ÃʱâÈ­ÇÑ´Ù. ±Û²Ã »ö»óµµ ¿À³Ê µå·Î¿ì·Î µÇ¾î Àִµ¥ ¿À³Ê µå·Î¿ì Äڵ尡 ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ´õ ÀÌ»ó ¿©ºÐÀÇ Äڵ带 ÀÛ¼ºÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÄÁÆ®·Ñ ÃʱâÈ­ ÈÄ ÆĶó¹ÌÅÍ·Î Àü´ÞµÈ Obj °´Ã¼ÀÇ ±Û²Ã ¼³Á¤À» ÄÁÆ®·Ñ¿¡ Ãâ·ÂÇÑ´Ù. ±×¸®°í Àü¿ª ¿É¼ÇÀÌ ¾Æ´Ñ °æ¿ì´Â ÅؽºÆ® °´Ã¼Àΰ¡ ¾Æ´Ñ°¡¿¡ µû¶ó ÄÁÆ®·ÑÀ» Àû´çÈ÷ »ç¿ë±ÝÁö ½ÃŲ´Ù. ÅؽºÆ® °´Ã¼´Â ¼±±½±â, ¼±»ö»ó ¿É¼ÇÀ» »ç¿ëÇÏÁö ¾ÊÀ¸¸ç ±Û²Ã°ú °ü·ÃµÈ ¿É¼ÇÀº ´Ù¸¥ °´Ã¼¿¡´Â ÇÊ¿äÄ¡ ¾Ê´Ù.

IDOK¿¡¼­´Â ÆíÁýµÈ °á°ú¸¦ ´Ù½Ã Obj·Î ÀÐ¾î ¿Â´Ù. ¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é Àü¿ª ±Û²Ã ¼³Á¤°ú °³º° ÅؽºÆ® °´Ã¼ÀÇ ±Û²ÃÀ» ¸ðµÎ Á¶Á¤ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±Û²Ã°ú °ü·ÃµÈ ¸¶Áö¸· 󸮴 ½Ã½ºÅÛÀÇ ±Û²Ã ¼³Á¤ÀÌ ¹Ù²î¾úÀ» ¶§ ÆùÆ®¸¦ ´Ù½Ã ¿­°ÅÇÏ´Â °ÍÀÌ´Ù.

 

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

{

   ....

   case WM_FONTCHANGE:

      ReEnum();

      InvalidateRect(hCanvas,NULL,FALSE);

      return 0;

   }

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

}

 

½Ã½ºÅÛ¿¡ »õ·Î¿î ±Û²ÃÀÌ Ãß°¡µÇ°Å³ª »èÁ¦µÇ¸é WM_FONTCHANGE ¸Þ½ÃÁö°¡ ¸ðµç ž ·¹º§ À©µµ¿ì·Î º¸³»Áö´Âµ¥ ÀÌ ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ±Û²Ã ¸ñ·ÏÀ» ´Ù½Ã ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é »õ·Î Ãß°¡µÇ¾ú°Å³ª »èÁ¦µÈ ±Û²Ã¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë ¼ö ¾ø°Ô µÉ °ÍÀÌ´Ù. ÀÌ¹Ì ±×·ÁÁø ÅؽºÆ® °´Ã¼Áß¿¡ ÀÌ ±Û²ÃÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÀÖÀ» ¼öµµ ÀÖÀ¸¹Ç·Î ĵ¹ö½ºµµ ´Ù½Ã ±×·Á¾ß ÇÑ´Ù.