ÅØ½ºÆ®´Â ´Ù¸¥ °´Ã¼¿¡ ºñÇØ ±Û²ÃÀÌ Àû¿ëµÇ±â ¶§¹®¿¡ ¼³Á¤ÇÒ ¼ö ÀÖ´Â ¿É¼ÇÀÇ ¼öµµ Á» ´õ ¸¹´Ù. ±ÛÀÚÀÇ Å©±â³ª »ö»óÀº »ç¿ëÀÚ°¡ ÀÔ·ÂÇϰųª ¼±ÅÃÇϵµ·Ï ÇÒ ¼ö ÀÖÁö¸¸ ±Û²ÃÀº ½Ã½ºÅÛ¸¶´Ù ¼³Ä¡µÈ ¸ñ·ÏÀÌ ´Þ¶óÁö¹Ç·Î Á÷Á¢ ÀÔ·ÂÇÏ´Â ¹æ¹ýÀº ÁÁÁö ¾Ê´Ù. ±Û²ÃÀ» ¼±ÅÃÇÏ·Á¸é ¿°Å¸¦ ¸ÕÀú ÇØ¾ß ÇÑ´Ù. ¿°ÅÇÑ °á°ú¸¦ ÀúÀåÇϱâ À§ÇØ ´ÙÀ½ º¯¼ö¸¦ Ãß°¡Çϵµ·Ï ÇÏÀÚ.
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 ¸Þ½ÃÁö°¡ ¸ðµç ž ·¹º§ À©µµ¿ì·Î º¸³»Áö´Âµ¥ ÀÌ ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ±Û²Ã ¸ñ·ÏÀ» ´Ù½Ã ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é »õ·Î Ãß°¡µÇ¾ú°Å³ª »èÁ¦µÈ ±Û²Ã¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë ¼ö ¾ø°Ô µÉ °ÍÀÌ´Ù. ÀÌ¹Ì ±×·ÁÁø ÅØ½ºÆ® °´Ã¼Áß¿¡ ÀÌ ±Û²ÃÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÀÖÀ» ¼öµµ ÀÖÀ¸¹Ç·Î ĵ¹ö½ºµµ ´Ù½Ã ±×·Á¾ß ÇÑ´Ù.