¸¶ÁøÀÌ Ãß°¡µÇ¸é À©µµ¿ìÀÇ ÀÛ¾÷¿µ¿ª ÀϺδ ¸¶Áø¿µ¿ªÀ» À§ÇØ ÇÒ´çµÇ¾î¾ß ÇÑ´Ù. À̶§ ¸¶ÁøÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö ¿µ¿ª, ±×·¯´Ï±î ½ÇÁ¦·Î ÅؽºÆ®¸¦ º¸¿©ÁÖ°í ÆíÁý¿¡ »ç¿ëÇÒ ¿µ¿ªÀ» Æ÷¸ËÆÿµ¿ª(Formatting Area)À̶ó°í ÇÑ´Ù. Æ÷¸ËÆÿµ¿ªÀº Á¤·Ä, Ãâ·Â, ¸¶¿ì½ºµ¿ÀÛÀÌ ÀÌ·ç¾îÁö´Â ¿µ¿ªÀ̹ǷΠ¸ðµç ÆíÁýÄÚµå´Â ÀÌ ¿µ¿ª ¾È¿¡¼ µ¿ÀÛÇØ¾ß ÇÑ´Ù.
ApiEdit6±îÁö´Â ÀÛ¾÷¿µ¿ª°ú Æ÷¸ËÆÿµ¿ªÀÌ ¿ÏÀüÈ÷ ÀÏÄ¡ÇÏ¿´±â ¶§¹®¿¡ GetClientRect ÇÔ¼ö·Î ±¸ÇÑ ÀÛ¾÷¿µ¿ªÀ» ±×´ë·Î Æ÷¸ËÆÿµ¿ªÀ¸·Î »ç¿ëÇß´Ù. ÇÏÁö¸¸ ¸¶ÁøÀÌ Ãß°¡µÇ¸é ÀÛ¾÷¿µ¿ª¿¡¼ ¸¶ÁøÀÇ Æø¸¸Å »©ÁØ ¿µ¿ª¸¸ Æ÷¸ËÆÿµ¿ªÀÌ µÈ´Ù. ÀÌ ¿µ¿ªÀº ÆíÁýÄÚµåµéÀÌ ¼ö½Ã·Î Âü°íÇØ¾ß ÇϹǷΠÀü¿ªº¯¼ö·Î °ü¸®ÇÏ´Â °ÍÀÌ À¯¸®ÇÏ´Ù. ´ÙÀ½ ³× °³ÀÇ Àü¿ªº¯¼ö¸¦ Ãß°¡ÇÑ´Ù.
int MarginWidth;
COLORREF MarColor1, MarColor2;
RECT frt;
MarginWidth º¯¼ö´Â À̸§ ±×´ë·Î ¸¶ÁøÀÇ ÆøÀÌ¸ç µÎ °³ÀÇ »ö»ó º¯¼ö´Â ¸¶ÁøÀ» ±×¸®´Â µ¥ »ç¿ëÇÒ »ö»ó°ªÀÌ´Ù. frt°¡ ¹Ù·Î Æ÷¸ËÆÿµ¿ªÀε¥ ÀÛ¾÷¿µ¿ª¿¡¼ ¸¶ÁøÀÇ ÆøÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö ¿µ¿ªÀ» Â÷ÁöÇÏ°Ô µÈ´Ù. Æ÷¸ËÆÿµ¿ªÀ» ÃʱâÈÇÏ°í °»½ÅÇÏ´Â ÀÏÀº ÀÛ¾÷¿µ¿ªÀÇ Å©±â°¡ º¯°æµÇ´Â ½ÃÁ¡ÀÎ OnSize¿¡¼ ÇÑ´Ù.
void OnSize(HWND hWnd, UINT state, int cx, int cy)
{
if (state != SIZE_MINIMIZED) {
GetClientRect(hWnd,&frt);
frt.left += MarginWidth;
....
}
GetClientRect ÇÔ¼ö·Î ÀÛ¾÷¿µ¿ªÀ» ¸ÕÀú ±¸ÇÏ°í ¸¶ÁøÀÇ Æø¸¸Å ¿ÞÂÊ º¯À» ´õÇß´Ù. ¸¶ÁøÀº ¿À¸¥ÂÊ¿¡ µÑ ¼öµµ ÀÖ°í ¿ÞÂÊ¿¡ µÑ ¼öµµ Àִµ¥ º¸Åë ¿ÞÂÊ¿¡ µÎ¹Ç·Î frt.left¸¦ ¸¶ÁøÆø¸¸Å ¿À¸¥ÂÊÀ¸·Î À̵¿½ÃÅ°¸é µÈ´Ù. OnCreate¿¡¼´Â ¸¶ÁøÆøÀ» ÃʱâÈÇÑ´Ù.
BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
....
MarginWidth=25;
MarColor1=RGB(192,192,192);
MarColor2=RGB(160,160,160);
SendMessage(hWnd,WM_SIZE,0,0);
return TRUE;
}
MarginWidth´Â 25Çȼ¿·Î ÃʱâÈÇßÀ¸¸ç »ö»óÀº ȸ»ö °èÅëÀ¸·Î µÎ °³¸¦ Á¤ÀÇÇß´Ù. ¸¶ÁøÆøÀ» Á¤ÇÑ ÈÄ °ð¹Ù·Î WM_SIZE ¸Þ½ÃÁö¸¦ º¸³» frtµµ °°ÀÌ ÃʱâÈÇϵµ·Ï ÇÏ¿´´Ù. ¿Ö ÀÌ ½ÃÁ¡¿¡¼ OnSizeÈ£ÃâÀÌ ÇÊ¿äÇÑ°¡ Çϸé ÃʱâÈ ÇÔ¼öÀÎ UpdateLineInfo, UpdateScrollInfo°¡ frt¸¦ ¸ÕÀú »ç¿ëÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×·¡¼ OnCreate°¡ ³¡³ª±â Àü¿¡ OnSize¸¦ È£ÃâÇØ¾ß Çϴµ¥ OnSize¿¡¼´Â frt ÃʱâȻӸ¸ ¾Æ´Ï¶ó UpdateLineInfo, UpdateScrollInfo ÇÔ¼öµµ °°ÀÌ È£ÃâÇÑ´Ù. ÀÌÁ¦ OnCreate¿¡¼´Â ÀÌ µÎ ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø¾îÁ³À¸¹Ç·Î »èÁ¦Çϵµ·Ï ÇÏÀÚ.
Æ÷¸ËÆÿµ¿ªÀÌ ÃʱâȵǾúÀ¸¹Ç·Î ÀÌÁ¦ ¸ðµç ÆíÁýÄÚµå´Â ÀÛ¾÷¿µ¿ª ´ë½Å frt¸¦ ´ë½Å »ç¿ëÇØ¾ß ÇÑ´Ù. frt¿¡´Â ¸¶ÁøÆøÀÌ ÀÌ¹Ì °è»êµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ¿µ¿ª¸¸ Âü°íÇϸé ÆíÁýÄÚµå´Â ¸¶ÁøÀÇ Á¸Àç¿¡ ´ëÇØ Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù. ÀÛ¾÷ ´ë»ó ÇÔ¼ö´Â ´ÙÀ½ 9°³ÀÌ´Ù.
OnKey, OnPaint, OnHScroll, OnVScroll, OnMouseMove,
GetLine, SetCaret, UpdateScrollInfo, Invalidate
¼öÁ¤ÇØ¾ß ÇÒ ÇÔ¼ö°¡ ¸¹±â´Â ÇÏÁö¸¸ ÀÛ¾÷ ÀýÂ÷´Â ¾ÆÁÖ °£´ÜÇÏ´Ù. ¸ðµç ÇÔ¼öÀÇ RECT crt; ¼±¾ð¹®°ú GetClientRect ÇÔ¼ö È£Ãâ¹®À» »èÁ¦ÇÏ°í crt´Â ¸ðÁ¶¸® frt·Î ¹Ù²Ù¸é µÈ´Ù. ã±â, ¹Ù²Ù±â ±â´ÉÀ» »ç¿ëÇϸé ÇÑ ¹ø¿¡ Äڵ带 ¼öÁ¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÀÌ·± ÀÛ¾÷ÀÌ¾ß ¾ÆÁÖ ½¬¿î ÆíÀÌ´Ù. ÀÌ ÀÛ¾÷ ÈÄ¿¡ crt¶ó´Â º¯¼ö´Â ¼Ò½º Àüü¸¦ ÅëƲ¾î Çϳªµµ ¾ø¾î¾ß Çϸç GetClientRect È£Ãâ¹®Àº OnSize¿¡ Çϳª¸¸ ÀÖ¾î¾ß ÇÑ´Ù. ¸¶ÁøÀ» ¸¸µé¾úÀ¸´Ï ȸ鿡 º¸À̵µ·Ï Ãâ·ÂÇغ¸ÀÚ. OnPaint¸¦ ¶Ç ÇÑ ¹ø ´ëÆø ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
void OnPaint(HWND hWnd)
{
HDC hdc, hMemDC;
PAINTSTRUCT ps;
int l;
int s,e,t;
HBRUSH hBrush;
HBITMAP OldBitmap;
RECT lrt;
HBRUSH hMarBrush;
RECT mrt;
HPEN hMarPen,OldPen;
hdc=BeginPaint(hWnd,&ps);
t=yPos/LineHeight;
s=(yPos+ps.rcPaint.top)/LineHeight;
e=(yPos+ps.rcPaint.bottom-1)/LineHeight;
e=min(e,TotalLine-1);
hMemDC=CreateCompatibleDC(hdc);
if (hBit == NULL) {
hBit=CreateCompatibleBitmap(hdc,frt.right,LineHeight);
}
OldBitmap=(HBITMAP)SelectObject(hMemDC,hBit);
hBrush=GetSysColorBrush(COLOR_WINDOW);
SetRect(&lrt,MarginWidth-1,0,frt.right,LineHeight);
for (l=s;l<=e;l++) {
FillRect(hMemDC,&lrt,hBrush);
DrawLine(hMemDC,l);
BitBlt(hdc,0,(l-t)*LineHeight,frt.right,(l-t)*LineHeight+LineHeight,
hMemDC,0,0,SRCCOPY);
}
if (MarginWidth != 0) {
hMarBrush=CreateSolidBrush(MarColor1);
SetRect(&mrt,0,(l-t)*LineHeight,MarginWidth-1,frt.bottom);
FillRect(hdc,&mrt,hMarBrush);
hMarPen=CreatePen(PS_SOLID,1,MarColor2);
OldPen=(HPEN)SelectObject(hdc,hMarPen);
MoveToEx(hdc,MarginWidth-2,(l-t)*LineHeight,NULL);
LineTo(hdc,MarginWidth-2,frt.bottom);
SelectObject(hdc,OldPen);
DeleteObject(hMarPen);
DeleteObject(hMarBrush);
}
SetRect(&lrt,MarginWidth-1,(l-t)*LineHeight,frt.right,frt.bottom);
FillRect(hdc,&lrt,hBrush);
DeleteObject(hBrush);
SelectObject(hMemDC,OldBitmap);
DeleteDC(hMemDC);
EndPaint(hWnd,&ps);
}
¸î °³ÀÇ Áö¿ªº¯¼ö°¡ Ãß°¡µÇ¾ú´Âµ¥ hMarBrush, hMarPenÀº ¸¶Áø ä»ö¿¡ »ç¿ëÇÒ ºê·¯½Ã¿Í ÆæÀÇ ÇÚµéÀ̸ç mrt´Â ¸¶ÁøÀÇ ¿µ¿ªÀÌ´Ù. ÅؽºÆ®°¡ Ãâ·ÂµÇ¾î¾ß ÇÒ ¿µ¿ªÀÎ lrtÀÇ ¿ÞÂÊ ÁÂÇ¥´Â ¸¶ÁøÀÇ Æø°ú °°¾ÆÁ®¾ß Çϳª 1Çȼ¿¸¸Å ¿©À¯¸¦ µÎ¾î ¸¶Áø°ú ÅؽºÆ®°¡ ³Ê¹« ºÙ¾î º¸ÀÌÁö ¾Êµµ·Ï ÇÏ¿´´Ù. ÀÛ¾÷¿µ¿ªÀÇ ¿ÞÂÊ¿¡ ¸¶ÁøÆø¸¸Å ÀÚ¸®°¡ ºñ¿öÁö°í ±× ¿À¸¥ÂÊ¿¡ ÅؽºÆ®°¡ Ãâ·ÂµÈ´Ù. °¢ ÁÙ¿¡ ´ëÇØ DrawLineÀ» È£ÃâÇϸé ÀÌ ÇÔ¼ö ³»ºÎ¿¡¼ ¸¶Áø°ú ÅؽºÆ®¸¦ ºñÆ®¸Ê¿¡ °°ÀÌ Ãâ·ÂÇϵµ·Ï ÇÒ °ÍÀÌ´Ù.
¸ðµç ÁÙÀÇ Ãâ·ÂÀÌ ³¡³ ÈÄ ¾Æ·¡ÂÊ ¿©¹é¿¡ ´ëÇؼµµ ¸¶ÁøÀ» Á÷Á¢ ±×·Á¾ß ÇÑ´Ù. ¸¶ÁøÆø¿¡¼ 2Çȼ¿À» »«¸¸Å MarColor1·Î ä¿ì°í ±× ¿À¸¥ÂÊ¿¡ MarColor2·Î ÇÑ ÁÙ ¼±À» ±×¾î ÁÖ¾ú´Ù. ´Ü¼øÇÑ ±×·¡ÇÈ Ãâ·Â¹®ÀÏ »ÓÀÌ´Ù. °¢ ÁÙÀÇ ¸¶Áø¿µ¿ªÀº DrawLine ÇÔ¼ö°¡ ºñÆ®¸Ê¿¡ ±×·Á ÁØ´Ù.
int DrawLine(HDC hdc, int Line)
{
HBRUSH hMarBrush;
HPEN hMarPen,OldPen;
RECT mrt;
....
DrawSegment(hdc,x,0,nowoff,len,
(nowoff+len==pLine[Line].End),fore,back);
nowoff+=len;
if (nowoff == pLine[Line].End)
break;
}
if (MarginWidth != 0) {
hMarBrush=CreateSolidBrush(MarColor1);
SetRect(&mrt,0,0,MarginWidth-1,LineHeight);
FillRect(hdc,&mrt,hMarBrush);
hMarPen=CreatePen(PS_SOLID,1,MarColor2);
OldPen=(HPEN)SelectObject(hdc,hMarPen);
MoveToEx(hdc,MarginWidth-2,0,NULL);
LineTo(hdc,MarginWidth-2,LineHeight);
SelectObject(hdc,OldPen);
DeleteObject(hMarPen);
DeleteObject(hMarBrush);
}
return 1;
}
ÁÙ ³¡À» ¸¸³µÀ» ¶§ ±×³É ¸®ÅÏÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÀÏ´Ü ·çÇÁ¸¦ ºüÁ® ³ª¿Í ¸¶ÁøÀ» ±×¸° ÈÄ ¸®ÅÏÇØ¾ß ÇÑ´Ù. ¸¶ÁøÀº ÅؽºÆ®¸¦ Ãâ·ÂÇϱâ Àü¿¡ ±×·Áµµ µÇ°í ÅؽºÆ®¸¦ ¸ÕÀú Ãâ·ÂÇÑ ÈÄ ±×·Áµµ µÇ´Âµ¥ ¼öÆòÀ¸·Î ½ºÅ©·ÑµÉ ¶§ ÅؽºÆ®·Î ÀÎÇØ ¸¶Áø¿µ¿ªÀÌ Áö¿öÁö´Â °ÍÀ» µû·Î ó¸®ÇÏÁö ¾Ê±â À§ÇØ ÅؽºÆ®¸¦ ¿ÏÀüÈ÷ Ãâ·ÂÇÑ ÈÄ ¸¶ÁøÀ» µû·Î ±×¸®´Â °ÍÀÌ ÁÁ´Ù. ÅؽºÆ®°¡ ¼³»ç ¸¶Áø¿µ¿ª¿¡ Ãâ·ÂµÇ´õ¶óµµ ¸¶ÁøÀ» ´Ù½Ã ±×¸®¹Ç·Î Ç×»ó ¸¶ÁøÀÌ ÅؽºÆ®º¸´Ù ´õ À§¿¡ ÀÖ°Ô µÈ´Ù. DrawLineÀÇ ¸¶Áø Ãâ·Â¹®µµ OnPaint¿¡¼¿Í °ÅÀÇ µ¿ÀÏÇÏ´Ù. ¿©±â±îÁö ¼öÁ¤ÇÑ ÈÄ ½ÇÇàÇغ¸ÀÚ.
¿ÞÂÊ¿¡ ¿¶Àº ȸ»öÀÇ ¸¶ÁøÀÌ ³ªÅ¸³ª±â´Â Çϴµ¥ ¾ÆÁ÷ ³ª¸ÓÁö ÄÚµåµéÀÌ ¼öÁ¤µÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¹®ÀåÀÌ ¸¶Áø¿¡ ÀÇÇØ °¡·ÁÁö°í ij·µÀÌ ¸¶Áø ¾È¿¡¼ ³î°í ÀÖ´Ù. Á¤·ÄÇÔ¼ö¿Í Ãâ·ÂÇÔ¼ö µîÀÌ ¸¶ÁøÀ» Á¦´ë·Î ÀνÄÇϵµ·Ï ÇÏ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù.