½ºÅ¸ÀÏ »ö»óÀ» Àú·¸°Ô º¹ÀâÇÏ°Ô º¹»çÇÏ°í ÁÖ°Å´Ï ¹Þ°Å´Ï ÇÏ´Â ÀÌÀ¯´Â °á±¹ »ç¿ëÀÚ°¡ ÀÌ »ö»óÀ» º¯°æÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ Á¦°øÇϱâ À§Çؼ¿´´Ù. ºÐ¼®±âÀÇ »ý¼ºÀÚ¿¡ ÀÖ´Â °ªÀ» ¹Ù²Ü ¼ö´Â ¾øÀ¸¹Ç·Î SOption::arStyle¿¡ ±× »çº»À» º¹»çÇß°í ÀÌ °ªÀ» ºÐ¼®±â°¡ ¼±ÅÃµÉ ¶§¸¶´Ù Àü´ÞÇϵµ·Ï Çسõ¾ÒÀ¸¹Ç·Î ÀÌÁ¦ SOption::arStyle°ªÀ» »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÖ°í º¯°æÇϵµ·Ï Çϱ⸸ ÇÏ¸é µÈ´Ù.
¹®¹ý ¼³Á¤À» À§ÇÑ ´ëÈ»óÀÚ ¸®¼Ò½º´Â ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ°í ´ëÈ»óÀÚ ÇÁ·Î½ÃÀúµµ ºñ·Ï ºñ¾îÀÖÁö¸¸ ¸¸µé¾îÁ® ÀÖ´Ù. ÀÌ ºó ´ëÈ»óÀÚ ÇÁ·Î½ÃÀú¿¡ Äڵ带 ÀÛ¼ºÇÏ¿© arStyle ¹è¿ÀÇ »óŸ¦ º¸¿©ÁÖ°í »ç¿ëÀÚ°¡ ¿øÇÏ´Â »ö»óÀ¸·Î ¹Ù²Ü ¼ö ÀÖµµ·Ï Çغ¸ÀÚ. ÀÛ¼ºÇÒ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
BOOL CALLBACK SyntaxDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HWND hCon;
LVCOLUMN
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.cx=80;
COL.pszText="±ÛÀÚ»ö";
COL.iSubItem=1;
ListView_InsertColumn(hCon,1,&
COL.cx=80;
COL.pszText="¹è°æ»ö";
COL.iSubItem=2;
ListView_InsertColumn(hCon,2,&
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)À¸·Î ¼öÁ¤ÇÏ¿© ±âº» ºÐ¼®±â¸¦ µðÆúÆ® ºÐ¼®±â·Î »ç¿ëÇϵµ·Ï ÇÑ´Ù.