´Ù. ¼³Á¤ ´ëÈ­»óÀÚ

½ºÅ¸ÀÏ »ö»óÀ» Àú·¸°Ô º¹ÀâÇÏ°Ô º¹»çÇÏ°í ÁÖ°Å´Ï ¹Þ°Å´Ï ÇÏ´Â ÀÌÀ¯´Â °á±¹ »ç¿ëÀÚ°¡ ÀÌ »ö»óÀ» º¯°æÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ Á¦°øÇϱâ À§Çؼ­¿´´Ù. ºÐ¼®±âÀÇ »ý¼ºÀÚ¿¡ ÀÖ´Â °ªÀ» ¹Ù²Ü ¼ö´Â ¾øÀ¸¹Ç·Î SOption::arStyle¿¡ ±× »çº»À» º¹»çÇß°í ÀÌ °ªÀ» ºÐ¼®±â°¡ ¼±ÅÃµÉ ¶§¸¶´Ù Àü´ÞÇϵµ·Ï Çسõ¾ÒÀ¸¹Ç·Î ÀÌÁ¦ SOption::arStyle°ªÀ» »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÖ°í º¯°æÇϵµ·Ï Çϱ⸸ ÇÏ¸é µÈ´Ù.

¹®¹ý ¼³Á¤À» À§ÇÑ ´ëÈ­»óÀÚ ¸®¼Ò½º´Â ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ°í ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀúµµ ºñ·Ï ºñ¾îÀÖÁö¸¸ ¸¸µé¾îÁ® ÀÖ´Ù. ÀÌ ºó ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀú¿¡ Äڵ带 ÀÛ¼ºÇÏ¿© arStyle ¹è¿­ÀÇ »óŸ¦ º¸¿©ÁÖ°í »ç¿ëÀÚ°¡ ¿øÇÏ´Â »ö»óÀ¸·Î ¹Ù²Ü ¼ö ÀÖµµ·Ï Çغ¸ÀÚ. ÀÛ¼ºÇÒ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

 

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

{

     HWND hCon;

     LVCOLUMN COL;

     LVITEM LI;

     int i,idx;

     LPDRAWITEMSTRUCT dis;

     HBRUSH hBrush, hOldBrush;

     static int mi,msubi;

     CHOOSECOLOR COLDLG;

     static COLORREF crTemp[16];

     int tx,ty;

     TCHAR *tstr;

     COLORREF OldBk, OldColor;

     DWORD OldMode;

     COLORREF fore,back;

     CParse *Parser;

 

     switch(iMessage)

     {

     case WM_INITDIALOG:

          hCon=GetDlgItem(hDlg,IDC_PARSER);

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"C/C++");

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"HTML");

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"SQL");

          SendMessage(hCon,CB_SETCURSEL,0,0);

 

          hCon=GetDlgItem(hDlg,IDC_STYLE);

          COL.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;

          COL.fmt=LVCFMT_LEFT;

          COL.cx=100;

          COL.pszText="½ºÅ¸ÀÏ";

          COL.iSubItem=0;

          ListView_InsertColumn(hCon,0,&COL);

 

          COL.cx=80;

          COL.pszText="±ÛÀÚ»ö";

          COL.iSubItem=1;

          ListView_InsertColumn(hCon,1,&COL);

 

          COL.cx=80;

          COL.pszText="¹è°æ»ö";

          COL.iSubItem=2;

          ListView_InsertColumn(hCon,2,&COL);

          SendMessage(GetDlgItem(hDlg,IDC_DEFEXT),EM_LIMITTEXT,250,0);

          return TRUE;

     case WM_DRAWITEM:

          dis=(LPDRAWITEMSTRUCT)lParam;

          if (wParam==IDC_STYLE) {

              idx=SendDlgItemMessage(hDlg,IDC_PARSER,CB_GETCURSEL,0,0);

              fore=NewOption.arStyle[idx+1][dis->itemID].fore;

              back=NewOption.arStyle[idx+1][dis->itemID].back;

 

              if (fore != -1) {

                   OldColor=SetTextColor(dis->hDC,fore);

              }

              if (back != -1) {

                   OldBk=SetBkColor(dis->hDC, back);

              }

              tstr=NewOption.arStyle[idx+1][dis->itemID].name;

              OldMode=SetBkMode(dis->hDC,OPAQUE);

              TextOut(dis->hDC,dis->rcItem.left, dis->rcItem.top+3,

                   tstr,lstrlen(tstr));

              SetBkMode(dis->hDC,OldMode);

 

              if (fore != -1) {

                   hBrush=CreateSolidBrush(fore);

                   hOldBrush=(HBRUSH)SelectObject(dis->hDC,hBrush);

                   SetTextColor(dis->hDC,OldColor);

              }

              Rectangle(dis->hDC,dis->rcItem.left+105, dis->rcItem.top+1,

                   dis->rcItem.left+175, dis->rcItem.bottom-1);

              if (fore == -1) {

                   TextOut(dis->hDC,dis->rcItem.left+125, dis->rcItem.top+3,"±âº»",4);

              } else {

                   DeleteObject(SelectObject(dis->hDC,hOldBrush));

              }

 

              if (back != -1) {

                   hBrush=CreateSolidBrush(back);

                   hOldBrush=(HBRUSH)SelectObject(dis->hDC,hBrush);

                   SetBkColor(dis->hDC, OldBk);

              }

              Rectangle(dis->hDC,dis->rcItem.left+185, dis->rcItem.top+1,

                   dis->rcItem.left+255, dis->rcItem.bottom-1);

              if (back == -1) {

                   TextOut(dis->hDC,dis->rcItem.left+205, dis->rcItem.top+3,"±âº»",4);

              } else {

                   DeleteObject(SelectObject(dis->hDC,hOldBrush));

              }

          } else {

              if (dis->itemState & ODS_SELECTED) {

                   hBrush=CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));

                   OldBk=SetBkColor(dis->hDC, GetSysColor(COLOR_HIGHLIGHT));

                   OldColor=SetTextColor(dis->hDC,GetSysColor(COLOR_HIGHLIGHTTEXT));

                   OldMode=SetBkMode(dis->hDC,TRANSPARENT);

              }

              else {

                   hBrush=CreateSolidBrush(GetSysColor(COLOR_BTNFACE));

              }

              FillRect(dis->hDC, &dis->rcItem, hBrush);

              DeleteObject(hBrush);

              hBrush=CreateSolidBrush(arPreColor[dis->itemID].Color);

              hOldBrush=(HBRUSH)SelectObject(dis->hDC,hBrush);

              if (dis->itemID > 1) {

                   Rectangle(dis->hDC,dis->rcItem.left+2,dis->rcItem.top+1,

                        dis->rcItem.left+23,dis->rcItem.bottom-1);

                   tx=dis->rcItem.left+30;

              } else {

                   tx=dis->rcItem.left+3;

              }

              ty=dis->rcItem.top+3;

              if (dis->itemID == 0) {

                   tstr="±âº»»ö";

              } else if (dis->itemID == 1) {

                   tstr="»ö»ó¼±ÅÃ...";

              } else {

                   tstr=arPreColor[dis->itemID].Name;

              }

              TextOut(dis->hDC,tx,ty,tstr,lstrlen(tstr));

 

              if (dis->itemState & ODS_SELECTED) {

                   SetBkColor(dis->hDC, OldBk);

                   SetTextColor(dis->hDC,OldColor);

                   SetBkMode(dis->hDC,OldMode);

              }

              DeleteObject(SelectObject(dis->hDC,hOldBrush));

          }

          break;

     case WM_COMMAND:

          idx=SendDlgItemMessage(hDlg,IDC_PARSER,CB_GETCURSEL,0,0);

          if (LOWORD(wParam) > 1 && LOWORD(wParam) < sizeof(arPreColor)/sizeof(arPreColor[0])) {

              if (msubi==1) {

                   NewOption.arStyle[idx+1][mi].fore=arPreColor[LOWORD(wParam)].Color;

              } else {

                   NewOption.arStyle[idx+1][mi].back=arPreColor[LOWORD(wParam)].Color;

              }

              InvalidateRect(GetDlgItem(hDlg,IDC_STYLE),NULL,TRUE);

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          }

 

          switch (LOWORD(wParam))   {

          case 0:

              if (msubi==1) {

                   NewOption.arStyle[idx+1][mi].fore=-1;

              } else {

                   NewOption.arStyle[idx+1][mi].back=-1;

              }

              InvalidateRect(GetDlgItem(hDlg,IDC_STYLE),NULL,TRUE);

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          case 1:

              memset(&COLDLG, 0, sizeof(CHOOSECOLOR));

              COLDLG.lStructSize = sizeof(CHOOSECOLOR);

              COLDLG.hwndOwner=hDlg;

              COLDLG.lpCustColors=crTemp;

              COLDLG.Flags=CC_FULLOPEN;

              if (ChooseColor(&COLDLG)!=0) {

                   if (msubi==1) {

                        NewOption.arStyle[idx+1][mi].fore=COLDLG.rgbResult;

                   } else {

                        NewOption.arStyle[idx+1][mi].back=COLDLG.rgbResult;

                   }

                   InvalidateRect(GetDlgItem(hDlg,IDC_STYLE),NULL,TRUE);

                   PropSheet_Changed(GetParent(hDlg),hDlg);

              }

              return TRUE;

          case IDC_PARSER:

              switch (HIWORD(wParam)) {

              case CBN_SELCHANGE:

                   ListView_DeleteAllItems(GetDlgItem(hDlg,IDC_STYLE));

                   for (i=0;NewOption.arStyle[idx+1][i].fore!=-2;i++) {

                        LI.mask=LVIF_TEXT;

                        LI.iSubItem=0;

                        LI.iItem=i;

                        LI.pszText="zzz";

                        ListView_InsertItem(GetDlgItem(hDlg,IDC_STYLE),&LI);

                   }

                   bEditByCode=TRUE;

                   SetDlgItemText(hDlg,IDC_EXT,NewOption.arExt[idx+1]);

                   bEditByCode=FALSE;

 

                   switch (idx+1) {

                   case 1:

                        Parser=new CParseCpp;

                        break;

                   case 2:

                        Parser=new CParseHtml;

                        break;

                   case 3:

                        Parser=new CParseSql;

                        break;

                   }

 

                   SetDlgItemText(hDlg,IDC_PARDELI,Parser->GetInfo(1));

                   SetDlgItemText(hDlg,IDC_PARCOM,Parser->GetInfo(2));

                   SetDlgItemText(hDlg,IDC_PARCOMSTART,Parser->GetInfo(3));

                   SetDlgItemText(hDlg,IDC_PARCOMEND,Parser->GetInfo(4));

                   SetDlgItemText(hDlg,IDC_PARBLOCKSTART,Parser->GetInfo(5));

                   SetDlgItemText(hDlg,IDC_PARBLOCKEND,Parser->GetInfo(6));

                   delete Parser;

                   break;

              }

              return TRUE;

          case IDC_EXT:

              if (HIWORD(wParam) == EN_CHANGE) {

                   if (bEditByCode==FALSE) {

                        GetDlgItemText(hDlg,IDC_EXT,NewOption.arExt[idx+1],250);

                        PropSheet_Changed(GetParent(hDlg),hDlg);

                   }

              }

              return TRUE;

          case IDC_BTNDEFSTYLE:

              switch (idx+1) {

              case 1:

                   Parser=new CParseCpp;

                   break;

              case 2:

                   Parser=new CParseHtml;

                   break;

              case 3:

                   Parser=new CParseSql;

                   break;

              }

 

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

                   Parser->GetStyleColor(i,NewOption.arStyle[idx+1][i].fore,

                        NewOption.arStyle[idx+1][i].back);

                   if (NewOption.arStyle[idx+1][i].fore==-2)

                        break;

              }

              delete Parser;

              InvalidateRect(GetDlgItem(hDlg,IDC_STYLE),NULL,TRUE);

              PropSheet_Changed(GetParent(hDlg),hDlg);

              return TRUE;

          }

          break;

     case WM_MEASUREITEM:

          LPMEASUREITEMSTRUCT lpmis;

          lpmis = (LPMEASUREITEMSTRUCT)lParam;

          lpmis->itemWidth=80;

          lpmis->itemHeight=18;

          return TRUE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          hdr=(LPNMHDR)lParam;

 

          if (hdr->hwndFrom == GetDlgItem(hDlg,IDC_STYLE)) {

              switch (hdr->code) {

              case NM_CLICK:

                   LVHITTESTINFO info;

                   HMENU hPopup;

                   POINT pt;

                   pt=info.pt=((LPNMITEMACTIVATE)lParam)->ptAction;

                   ListView_SubItemHitTest(hdr->hwndFrom,&info);

                   if (info.iItem !=-1 && info.iSubItem > 0) {

                        mi=info.iItem;

                        msubi=info.iSubItem;

                        hPopup=CreatePopupMenu();

                        AppendMenu(hPopup,MF_STRING | MF_OWNERDRAW,0,0);

                        AppendMenu(hPopup,MF_STRING | MF_OWNERDRAW,1,0);

                        idx=sizeof(arPreColor)/sizeof(arPreColor[0]);

                        for (i=3;i<idx;i++) {

                             if (i==(idx-1)/2+1+(idx%2 ? 0:1)) {

                                 AppendMenu(hPopup,MF_STRING | MF_OWNERDRAW | MF_MENUBARBREAK,i,0);

                             } else {

                                 AppendMenu(hPopup,MF_STRING | MF_OWNERDRAW,i,0);

                             }

                        }

 

                        ClientToScreen(hdr->hwndFrom,&pt);

                        TrackPopupMenu(hPopup, TPM_LEFTALIGN, pt.x,pt.y,

                             0, hDlg, NULL);

                        DestroyMenu(hPopup);

                   }

 

                   break;

              }

              return TRUE;

          }

 

          switch (hdr->code) {

          case PSN_SETACTIVE:

              g_StartPage=4;

               SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_PARSER,CBN_SELCHANGE),

                   (LPARAM)GetDlgItem(hDlg,IDC_PARSER));

              return TRUE;

          case PSN_APPLY:

              ApplyNow();

              return TRUE;

          case PSN_KILLACTIVE:

              return TRUE;

          }

          break;

     }

     return FALSE;

}

 

¹®¹ý ¼³Á¤»óŸ¦ º¸¿©ÁÖ´Â ¸®½ºÆ® ºä ÄÁÆ®·Ñ°ú »ö»óÀ» ¼±ÅÃÇÏ´Â ¸Þ´º°¡ ¸ðµÎ ¿À³Ê µå·Î¿ì·Î ÀÛ¼ºµÇ¾î ÀÖ´Ù. ±×·¯´Ù º¸´Ï Äڵ尡 Á» ±æ¾îÁ³´Âµ¥ µû·Î ºÐ¼®ÇØ º¼¸¸Å­ ¾î·Á¿î ±¸¹®Àº ¾øÀ¸¹Ç·Î ÀÚ¼¼ÇÑ ºÐ¼®Àº »ý·«ÇÑ´Ù. ½ÇÇàÁßÀÇ ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù.

ÀÌ ´ëÈ­»óÀÚ¸¦ ÅëÇØ ºÐ¼®±âÀÇ ½ºÅ¸ÀÏ »ö»ó°ú ¿¬°áµÈ È®ÀåÀÚ¸¦ º¯°æÇÒ ¼ö ÀÖÀ¸¸ç ±¸ºÐÀÚ³ª ±âŸ ¹®¹ý Á¤º¸¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù. Á÷°üÀûÀ¸·Î ÀÌÇØÇÒ ¼ö ÀÖ´Â UI¸¦ ¼³°èÇÏ°íÀÚ ÇßÀ¸¸ç »ö»óÀ» ½±°Ô ¹Ù²Ü ¼ö ÀÖµµ·Ï ÅÍÄ¡¼ö¸¦ ³·Ãߴµ¥ ÁÖ¾ÈÁ¡À» µÎ¾ú´Ù. ³ª¸§´ë·Î ³ë·ÂÇßÁö¸¸ »ç¿ëÀÚµéÀÌ ¾î¶»°Ô Æò°¡ÇÒÁö´Â ¾Ë ¼ö ¾ø´Â ³ë¸©ÀÌ´Ù.

ÀÌ ´ëÈ­»óÀÚ¿¡¼­ »ö»óÀ̳ª È®ÀåÀÚ¸¦ º¯°æÇÑ ÈÄ Àû¿ë ¹öÆ°À» Ŭ¸¯Çϸé Áï½Ã º¯°æ »çÇ×À» ¹Ý¿µÇØ¾ß ÇÑ´Ù. ApplyNow¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÏ¿© ¹®¹ý ¼³Á¤ Áß º¯°æµÈ °ÍÀ» ã¾Æ Àû¿ëÇϵµ·Ï ÇÏÀÚ.

 

void ApplyNow()

{

     HWND hChild;

     SInfo *pSi;

     HDC hdc;

     LOGFONT tFont;

    BOOL bChangeStyle;

 

    if (memcmp(Option.arStyle,NewOption.arStyle,sizeof(NewOption.arStyle))!=0) {

        bChangeStyle=TRUE;

    } else {

        bChangeStyle=FALSE;

    }

 

     ....

     hChild=GetWindow(g_hMDIClient,GW_CHILD);

     while (hChild) {

          ....

        if (bChangeStyle) {

           NewOption.SetStyleColor(pSi->Ae.GetParser());

           pSi->Ae.Invalidate(-1);

        }

 

          hChild=GetWindow(hChild,GW_HWNDNEXT);

     }

 

     Option=NewOption;

}

 

´Ù¸¥ ¿É¼Ç°ú ¸¶Âù°¡Áö·Î ½ºÅ¸ÀÏ »ö»óµµ º¯°æµÇ¾úÀ» ¶§¸¸ Àû¿ëÇØ¾ß ÇÑ´Ù. ±×·±µ¥ ½ºÅ¸ÀÏ »ö»óÀº ´Ü¼ø º¯¼ö°¡ ¾Æ´Ï¶ó 2Â÷¿ø ¹è¿­À̱⠶§¹®¿¡ º¯°æ ¿©ºÎ¸¦ ½±°Ô ÆÇ´ÜÇϱⰡ ¾î·Æ´Ù. ±×·¡¼­ Àû¿ëÇϱ⿡ ¾Õ¼­ Option°ú NewOptionÀÇ arStyle ¹è¿­À» 2Áø Â÷¿ø¿¡¼­ ¸Þ¸ð¸® ºñ±³ÇÏ¿© º¯°æÇß´ÂÁö ¾Æ´ÑÁö¸¸ ¸ÕÀú Á¶»çÇÑ´Ù. »çº»À» ¸¸µé ¶§ ±×´ë·Î¶ó¸é º¯°æµÇÁö ¾ÊÀº °ÍÀÌ°í ´Ü 1ºñÆ®¶óµµ ¹Ù²ï °ÍÀÌ ÀÖ´Ù¸é »ç¿ëÀÚ°¡ ¹®¹ý ¼³Á¤À» º¯°æÇÑ °ÍÀÌ´Ù.

¹®¹ý ¼³Á¤ÀÌ º¯°æµÇ¾úÀ¸¸é ÀÌ¹Ì »ý¼ºµÇ¾î ÀÖ´Â ¸ðµç CApiEdit °´Ã¼¿¡°Ô º¯°æµÈ ½ºÅ¸ÀÏ Á¤º¸¸¦ ´Ù½Ã °¡¸£ÃÄ ÁÖµµ·Ï ÇÏ¿´´Ù. ´Ü, À̶§ ¸ðµç ºÐ¼®±â¿¡ ´ëÇÑ ½ºÅ¸ÀÏÀ» °¡¸£ÃÄ ÁÙ ÇÊ¿ä´Â ¾ø°í ÇöÀç »ç¿ëÁßÀÎ ¹®¹ý¿¡ ´ëÇÑ ½ºÅ¸Àϸ¸ °»½ÅÇÏ¸é µÈ´Ù. HTML ¹®¼­¸¦ ÆíÁýÇÏ°í ÀÖ´Â Â÷Àϵ忡°Ô C/C++ ¹®¹ý ¼³Á¤ÀÇ º¯°æÀº ´çÀå ÇÊ¿äÇÑ °ÍÀÌ ¾Æ´Ï´Ù.

¾ÕÀ¸·Î »ý¼ºµÉ â¿¡ ´ëÇؼ­´Â º°µµ·Î ½ºÅ¸ÀÏÀ» °¡¸£ÃÄ ÁÖÁö ¾Ê¾Æµµ µÇ¹Ç·Î SetSetting ÇÔ¼ö¿¡´Â ¾Æ¹« Äڵ嵵 ÇÊ¿ä¾ø´Ù. Â÷Àϵ尡 »ý¼ºµÉ ¶§ SelectParser ÇÔ¼ö°¡ ½ºÅ¸ÀÏ Á¤º¸¸¦ ¸Å¹ø °¡¸£ÃÄ ÁÖ°í ÀÖ´Ù. È®ÀåÀÚ ¿¬°á »óŵµ ´ÙÀ½ ¹ø SelectParser È£Ãâ½Ã¿¡ Àû¿ëµÇ¹Ç·Î º°µµ·Î Àû¿ë Äڵ带 ÀÛ¼ºÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

ÀÌ»óÀ¸·Î ¹®¹ý°­Á¶¿¡ ´ëÇÑ ½Ç½ÀÀ» ¸¶Ä£´Ù. ¸¶Áö¸·À¸·Î CApiEdit::SetDefaultSettingÀÇ SetParser(1)À» SetParser(0)À¸·Î ¼öÁ¤ÇÏ¿© ±âº» ºÐ¼®±â¸¦ µðÆúÆ® ºÐ¼®±â·Î »ç¿ëÇϵµ·Ï ÇÑ´Ù.