ApiEdit´Â ¿ÞÂÊ ¸¶Áø ¿µ¿ªÀ» ÀϺθ¦ Á¦¿ÜÇÏ°í´Â ÀÚ½ÅÀÇ ÀÛ¾÷¿µ¿ª Àüü¸¦ ÅؽºÆ® Ãâ·Â¿¡ »ç¿ëÇÑ´Ù. ±×·¡¼ ÆíÁý ¿µ¿ªÀÌ ÄÁÆ®·ÑÀÇ °æ°è¼±°ú ³Ê¹« ¹ÐÂøµÇ¾î Àִµ¥ ÀÂÊ¿¡ ¿©À¯°¡ ÀüÇô ¾ø¾î ¹«Ã´ °©°©ÇØ º¸ÀÌ°í °¡µ¶¼ºµµ ¶³¾îÁø´Ù. ´ÙÀ½Àº ±¼¸² 10ptÀÇ ±Û²Ã·Î ÅؽºÆ®¸¦ Ãâ·ÂÇÑ ¸ð¾çÀε¥ ±ÛÀÚÀÇ À ȹÀÌ °æ°è¼±°ú ºÙÀÌ ¾ú¾î º°·Î º¸±â¿¡ ÁÁÁö ¾Ê´Ù.
Á» ´õ ½Ã¿ø½º·´°Ô º¸À̵µ·Ï Çϱâ À§ÇØ ÆíÁý ¿µ¿ª°ú °æ°è¼± »çÀÌ¿¡ ¾à°£ÀÇ ¿©¹éÀ» µÎ±â·Î ÇÑ´Ù. ±×±îÁþ ¿©¹é Á¶±Ý ÁÖ´Â Á¤µµ°¡ ¹¹ ±×¸® ¾î·Á¿ï±î ½Í°ÚÁö¸¸ ÁÂÇ¥¸¦ ÂüÁ¶ÇÏ´Â ¸ðµç ÇÔ¼öµéÀÌ ¼öÁ¤µÇ¾î¾ß ÇϹǷΠ¸¸¸¸ÇÑ ÀÛ¾÷Àº ¾Æ´Ï´Ù. º¹ÀâÇÏÁö´Â ¾ÊÁö¸¸ ±ÍÂúÀº »ê¼ö¸¦ ¸¹ÀÌ ÇØ¾ß ÇϹǷΠÀÌ ÀÛ¾÷À» ´ë½ÅÇÏ´Â ¸ÅÅ©·Î ÇÔ¼ö¸¦ Á¤ÀÇÇØ ³õ°í »ç¿ëÇϱâ·Î ÇÑ´Ù. ApiEdit.h¿¡ ¸ÅÅ©·Î ÇÔ¼ö¿Í ÇÊ¿äÇÑ ¸â¹ö º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.
// ¹®¼ ÁÂÇ¥¿Í ¼ø¼ö ¹®¼ ÁÂÇ¥¸¦ º¯È¯ÇÑ´Ù.
#define PureX(x) ((x)-frt.left)
#define PureY(y) ((y)-frt.top)
#define DocX(x) ((x)+frt.left)
#define DocY(y) ((y)+frt.top)
class CApiEdit : public CWindow
{
private:
....
RECT InnerRect;
COLORREF InnerRectColor;
public:
....
RECT GetInnerRect() { return InnerRect; }
void SetInnerRect(RECT aRect);
COLORREF GetInnerRectColor() { return InnerRectColor; }
void SetInnerRectColor(COLORREF aValue);
};
¸ÅÅ©·Î ÇÔ¼öµéÀº ¼ø¼ö ¹®¼ ÁÂÇ¥¿Í ¹®¼ ÁÂÇ¥°£À» º¯È¯Çϴµ¥ ÀÌ µÎ ÁÂǥü°èÀÇ Â÷ÀÌÁ¡Àº ´ÙÀ½ Ç׿¡¼ ÀÚ¼¼È÷ ¾Ë¾Æº¼ °ÍÀÌ´Ù. InnerRectÀÇ °¢ ¸â¹ö´Â °æ°è¼±°ú ÆíÁý ¿µ¿ª »çÀÌÀÇ ¿©¹éÀ» ÁöÁ¤Çϸç InnerRectColorÀº ¿©¹éÀÇ »ö»óÀÌ´Ù. ÀÌ º¯¼öµéÀº ÇÁ·¹ÀÓ¿¡ ¼±¾ðÇØ µÎ°í ºä¿¡¼´Â ÇÁ·¹ÀÓÀÇ °ªÀ» ÂüÁ¶ÇÒ °ÍÀÌ´Ù. Áï, ÀÌ °ªÀº ¸ðµç ºä¿¡ ÀÏ°ýÀûÀ¸·Î Àû¿ëµÇ¸ç ºä¸¶´Ù ´Ù¸¥ ¼³Á¤À» °¡Áú ¼ö ¾ø´Ù. º¯¼ö¸¦ ¸¸µé¾úÀ¸´Ï ÀÐ°í ¾²´Â ¾×¼¼½º ÇÔ¼öµµ ÇÊ¿äÇÏ´Ù. »ý¼ºÀÚ¿¡¼ ÀÌ º¯¼öµéÀ» ´ÙÀ½°ú °°ÀÌ ÃʱâÈÇÑ´Ù.
CApiEdit::CApiEdit()
{
....
SetRect(&InnerRect,32,32,32,32);
InnerRectColor=RGB(255,0,0);
}
Å×½ºÆ®¸¦ À§ÇØ °¢ ¹æÇâÀ¸·Î 32¸¸Å ÃæºÐÇÑ ¿©¹éÀ» ÁØ´Ù. ¾ÈÂÊ ¿©¹éÀÇ »ö»óÀº ´«¿¡ Àß ¶ç´Â »¡°£»öÀ¸·Î ÀÏ´Ü ÃʱâÈÇÑ´Ù. Å×½ºÆ®¸¦ ÇÒ ¶§´Â ¿É¼ÇÀÇ È¿°ú¸¦ Á» °úÀåÇØ¾ß ¸ðµç Äڵ尡 ÀÌ»ó¾øÀÌ Àß ½ÇÇàµÇ´ÂÁö ½±°Ô ÆǺ°ÇÒ ¼ö ÀÖ´Ù. Å×½ºÆ®°¡ ³¡³ª¸é ¿©¹éÀ» Á» ÁÙÀÌ°í »ö»óµµ ¹«³ÇÏ°Ô ¹Ù²Ü °ÍÀÌ´Ù. Set ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
void CApiEdit::SetInnerRect(RECT aRect)
{
InnerRect=aRect;
for (int aet=0;aet<4 && arView[aet];aet++) {
SendMessage(arView[aet]->hWnd,WM_SIZE,0,0);
arView[aet]->Invalidate(-1);
}
}
void CApiEdit::SetInnerRectColor(COLORREF aValue)
{
InnerRectColor=aValue;
ForAllView(Invalidate(-1))
}
Æ÷¸ËÆà ¿µ¿ªÀÌ ¹Ù²î¸é Á¤·Äµµ ´Ù½Ã ÇØ¾ß ÇÏ°í ½ºÅ©·Ñ ¹Ù À§Ä¡µµ ¹Ù²î¸ç ½ºÅ©·Ñ ¹üÀ§µµ ¹Ù²ï´Ù. ÀÌ ¸ðµç º¯È´Â À©µµ¿ìÀÇ ÆøÀÌ ¹Ù²ð ¶§¿Í µ¿ÀÏÇϹǷΠ°¢ ºä·Î WM_SIZE ¸Þ½ÃÁö¸¦ º¸³» ÀÛ¾÷¿µ¿ª Å©±â°¡ ¹Ù²î¾úÀ» ¶§ÀÇ Ã³¸®¸¦ Çß´Ù. »ö»óÀÌ ¹Ù²î¸é ´Ü¼øÈ÷ ´Ù½Ã ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù.
InnerRect´Â Æ÷¸ËÆà ¿µ¿ªÀÇ »óÇÏ ÁÂ¿ì ¿©¹éÀ» ÁöÁ¤Çϸç frtÀÇ °¢ º¯¿¡ InnerRectÀÇ ´ëÀÀµÇ´Â º¯ÀÇ °ªÀ» »©¸é ÀÌ ¿µ¿ªÀÌ ÁøÂ¥ Æ÷¸ËÆà ¿µ¿ªÀ̸ç ÀÌ ¾È¿¡ ÅؽºÆ®°¡ ¹èÄ¡µÈ´Ù. Æ÷¸ËÆà ¿µ¿ªÀÇ Æø°ú ³ôÀÌ´Â ÀÚÁÖ ÂüÁ¶µÇ¹Ç·Î º°µµÀÇ ¸â¹ö º¯¼ö¿¡ ¹Ì¸® °è»êÇØ ³õ´Â °ÍÀÌ À¯¸®ÇÏ´Ù. ÀÌ °ªÀº ºä¸¶´Ù ´Ù¸¦ ¼ö ÀÖÀ¸¹Ç·Î ºä¿¡ ¼±¾ðÇÑ´Ù. OnSize¿¡¼ Æ÷¸ËÆà ¿µ¿ªÀº ´ÙÀ½°ú °°ÀÌ °è»êÇÑ´Ù.
class CApiEditText : public CWindow
{
....
int Fwidth, Fheight;
public:
....
virtual void ManageCaret();
}
void CApiEditText::OnSize(HWND hWnd, UINT state, int cx, int cy)
{
if (state != SIZE_MINIMIZED) {
GetClientRect(hWnd,&crt);
frt=crt;
//
½ºÅ©·Ñ ¹Ù ¿µ¿ª°ú ¾ÈÂÊ ¿©¹éÀº ÆíÁý ¿µ¿ª¿¡¼ Á¦¿ÜµÈ´Ù.
frt.right-=(SBW+pFrame->InnerRect.right);
frt.bottom-=(SBW+pFrame->InnerRect.bottom);
frt.left+=(MarginWidth+pFrame->InnerRect.left);
frt.top+=(pFrame->InnerRect.top);
//
Æ÷¸ËÆà ¿µ¿ªÀÇ Æø°ú ³ôÀ̸¦ ¹Ì¸® ±¸ÇØ ³õ´Â´Ù.
Fwidth=frt.right-frt.left;
Fheight=frt.bottom-frt.top;
// ºÐÇÒ °¡´ÉÇÏ¸é ½ºÅ©·Ñ ¹Ù À§, ¿ÞÂÊ¿¡ ½ºÇø´ ¹Ú½º¸¦ À§ÇÑ ¿©¹éÀ» ³²±ä´Ù.
if (bVertSplit) {
....
if (nWrap && ViewType == TEXT_VIEW) {
GetRCFromOff(toff,r,c);
yPos=(r+nLine)*LineHeight;
yPos=max(0,min(yPos,yMax-(Fheight/LineHeight)*LineHeight));
}
ÀÛ¾÷¿µ¿ª¿¡¼ ½ºÅ©·Ñ ¹Ù, ¸¶Áø ¿µ¿ª»Ó¸¸ ¾Æ´Ï¶ó InnerRect¸¸Å ´õ ÁÙ¿©¼ Æ÷¸ËÆà ¿µ¿ª frt¸¦ °è»êÇß´Ù. Æ÷¸ËÆà ¿µ¿ªÀÇ Æø°ú ³ôÀÌÀÎ Fwidth, Fheight´Â frtÀÇ Á¿ì, »óÇÏÀÇ Â÷·Î ½±°Ô °è»êÇÒ ¼ö ÀÖ´Ù. ApiEditÀÇ ÀÛ¾÷¿µ¿ª(crt)Àº ´ÙÀ½°ú °°ÀÌ ¿©·¯ °³ÀÇ ¿ä¼Ò·Î ºÐÇҵȴÙ. ¹°·Ð ´ë°³ÀÇ °æ¿ì ¾ÈÂÊ ¿©¹éÀº ±â²¯ÇØ¾ß 1À̳ª 2Á¤µµ¸¸ ÁöÁ¤ÇϹǷΠfrt°¡ ÀÛ¾÷¿µ¿ªÀÇ ´ëºÎºÐÀ» Â÷ÁöÇÒ °ÍÀÌ´Ù.
ÀÌ »óÅ¿¡¼ ½ÇÇàÇØ º¸¸é ApiEdit°¡ Æ÷¸ËÆà ¿µ¿ªÀ» Á¦´ë·Î ó¸®ÇÏ°í ÀÖÁö ¾ÊÀ½À» ¾Ë ¼ö ÀÖ´Ù. ¿À¸¥ÂÊ°ú ¾Æ·¡ÂÊ ¿©¹é¸¸ °Ü¿ì º¸À̴µ¥ frt.topÀº ¹«Á¶°Ç 0À¸·Î °¡Á¤ÇÏ°í frt.right°¡ crt.right¿Í µ¿ÀÏÇÑ Àǹ̷Π»ç¿ëµÇ°í Àֱ⠶§¹®ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ª¿¡ ¿©¹éÀÌ ¾øÀ» ¶§´Â ÀÌ °¡Á¤ÀÌ ¸Â¾ÒÁö¸¸ ÀÌÁ¦´Â Ʋ·ÁÁ³À¸¹Ç·Î ¸¹Àº ºÎºÐÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. OnPaintºÎÅÍ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::OnPaint(HWND hWnd)
{
....
HBRUSH hInnerBrush;
hdc=BeginPaint(hWnd,&ps);
GetClientRect(hWnd,&crt);
// ¾ÈÂÊ ºê·¯½Ã »ý¼º
hInnerBrush=CreateSolidBrush(pFrame->InnerRectColor);
//À§, ¿À¸¥ÂÊ ¿©¹é ±×¸²
if (pFrame->InnerRect.top) {
SetRect(&mrt,MarginWidth,0,crt.right-SBW,frt.top);
FillRect(hdc,&mrt,hInnerBrush);
}
if (pFrame->InnerRect.right) {
SetRect(&mrt,frt.right,0,crt.right-SBW,crt.bottom-SBW);
FillRect(hdc,&mrt,hInnerBrush);
}
t=yPos/LineHeight;
s=max((yPos+PureY(ps.rcPaint.top))/LineHeight,t);
e=max((yPos+PureY(ps.rcPaint.bottom)-1)/LineHeight,t);
if (ViewType == TEXT_VIEW) {
e=min(e,TotalLine-1);
Parser->ParseLines(*this,e);
} else {
e=min(e,GetRowCount()-1);
}
hMemDC=CreateCompatibleDC(hdc);
if (hBit == NULL) {
hBit=CreateCompatibleBitmap(hdc,frt.right,LineHeight);
}
OldBitmap=(HBITMAP)SelectObject(hMemDC,hBit);
if (hMainFont) {
hOldFont=(HFONT)SelectObject(hMemDC,hMainFont);
}
hBrush=CreateSolidBrush(pFrame->cBack);
SetRect(&lrt,MarginWidth,0,frt.right,LineHeight);
for (l=s;l<=e;l++) {
FillRect(hMemDC,&lrt,hBrush);
DrawLine(hMemDC,l);
BitBlt(hdc,0,DocY((l-t)*LineHeight),frt.right,LineHeight,
hMemDC,0,0,SRCCOPY);
}
if (MarginWidth != 0) {
hMarBrush=CreateSolidBrush(pFrame->MarColor1);
// ¸¶Áø ¿©¹é 1Çȼ¿ °¨¼Ò
SetRect(&mrt,0,(l-t)*LineHeight+frt.top,MarginWidth,crt.bottom-SBW);
FillRect(hdc,&mrt,hMarBrush);
// À§ÂÊ ¸¶Áøµµ ±×¸°´Ù.
SetRect(&mrt,0,0,MarginWidth,frt.top);
FillRect(hdc,&mrt,hMarBrush);
hMarPen=CreatePen(PS_SOLID,1, pFrame->MarColor2);
OldPen=(HPEN)SelectObject(hdc,hMarPen);
// ¸¶Áø ±¸ºÐ¼±Àº óÀ½ºÎÅÍ ³¡±îÁö ±×À½
MoveToEx(hdc,MarginWidth-1,0,NULL);
LineTo(hdc,MarginWidth-1,crt.bottom-SBW);
SelectObject(hdc,OldPen);
DeleteObject(hMarPen);
DeleteObject(hMarBrush);
}
SetRect(&lrt,frt.left,DocY((l-t)*LineHeight),frt.right,frt.bottom);
FillRect(hdc,&lrt,hBrush);
// ¹®¼ µÞºÎºÐÀÇ ¿ÞÂÊ ¿©¹é ±×¸². ´õºí ¹öÆÛ¸µµÇÁö ¾ÊÀ¸¹Ç·Î Á÷Á¢ ±×·Á¾ß ÇÑ´Ù.
if (pFrame->InnerRect.left) {
SetRect(&mrt,MarginWidth,DocY((l-t)*LineHeight),frt.left,frt.bottom);
FillRect(hdc,&mrt,hInnerBrush);
}
// ¾Æ·¡ ¿©¹é ±×¸²
if (pFrame->InnerRect.bottom) {
SetRect(&mrt,MarginWidth,frt.bottom,frt.right,crt.bottom-SBW);
FillRect(hdc,&mrt,hInnerBrush);
}
// ¾ÈÂÊ ºê·¯½Ã Æı«
DeleteObject(hInnerBrush);
if (hMainFont) {
SelectObject(hMemDC,hOldFont);
}
....
¾ÈÂÊ ¿©¹éÀ» ä»öÇϱâ À§ÇØ hInnerBrush¸¦ »ý¼ºÇÑ´Ù. À§ÂÊ, ¿À¸¥ÂÊÀÇ ¿©¹éÀº OnPaint¿¡¼ Á÷Á¢ ±×¸°´Ù. DrawLineÀº Æ÷¸ËÆà ¿µ¿ª¸¸ ±×°Íµµ ÅؽºÆ®°¡ ÀÖ´Â ÁÙ¸¸ Ãâ·ÂÇÒ »ÓÀ̹ǷΠÀÌ ºÎºÐÀº OnPaint¿¡¼ Á÷Á¢ ±×·Á¾ß ÇÑ´Ù. ÀÛ¾÷¿µ¿ª ºÐÇÒµµ¸¦ º¸¸é ÀÌ ¿µ¿ªÀÇ ÁÂÇ¥´Â ¾î·ÆÁö ¾Ê°Ô ±¸ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¹«È¿ ¿µ¿ªÀ¸·ÎºÎÅÍ Ãâ·Â ½ÃÀÛÁÙ s,e¸¦ °è»êÇÏ´Â °ø½Äµµ ¹Ù²î¾ú´Ù. ps.rcPaint.topÀº ȸé ÁÂÇ¥¸¦ °¡¸®Å°°í ÀÖÀ¸¹Ç·Î ¿©±â¼ frt.topÀ» »©¼ ¼ø¼ö ¹®¼ ÁÂÇ¥·Î ¹Ù²Û ÈÄ LineHeight·Î ³ª´©¾î¾ß ¹«È¿ ¿µ¿ªÀÇ ÁÙ ¼ö¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ´Ü, ½ÃÀÛÁÙ s´Â ȸé»óÀÇ Ã¹ÁÙ tº¸´Ù ÀÛÀ» ¼ö ¾ø´Ù. ¿©¹é ºÎºÐÀÌ ¹«È¿ÈµÇ¾úÀ» ¶§ º¸ÀÌÁöµµ ¾Ê´Â ÁÙÀ» ±×¸± ÇÊ¿ä´Â ¾øÀ¸¸ç ±×¸®¸é ¿ÀÈ÷·Á ¿©¹éÀÌ ±úÁö´Â ºÎÀÛ¿ëÀÌ ÀÖ´Ù.
¿ÞÂÊ ¿©¹éÀº DrawLine¿¡¼ ¸Þ¸ð¸® ºñÆ®¸Ê¿¡ Á÷Á¢ ±×¸± °ÍÀÌ´Ù. ±×·¡¼ ¸Þ¸ð¸® ºñÆ®¸ÊÀÇ ÆøÀº ¿©ÀüÈ÷ frt.rightÀε¥ DrawLine¿¡¼ ¸¶Áø°ú ¾ÈÂÊ ¿©¹é±îÁö ±×¸®±â ¶§¹®ÀÌ´Ù. ¾ÈÂÊ ¿©¹éÀ» DrawLine¿¡¼ ±×¸®Áö ¾Ê°í ¸ðµç ÁÙÀ» Ãâ·ÂÇÑ ÈÄ OnPaint¿¡¼ ±×¸®¸é ±ô¹Ú°Å¸²ÀÌ ¹ß»ýÇϹǷΠ°¡±ÞÀû ÇÑ ¹ø¿¡ ±×·Á¾ß ÇÑ´Ù. ¾Æ·¡ÂÊ ¿©¹éµµ OnPaint¿¡¼ ±×¸®µÇ DrawLineÀ» ¸ðµÎ È£ÃâÇÑ ÈÄ¿¡ ±×·È´Ù.
¸¶ÁøÀÇ ±¸Á¶µµ ¾à°£ º¯°æÇÑ´Ù. ¹Ù±ùÂÊ¿¡ 1Çȼ¿ ¿©ºÐÀ» µÎ¾úÀ¸³ª ÀÌÁ¦ º°µµÀÇ ¾ÈÂÊ ¿©¹é ÁöÁ¤ ±â´ÉÀÌ µé¾î°¡¹Ç·Î ±×·² ÇÊ¿ä°¡ ¾ø´Ù. 1Çȼ¿ÀÌ¶óµµ ¸¶ÁøÀ» ³Ð°Ô ¾²±â À§ÇØ ¸¶ÁøÀº MarginWidth ÆøÀ» ¸ðµÎ »ç¿ëÇÑ´Ù. °æ°è¼±, ÁÙ¹øÈ£ Ãâ·Â À§Ä¡°¡ 1Çȼ¿ ¿À¸¥ÂÊÀ¸·Î ÇÑ Ä¾¿ À̵¿µÇ¾ú´Ù. º»¹® ¿µ¿ª lrtµµ Margin¿¡¼ºÎÅÍ ½ÃÀ۵ȴÙ.
BitBlt Ãâ·Â¹®µµ ¼öÁ¤ÇÑ´Ù. (l-t)*LineHeight °ø½ÄÀ¸·Î ÇöÀç ȸé»óÀÇ ÁÙ¹øÈ£(ȸéùÁÙ - ÇöÀçÁÙ)¿¡ ÁÙ°£À» °öÇØ ¼öÁ÷ À§Ä¡¸¦ Á¤ÇßÀ¸³ª ÀÌÁ¦ À§ÂÊ¿¡ ¿©¹éÀÌ µé¾î°¡°Ô µÊÀ¸·Î½á ¿©±â¿¡ frt.topÀÌ ´õÇØÁ®¾ß ÇÑ´Ù. »ç½Ç ±× Àü¿¡´Â frt.topÀÌ Ç×»ó 0À̾úÀ¸¹Ç·Î ´õÇÒ ÇÊ¿ä°¡ ¾ø¾úÀ¸³ª ÀÌÁ¦´Â Á¦´ë·Î °è»êÇØ¾ß ÇÑ´Ù. ¾ÕÀ¸·ÎÀÇ ¼öÁ¤µµ ÀÌ·± ½ÄÀ¸·Î 0À¸·Î °íÁ¤µÇ¾ú´ø °ªÀ» °è»ê¿¡ Æ÷ÇÔ½ÃÅ°´Â ÀÛ¾÷ÀÌ´Ù. °¢ ÁÙÀ» ¸ðµÎ Ãâ·ÂÇÑ ÈÄ µÞºÎºÐÀÇ ¸¶Áø ¿µ¿ªÀ» ±×¸®µÇ À§ÂÊ ¿©¹éÀÇ ¿ÞÂÊ¿¡µµ ¸¶ÁøÀ» ±×·Á¾ß ÇÑ´Ù. °æ°è¼±Àº ¾Æ¿¹ Á¦ÀÏ À§¿¡¼ºÎÅÍ ¾Æ·¡±îÁö ¼±À» ±×¾ú´Ù. ¹®¼ µÞºÎºÐÀÇ ºó °ø°£°ú ¾ÈÂÊ ¿©¹éµµ Á÷Á¢ ±×·Á¾ß ÇÑ´Ù.
Äڵ忡¼ ¹®¼ÀÇ ³¡ ´ÙÀ½ ºÎºÐ ÁÂÇ¥¸¦ (l-t)*LineHeight + frt.topÀ¸·Î °è»êÇÏ°í Àִµ¥ ÀÌ °ªÀº »ç½ÇÀº ¹®¼ ³¡ ºÎºÐÀÌ ¾Æ´Ï¶ó Ãâ·ÂÀ» ³¡³½ ÁÙ ´ÙÀ½ ÁÙÀÌ´Ù. ÀÌ ºÎºÐÀ» ¹®¼ ³¡À̶ó´Â °¡Á¤Àº lÀÌ ¹®¼ ³¡±îÁö ·çÇÁ¸¦ µ¹¾ÒÀ» ¶§¸¸ ¸ÂÀ¸¸ç ¹®¼ÀÇ Áß°£ÂëÀÌ ¹«È¿ÈµÇ¾úÀ» ¶§´Â ¸¶Áö¸· Ãâ·ÂµÈ µÞºÎºÐÀ» °¡¸®Å²´Ù. ±×·¯³ª ÀÌ Äڵ忡 ÀÇÇØ ¹«È¿ ¿µ¿ª ¾Æ·¡ÂÊÀÌ Áö¿öÁú ¿°·Á´Â ¾ø´Ù. ¿Ö³ÄÇÏ¸é ¹«È¿ÇÏ´Ù¸é lÀÌ ÀÌ ÁÙ ±îÁö ·çÇÁ¸¦ µ¹ °ÍÀÌ°í ±×·¸Áö ¾Ê´Ù¸é ¾Æ¿¹ Ãâ·ÂÀÌ ³ª°¡Áö ¾Ê´Â´Ù. Á¤È®ÇÏ°Ô °è»êÇÏÀÚ¸é (l-t) ÁÙÀÌ °ú¿¬ ¹®¼ ³¡ÀÎÁö ÀÏÀÏÀÌ Á¡°ËÇØ¾ß Çϳª ÀÌ Á¡°ËÀ» ÇÏ´Â ½Ã°£º¸´Ù´Â GDI°¡ ¹«È¿ ¿µ¿ª ¹Ù±ùÀ» Ŭ¸®ÇÎ Çϵµ·Ï ³»¹ö·Á µÎ´Â °ÍÀÌ ´õ ³´´Ù.
OnPaint°¡ ¼öÁ¤µÇ¾úÀ¸¹Ç·Î Á¹º´ÀÎ DrawLine°ú ±× Á¹º´ÀÎ DrawLineSubµµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ÃÖ°í Á¹º´ ÇÔ¼öÀÎ DrawSegmentµµ ¹°·Ð ¼öÁ¤ ´ë»óÀÌ´Ù. ´ëÀå ÇÔ¼öµéÀÌ ¼öÁ¤µÇ¾úÀ¸´Ï ÃÖ°í Á¹º´ ÇÔ¼öµµ ¾î¿ ¼ö ¾øÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. ¼öÁ¤ÇÏ´Â ¹æ½ÄÀº OnPaint¿Í °ÅÀÇ À¯»çÇѵ¥ 0À¸·Î °¡Á¤µÈ °ªÀ» ½ÇÁ¦ °ªÀ¸·Î º¯°æÇÏ´Â °ÍÀÌ´Ù.
int CApiEditText::DrawLine(HDC hdc, int Line)
{
....
x=frt.left-xPos;
....
void CApiEditText::DrawLineSub(HDC hdc,int Line,BOOL bCurLine)
{
....
// ¿ÞÂÊ ¾ÈÂÊ ¿©¹é ±×¸²
if (pFrame->InnerRect.left) {
hMarBrush=CreateSolidBrush(pFrame->InnerRectColor);
SetRect(&mrt,MarginWidth,0,frt.left,LineHeight);
FillRect(hdc,&mrt,hMarBrush);
DeleteObject(hMarBrush);
}
// ¸¶Áø Ãâ·Â
if (MarginWidth != 0) {
hMarBrush=CreateSolidBrush(pFrame->MarColor1);
SetRect(&mrt,0,0,MarginWidth,LineHeight);
FillRect(hdc,&mrt,hMarBrush);
hMarPen=CreatePen(PS_SOLID,1,pFrame->MarColor2);
OldPen=(HPEN)SelectObject(hdc,hMarPen);
MoveToEx(hdc,MarginWidth-1,0,NULL);
LineTo(hdc,MarginWidth-1,LineHeight);
SelectObject(hdc,OldPen);
DeleteObject(hMarPen);
DeleteObject(hMarBrush);
// ÁÙ ¹øÈ£ Ãâ·Â
if (bShowLineNum && (ViewType==HEXA_VIEW || pLine[Line].nLine==0)) {
....
TextOut(hdc,MarginWidth-3,(FontHeight-10)/2,szLine,lstrlen(szLine));
....
¹®ÀÚ¿ÀÌ Ãâ·ÂµÇ´Â ½ÃÀÛ À§Ä¡´Â MarginWidth°¡ ¾Æ´Ï¶ó ¿©±â¿¡ ¾ÈÂÊ ¿©¹éÀÌ ´õÇØÁø frt.left°¡ µÇ¾î¾ß ÇÑ´Ù. ¸¶Áø°ú º»¹® »çÀÌÀÇ 1Çȼ¿ ¿©¹éÀ» Á¦°ÅÇÑ´Ù. ¸¶Áø ¿·ÀÇ ¿ÞÂÊ ¿©¹éÀº OnPaint¿¡¼ Ãâ·ÂÇÏ¸é ±ô¹Ú°Å¸®¹Ç·Î ºñÆ®¸Ê¿¡ ¹Ì¸® Ãâ·ÂÇØ ³õ´Â´Ù. DrawSegment ÇÔ¼ö´Â ´ÙÇàÈ÷ ¼öÁ¤ÇÒ ºÎºÐÀÌ ¸¹Áö ¾Ê´Ù.
void CApiEditText::DrawSegment(HDC hdc, int &x, int y, int SegOff, int len, BOOL ignoreX,
COLORREF fore, COLORREF back)
{
int docx;
int oldx;
RECT rt;
HBRUSH Brush;
if (pFrame->buf[SegOff] == '\t') {
oldx=x;
docx=x+xPos;
docx=DocX((PureX(docx)/TabSize+1)*TabSize);
....
ÅÇ °è»ê½Ä¸¸ Á¶±Ý ¹Ù²î¾ú´Ù. docx¸¦ ¼ø¼ö ¹®¼ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ´ÙÀ½ ÅÇ À§Ä¡¸¦ ã°í ´Ù½Ã ¹®¼ ÁÂÇ¥·Î ¹Ù²Ù¾ú´Ù. ÀÌ ½ÄÀº 1±Ç¿¡¼ ÀÌ¹Ì ¼³¸íÇߴµ¥ MarginWidth ´ë½Å frt.left¸¦ ´õÇÏ°í »«´Ù´Â Á¡ÀÌ ¹Ù²ï °ÍÀÌ´Ù. Àüü ȸéÀº ´ÙÀ½°ú °°ÀÌ ±×·ÁÁø´Ù.
DrawLineÀÌ ±×¸®´Â ºÎºÐÀº °ËÁ¤»ö ³×¸ð ¾ÈÂÊÀÌ´Ù. °¢ ÁÙÀÇ ÅؽºÆ®´Â ¹°·ÐÀÌ°í ¸¶Áø, ¾ÈÂÊ ¿©¹é, ±×¸®°í ¸¶Áø¿¡ Ãâ·ÂµÇ´Â ºÏ¸¶Å©, ÁÙ¹øÈ£ µîÀÌ DrawLine¿¡ ÀÇÇØ ±×·ÁÁø´Ù. ³ª¸ÓÁö ¿µ¿ªÀº ¸ðµÎ OnPaint°¡ Á÷Á¢ ±×¸°´Ù. ¹®¼ µÞºÎºÐÀÇ ³²Àº ºÎºÐÀÇ ¸¶Áø°ú ¿©¹é, ¿À¸¥ÂÊ, À§ÂÊ ¿©¹é µîµî, ½ÉÁö¾î À§ÂÊ ¿©¹é ¿ÞÂÊÀÇ ¸¶Áøµµ OnPaintÀÇ Ã¥ÀÓÀÌ´Ù.
¾ÈÂÊ ¿©¹éÀ» ¸¸µé±â´Â Çߴµ¥ Ãâ·Â¸¸ µÉ »Ó ¾ÆÁ÷ ÆíÁý ÄÚµåµéÀÌ À̸¦ Á¦´ë·Î ÀνÄÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇÏ¸é ±× Àü¿¡´Â frt.top°ú frt.left°¡ »ó¼ö 0À¸·Î °íÁ¤µÇ¾î ÀÖ¾ú±â ¶§¹®Àε¥ ¾ÈÂÊ ¿©¹é °³³äÀÌ µé¾î°¡°Ô µÊÀ¸·Î½á ÁÂÇ¥¸¦ ´Ù·ç´Â ¸ðµç ºÎºÐÀÌ ¿µÇâÀ» ¹Þ´Â´Ù. ¾ÆÁÖ Áö·çÇÑ ÆíÁý ÀÛ¾÷À» ÇØ¾ß Çϴµ¥ ¿ì¼± ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ÁÂÇ¥°ªÀ» ±¸ÇÏ´Â ÇÔ¼öºÎÅÍ ¼öÁ¤ÇÏÀÚ.
void CApiEditText::GetXYFromOff(int nPos, int &x, int &y)
{
int r,c;
TCHAR *p;
assert(nPos >= 0
&& nPos <= pFrame->doclen);
GetRCFromOff(nPos, r,
c);
y=r*LineHeight+frt.top;
x=frt.left;
for (p=pFrame->buf+pLine[r].Start;p!=pFrame->buf+nPos;) {
assert(p < pFrame->buf+nPos);
if (*p == '\t') {
x = DocX((PureX(x)/TabSize+1)*TabSize);
p++;
....
y´Â ÁÙ¹øÈ£ r¿¡ ÁÙ°£À» °öÇÏ°í ¿©±â¿¡ Æ÷¸ËÆà ¿µ¿ªÀÇ »ó´ÜÀÎ frt.topÀ» ´õÇØ¾ß ÇÑ´Ù. Àü¿¡´Â frt.topÀÌ Ç×»ó 0À̾úÀ¸¹Ç·Î ´õÇϳª ¸¶³ª¿´Áö¸¸ Áö±ÝÀº ÀÌ °ªÀÌ ÇÊ¿äÇÏ´Ù. x´Â MarginWidth¿¡¼ºÎÅÍ ½ÃÀÛÇß¾ú´Âµ¥ ÀÌÁ¦ InnerRect.left±îÁö ´õÇØÁø frt.left¿¡¼ ½ÃÀÛÇØ¾ß ÇÑ´Ù. ÀÌ·± ½ÄÀ¸·Î Æ÷¸ËÆà ¿µ¿ªÀÇ ¿ÞÂÊ ÁÂÇ¥¿´´ø MarginWidth´Â ¸ðµÎ frt.left·Î ¹Ù²î¾î¾ß ÇÑ´Ù. ÅÇ °è»ê¿¡µµ ¼ø¼ö ¹®¼ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ÅÇ Àû¿ëÇÏ¿© ´Ù½Ã ¹®¼ ÁÂÇ¥·Î ¹Ù²Ù¾î¾ß ÇÑ´Ù. ¹Ý´ë ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.
int CApiEditText::GetOffFromXY(int x, int y)
{
int r,len;
TCHAR *p;
int chWidth;
int acwidth;
x=max(x,frt.left);
y=max(y,frt.top);
r=PureY(y)/LineHeight;
r=min(r,GetRowCount()-1);
for (p=pFrame->buf+pLine[r].Start,acwidth=frt.left;;) {
....
if (*p == '\t') {
len=1;
chWidth=DocX((PureX(acwidth)/TabSize+1)*TabSize-acwidth);
....
¿äûÇÑ ÁÂÇ¥ y´Â ÃÖ¼ÒÇÑ frt.top ÀÌ»óÀ̾î¾ß Çϸç x´Â ÃÖ¼ÒÇÑ frt.left¿©¾ß ÇÑ´Ù. yÁÂÇ¥·ÎºÎÅÍ ÁÙ ¹øÈ£¸¦ ±¸ÇÒ ¶§´Â y¿¡¼ frt.topÀ» ¸ÕÀú »« ÈÄ LineHeight·Î ³ª´«´Ù. xÁÂÇ¥ÀÇ ´©Àû°ªÀÎ acwidth´Â frt.left¿¡¼ºÎÅÍ ½ÃÀÛÇÑ´Ù. GetXPosOnLine ÇÔ¼öµµ °°Àº ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù. xÁÂÇ¥ÀÇ ½ÃÀÛÀº frt.leftÀ̸ç ÅÇ ÁÂÇ¥¸¦ °è»êÇÒ ¶§µµ frt.left°¡ »ç¿ëµÈ´Ù.
int CApiEditText::GetXPosOnLine(int r,int DestX)
{
TCHAR *p;
int len, acwidth;
assert(r >= 0 && r <= TotalLine-1);
if (DestX == frt.left) {
return pLine[r].Start;
}
for (p=pFrame->buf+pLine[r].Start, acwidth=frt.left;;) {
if (p-pFrame->buf == pLine[r].End) {
if (IsVirtualPosable()) {
ExtraX=(DestX-acwidth)/arChWidth[' '];
}
break;
}
assert(p < pFrame->buf+pLine[r].End);
if (*p == '\t') {
len=1;
acwidth=DocX((PureX(acwidth)/TabSize+1)*TabSize);
....
¿©±â¼ ³í¸®ÀûÀ¸·Î ¾ÆÁÖ Áß¿äÇÑ ÇÙ½É »çÇ×À» Á¤¸®ÇÏ°í ³Ñ¾î°¡ÀÚ. GetXYFromOff¸¦ ºñ·ÔÇÏ¿© ÁÂÇ¥¸¦ ´Ù·ç´Â ÇÔ¼öµéÀÌ »ç¿ëÇÏ´Â XY°ªÀº ¾î¶² Àǹ̸¦ °¡Áö´Â°¡? ÀÌ ÁÂÇ¥´Â ½ºÅ©·ÑÀ» °í·ÁÇÏÁö ¾ÊÀº ¹®¼ ÁÂÇ¥ÀÌµÇ Æ÷¸ËÆà ¿µ¿ªÀÇ À§, ¿ÞÂʸ¸Å ÆòÇà À̵¿µÈ °ªÀÌ´Ù. ±×·¡¼ ¹®¼»óÀÇ Ã¹ ¹ø° ¹®ÀÚ ÁÂÇ¥´Â (0,0)ÀÌ µÇ´Â °ÍÀÌ ¾Æ´Ï°í (frt.left, frt.top)ÀÌ µÈ´Ù.
¿Ö ÀÌ·± ½ÄÀÇ È¥¶õ½º·¯¿î ÁÂÇ¥ ü°è¸¦ »ç¿ëÇϴ°¡ ÇÏ¸é ¸¶¿ì½º, ij·µ, ¼±Åà ¿µ¿ª ºñ±³ µî ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¸ðµç °÷ÀÌ ÀÛ¾÷ ¿µ¿ª ÁÂÇ¥¸¦ ´Ù·ç±â ¶§¹®ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ªÀ» °í·ÁÇÑ ¹®¼ ÁÂÇ¥¿¡¼ xPos, yPos¸¸ »©¸é ¹Ù·Î ȸé ÁÂÇ¥¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ÀÌ ÇÔ¼öµéÀÌ ¼ø¼öÇÑ ¹®¼ ÁÂÇ¥¸¦ ¸®ÅÏÇÑ´Ù¸é ÀÌ ÁÂÇ¥¸¦ »ç¿ëÇÏ´Â ¸ðµç °÷¿¡¼ frt.left¿Í frt.topÀ» ´õÇؼ »ç¿ëÇØ¾ß ÇϹǷΠºÒÆíÇÏ´Ù.
¼ø¼ö ¹®¼ ÁÂÇ¥¶õ Æ÷¸ËÆà ¿µ¿ªÀ» °í·ÁÇÏÁö ¾Ê°í ¹®¼»óÀÇ Ã¹ ¹ø° ¹®ÀÚ¸¦ ¿øÁ¡À¸·Î ÇÑ ÁÂÇ¥ÀÌ´Ù. ÀÌ ÁÂÇ¥°¡ ÇÊ¿äÇÑ ÀÌÀ¯´Â ½ºÅ©·Ñ °ªÀÎ xPos, yPos¿¡ Æ÷¸ËÆà ¿µ¿ªÀÇ °³³äÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ¹®¼ ÁÂÇ¥¸¦ xPos, yPos¿Í ºñ±³, ¿¬»êÇÏ·Á¸é ¹Ýµå½Ã ¼ø¼ö ¹®¼ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ºñ±³ÇØ¾ß ÇÑ´Ù. ¼ø¼öÇÑ ¹®¼ ÁÂÇ¥°¡ ÇÊ¿äÇÏ´Ù¸é, Áï ù ¹ø° ¹®ÀÚ À§Ä¡ÀÎ (0,0)À» ±âÁØÀ¸·Î ÇÑ ÁÂÇ¥¸¦ ÇÊ¿ä·Î ÇÑ´Ù¸é ´ÙÀ½ °ø½ÄÀ¸·Î »óÈ£ º¯È¯ÇÒ ¼ö ÀÖ´Ù.
¹®¼ ÁÂÇ¥¿Í ¼ø¼ö ¹®¼ ÁÂÇ¥´Â Æ÷¸ËÆà ¿µ¿ªÀÇ Á»ó´Ü ÁÂÇ¥¸¦ ´õÇÏ°í »À¸·Î½á º¯È¯°¡´ÉÇÏ´Ù. ¶ÇÇÑ ½ºÅ©·Ñ À§Ä¡¸¦ ´õÇÏ°í »©¸é ¹®¼ ÁÂÇ¥¿Í ȸé ÁÂÇ¥¸¦ º¯È¯ÇÒ ¼ö ÀÖ´Ù. ¼ø¼ö ¹®¼ ÁÂÇ¥¸¦ ȸé ÁÂÇ¥·Î ¹Ù·Î º¯È¯ÇÒ ¼ö´Â ¾øÀ¸¸ç Áß°£ Çü½ÄÀÎ ¹®¼ ÁÂÇ¥¸¦ Çѹø °ÅÃÄ¾ß ÇÑ´Ù. ÃÖÃÊ ¹®¼ ÁÂÇ¥¶ó´Â °³³äÀ» µµÀÔÇß´ø ÀÌÀ¯´Â ÁÂÇ¥ »ç¿ëÀÇ Æí¸®¿Í È¿À²À» À§ÇؼÀ̳ª »ç½Ç ¹ø°Å·Î¿î ¸éµµ ÀÖ´Ù. Â÷¶ó¸® óÀ½ºÎÅÍ ¼ø¼ö ¹®¼ ÁÂÇ¥¸¦ »ç¿ëÇß´õ¶ó¸é ÇÏ´Â »ý°¢ÀÌ µé±âµµ Çϴµ¥ Çѹø °áÁ¤µÈ °ÍÀ̱⠶§¹®¿¡ Áö±ÝÀº ¹Ù²Ü ¼ö ¾øÀ¸¸ç ¾îÂ÷ÇÇ µÑ ´Ù ³ª¸§´ë·ÎÀÇ Àå´ÜÁ¡ÀÌ ÀÖ´Ù.
¾ÕÀÇ GetOffFromXY ÇÔ¼ö¿¡ »ç¿ëµÈ r=PureY(y)/LineHeight;½ÄÀ» Ç®¾î º¸¸ér=(y-frt.top)/LineHeight;°¡ µÈ´Ù. ÁÙ¹øÈ£ rÀº Àμö·Î Àü´ÞµÈ ¹®¼ ÁÂÇ¥ y¿¡¼ frt.topÀ» »©¼ ¼ø¼ö ¹®¼ ÁÂÇ¥·Î ¹Ù²Û ÈÄ LineHeight·Î ³ª´©¾î ±¸Çß´Ù. Áï ÁÙ¹øÈ£=¼ø¼ö¹®¼ÁÂÇ¥/ÁÙ°£ ÀÌ·¸°Ô µÈ´Ù. ÀÌ ½ÄÀ» ÀÌÇØÇÏ´Â °ÍÀº ¾î·ÆÁö ¾ÊÀ» °ÍÀ̳ª ºñ½ÁÇÑ ½ÄÀÌ Á» ´õ º¹ÀâÇÑ ¼ö½Ä³»¿¡¼ »ç¿ëµÇ¸é ´ë´ÜÈ÷ È¥¶õ½º·´´Ù. ±×·¡¼ ÀÌ·± È¥¶õÀ» Á¶±ÝÀÌ¶óµµ ÁÙÀ̱â À§ÇØ PureX, DocX°°Àº ¸ÅÅ©·Î ±¸¹®À» ¸¸µç °ÍÀÌ´Ù. ÀÌ ¸ÅÅ©·ÎµéÀº È¿À²º¸´Ù´Â ¼Ò½º¸¦ Á» ´õ ½±°Ô ÆľÇÇϴµ¥ µµ¿òÀ» ÁØ´Ù. ÀÌ ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯¿Í GetXYFromOff°¡ Á¶»çÇØ ÁÖ´Â ÁÂÇ¥ÀÇ ¼ºÁúÀ» Á¤È®ÇÏ°Ô ÀÌÇØÇÏ°í ³Ñ¾î°¥ ÇÊ¿ä°¡ ÀÖ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇØ º¸¸é Àû¾îµµ ij·µÀº Á¦ÀÚ¸®¸¦ ã´Â´Ù.
ÁÂÇ¥ ü°è°¡ ¹Ù²î¾úÀ¸´Ï ±²ÀåÈ÷ ¸¹Àº ÇÔ¼öµéÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. Áß°£¿¡ »õ·Î¿î °³³äÀ» Ãß°¡ÇÑ´Ù´Â °ÍÀº ÀÌ·¸µí ¹«Ã´ ±ÍÂúÀº ÀÏÀÌ´Ù. óÀ½ ±âȹÇÒ ¶§ºÎÅÍ ÀÌ·± ±â´ÉÀ» °í·ÁÇß´Ù¸é ¾ÖÃʺÎÅÍ Äڵ忡 ¹Ý¿µÇßÀ» °ÍÀÌ´Ù. GetLineÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::GetLine(int Line, int &s, int &e)
{
if (RightWrap == 0) {
Right=frt.right-2;
} else {
Right=frt.left+RightWrap*FontWidth;
}
....
if (nWrap == 0 && RightWrap == 0) {
while (!AeIsLineEnd(p)) {
if (pFrame->IsDBCS(p-pFrame->buf)) {
p++;
}
p++;
}
} else {
for (acwidth=frt.left,Head=p;;) {
if (*p == '\t') {
len=1;
acwidth=DocX((PureX(acwidth)/TabSize+1)*TabSize);
EndPos=p;
....
if (acwidth > max(Right, frt.left+FontHeight*4)) {
ÀÚµ¿ °³Çà¿ °è»ê ¹æ½ÄÀÌ Æ²·ÁÁ³´Ù. ¿ÞÂÊ ½ÃÀÛ ÁÂÇ¥ ¹× ÅÇ Ã³¸® µîÀº ¾Õ¿¡¼ ÀÛ¾÷Çß´ø °Í°ú µ¿ÀÏÇÏ´Ù. acwidth´Â frt.left¿¡¼ ½ÃÀÛÇÏ¿© ÀÚµ¿ °³Çà¿À̳ª Æ÷¸ËÆà ¿µ¿ªÀÇ ¿À¸¥ÂÊ ³¡¿¡ ´êÀ» ¶§±îÁö °è¼Ó Áõ°¡ÇÑ´Ù. ´ÙÇàÈ÷ Àμâ¿ë GetLineÀº ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Âµ¥ Àμ⠷çƾ¿¡´Â ÀÌ¹Ì ¿©¹é¿¡ ´ëÇÑ °è»êÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ½ºÅ©·Ñ ÇÔ¼öµéµµ ´ëÆø ¼öÁ¤µÇ´Âµ¥ ¸ÕÀú ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
// ½ºÅ©·Ñ »óŸ¦ °í·ÁÇÏ¿© ij·µÀ» ¼û±â°Å³ª º¸ÀδÙ.
void CApiEditText::ManageCaret()
{
POINT pt;
GetXYFromOff(off,(int &)pt.x,(int &)pt.y);
pt.y-=yPos;
pt.x-=xPos;
// Æ÷¸ËÆà ¿µ¿ªÀ» ¹þ¾î³ª¸é ¼û±ä´Ù.
if (PtInRect(&frt,pt)==FALSE) {
if (bHideCaret==FALSE) {
HideCaret(hWnd);
bHideCaret=TRUE;
}
} else {
ShowCaret(hWnd);
bHideCaret=FALSE;
}
// ij·µÀÌ ¾ÆÁ÷ º¸ÀÌ´Â »óŸé À̵¿ÇÑ´Ù.
if (bHideCaret==FALSE) {
SetCaret(FALSE,FALSE);
}
}
ÀÌ ÇÔ¼ö´Â ½ºÅ©·Ñ ÈÄ¿¡ ij·µÀÇ À§Ä¡¸¦ Á¡°ËÇØ º¸°í Æ÷¸ËÆà ¿µ¿ª ¹Ù±ùÀ̸é ij·µÀ» ¼û±ä´Ù. Àü¿¡´Â ¼öÆòÀ¸·Î¸¸ ij·µÀÌ ¼ûÀ» ¼ö ÀÖÁö¸¸ ÀÌÁ¦ ¾Æ·¡ À§¿¡µµ ¿©¹éÀÌ ÀÖÀ¸¹Ç·Î ¿©±â¼µµ ij·µÀ» ¼û°Ü¾ß ÇÑ´Ù. ij·µÀÌ º¸ÀÌ´Â »óŸé SetCaret ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Á÷Á¢ ij·µÀ» À̵¿½ÃŲ´Ù. ÀÌ Ã³¸®´Â ½ºÅ©·Ñ ¹Ù°¡ ÄÁÆ®·ÑÀÌ µÇ¸é¼ºÎÅÍ ÇÊ¿äÇØÁ³´Ù. ¼öÆò, ¼öÁ÷ ½ºÅ©·Ñ ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)
{
....
ScrollWindow(hWnd, -xInc, 0, &frt, &frt);
SetScrollPos(hHorzScroll, SB_CTL, xPos, TRUE);
ManageCaret();
}
void CApiEditText::OnVScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)
{
if (!IsWindowEnabled(hVertScroll)) {
return;
}
LinePerPage=(Fheight/LineHeight)*LineHeight;
....
ScrollWindow(hWnd, 0, -yInc, &srt,&srt);
SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);
ManageCaret();
}
void CApiEditText::OnMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
LinePerPage=(Fheight/LineHeight)*LineHeight;
....
if (IsWindowEnabled(hVertScroll)) {
SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);
}
ManageCaret();
}
½ºÅ©·Ñ ¸Þ½ÃÁö ó¸® ÈÄ¿¡ ij·µÀÌ Æ÷¸ËÆà ¿µ¿ª¾È¿¡ ÀÖ´ÂÁö Á¡°ËÇϱâ À§ÇØ ManageCaret ÇÔ¼ö¸¦ È£ÃâÇß´Ù. ¼öÁ÷ ½ºÅ©·ÑÀº ÇÑ ÆäÀÌÁö¿¡ µé¾î°¡´Â ÁÙ ¼ö °è»ê °ø½ÄÀÌ ¹Ù²î¾ú´Âµ¥ Æ÷¸ËÆà ¿µ¿ªÀÇ Á¤È®ÇÑ ³ôÀÌ´Â bottom-topÀ¸·Î °è»êÇØ¾ß Çϸç ÀÌ °ªÀº OnSize¿¡¼ FHeight¿¡ ¹Ì¸® ´ëÀÔÇØ µÎ¾ú´Ù. ½ºÅ©·Ñ ¹üÀ§¸¦ ¼³Á¤ÇÏ´Â ÇÔ¼ö¿Í Scroll ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::UpdateScrollInfo()
{
SCROLLINFO si;
int i, MaxLength;
yMax=(GetRowCount()+Fheight/LineHeight/2)*LineHeight;
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_ALL | SIF_DISABLENOSCROLL;
si.nMin=0;
si.nMax=yMax;
si.nPage=(Fheight/LineHeight)*LineHeight;
....
if (nWrap == 0 || RightWrap != 0) {
....
si.nPage=Fwidth;
si.nPos=xPos;
SetScrollInfo(hHorzScroll, SB_CTL, &si, TRUE);
if (si.nPage >= (unsigned)si.nMax) {
EnableWindow(hHorzScroll,FALSE);
}
}
void CApiEditText::Scroll(int nLine, int nCode/*=0*/)
{
int yInc;
int LinePerPage;
RECT srt;
if (nCode) {
switch (nCode) {
case 1:
SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEDOWN,0),0);
return;
case -1:
SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEUP,0),0);
return;
case 2:
nLine=Fheight/LineHeight/2;
break;
case -2:
nLine=-Fheight/LineHeight/2;
break;
}
}
LinePerPage=(Fheight/LineHeight)*LineHeight;
....
if (IsWindowEnabled(hVertScroll)) {
SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);
}
ManageCaret();
}
ftr.bottomÀ̶ó°í µÇ¾î ÀÖ´ø ºÎºÐÀÌ Fheight·Î ¹Ù²î¾ú°í frt.right´Â Fwidth·Î ¹Ù²î¾ú´Ù. ´ÙÀ½Àº SetCaret ÇÔ¼öÀÌ´Ù.
void CApiEditText::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
....
if (bScrollToCaret && crt.right) {
pFrame->SendNotify(AEN_MOVE);
if (nWrap==0) {
if ((x+caretwidth > xPos+frt.right) || (x < xPos+frt.left)) {
//
¼ø¼ö ¹®¼ ÁÂÇ¥¿¡¼ ÆøÀÇ Àý¹ÝÀ» »« À§Ä¡¸¦ »õ·Î Á¤ÇÔ
xPos=max(0,PureX(x)-(frt.right-frt.left)/2);
bScroll=TRUE;
}
}
// ¼ø¼ö ¹®¼»óÀÇ ÁÂÇ¥°¡ yPosº¸´Ù ´õ ÀÛÀ¸¸é ±× ÁÙÀ» ùÁÙ·Î ¹Ù²Û´Ù.
if (PureY(y) < yPos) {
yPos=PureY(y);
bScroll=TRUE;
}
if (y+FontHeight > yPos+frt.bottom) {
// ty=ȸé Á¦ÀÏ ¾Æ·¡ÂÊÀÇ º¸ÀÌ´Â ÁÙÀÇ È¸é»óÀÇ ÁÂÇ¥. ÁÙ°£ ¿µ¿ªÀº Á¦¿Ü. ¹è¼ö Á¶Á¤
ty=(frt.bottom-frt.top-FontHeight)/LineHeight*LineHeight;
// ½ºÅ©·Ñ À§Ä¡ = ¼ø¼ ¹®¼»óÀÇ ÁÂÇ¥¿¡¼ Á¦ÀÏ ¾Æ·¡ ÁÙ ÁÂÇ¥.
yPos=PureY(y)-ty;
bScroll=TRUE;
}
....
ij·µÀÌ ¾ÈÂÊ ¿©¹éÀ¸·Î µé¾î¿À¸é, Áï Æ÷¸ËÆà ¿µ¿ªÀ» ¹þ¾î³ª¸é ¼öÆò ½ºÅ©·ÑÇÑ´Ù. À̶§ »õ ¼öÆò ½ºÅ©·Ñ À§Ä¡´Â ¼ø¼ö ¹®¼ ÁÂÇ¥¿¡¼ Æ÷¸ËÆà ¿µ¿ª ÆøÀÇ Àý¹ÝÀ» »« À§Ä¡ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ªÆøÀº right-left·Î °è»êÇÑ´Ù. GetXYFromOff°¡ Á¶»çÇÑ y¿¡´Â frt.topÀÌ ÀÌ¹Ì ´õÇØÁ® Àִµ¥ ºñÇØ yPos´Â ¼ø¼ö ¹®¼ ÁÂÇ¥À̹ǷΠy¸¦ ¼ø¼ö ¹®¼ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ºñ±³ÇÑ´Ù. ¶ÇÇÑ yPos¸¦ ÇöÀç yÁÙ¿¡ ¸ÂÃâ ¶§µµ y¸¦ ¼ø¼ ¹®¼ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ´ëÀÔÇÑ´Ù. ¼¼¹ø° if¹®Àº ij·µÀÇ ¹ß°¡¶ôÀÌ Æ÷¸ËÆà ¿µ¿ª¹ÛÀ» ¹þ¾î³µÀ» ¶§ÀÇ Ã³¸®¸¦ Çϴµ¥ ÀÌ Á¶°Ç¹®Àº »ç½Ç ´ÙÀ½ µÑ Áß Çϳª·Î ¾²´Â °ÍÀÌ ¿øÄ¢ÀûÀÌ´Ù.
if (PureY(y)+FontHeight > yPos+(frt.bottom-frt.top)) {
if ((y-frt.top)+FontHeight > yPos+(frt.bottom-frt.top)) {
Áº¯Àº ÇöÀç ij·µÀÇ ¼ø¼ö ¹®¼ ÁÂÇ¥¿¡ FontHeight¸¦ ´õÇÑ Ä³·µÀÇ ¹ß°¡¶ô ¼öÁ÷ ÁÂÇ¥ÀÌ°í ¿ìº¯Àº ÇöÀç ½ºÅ©·Ñ »óÅ¿¡¼ Á¦ÀÏ ¾Æ·¡ÂÊ ¼öÁ÷ ÁÂÇ¥ÀÌ´Ù. ±×·¡¼ ÀÌ ½ÄÀº "ij·µÀÇ ¾Æ·¡ÂÊÀÌ ¾Èº¸À̸é"À̶ó´Â Á¶°ÇÀ» ±¸¼ºÇϴµ¥ º¸´Ù½ÃÇÇ ¾çº¯¿¡ -frt.topÀÌ ÀÖÀ¸´Ï ¾çÂÊ ´Ù ¾ø¾Ö ¹ö·Áµµ ¼ö½ÄÀº µ¿ÀÏÇØÁø´Ù. ±×·¡¼ ÀÌ °ªÀ» ¾çÂÊ ´Ù ¾ø¾Ö ¹ö¸®°í °ýÈ£¸¦ Á¤¸®Çϸé À§ÀÇ °á°ú Äڵ尡 ³ª¿Â´Ù. »ç½Ç Á¿ìÀÇ -frt.topÀº Á¸Àç °¡Ä¡´Â ¾øÁö¸¸ Àǹ̰¡ ´Ù¸£´Ù. Áº¯ÀÇ °æ¿ì y¸¦ ¼ø¼ö ¹®¼ ÁÂÇ¥·Î ¹Ù²Ù±â À§ÇØ, ¿ìº¯ÀÇ °æ¿ì´Â Æ÷¸ËÆà ¿µ¿ªÀÇ ³ôÀ̸¦ ±¸Çϱâ À§ÇØ ÇÊ¿äÇÑ °ÍÀÌ´Ù. ¾çº¯¿¡ -frt.topÀ» ¾ø¾Ö ¹ö¸®¸é ÄÚµå´Â °£´ÜÇØÁöÁö¸¸ ÀÌÇØÇϱâ´Â ´õ ¾î·Á¿öÁø´Ù. °á°ú Äڵ常À¸·Î´Â ÀÌ·± Áß°£ °úÁ¤±îÁö À¯ÃßÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ´Ù¸¥ »ç¶÷ÀÇ Äڵ带 º¸±â°¡ ±Ùº»ÀûÀ¸·Î ¾î·Á¿î °ÍÀÌ´Ù.
ij·µÀÌ Æ÷¸ËÆà ¿µ¿ª ¾Æ·¡ÂÊ¿¡ ÀÖÀ» ¶§´Â yPos¸¦ À̵¿½ÃÄÑ ÀÌ ÁÙÀÌ È¸é ¾Æ·¡ÂÊ¿¡ ÀÖµµ·Ï ÇÑ´Ù. ¿©±â¼ ty´Â ȸé Á¦ÀÏ ¾Æ·¡ÂÊ¿¡ ¹èÄ¡µÉ º¸ÀÌ´Â ÁÙÀÇ È¸é ¼öÁ÷ ÁÂÇ¥ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ªÀÇ ³ôÀÌ¿¡¼ FontHeight¸¦ »©°í ÀÌ °ªÀ» LineHeightÀÇ ¹è¼ö·Î ³»¸²ÇÏ¿´´Ù. Áï, ÇöÀç Æ÷¸ËÆà ¿µ¿ª ³ôÀÌ¿¡¼ ¾îµðÂë¿¡ ÁÙÀ» Ãâ·ÂÇϸé ÀÌ ÁÙÀÌ ´Ù º¸ÀÏ °ÍÀΰ¡¸¦ °è»êÇÑ °ÍÀÌ´Ù. ¿©±â¿¡ FontHeight ´ë½Å LineHeight¸¦ »ç¿ëÇϸé Àǹ̰¡ ´Þ¶óÁø´Ù. ¿ÏÀüÈ÷ º¸ÀÌ´Â ÁÙÀÇ Á¤ÀǶõ ÁÙ°£±îÁö ´Ù º¸ÀÌ´Â ÁÙÀÌ ¾Æ´Ï¶ó ÁÙ°£Àº »©°í ±ÛÀÚ¸¸ Á¦´ë·Î º¸ÀÌ´Â ÁÙ·Î Á¤ÀÇÇ߱⠶§¹®¿¡ FontHeight¸¦ »ç¿ëÇß´Ù.
ty¸¦ °è»êÇßÀ¸¸é yPos´Â ÇöÀç ij·µ À§Ä¡ y¸¦ ¼ø¼ö ¹®¼ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ¿©±â¼ ty¸¦ »©¸é µÈ´Ù. ÀÌ ½ÄÀº ´ÙÀ½°ú °°ÀÌ º¯ÇüÇÒ ¼ö ÀÖ´Ù. Áï yPos¿¡¼ ¸¶Áö¸· ÁÙÀÇ È¸é ÁÂÇ¥ ty¸¦ ´õÇÑ À§Ä¡¿¡ ÇöÀç ij·µÀÌ ÀÖ´Â ÁÙÀ» ¹èÄ¡Ç϶ó´Â ¶æÀÌ µÈ´Ù.
yPos=(y-frt.top)-ty;
yPos+ty=(y-frt.top);
OnMouseMove¿¡¼ Ä¿¼°¡ »ó´ÜÀ» ¹þ¾î³ª´ÂÁö ºñ±³ÇÏ´Â ¿¬»ê¹®µµ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)
{
...
if (y < frt.top) {
SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0L);
bInstTimer=TRUE;
}
if (nWrap == 0) {
GetRCFromOff(SelEnd,r,c);
if (x>frt.right && SelEnd != pLine[r].End) {
SendMessage(hWnd, WM_HSCROLL, SB_LINERIGHT, 0L);
bInstTimer=TRUE;
}
if (x<frt.left && SelEnd != pLine[r].Start) {
....
0 ´ë½Å frt.top, frt.left¸¦ »ç¿ëÇßÀ» »ÓÀÌ´Ù. OnSetCursor´Â Ưº°È÷ °íÄ¡Áö ¾Ê´Â´Ù. ¿©¹é¿¡¼ÀÇ Ä¿¼³ª ¸¶¿ì½º ¾×¼ÇÀº Æ÷¸ËÆà ¿µ¿ª°ú µ¿ÀÏÇÏ°Ô Ãë±ÞÇÑ´Ù. ¿¸ðµå¿¡¼ ÇÑ ÁÙÀÇ ¼±Åà ¿µ¿ªÀ» Á¶»çÇÏ´Â GetSelInLine ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::GetSelInLine(int Line,int &s,int &e)
{
....
s=GetOffFromXY(left,DocY(Line*LineHeight));
e=GetOffFromXY(right,DocY(Line*LineHeight));
ignoreVirt--;
ExtraX=BkExtraX;
}
LineÁÙÀÇ ¼öÁ÷ ¹®¼ ÁÂÇ¥´Â Line*LineHeight¿¡ frt.topÀ» ´õÇØ¾ß ÇÑ´Ù. GetOffFromXY´Â ¼ø¼ö ¹®¼ ÁÂÇ¥°¡ ¾Æ´Ñ ¹®¼ ÁÂÇ¥¸¦ ¿ä±¸ÇÑ´Ù. Å°º¸µå¿¡¼ ÆäÀÌÁö ´ÜÀ§·Î ½ºÅ©·Ñ ÇÒ ¶§µµ Æ÷¸ËÆà ¿µ¿ªÀÇ Å©±â¸¸Å À̵¿ÇØ¾ß ÇÑ´Ù.
case VK_UP:
if (bControl && bShift)
break;
GetRCFromOff(off,r,c);
OldOff=off;
if (r > 0) {
if (bControl) {
SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0L);
if (r != (Fheight+yPos)/LineHeight)
break;
}
case VK_PRIOR:
GetRCFromOff(off,r,c);
oldr=r;
r-=Fheight/LineHeight;
r=max(r,0);
....
case VK_NEXT:
GetRCFromOff(off,r,c);
oldr=r;
r+=Fheight/LineHeight;
r=min(r,GetRowCount()-1);
yPos=yPos+(r-oldr)*LineHeight;
yPos=max(0,min(yPos,yMax-(Fheight/LineHeight)*LineHeight));
Invalidate(-1);
crt.bottom ´ë½Å Fheight¶ó°í ½á¾ß ÇÑ´Ù. CtrlÅ°¿Í VK_UPÀ» °°ÀÌ ´©¸¦ ¶§´Â Æ÷¸ËÆà ¿µ¿ªÀÇ ³¡ ÁÙÀÌ ¾Æ´Ñ ÇÑ Ä¿¼¸¦ À̵¿½Ãų ÇÊ¿ä°¡ ¾ø´Âµ¥ À̶§ Æ÷¸ËÆà ¿µ¿ª ³¡ÁÙ ÆǺ°¹®µµ Fheight¸¦ ÂüÁ¶ÇÑ´Ù.
ºä°¡ µÎ °³À̹ǷΠµû·Î ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ±×·¯³ª ´ëºÎºÐÀ» ÅؽºÆ® ºäÀÇ ±â´ÉÀ» ºô·Á¼ »ç¿ëÇϹǷΠ¸¹ÀÌ °íÄ¥ ÇÊ¿ä´Â ¾ø´Ù. Å°º¸µå Çڵ鷯´Â ÅؽºÆ® ºä¿Í ¿ÏÀüÈ÷ °°Àº ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù. ¸Þ½ÃÁö Çڵ鷯µµ ´ÙÀ½ Çϳª¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù. ³ª¸ÓÁö´Â ¸ðµÎ ±âº» ºäÀÇ ¸Þ½ÃÁö Çڵ鷯¸¦ È£ÃâÇϹǷΠÀÌ¹Ì ¿©¹éÀ» ÀνÄÇϵµ·Ï ¼öÁ¤µÇ¾ú´Ù.
void CApiEditHexa::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)
{
if (y < frt.top) {
SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0L);
bInstTimer=TRUE;
}
....
SetCaretÀº ÅؽºÆ® ºä¿Í µ¿ÀÏÇÏ°Ô ¼öÁ¤ÇÑ´Ù.
void CApiEditHexa::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
....
if (bScrollToCaret && crt.right) {
pFrame->SendNotify(AEN_MOVE);
if ((x+caretwidth > xPos+frt.right) || (x < xPos+frt.left)) {
xPos=max(0,PureX(x)-(frt.right-frt.left)/2);
bScroll=TRUE;
}
if (PureY(y) < yPos) {
yPos=PureY(y);
bScroll=TRUE;
}
if (y+FontHeight > yPos+frt.bottom) {
ty=(frt.bottom-frt.top-FontHeight)/LineHeight*LineHeight;
yPos=PureY(y)-ty;
bScroll=TRUE;
}
....
ÁÂÇ¥¿Í ¿ÀÇÁ¼Â°£À» º¯È¯ÇÏ´Â µÎ ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.
void CApiEditHexa::GetXYFromOff(int nPos,int &x,int &y)
{
int r,c;
assert(nPos >= 0 && nPos <= pFrame->doclen);
GetRCFromOff(nPos,r,c);
y=DocY(r*LineHeight);
x=DocX(c*bGap+bCol);
}
int CApiEditHexa::GetOffFromXY(int x,int y)
{
int r,c;
x-=frt.left;
x=max(x,bCol);
y=max(y,frt.top);
r=PureY(y)/LineHeight;
r=min(r,GetRowCount()-1);
c=(x-bCol+FontWidth)/bGap;
c=min(c,bpl-1);
return GetOffFromRC(r,c);
}
DrawLine ÇÔ¼ö´Â ±âº»ºä¿Í ¿ÏÀüÈ÷ ¶È°°°Ô ¼öÁ¤ÇÑ´Ù. ´ÙÀ½ ÇÑ ÁÙ¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù.
int CApiEditHexa::DrawLine(HDC hdc, int Line)
{
....
x=frt.left-xPos;
¼öÁ¤ ¿Ï·áµÇ¾ú´Ù. º°·Î ¾î·ÆÁö´Â ¾ÊÁö¸¸ ÀÌ¹Ì Çß´ø ÀÛ¾÷À» ¹Ýº¹ÇÏ·Á´Ï Á» ±ÍÂú±â´Â ÇÏ´Ù. ¸¸¾à ÀÌ ½Ç½ÀÀÌ ¾î·Æ°Ô ´À²¸Áø´Ù¸é ±âÁ¸ Äڵ忡 Àͼ÷ÇÏÁö ¾Ê¾Æ¼ÀÏ °ÍÀÌ´Ù. ÇÁ·ÎÁ§Æ®°¡ Ä¿Áú¼ö·Ï À¯Áö º¸¼ö ºñ¿ëÀÌ Áõ°¡ÇÑ´Ù´Â °ÍÀº ¹Ù·Î ÀÌ·± ¶æÀÌ´Ù.
´«±ÙÀÚ´Â ÆíÁýâ »ó´Ü¿¡ ¿ ¼ö¸¦ Ç¥½ÃÇÏ¿© ´ëÃæ ¸î ±ÛÀÚ Á¤µµ ÀÔ·ÂÇß´ÂÁö¸¦ º¼ ¼ö ÀÖ´Â ÀåÄ¡ÀÌ´Ù. »ç½Ç ¼½ÄÀÌ ¾ø´Â ÅؽºÆ® ÆíÁý±â¿¡¼ ¹®¼ÀÇ ³»¿ë¸¸ Áß¿äÇÏ°í Çü½ÄÀº ±×´ÙÁö °í·Á ´ë»óÀÌ ¾Æ´Ï¹Ç·Î ´«±ÝÀÚ´Â ±×´ÙÁö ½Ç¿ëÀûÀÌÁö ¾Ê´Ù. ±×·¯³ª °íÁ¤Æø ±Û²Ã¿¡¼ Çà´ç ÀÏÁ¤ °³¼öÀÇ ¹®ÀÚ¸¸À» ÀÔ·ÂÇØ¾ß ÇÏ´Â ¹®¼¿¡¼´Â ´«±ÝÀÚ°¡ °¡²û ÇÊ¿äÇÒ ¶§µµ ÀÖ´Ù. ´«±ÝÀÚ ±¸ÇöÀ» À§ÇØ ´ÙÀ½ º¯¼öµéÀ» ÇÁ·¹ÀÓ¿¡ ¼±¾ðÇÑ´Ù.
#define RULERHEIGHT 20
class CApiEdit : public CWindow
{
private:
....
BOOL bShowRuler;
COLORREF RulerColor;
public:
....
BOOL GetShowRuler() { return bShowRuler; }
void SetShowRuler(BOOL aValue);
COLORREF GetRulerColor() { return RulerColor; }
void SetRulerColor(int aValue);
};
´«±ÝÀÚ Ç¥½Ã ¿©ºÎ¿Í ´«±ÝÀÚÀÇ »ö»óÀ» ÁöÁ¤ÇÏ´Â º¯¼öÀÌ´Ù. RULERHEIGHT »ó¼ö´Â À̸§ÀÌ ÀǹÌÇϵíÀÌ ´«±ÝÀÚÀÇ ³ôÀÌÀÌ´Ù. »ý¼ºÀÚ¿¡¼ ´ÙÀ½°ú °°ÀÌ ÃʱâÈÇÑ´Ù.
CApiEdit::CApiEdit()
{
....
bShowRuler=TRUE;
RulerColor=RGB(220,220,220);
}
Å×½ºÆ®¸¦ ÇØ¾ß ÇϹǷΠÀÏ´Ü TRUE·Î ÃʱâÈÇß´Ù. ¿É¼Ç°ªÀ» º¯°æÇÏ´Â Set ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
void CApiEdit::SetShowRuler(BOOL aValue)
{
bShowRuler=aValue;
for (int aet=0;aet<4 && arView[aet];aet++) {
SendMessage(arView[aet]->hWnd,WM_SIZE,0,0);
arView[aet]->Invalidate(-1);
}
}
void CApiEdit::SetRulerColor(int aValue)
{
RulerColor=aValue;
ForAllView(Invalidate(-1))
}
´«±ÝÀÚ º¸±â ¸ðµå°¡ ¹Ù²î¸é Æ÷¸ËÆà ¿µ¿ªÀ» ´Ù½Ã °è»êÇØ¾ß ÇϹǷΠWM_SIZE ¸Þ½ÃÁö¸¦ º¸³½´Ù. ´«±ÝÀÚ°¡ º¸ÀÌ°Ô µÇ¾ú´Ù°í Çؼ ÆøÀÌ ¹Ù²î´Â °ÍÀº ¾Æ´Ï¹Ç·Î Á¤·ÄÀ» ´Ù½Ã ÇÒ ÇÊ¿ä´Â ¾ø´Âµ¥ ºÒÇÊ¿äÇÑ Á¤·ÄÀ» Çѹø ´õ ÇÏ´Â ¼ÀÀ̱â´Â ÇÏÁö¸¸ ÀÚÁÖ ÀÖ´Â ÀÏÀÌ ¾Æ´Ï¹Ç·Î °£´ÜÇÏ°Ô ±¸ÇöÇß´Ù. »ö»óÀÌ ¹Ù²î¸é ´Ù½Ã ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. ºäÀÇ OnSize¿¡¼ ´«±ÝÀÚÀÇ ³ôÀ̸¸Å Æ÷¸ËÆà ¿µ¿ª »ó´ÜÀ» À̵¿½ÃŲ´Ù.
void CApiEditText::OnSize(HWND hWnd, UINT state, int cx, int cy)
{
....
if (state != SIZE_MINIMIZED) {
....
frt.top+=(pFrame->InnerRect.top+(pFrame->bShowRuler ? RULERHEIGHT:0));
´ÙÀ½Àº ´«±ÝÀÚ¸¦ ±×¸®´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù. ´Ü¼øÇÑ ±×·¡ÇÈ Ãâ·Â¹®ÀÌ´Ù. OnPaint¿¡¼ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ´«±ÝÀÚ¸¦ ±×¸°´Ù.
void CApiEditText::DrawRuler(HWND hWnd,HDC hdc)
{
TCHAR szTemp[10];
RECT crt,rrt;
HBRUSH hBrush;
HPEN hPen,OldPen;
HFONT hOldFont;
int i,x;
GetClientRect(hWnd,&crt);
hBrush=CreateSolidBrush(pFrame->RulerColor);
SetRect(&rrt,MarginWidth,0,crt.right-SBW,RULERHEIGHT);
FillRect(hdc,&rrt,hBrush);
hPen=CreatePen(PS_SOLID,1,RGB(128,128,128));
OldPen=(HPEN)SelectObject(hdc,hPen);
MoveToEx(hdc,MarginWidth,RULERHEIGHT-1,NULL);
LineTo(hdc,crt.right-SBW,RULERHEIGHT-1);
hOldFont=(HFONT)SelectObject(hdc,CApiEdit::hLineNumFont);
SetTextAlign(hdc,TA_CENTER);
for (i=0;;i++) {
x=frt.left+FontWidth*i;
MoveToEx(hdc,x,RULERHEIGHT-1,NULL);
if (i%10==0) {
wsprintf(szTemp,"%d",i);
TextOut(hdc,x,2,szTemp,lstrlen(szTemp));
}
if (i%5==0) {
LineTo(hdc,x,RULERHEIGHT-9);
} else {
LineTo(hdc,x,RULERHEIGHT-5);
}
// Ãâ·ÂÇÑ ÈÄ ÁÂÇ¥ Á¡°ËÇØ¾ß ¸¶Áö¸· ´«±Ý±îÁö Ãâ·ÂµÈ´Ù.
if (x > crt.right-SBW) {
break;
}
}
SetTextAlign(hdc,TA_LEFT);
SelectObject(hdc,hOldFont);
DeleteObject(SelectObject(hdc,OldPen));
DeleteObject(hBrush);
}
void CApiEditText::OnPaint(HWND hWnd)
{
int RulerHeight;
....
hdc=BeginPaint(hWnd,&ps);
GetClientRect(hWnd,&crt);
if (pFrame->bShowRuler) {
DrawRuler(hWnd,hdc);
RulerHeight=RULERHEIGHT;
} else {
RulerHeight=0;
}
....
if (pFrame->InnerRect.top) {
SetRect(&mrt,MarginWidth,RulerHeight,crt.right-SBW,frt.top);
FillRect(hdc,&mrt,hInnerBrush);
}
if (pFrame->InnerRect.right) {
SetRect(&mrt,frt.right,RulerHeight,crt.right-SBW,crt.bottom-SBW);
FillRect(hdc,&mrt,hInnerBrush);
}
´«±ÝÀÚ°¡ º¸ÀÌ´Â »óÅÂÀ̸é DrawRuler ÇÔ¼ö·Î ´«±ÝÀÚ¸¦ ±×¸°´Ù. À§ÂÊ, ¿À¸¥ÂÊ ¿©¹éÀº ´«±ÝÀÚÀÇ ³ôÀ̸¸Å ¾Æ·¡·Î À̵¿µÈ´Ù. Á¼Àº ¿µ¿ªÀ̹ǷΠ´õºí ¹öÆÛ¸µÀº ÇÏÁö ¾Ê¾Ò´Âµ¥ ¹Ù·Î ±×·Áµµ ±ô¹Ú°Å¸²À» ´À³¥ ¼ö ¾ø´Ù. ½ÇÇàÇØ º¸¸é ´«±ÝÀÚÀÇ ¼ýÀÚµéÀÌ ºÒÅõ¸íÇÏ°Ô Ãâ·ÂµÇ´Âµ¥ ÀÌ ¹®Á¦´Â ´ÙÀ½ Àý¿¡¼ ÀÚ¿¬½º·´°Ô ÇØ°áµÉ °ÍÀÌ´Ù.
´«±ÝÀÚ´Â Æ÷¸ËÆà ¿µ¿ª¿¡ Æ÷ÇÔµÇÁö ¾ÊÀ¸¹Ç·Î OnSetCursor¿¡¼ Æ÷¸ËÆà ¿µ¿ª ¹Ù±ù¿¡ Ä¿¼°¡ ÀÖÀ» ¶§ È»ìÇ¥ ¸ð¾çÀÇ Ä¿¼·Î ¹Ù²Û´Ù. ¶ÇÇÑ ÀÌ ¿µ¿ª¿¡¼ ¸¶¿ì½º ´©¸§Àº ¾Æ¹« µ¿ÀÛµµ ÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù.
BOOL CApiEditText::OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg)
{
if (codeHitTest==HTCLIENT) {
....
// ´«±ÝÀÚ À§¿¡¼´Â È»ìÇ¥ Ä¿¼¸¦ Ç¥½ÃÇÑ´Ù.
if (pFrame->bShowRuler && pt.y < RULERHEIGHT) {
SetCursor(LoadCursor(NULL,IDC_ARROW));
return TRUE;
}
pt.x += xPos;
....
void CApiEditText::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
{
....
// ´«±ÝÀÚ À§¿¡¼ÀÇ Å¬¸¯Àº ¹«½ÃÇÑ´Ù.
if (pFrame->bShowRuler && y < RULERHEIGHT) {
return;
}
bFindSelect=FALSE;
....
void CApiEditHexa::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
{
....
// ´«±ÝÀÚ À§¿¡¼ÀÇ Å¬¸¯Àº ¹«½ÃÇÑ´Ù.
if (pFrame->bShowRuler && y < RULERHEIGHT) {
return;
}
bFindSelect=FALSE;
....
±×³É ¸®ÅÏÇØ ¹ö¸®¸é ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù. ¿©±â±îÁö Å×½ºÆ®°¡ ³¡³µÀ¸¸é ¼³Á¤°ªµéÀ» ¹«³ÇÑ °ªÀ¸·Î µðÆúÆ®¸¦ ¼öÁ¤ÇÑ´Ù.
CApiEdit::CApiEdit()
{
....
SetRect(&InnerRect,1,2,0,0);
InnerRectColor=GetSysColor(COLOR_WINDOW);;
bShowRuler=FALSE;
RulerColor=RGB(220,220,220);
}
¿ÞÂÊ¿¡ 1Çȼ¿, À§ÂÊ¿¡ 2Çȼ¿¸¸Å¸¸ ¿©¹éÀ» ÁÖ¾ú°í ¿©¹éÀÇ »ö»óÀº ¹è°æ»ö»ó°ú °°´Ù. ÀÌ Á¤µµ ¿©¹é¸¸ Á־ ´Ù¼Ò ¿©À¯ÀÖ¾î º¸ÀδÙ. ´«±ÝÀÚ´Â µðÆúÆ®·Î º¸ÀÌÁö ¾Ê°Ô Çß´Ù.