ApiEditÀÇ ¼±Åà ºí·ÏÀº ÅØ½ºÆ®¸¸ ¹ÝÀü½ÃÄÑ Ãâ·ÂÇϱ⠶§¹®¿¡ ¿©·¯ ÁÙÀ» ÇѲ¨¹ø¿¡ ¼±ÅÃÇϸé ÁÙ »çÀÌ´Â ¹ÝÀüµÇÁö ¾Ê´Â´Ù. ¸¶Ä¡ ¹®¼¿¡ °¡·Î ÁÙ¹«´Ì°¡ ÀÖ´Â °Íó·³ °°Àºµ¥ º¸±â¿¡´Â ±×·° Àú·° ±¦Âú°í Ưº°È÷ ºÒÆíÇÑ Á¡Àº ¾øÁö¸¸ ¼±Åà ºí·Ï³»ÀÇ ¹®¼¸¦ ÀÐÀ» ¶§´Â °¡µ¶¼º¿¡ ÁÁÁö ¾Ê°í ÀÌ·± ¹®ÀåÀ» ¿À·§µ¿¾È Àдٺ¸¸é ´«µµ ½±°Ô ÇÇ·ÎÇØÁø´Ù. ƯÈ÷ ÁÙ°£ÀÌ ³ÐÀ» ¶§´Â ÇÑ ÁÙ¾¿ °Ç³Ê¶Ù¸é ¼±ÅÃµÈ °Íó·³ º¸À̱⵵ ÇÑ´Ù.

¿öµå ÇÁ·Î¼¼¼³ª ´Ù¸¥ ÅØ½ºÆ® ÆíÁý±â¿¡ Àͼ÷ÇÑ »ç¶÷Àº ÀÌ·± ºí·Ï ¸ð¾çº¸´Ù ¼±Åà ºí·Ï Àüü°¡ ¿ÏÀüÈ÷ ¹ÝÀüµÇ´Â °ÍÀ» ´õ ÁÁ¾ÆÇÑ´Ù. ¹°·Ð ÇöÀçÀÇ ApiEdit ºí·Ï ¸ð¾çÀÌ ´õ ¸¶À½¿¡ µå´Â »ç¶÷µµ ÀÖÀ» °ÍÀÌ´Ù. ºí·Ï ¸ð¾çÀ» ¾î¶»°Ô Ãâ·ÂÇÒ °ÍÀΰ¡¸¦ ¿É¼ÇÀ¸·Î ¸¸µé¾î º¸ÀÚ. ¶ÇÇÑ ÁÙ°£ÀÌ ³ÐÀ» ¶§ ¹®ÀÚ¿ÀÌ »ó´ÜÀ¸·Î¸¸ Á¤·ÄµÇ´Â Á¤·Ä ¹æ½Äµµ º¯°æÇØ º¼ °ÍÀÌ´Ù. ÀÌ ±â´Éµé ±¸Çö¿¡ ÇÊ¿äÇÑ ¿É¼Ç º¯¼öµéÀ» ÇѲ¨¹ø¿¡ ¹Ì¸® ¼±¾ðÇÑ´Ù.
class CApiEdit : public CWindow
{
private:
....
int VAlign;
int SelBlockType;
COLORREF SelFrameColor;
public:
....
int GetVAlign() { return VAlign; }
void SetVAlign(int aValue);
int GetSelBlockType() { return SelBlockType; }
void SetSelBlockType(int aValue);
COLORREF GetSelFrameColor() { return SelFrameColor; }
void SetSelFrameColor(int aValue);
};
VAlignÀº ¼±Åà ºí·Ï ³»¿¡¼ÀÇ ¼öÁ÷ Á¤·Ä ¹æ½ÄÀ» ÁöÁ¤Çϸç SelBlockTypeÀº ¼±Åà ºí·°ÀÇ ¸ð¾çÀÌ´Ù. »ý¼ºÀÚ¿¡¼ ÀÌ º¯¼öµéÀ» ÃʱâÈÇϰí Set ÇÔ¼ö¿¡¼ ¿É¼Ç º¯°æ½ÃÀÇ Ã³¸®¸¦ ÇÑ´Ù.
CApiEdit::CApiEdit()
{
....
VAlign=1;
SelBlockType=1;
SelFrameColor=RGB(0,0,0);
}
void CApiEdit::SetSelBlockType(int aValue)
{
SelBlockType=aValue;
for (int aet=0;aet<4 && arView[aet];aet++) {
if (arView[aet]->SelStart != arView[aet]->SelEnd) {
arView[aet]->Invalidate(-1);
}
}
}
void CApiEdit::SetSelFrameColor(int aValue)
{
SelFrameColor=aValue;
for (int aet=0;aet<4 && arView[aet];aet++) {
if (arView[aet]->SelStart != arView[aet]->SelEnd) {
arView[aet]->Invalidate(-1);
}
}
}
void CApiEdit::SetVAlign(int aValue)
{
VAlign=aValue;
ForAllView(Invalidate(-1))
}
ÀÌ ¿É¼ÇµéÀ» Á¦´ë·Î Àû¿ëÇÏ·Á¸é ÅØ½ºÆ® Ãâ·Â ¸ðµå¸¦ Åõ¸íÀ¸·Î ¹Ù²Ù¾î¾ß ÇÑ´Ù. ¼±Åà ºí·ÏÀ» ¸ÕÀú ±×¸®°í ÅØ½ºÆ®¸¦ Ãâ·ÂÇØ¾ß ÇÏ¸ç ¶Ç ¹è°æÀÇ ºñÆ®¸ÊÀÌ ±ò¸° »óÅ¿¡¼µµ ÅØ½ºÆ®¸¦ Ãâ·ÂÇÒ °ÍÀ̹ǷΠ¹è°æ »ö»óÀ» ¹«½ÃÇØ¾ß ÇÑ´Ù.
void CApiEditText::OnPaint(HWND hWnd)
{
hdc=BeginPaint(hWnd,&ps);
SetBkMode(hdc,TRANSPARENT);
....
hMemDC=CreateCompatibleDC(hdc);
SetBkMode(hMemDC,TRANSPARENT);
....
ȸé DC¿Í ¸Þ¸ð¸® DC µÑ ´Ù ¹«Á¶°Ç TRANSPARENT ¸ðµå·Î º¯°æÇß´Ù. ÀÌ·¸°Ô µÇ¸é ÁÙ ¹øÈ£ Ãâ·ÂÀ̳ª ´«±ÝÀÚÀÇ ÅØ½ºÆ®¸¦ Ãâ·ÂÇÒ ¶§ ÀϺη¯ Åõ¸í ¸ðµå·Î ¹Ù²ÙÁö ¾Ê¾Æµµ µÈ´Ù. ´ÙÀ½ ÄÚµåµéÀº ÀÌÁ¦ »èÁ¦ÇÑ´Ù.
void CApiEditText::DrawLineSub(HDC hdc,int Line,BOOL bCurLine)
{
UINT OldBkMode;
....
// ÁÙ ¹øÈ£ Ãâ·Â
if (bShowLineNum && (ViewType==HEXA_VIEW || pLine[Line].nLine==0)) {
....
OldBkMode=SetBkMode(hdc,TRANSPARENT);
....
SetBkMode(hdc,OldBkMode);
}
// ºÏ¸¶Å© Ãâ·Â
if (ViewType==HEXA_VIEW || pLine[Line].nLine == 0) {
....
OldBkMode=SetBkMode(hdc,TRANSPARENT);
....
SetBkMode(hdc,OldBkMode);
}
}
}
¹°·Ð »èÁ¦ ¾ÈÇØµµ »ó°ü¾øÁö¸¸ ºÒÇÊ¿äÇÑ ÄÚµåÀ̹ǷΠÁö¿ö ¹ö¸®´Â °ÍÀÌ ÁÁ´Ù. ´«±ÝÀÚÀÇ ¼ýÀÚµéÀÌ ÀÌÁ¦ Á¦´ë·Î º¸ÀÏ °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é ¼±Åà ºí·ÏÀ̳ª C++ ÆÄÀÏÀÇ ÁÖ¼®°°ÀÌ ¹è°æÀÌ ÀÖ´Â ÅØ½ºÆ®´Â Á¦´ë·Î º¸ÀÌÁö ¾Ê´Â´Ù. Áö±ÝºÎÅÍ´Â ¹è°æÀ» Á÷Á¢ ±×·Á¾ß ÇÑ´Ù. 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);
x=docx-xPos;
if (back!=pFrame->cBack) {
if
(pFrame->SelBlockType==0) {
SetRect(&rt,oldx,y,x+1,y+FontHeight);
}
else {
SetRect(&rt,oldx,0,x+1,LineHeight);
}
Brush=CreateSolidBrush(back);
FillRect(hdc,&rt,Brush);
DeleteObject(Brush);
}
if (bShowTab) {
DisplayTab(hdc,oldx,x,y,back);
}
} else {
SetTextColor(hdc,fore);
SetBkColor(hdc,back);
oldx=x;
if (bShowEnter || ignoreX == FALSE || back!=pFrame->cBack) {
x+=MyGetTextExtent(pFrame->buf+SegOff,len);
}
if (back!=pFrame->cBack) {
if (pFrame->SelBlockType==0) {
SetRect(&rt,oldx,y,x,y+FontHeight);
} else {
SetRect(&rt,oldx,0,x,LineHeight);
}
Brush=CreateSolidBrush(back);
FillRect(hdc,&rt,Brush);
DeleteObject(Brush);
}
AeTextOut(hdc,oldx,y,pFrame->buf+SegOff,len);
if (bShowSpace) {
DisplaySpace(hdc,oldx,y,pFrame->buf+SegOff,len);
}
}
if (bShowEnter) {
if (pFrame->IsEnterCode(SegOff+len)) {
DisplayEnter(hdc,x,y,back);
}
}
}
¹è°æ »ö»óÀ» ÁöÁ¤ÇÏ´Â SetBkColor È£Ãâ¹®Àº ÀÌÁ¦ Çʿ䰡 ¾ø¾îÁ³´Ù. ¹è°æÀ» ¸ÕÀú ±×¸®°í ¿©±â¿¡ Åõ¸í»öÀ¸·Î ÅØ½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù. ¼±Åà ºí·°À̳ª ¶Ç´Â ÁÖ¼®°°ÀÌ ¹è°æÀÌ ÀÖ´Â ÅØ½ºÆ®ÀÇ ¸ð¾çÀº SelBlockType º¯¼ö¿¡ µû¶ó ´Þ¶óÁö´Âµ¥ ÀÌ °ªÀÌ 0ÀÌ¸é ÆùÆ® ³ôÀ̸¸Å ¹è°æÀ» ±×¸®°í 1À̸é ÁÙ°£ ³ôÀ̸¸Å ¹è°æÀ» ±×¸°´Ù. ÁÙ°£ÀÌ ¾Æ¹«¸® Ä¿µµ ¼±Åà ºí·°ÀÌ ¸ðµÎ ºÙ¾î¼ Ãâ·ÂµÈ´Ù.

Çí»çºä´Â DrawLine¿¡¼ °ð¹Ù·Î Ãâ·ÂÇϹǷΠÀÌ ÇÔ¼ö¸¦ ¼öÁ¤ÇØ¾ß Çϴµ¥ Àá½Ã ÈÄ ÀÛ¼ºÇÒ ¼öÁ÷ Á¤·Ä ±â´É±îÁö °°ÀÌ ¼öÁ¤Çϵµ·Ï ÇÏÀÚ.
ValignÀº ¼±Åà ºí·Ï³»¿¡¼ÀÇ ¼öÁ÷ Á¤·Ä À§Ä¡¸¦ ÁöÁ¤ÇÑ´Ù. ÁÙ°£ÀÌ 100% ÀÌ»óÀÏ ¶§´Â ¹®ÀÚ¿ ¾Æ·¡ À§¿¡ ¿©¹éÀÌ »ý±â´Âµ¥ ÀÌ ¿©¹é°ú ¹®ÀÚ¿ÀÇ ¹èÄ¡ °ü°è¸¦ ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù. Àüü ÁÙ°£ ³ôÀÌ¿¡¼ ¹®ÀÚ¿À» À§, Áß¾Ó, ¾Æ·¡¿¡ °¢°¢ ¹èÄ¡ÇÒ ¼ö ÀÖ´Ù.

Áß¾Ó Á¤·ÄÀÌ º¸±â¿¡ °¡Àå ÁÁÀºµ¥ ´ç±ÙÀÇ ÇöÀç Ãâ·Â ¹æ½ÄÀº »ó´Ü Á¤·Ä·Î µÇ¾î ÀÖ´Ù. DrawLineÀÌ º°´Ù¸¥ ÁÂÇ¥ Á¶Á¤¾øÀÌ ÁÙÀÇ ¼öÁ÷ ½ÃÀÛ ÁÂÇ¥¿¡ ¹®ÀÚ¿À» Ãâ·ÂÇϱ⠶§¹®ÀÌ´Ù. Á¤·Ä ¹æ½ÄÀ» ¹Ù²Ù·Á¸é ÁÙ°£ÀÇ Ãâ·Â ÁÂÇ¥¸¦ Àû´çÈ÷ ¶ç¿ö ÅØ½ºÆ®¸¦ Á¶±Ý ¾Æ·¡ÂÊÀ¸·Î ³»·Á¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â VAlign ¿É¼ÇÀ¸·ÎºÎÅÍ ÁÙ°£³»ÀÇ ¹®ÀÚ ¼öÁ÷ À§Ä¡¸¦ ±¸ÇÑ´Ù.
int CApiEditText::GetCharYPos()
{
switch (pFrame->VAlign) {
case 0:
return 0;
default:
case 1:
return (LineHeight-FontHeight)/2;
case 2:
return LineHeight-FontHeight;
}
}
»ó´Ü Á¤·ÄÀÏ ¶§´Â 0À» ¸®ÅÏÇÏ¿© ÁÙ À§ÂÊ¿¡ Ãâ·ÂÇÏ¸é µÇ°í ÇÏ´Ü Á¤·ÄÀÏ ¶§´Â ÁÙ°£¿¡¼ ±Û²Ã Å©±â ³ôÀ̸¦ »«¸¸ÅÀÎ ¿©¹é ³ôÀ̸¦ ´õÇØ ÁÙ°£ ¾Æ·¡ÂÊ¿¡ ÅØ½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù. Áß¾Ó Á¤·ÄÀÏ ¶§´Â ¿©¹é ³ôÀÌÀÇ Àý¹ÝÀ» ´õÇØ ÅØ½ºÆ®°¡ ÁÙ°£ÀÇ Áß¾Ó¿¡ ¿Àµµ·Ï ÇÑ´Ù. ´Ü¼öÇÑ ¿¬»ê¹®ÀÏ »ÓÀÌ´Ù. ÅØ½ºÆ®¸¦ Ãâ·ÂÇÒ ¶§ y ÁÂÇ¥¸¦ ¹«Á¶°Ç 0À¸·Î ÁÖÁö ¸»°í ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÑ ÁÂÇ¥¸¦ »ç¿ëÇÑ´Ù.
int CApiEditText::DrawLine(HDC hdc, int Line)
{
int x,y;
....
y=GetCharYPos();
if (bCurLine &&
(pFrame->nShowCurLine == 3 || pFrame->nShowCurLine == 4)) {
if (pFrame->SelBlockType==0) {
SetRect(&lrt,frt.left,y,frt.right,y+FontHeight);
} else {
SetRect(&lrt,frt.left,0,frt.right,LineHeight);
}
hCurLine=CreateSolidBrush(pFrame->CurColor);
FillRect(hdc,&lrt,hCurLine);
DeleteObject(hCurLine);
}
....
for (;;) {
....
DrawSegment(hdc,x,y,nowoff,len,
(nowoff+len==pLine[Line].End),fore,back);
....
yº¯¼ö¸¦ »õ·Î ¼±¾ðÇϰí VAlign°ª¿¡ µû¶ó ¼öÁ÷ Ãâ·Â À§Ä¡¸¦ ¼±ÅÃÇÑ´Ù. DrawSegmentÀÇ ¼¼¹øÂ° Àμö·Î y¸¦ ³Ñ±â¸é ÀÌ ÁÂÇ¥¿¡ ¹®ÀÚ¿À» Ãâ·ÂÇÒ °ÍÀÌ´Ù. »ç½Ç ÀÌ Àμö´Â ´õºí ¹öÆÛ¸µÀ» Çϸ鼺ÎÅÍ ºÒÇÊ¿äÇß¾úÀ¸³ª ¼öÁ÷ Á¤·Ä À§Ä¡¸¦ ÁöÁ¤ÇÏ´Â Áö±Ý¿¡ ¿Í¼ ´Ù½Ã ÇÊ¿äÇÏ°Ô µÇ¾ú´Ù. ÀϺη¯ ³²°ÜµÐ °Íµµ ¾Æ´Ï°í ¾ø¾Ö±â°¡ ±ÍÂú¾Æ¼ ³»¹ö·Á µÐ °ÍÀ̾ú´Âµ¥ ¾îÂîÇÏ´Ù º¸´Ï Àç»ç¿ëÇÒ ±âȸ°¡ »ý°å´Ù. À½¿µÀÌ µé¾î°£ ÇöÀçÇà Ç¥½Ã´Â SelBlockType°ú VAlign ¿É¼ÇÀÇ ¿µÇâÀ» µ¿½Ã¿¡ ¹Þ´Â´Ù. À½¿µÀÇ ³ôÀ̵µ ºí·ÏÀÇ ³ôÀÌ¿¡ ¸ÂÃß°í SelBlockTypeÀÌ 0ÀÏ °æ¿ì À½¿µÀÇ ½ÃÀÛ À§Ä¡¸¦ y¿¡ ¸ÂÃá´Ù. ij·µÀÇ À§Ä¡µµ ÅØ½ºÆ®¸¦ µû¶ó°¡¾ß ÇϹǷΠSetCaretµµ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
....
SetCaretPos(x-xPos,y-yPos+GetCharYPos());
if (bUpdatePrevX) {
PrevX=x;
}
if (pFrame->nShowCurLine != 0 && OldPos.y != y-yPos) {
InvRt.left=0;
InvRt.right=frt.right;
InvRt.top=min(OldPos.y,y-yPos)/LineHeight*LineHeight;
InvRt.bottom=max(OldPos.y,y-yPos)+LineHeight;
InvalidateRect(hWnd,&InvRt,FALSE);
}
}
¼öÁ÷Á¤·ÄµÈ¸¸Å ij·µ À§Ä¡µµ ¾Æ·¡·Î ³»·È´Ù. Áß¾ÓÀ̳ª ÇÏ´Ü Á¤·ÄÀÏ ¶§ À½¿µÀÇ ¹«È¿ ¿µ¿ª ½ÃÀÛ À§Ä¡°¡ ij·µ ÁÂÇ¥°¡ ¾Æ´Ï¶ó ij·µÀÌ ÀÖ´Â ÁÙÀÇ Ã³À½À̾î¾ß ÇÑ´Ù. LineHeightÀÇ ¹è¼ö·Î ³»¸²Çϸé ÁÙÀÇ Ã³À½ ÁÂÇ¥¸¦ ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. DrawSegment ÇÔ¼ö°¡ yÀμö¸¦ ¹Þ¾ÆµéÀ̹ǷΠ±× Á¹º´ ÇÔ¼öµéÀÎ Á¦¾îÄÚµå º¸±â ÇÔ¼öµéµµ ¸ðµÎ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¼öÁ¤ ¹æ¹ýÀº Áö±ØÈ÷ °£´ÜÇÏ´Ù.
void CApiEditText::DisplayTab(HDC hdc, int x1, int x2, int y,COLORREF back)
{
switch (ShowTabType) {
case 0:
MoveToEx(hdc,x1+1,y+FontHeight/2,NULL);
LineTo(hdc,x2-1,y+FontHeight/2);
LineTo(hdc,x2-3,y+FontHeight/2-2);
LineTo(hdc,x2-3,y+FontHeight/2+2);
LineTo(hdc,x2-1,y+FontHeight/2);
break;
case 1:
MoveToEx(hdc,x1+1,y+FontHeight*3/4,NULL);
LineTo(hdc,x2-1,y+FontHeight*3/4);
LineTo(hdc,x2-3,y+FontHeight*3/4-2);
LineTo(hdc,x2-3,y+FontHeight*3/4+2);
LineTo(hdc,x2-1,y+FontHeight*3/4);
for (i=0;i<sizeof(arTab)/sizeof(arTab[0]);i+=2) {
SetPixel(hdc,arTab[i]+x1+2,y+arTab[i+1]+FontHeight*3/4-6,pFrame->CodeColor);
}
break;
}
SelectObject(hdc,OldPen);
DeleteObject(hPen);
}
¸ðµç ¼öÁ÷ ÁÂÇ¥¿¡ y+¸¸ ÇØ ÁÖ¸é µÈ´Ù. ¿ø·¡ ÀÌ °ªÀ» ´õÇØ¾ß Çß¾ú´Âµ¥ 0À̾ú±â ¶§¹®¿¡ ´õÇÏÁö ¾Ê¾Ò¾ú´Ù.
void CApiEditText::DisplayEnter(HDC hdc, int x, int y,COLORREF back)
{
HPEN hPen,OldPen;
HBRUSH
Brush,OldBrush;
RECT rt;
int width;
hPen=CreatePen(PS_SOLID,1,pFrame->CodeColor);
OldPen=(HPEN)SelectObject(hdc,hPen);
Brush=CreateSolidBrush(back);
....
SetRect(&rt,x,y,x+width,y+FontHeight);
FillRect(hdc,&rt,Brush);
if (ShowEnterType <= 1) {
MoveToEx(hdc,x+width-2,y+FontHeight/10,NULL);
LineTo(hdc,x+width-2,y+FontHeight*3/4);
LineTo(hdc,x+2,y+FontHeight*3/4);
LineTo(hdc,x+4,y+FontHeight*3/4-2);
LineTo(hdc,x+4,y+FontHeight*3/4+2);
LineTo(hdc,x+2,y+FontHeight*3/4);
} else {
OldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
Rectangle(hdc,rt.left+1,rt.top+1,rt.right-1,rt.bottom-1);
SelectObject(hdc,OldBrush);
MoveToEx(hdc,x+width-4,y+FontHeight/5,NULL);
LineTo(hdc,x+width-4,y+FontHeight*5/8);
LineTo(hdc,x+3,y+FontHeight*5/8);
LineTo(hdc,x+5,y+FontHeight*5/8-2);
LineTo(hdc,x+5,y+FontHeight*5/8+2);
LineTo(hdc,x+3,y+FontHeight*5/8);
}
SelectObject(hdc,OldPen);
DeleteObject(hPen);
DeleteObject(Brush);
}
DrawSegment¿¡¼ ¹è°æ »ö»óÀ¸·Î ¹Ì¸® ä¿ì±â¸¦ ÇØ µÎ¾úÀ¸¹Ç·Î Á¦¾î ÄÚµå Ãâ·ÂÀ» À§ÇØ ¹è°æÀ» Áö¿ï Çʿ䰡 ¾ø¾îÁ³´Ù. FillRect È£Ãâ¹®À» »èÁ¦ÇÏ°í ¹è°æ ºê·¯½Ãµµ ´õ ÀÌ»ó ÇÊ¿ä¾ø´Ù. ¸ðµç ¼öÁ÷ ÁÂÇ¥¿¡ y¸¦ ´õÇÑ´Ù. °ø¹éÀ» Ãâ·ÂÇÏ´Â ÇÔ¼öµµ ¸¶Âù°¡Áö·Î Ãâ·Â ÁÂÇ¥¿¡ y¸¦ ´õÇÑ´Ù.
void CApiEditText::DisplaySpace(HDC hdc, int x, int y, TCHAR *text, int len)
{
....
for (nPos=0;nPos!=len;nPos++) {
if (text[nPos] == 0x20) {
switch (ShowSpaceType) {
default:
case 0:
SetPixel(hdc,nx+width/2,y+FontHeight/2,pFrame->CodeColor);
SetPixel(hdc,nx+width/2,y+FontHeight/2+1,pFrame->CodeColor);
break;
case 1:
MoveToEx(hdc,nx,y+FontHeight*3/4+1,NULL);
LineTo(hdc,nx,y+FontHeight-1);
LineTo(hdc,nx+width-1,y+FontHeight-1);
LineTo(hdc,nx+width-1,y+FontHeight*3/4);
break;
case 2:
Rectangle(hdc,nx,0,nx+width,y+FontHeight);
break;
}
nx+=width;
} else {
....
¸¶ÁøÀÇ ÁÙ¹øÈ£, ÇöÀçÇà Ç¥½Ã, ºÏ¸¶Å© Ç¥½Ã µîµµ °°ÀÌ º»¹® ÅØ½ºÆ®¿Í ³ôÀ¸¸¦ ¸ÂÃß¾î¾ß ÇϹǷΠDrawLineSub ÇÔ¼öÀÇ ¸ðµç Ãâ·Â¹®¿¡ y¸¦ ´õÇÑ´Ù.
void CApiEditText::DrawLineSub(HDC hdc,int Line,BOOL bCurLine)
{
....
int vy;
vy=GetCharYPos();
// ¹Ú½º ¶Ç´Â ¹ØÁÙ·Î ÇöÀçÇà Ç¥½ÃÇϱâ
if ((pFrame->nShowCurLine==1
|| pFrame->nShowCurLine==2 ||
pFrame->nShowCurLine==4)
&& bCurLine) {
if
(pFrame->nShowCurLine == 1 || pFrame->nShowCurLine == 4) {
if (pFrame->SelBlockType==0) {
SetRect(&lrt,frt.left-1,vy,frt.right+1,vy+FontHeight);
} else {
SetRect(&lrt,frt.left-1,0,frt.right+1,LineHeight);
}
} else {
SetRect(&lrt,frt.left-1,vy+FontHeight,frt.right+1,vy+FontHeight);
}
SetTextColor(hdc,RGB(0,0,0));
SetBkColor(hdc,GetSysColor(COLOR_WINDOW));
DrawFocusRect(hdc,&lrt);
}
....
// ¸¶Áø Ãâ·Â
if (MarginWidth != 0) {
....
if (bShowLineNum && (ViewType==HEXA_VIEW || pLine[Line].nLine==0)) {
....
TextOut(hdc,MarginWidth-3,(FontHeight-10)/2+vy,szLine,lstrlen(szLine));
....
if (ViewType==HEXA_VIEW || pLine[Line].nLine == 0) {
....
RoundRect(hdc,0,vy,10,vy+FontHeight,2,2);
....
TextOut(hdc,2,vy+2,szLine,lstrlen(szLine));
....
// ¸¶Áø¿¡ ÇöÀçÇà Ç¥½Ã
if (pFrame->nShowCurLine == 5 && bCurLine) {
....
if (len!=0 || vy!=0) {
for (c=0;c<4;c++) {
tri[c].y+=len+vy;
}
}
¸ðµç Ãâ·Â ÁÂÇ¥¿¡ vy¸¦ ´õÇØ ÁØ´Ù. Á¡¼±À¸·Î ÇöÀçÇàÀ» Ç¥½ÃÇÒ ¶§ »ç°¢ ÇÁ·¹ÀÓÀÇ Å©±â´Â SelBlockType¿¡ µû¶ó ´Þ¶óÁø´Ù. ¸¶¿ì½º·Î µå·¡±×ÁßÀÇ Àӽà ij·µ À§Ä¡µµ ¼öÁ÷ Á¤·Ä¿¡ ¿µÇâÀ» ¹Þ´Â´Ù.
void CApiEditText::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)
{
....
if (bDragSel) {
if (x > frt.left && x < frt.right && y > frt.top && y < frt.bottom) {
toff=GetOffFromXY(x+xPos,y+yPos);
GetXYFromOff(toff,sx,sy);
SetCaretPos(sx-xPos,sy-yPos+GetCharYPos());
....
Çí»ç ºäµµ ¶È°°Àº ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù.
int CApiEditHexa::DrawLine(HDC hdc, int Line)
{
int x,y;
....
COLORREF
OldFore,OldBack;
....
GetRCFromOff(off,r,c);
if (r==Line && (bHideCurLine==FALSE || GetFocus()==hWnd)) {
bCurLine=TRUE;
}
y=GetCharYPos();
if (bCurLine &&
(pFrame->nShowCurLine == 3 || pFrame->nShowCurLine == 4)) {
if (pFrame->SelBlockType==0) {
SetRect(&lrt,frt.left,y,frt.right,y+FontHeight);
} else {
SetRect(&lrt,frt.left,0,frt.right,LineHeight);
}
hCurLine=CreateSolidBrush(CurColor);
FillRect(hdc,&lrt,hCurLine);
DeleteObject(hCurLine);
}
....
wsprintf(szText,"%.8X:",nPos);
if (bCapital==FALSE)
_strlwr(szText);
TextOut(hdc,x,y,szText,lstrlen(szText));
x+=bCol;
// ¹ÙÀÌÆ® Ãâ·Â. ¹®¼ ³¡À» ¸¸³ª´õ¶óµµ x°ª °»½ÅÀ» À§ÇØ ·çÇÁ´Â ³¡±îÁö µ¹¾Æ¾ß ÇÑ´Ù.
for (i=nPos;i<nPos+bpl;i++) {
if (i < pFrame->doclen) {
wsprintf(szText,fmtByte,(BYTE)pFrame->buf[i]);
// ¹ÙÀÌÆ® ÅØ½ºÆ® Ãâ·Â. ¼±Åà ¿µ¿ªÀÌ¸é ºí·Ï¾È¿¡ ÅØ½ºÆ® Ãâ·Â
if (i>=SelFirst && i<SelSecond &&
(GetFocus()==hWnd || pFrame->HideSelType!=0 || bFindSelect)) {
OldFore=SetTextColor(hdc,fore);
// OldBack=SetBkColor(hdc,back);
if (pFrame->SelBlockType==0) {
SetRect(&srt,x,y,x+bGap,y+FontHeight);
} else {
SetRect(&srt,x,0,x+bGap,LineHeight);
}
FillRect(hdc,&srt,hSelBack);
TextOut(hdc,x,y,szText,lstrlen(szText));
SetTextColor(hdc,OldFore);
// SetBkColor(hdc,OldBack);
} else {
TextOut(hdc,x,y,szText,lstrlen(szText));
}
}
x+=bGap;
}
// ¹®ÀÚ Ãâ·Â
x+=FontWidth;
for (i=nPos;i<nPos+bpl;i++) {
memset(szText,0,3);
if (i==pFrame->doclen) {
break;
}
// DBCS µÞ ¹ÙÀÌÆ®´Â .À¸·Î ´ëü
if (i==nPos && pFrame->IsInDBCS(i)) {
szText[0]='.';
} else {
//
ÇÑ±Û Ãâ·Â
if
(pFrame->IsDBCS(i) && !pFrame->IsEnterCode(i)) {
szText[0]=pFrame->buf[i++];
szText[1]=pFrame->buf[i];
}
else {
//
¿µ¹®Àº Àμ⠰¡´ÉÇÑ ¹®ÀÚ¸¸ Ãâ·Â
if
(pFrame->buf[i] >= 0x20 && pFrame->buf[i] <= 0x7e) {
szText[0]=pFrame->buf[i];
}
else {
szText[0]='.';
}
}
}
//
¹®ÀÚ Ãâ·Â
GetTextExtentPoint32(hdc,szText,lstrlen(szText),&sz);
if (i>=SelFirst && i<SelSecond &&
(GetFocus()==hWnd || HideSelType!=0 || bFindSelect)) {
OldFore=SetTextColor(hdc,fore);
// OldBack=SetBkColor(hdc,back);
if (pFrame->SelBlockType==0) {
SetRect(&srt,x,y,x+sz.cx,y+FontHeight);
} else {
SetRect(&srt,x,0,x+sz.cx,LineHeight);
}
FillRect(hdc,&srt,hSelBack);
TextOut(hdc,x,y,szText,lstrlen(szText));
SetTextColor(hdc,OldFore);
// SetBkColor(hdc,OldBack);
} else {
TextOut(hdc,x,y,szText,lstrlen(szText));
}
x+=sz.cx;
}
DeleteObject(hSelBack);
DeleteObject(SelectObject(hdc,OldPen));
DrawLineSub(hdc,Line,bCurLine);
return 1;
}
VAlign ¿É¼Ç¿¡ µû¶ó y¸¦ °è»êÇÏ°í ¸ðµç TextOut ÇÔ¼ö°¡ 0 ´ë½Å y¸¦ »ç¿ëÇÑ´Ù. ¹è°æ »ö»óÀº »ç¿ëÇÏÁö ¾ÊÀ¸¸ç ¼±Åà ºí·ÏÀº Á÷Á¢ FillRect·Î ±×¸°´Ù. °¢ ¹®ÀÚ¸¦ Ãâ·ÂÇϱâ Àü¿¡ ÆøÀ» ¸ÕÀú ±¸ÇØ ³õ¾Æ¾ß ºí·ÏÀÇ ÆøÀ» ¾Ë ¼ö ÀÖ´Ù. SetCaret ÇÔ¼ö´Â ÅØ½ºÆ® ºä¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ°Ô ¼öÁ¤ÇÑ´Ù.
void CApiEditHexa::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
....
SetCaretPos(x-xPos,y-yPos+GetCharYPos());
if (pFrame->nShowCurLine != 0 && OldPos.y != y-yPos) {
InvRt.left=0;
InvRt.right=frt.right;
InvRt.top=min(OldPos.y,y-yPos)/LineHeight*LineHeight;
InvRt.bottom=max(OldPos.y,y-yPos)+LineHeight;
InvalidateRect(hWnd,&InvRt,FALSE);
}
}
ºä°¡ µÎ °³ÀÌ´Ù º¸´Ï °°Àº ÀÛ¾÷À» ¿©·¯ ¹ø ¹Ýº¹ÇØ¾ß ÇÑ´Ù. ¹Ýº¹µÇ´Â ÄÚµå´Â ÁÁÁö ¾ÊÀ¸¹Ç·Î ´ÙÀ½¿¡ ¸®ÆåÅ丵ÇÒ ¿¹Á¤ÀÌ´Ù.
ÁÙ ³¡¿¡ ÀÖ´Â °³Çà ÄÚµå´Â ¼±ÅÃÇØµµ ¼±Åà ºí·Ï¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. ±×·¡¼ ºóÁÙÀÌ ÀÖ´Â ¹®¼¸¦ ¼±ÅÃÇÏ¸é ´ÙÀ½ ±×¸²Ã³·³ ¼±Åà ¿µ¿ªÀÌ Áß°£ Áß°£ ²÷¾îÁø °Íó·³ º¸ÀδÙ.

¾îÂ÷ÇÇ ºóÁÙÀ̹ǷΠºí·ÏÀÌ ²÷¾îÁ® Ç¥½ÃµÇµµ º° ¹®Á¦´Â ¾øÁö¸¸ ¸¶Ä¡ ¾Æ·¡ÂÊÀÇ ¹®´Ü°ú ÀÂÊÀÇ ¹®´ÜÀÌ µû·Î ¼±ÅõǾî ÀÖ´Â °Íó·³ º¸ÀδÙ. »ç¿ëÀÚ¿¡°Ô È¥¶õÀ» ÁÙ ¼öµµ ÀÖÀ¸¹Ç·Î ¼±ÅÃµÈ °³Çà Äڵ嵵 ¹ÝÀüÇÏ¿© Ç¥½ÃÇØ º¸ÀÚ. ½¬¿ö º¸ÀÏÁö ¸ð¸£°ÚÁö¸¸ »ý°¢º¸´Ù ¹®Á¦Á¡ÀÌ ¸¹´Ù. Á¤·Ä Á¤º¸ÀÎ pLineÀÇ Start¿Í End¿¡ ±â·ÏµÇ´Â ¿ÀÇÁ¼Â¿¡´Â °³Çà Äڵ尡 Á¦¿ÜµÇ¹Ç·Î ÀÏ¹Ý ¹®ÀÚ¿Í µ¿ÀÏÇÏ°Ô Ãë±ÞÇÏ±â ¾î·Æ´Ù. ´Ù¸¸ bShowEnter ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ» ¶§´Â ±×·¡ÇÈÀ¸·Î °³Çà Äڵ带 º¸¿©Áִµ¥ ÀÌ °æ¿ìµµ ¼±Åà »óÅ´ ǥ½ÃÇÏÁö ¾Ê´Â´Ù.
°³Çà Äڵ嵵 ¼±ÅÃµÇ¸é ¹ÝÀü»öÀ¸·Î Ç¥½ÃÇØ º¸ÀÚ. °³Çà ÄÚµå º¸±â ¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ» ¶§¿Í ±×·¸Áö ¾ÊÀ» ¶§ ¾çÂÊÀ» ´Ù ó¸®ÇØ¾ß ÇÑ´Ù. °³Çà ÄÚµå º¸±â ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÁö ¾ÊÀ» ¶§´Â DrawLine¿¡¼ Á÷Á¢ ó¸®ÇÑ´Ù. °³Çà ÄÚµåÀÇ Æø¸¸Å ¹ÝÀü Ç¥½Ã¸¸ Ãâ·ÂÇÏ´Â °£´ÜÇÑ µ¿ÀÛÀÌÁö¸¸ ±³·ÁÇÒ °Ô ¸¹¾Æ Äڵ尡 Á» ±æ´Ù.
int CApiEditText::DrawLine(HDC hdc, int Line)
{
BOOL bSelEnter=FALSE;
....
// ÁÙ³¡ÀÇ ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖ´ÂÁö Á¶»çÇÑ´Ù.
if (nowoff+len == pLine[Line].End) {
if (!bShowEnter && pFrame->IsEnterCode(pLine[Line].End) &&
pLine[Line].End >= SelFirst && pLine[Line].End < SelSecond) {
bSelEnter=TRUE;
}
}
// ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖÀ¸¸é x°»½Å
DrawSegment(hdc,x,y,nowoff,len,
(nowoff+len==pLine[Line].End && !bSelEnter),fore,back);
nowoff+=len;
// ¼±ÅÃµÈ °³Çà ÄÚµå Ãâ·Â
if (nowoff == pLine[Line].End) {
if (bSelEnter) {
if (pFrame->SelBlockType==0) {
SetRect(&lrt,x,y,x+arChWidth[' '],y+FontHeight);
} else {
SetRect(&lrt,x,0,x+arChWidth[' '],LineHeight);
}
if (GetFocus()==hWnd || pFrame->HideSelType==2 || bFindSelect) {
hCurLine=CreateSolidBrush(pFrame->cSelBack);
} else {
hCurLine=CreateSolidBrush(RGB(192,192,192));
}
FillRect(hdc,&lrt,hCurLine);
DeleteObject(hCurLine);
}
break;
}
}
DrawLineSub(hdc,Line,bCurLine);
return 1;
}
ÁÙ³¡¿¡ ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖ´ÂÁö bSelEnter º¯¼ö¿¡ ¸ÕÀú Á¶»çÇÑ´Ù. ´Ü bShowEnter ¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ¸¸é DisplayEnter ÇÔ¼ö¿¡¼ Á¦¾îÄڵ带 ±×¸± ¶§ ¼±Åà ºí·ÏÀ» ±×¸®¹Ç·Î ¿©±â¼ º°µµÀÇ Ã³¸®¸¦ ÇÒ Çʿ䰡 ¾ø´Ù. ÇöÀç ÁÙ ³¡ÀÌ°í ¿©±â°¡ °³Çà ÄÚµåÀÌ°í ¶Ç ¼±Åà ºí·Ï¾È¿¡ ÀÖ¾î¾ß °³Çà Äڵ尡 ¼±ÅÃµÈ °ÍÀÌ´Ù.
´Ü, ¿¸ðµåÀÏ ¶§´Â °³Çà Äڵ尡 ¼±ÅõÇÁö ¾Ê´Â´Ù. GetSelInLine ÇÔ¼ö°¡ SelFirst¿Í SelSecond¸¦ Á¶ÀÛÇϴµ¥ À̶§ °³Çà Äڵ尡 ¼±Åà ¹üÀ§¿¡ Æ÷ÇÔµÇÁö ¾ÊÀº °ÍÀ¸·Î °è»êµÇ±â ¶§¹®ÀÌ´Ù. ¿¸ðµå¿¡¼´Â °³Çà ÄÚµå ¼±Åà ºí·ÏÀÌ Å« Àǹ̰¡ ¾øÀ¸¹Ç·Î È¥¶õ½º·´Áö ¾ÊÀ» °ÍÀÌ´Ù. ¸¸¾à ¿ ¸ðµå¿¡¼µµ °³Çà Äڵ带 ¼±ÅÃÇÏ·Á¸é ±×·¸°Ô ÇÒ ¼öµµ ÀÖÀ¸³ª ÀÌ·¸°Ô µÇ¸é ¹Ù·Î ´ÙÀ½¿¡ ÀÛ¼ºÇÒ ºí·Ï ÇÁ·¹ÀÓ¿¡¼ ´õ Å« ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.
DrawSegment¸¦ È£ÃâÇÒ ¶§ ÁÙ ³¡ÀÌ´õ¶óµµ ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖÀ¸¸é xÁÂÇ¥¸¦ °»½ÅÇØ¾ß ¸¶Áö¸· ¹®ÀÚ¿ ´ÙÀ½¿¡ °³Çà ÄÚµå ºí·ÏÀÌ Á¦´ë·Î ±×·ÁÁø´Ù. ¸¶Áö¸· ÁÙ ³¡À» Ãâ·ÂÇÒ ¶§ °³Çà ÄÚµå ÀÚ¸®¿¡ ¼±Åÿµ¿ª »ö»óÀ¸·Î »ç°¢ ¹Ú½º¸¦ Çϳª ±×¸®¸é µÈ´Ù. °³Çà ÄÚµåÀÇ ÆøÀº °ø¹é°ú °°°í ³ôÀÌ´Â SelBlockType¿¡ µû¶ó ´Þ¶óÁö¸ç »ö»óÀº ¼±Åà ¿µ¿ª »ö»ó ¹× Æ÷Ä¿½º ¿©ºÎ µî ¿©·¯ °¡Áö Á¶°Ç¿¡ µû¶ó ´Þ¶óÁø´Ù. °³Çà ÄÚµå º¸±â ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é DisplayEnter¿¡¼ ¹è°æ»öÀ» Á÷Á¢ ±×¸° ÈÄ °³Çà Äڵ带 Ãâ·ÂÇÑ´Ù.
void CApiEditText::DisplayEnter(HDC hdc, int x, int y,COLORREF back)
{
HPEN hPen,OldPen;
HBRUSH OldBrush;
RECT rt,brt;
int width;
HBRUSH Brush;
....
SetRect(&rt,x,y,x+width,y+FontHeight);
if (back!=pFrame->cBack) {
if (pFrame->SelBlockType==0) {
brt=rt;
} else {
SetRect(&brt,x,0,x+width,LineHeight);
}
Brush=CreateSolidBrush(back);
FillRect(hdc,&brt,Brush);
DeleteObject(Brush);
}
if (ShowEnterType <= 1) {
....
¹è°æ»öÀÌ ÇöÀç ¹è°æ»ö°ú ´Ù¸£´Ù¸é, Áï ¼±ÅõǾî ÀÖ´Ù¸é brt¿¡ ¹è°æ ¿µ¿ªÀ» °è»êÇÏ°í ¼±Åà »ö»óÀ¸·Î »ç°¢ÇüÀ» ¸ÕÀú ±×¸®¸é µÈ´Ù. ÀÌ·¸°Ô µÇ¸é °³Çà ÄÚµå Ç¥½Ã´Â ¸¶Áö¸· Ãâ·ÂµÈ Á¶°¢ÀÇ ¹è°æ»öÀ» µû¶ó°£´Ù. °³Çà ÄÚµå ÀÚü°¡ ¼±ÅõǾî ÀÖÁö ¾Ê´õ¶óµµ ¹Ù·Î ¾ÕÀÇ Á¶°¢ÀÌ ¼±ÅõǾî ÀÖÀ¸¸é °³Çà Äڵ嵵 ¼±ÅÃµÈ °Íó·³ Ãâ·ÂµÈ´Ù. °³Çà ÄÚµå ÀÚü°¡ ÁÙÀÇ ¹üÀ§¿¡¼ Á¦¿ÜµÇ¾î Àֱ⠶§¹®¿¡ DrawLine¿¡¼ ¼¼±×¸ÕÆ®¿¡ Æ÷ÇÔµÇÁö ¾ÊÀ¸¸ç DrawSegment¿¡¼ ¸¶Áö¸· Á¶°¢ Ãâ·Â ÈÄ ´ýÀ¸·Î Ãâ·ÂÇÏ´Â °ÍÀ̱⠶§¹®ÀÌ´Ù. ±×·¡¼ °³Çà ÄÚµå Ç¥½Ã°¡ ¼±Åÿµ¿ª ³»ºÎ¿¡ ÀÖ´ÂÁö ¾Æ´ÑÁö´Â º°µµ·Î Á¶»çÇØ¾ß ÇÑ´Ù. ÀÌ ºÎ´ãÀº DrawSegment¿¡¼ Áö±â·Î ÇÑ´Ù. DisplayEnter¿¡¼ ÇÒ ¼öµµ ÀÖÁö¸¸ ±×·¸°Ô ÇÏ·Á¸é °³Çà ÄÚµåÀÇ ¿ÀÇÁ¼ÂÀ» Àμö·Î Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù´Â »õ·Î¿î ºÎ´ã¿¡ »ý±ä´Ù.
void CApiEditText::DrawSegment(HDC hdc, int &x, int y, int SegOff, int len, BOOL ignoreX,
COLORREF fore, COLORREF back)
{
....
if (bShowEnter) {
if (pFrame->IsEnterCode(SegOff+len)) {
if (SegOff+len >= min(SelStart,SelEnd) && SegOff+len < max(SelStart,SelEnd)) {
DisplayEnter(hdc,x,y,back);
} else {
DisplayEnter(hdc,x,y,pFrame->cBack);
}
}
}
}
SgmOff+len, Áï °³Çà ÄÚµåÀÇ ÀÚ¸®°¡ ¼±Åÿµ¿ª¿¡ ¼ÓÇØ ÀÖÀ¸¸é Á¶°¢ÀÇ ¹è°æ»öÀ¸·Î Ãâ·ÂÇÏ°í ±×·¸Áö ¾Ê´Ù¸é cBack Áï, ±âº» ¹è°æ»öÀ¸·Î Ãâ·ÂÇÑ´Ù. óÀ½ºÎÅÍ °í·ÁµÇÁö ¾Ê¾Ò´ø ±â´ÉÀ̶ó È¿À²ÀûÀÌÁö ¸øÇÏ¸ç ´Ù¼Ò ²Ç¼ö°¡ ¼¯¿´´Ù. ÀÌÁ¦ ½ÇÇàÇØ º¸¸é ²÷¾îÁø ¹®´Üµµ ¿¬¼ÓÀûÀ¸·Î ºí·Ï ¼±ÅÃµÉ °ÍÀÌ´Ù.
SelBlockTypeÀÇ ¼¼¹øÂ° ŸÀÔÀÎ 2¹øÀº ¼±Åà ºí·Ï¿¡ ¿Ü°û¼±À» ±×¸®´Â °ÍÀÌ´Ù. ¿Ü°û¼±ÀÇ »ö»óÀº SelFrameColor·Î ÁöÁ¤ÇÑ´Ù. 2¹ø ŸÀÔÀº 1¹ø ŸÀÔ°ú ¸¶Âù°¡Áö·Î ºí·Ï »çÀÌ¿¡ Æ´À» ÁÖÁö ¾Ê´Â´Ù. ¾Õ¿¡¼ ÀÌ ¿É¼ÇÀ» Á¡°ËÇÒ ¶§ if (SelBlockType==0) { } else { } ·Î Äڵ带 ÀÛ¼ºÇßÀ¸¹Ç·Î 2¹ø ŸÀÔ°ú 1¹ø ŸÀÔÀÇ ºí·Ï ¸ð¾çÀÌ µ¿ÀÏÇÏ°Ô ±×·ÁÁø´Ù. 2¹ø ŸÀÔÀº ¿©±â¿¡ ¿Ü°û¼±¸¸ Ãß°¡·Î ±×¸®¸é µÈ´Ù.
ºí·Ï ÇÁ·¹ÀÓÀº ºÒ±ÔÄ¢ÇÑ ¸ð¾çÀÇ ´Ù°¢ÇüÀ̱⠶§¹®¿¡ DrawLine¿¡¼ ó¸®ÇϱⰡ ¹«Ã´ ¾î·Æ´Ù. ÀÌÀü, ´ÙÀ½ÁÙÀÇ ¼±Åà »óűîÁö °í·ÁÇÏ¿© ¼±Åà ¿µ¿ªÀÇ °¡Àå ¿Ü°û¼±¸¸ ±×·Á¾ß Çϴµ¥ DrawLineÀº ÇÑ ÁÙÀÇ Ãâ·Â¸¸ Àü´ãÇϵµ·Ï µðÀÚÀεǾú°Ô ¶§¹®¿¡ ÇöÀç ±¸Á¶·Î´Â ÀÌ·± ¿¬»êÀ» ÇÒ ¼ö°¡ ¾ø´Ù. ±×·¡¼ ¸ðµç Ãâ·ÂÀ» ´Ù ÇÑ ÈÄ º°µµÀÇ ÇÔ¼ö°¡ ºí·Ï ÇÁ·¹ÀÓÀ» µû·Î ±×¸®±â·Î ÇÑ´Ù.
void CApiEditText::DrawSelFrame(HDC hdc)
{
HRGN hRgn;
int x1,y,x2;
int SelFirst, SelSecond;
HBRUSH hBrush;
int rs,re,i;
int ss,se;
RECT rt;
HRGN rgn;
BOOL OldbLineEnd;
int BkExtraX;
BkExtraX=ExtraX;
ExtraX=0;
ignoreVirt++;
OldbLineEnd=bLineEnd;
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
bLineEnd=FALSE;
GetRCFromOff(SelFirst,rs,i);
bLineEnd=TRUE;
GetRCFromOff(SelSecond,re,i);
hRgn=CreateRectRgn(0,0,0,0);
for (i=rs;i<=re;i++) {
if (bColumnMode) {
GetSelInLine(i,ss,se);
} else {
if (i==rs) {
ss=SelFirst;
} else {
ss=pLine[i].Start;
}
if (i==re) {
se=SelSecond;
} else {
se=pLine[i].End;
}
}
bLineEnd=FALSE;
GetXYFromOff(ss,x1,y);
bLineEnd=TRUE;
GetXYFromOff(se,x2,y);
if (!bColumnMode && pFrame->IsEnterCode(se) && se >= SelFirst && se < SelSecond) {
if (bShowEnter) {
switch (ShowEnterType) {
case 0:
x2+=arChWidth[' ']*2;
break;
case 1:
x2+=arChWidth[' ']*3;
break;
case 2:
x2+=arChWidth[' ']*3;
break;
}
} else {
x2+=arChWidth[' '];
}
}
x1-=xPos;
y-=yPos;
x2-=xPos;
SetRect(&rt,x1,y,x2,y+LineHeight);
if (PtInRect(&frt,*(POINT *)&rt) || PtInRect(&frt,*(POINT *)&rt.right)) {
rgn=CreateRectRgnIndirect(&rt);
CombineRgn(hRgn,hRgn,rgn,RGN_OR);
DeleteObject(rgn);
}
}
hBrush=CreateSolidBrush(pFrame->SelFrameColor);
FrameRgn(hdc,hRgn,hBrush,2,2);
DeleteObject(hBrush);
DeleteObject(hRgn);
bLineEnd=OldbLineEnd;
ignoreVirt--;
ExtraX=BkExtraX;
}
ÆÄ»ý ºä¿¡¼µµ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã °¡»ó ÇÔ¼ö¿©¾ß ÇÑ´Ù. °¢ÁÙ¿¡ ´ëÇØ ¼±Åà ½ÃÀÛÁ¡°ú ³¡Á¡ÀÇ ÁÂÇ¥¸¦ ±¸ÇØ »ç°¢ ¿µ¿ªÀ» ¸¸µé°í ¸ðµç ÁÙÀÇ »ç°¢ ¿µ¿ªÀ» ÇÕÃÄ ¸®ÀüÀ¸·Î ¸¸µç´Ù. ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ÁÂÇ¥¸¦ ±¸ÇÒ ¶§´Â bLineEndÀÇ ¿µÇâÀ» ¹Þ±â ¶§¹®¿¡ ÀÌ º¯¼ö¸¦ ÀûÀýÇÏ°Ô Á¶ÀÛÇØ¾ß ÇÑ´Ù. ÇÕÃÄÁø ¸®ÀüÀ» ¸¸µç ÈÄ FrameRgn ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸®Àü¿¡ ¿Ü°û¼±À» ±×¸°´Ù. ±½±â¿Í ÆøÀº 2·Î °íÁ¤Çߴµ¥ À̰͵µ ¼³Á¤ ¿É¼ÇÀ¸·Î ¸¸µé ¼ö ÀÖ´Ù.
¿¸ðµåÀÏ ¶§´Â GetSelInLine ÇÔ¼ö·Î ÁÙ ³»ÀÇ ¼±Åà ¿ÀÇÁ¼ÂÀ» ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ´Ü, ÀÌ °æ¿ì °³Çà ÄÚµå´Â ¼±Åà ¹üÀ§¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. ½ºÅ©·Ñ µî¿¡ ÀÇÇØ º¸ÀÌÁö ¾Ê´Â ¼±Åà ¿µ¿ª¿¡ ´ëÇØ¼´Â ¸®ÀüÀ» ¸¸µé Çʿ䰡 ¾ø´Ù. frt¿¡ ÀüÇô Æ÷ÇÔµÇÁö ¾Ê´Â ÁÙÀº ¼³»ç ¼±ÅõǾî ÀÖ´õ¶óµµ ¸®ÀüÀ» ¸¸µéÁö ¾Ê´Â´Ù. GetXYFromOff ÇÔ¼ö´Â °³Çà Äڵ带 °í·ÁÇÏÁö ¾ÊÀ¸¹Ç·Î ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖÀ¸¸é Á÷Á¢ ÁÂÇ¥¿¡ Æ÷ÇÔ½ÃŲ´Ù. OnPaintÀÇ ³¡¿¡¼ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
void CApiEditText::OnPaint(HWND hWnd)
{
....
if (SelStart!=SelEnd && pFrame->SelBlockType==2) {
DrawSelFrame(hdc);
}
EndPaint(hWnd,&ps);
}
¼±Åà ¿µ¿ªÀÌ ÀÖ°í ºí·Ï ÇÁ·¹ÀÓÀ» ±×¸®´Â ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é DrawSelFrameÀ» È£ÃâÇÑ´Ù. ¼±Åà ºí·Ï ÇÁ·¹ÀÓÀº ÁÙ ´ÜÀ§·Î Ãâ·ÂµÇÁö ¾ÊÀ¸¹Ç·Î ¹«È¿ ¿µ¿ª °ü¸® ¹æ¹ýÀÌ Á¶±Ý ´Ù¸£´Ù.
void CApiEditText::ExpandSelection(int Start, int End)
{
....
if (bColumnMode || pFrame->SelBlockType==2) {
Invalidate(min(SelStart,SelEnd),max(SelStart,SelEnd));
}
}
¿¸ðµå¿Í ¸¶Âù°¡Áö·Î Á¶±ÝÀÌ¶óµµ ¼±Åà ¿µ¿ªÀÌ ¹Ù²î¸é ¼±Åà ¿µ¿ª Àüü¸¦ ¹«È¿ÈÇØ¾ß ÇÑ´Ù. ¸¶¿ì½º·Î ¼±ÅÃÇÒ ¶§µµ ¸¶Âù°¡Áö´Ù.
void CApiEditText::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)
{
....
Invalidate(min(OldOff,off),max(OldOff,off));
if (bColumnMode || pFrame->SelBlockType==2) {
Invalidate(min(SelStart,SelEnd),max(SelStart,SelEnd));
}
Çí»ç ºä¿¡¼ ºí·Ï ÇÁ·¹ÀÓÀº »ó´çÈ÷ ´Ù¸£°Ô ±¸ÇöµÈ´Ù. bLineEnd¶ó´Â °³³äÀÌ ¾ø°í pLine ¹è¿µµ »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç ¿ ¸ðµåµµ ¾ø´Ù. µû¶ó¼ ¾Æ¿¹ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏ´Â °ÍÀÌ ÁÁ´Ù. ±â¹Ý Ŭ·¡½º¿¡¼ °¡»óÀ¸·Î ¼±¾ðÇßÀ¸¹Ç·Î ÀçÁ¤ÀÇÇØµµ °¡»ó ÇÔ¼öÀÌ´Ù.
void CApiEditHexa::DrawSelFrame(HDC hdc)
{
HRGN hRgn;
int x1,y,x2;
int SelFirst, SelSecond;
HBRUSH hBrush;
int rs,re,i;
int ss,se;
RECT rt;
HRGN rgn;
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
GetRCFromOff(SelFirst,rs,i);
GetRCFromOff(SelSecond,re,i);
hRgn=CreateRectRgn(0,0,0,0);
for (i=rs;i<=re;i++) {
if (i==rs) {
ss=SelFirst;
} else {
ss=i*bpl;
}
if (i==re) {
se=SelSecond;
} else {
se=i*bpl+bpl-1;
}
GetXYFromOff(ss,x1,y);
GetXYFromOff(se,x2,y);
if (se != SelSecond) {
x2+=bGap;
}
x1-=xPos;
y-=yPos;
x2-=xPos;
SetRect(&rt,x1,y,x2,y+LineHeight);
if (PtInRect(&frt,*(POINT *)&rt) || PtInRect(&frt,*(POINT *)&rt.right)) {
rgn=CreateRectRgnIndirect(&rt);
CombineRgn(hRgn,hRgn,rgn,RGN_OR);
DeleteObject(rgn);
}
}
hBrush=CreateSolidBrush(pFrame->SelFrameColor);
FrameRgn(hdc,hRgn,hBrush,2,2);
DeleteObject(hBrush);
DeleteObject(hRgn);
}
ºñ½ÁÇÏÁö¸¸ Á¶±Ý ´Ù¸£´Ù. ¸¶¿ì½º ¼±Åýÿ¡ ¼±Åÿµ¿ª Àüü¸¦ ¹«È¿ÈÇÑ´Ù.
void CApiEditHexa::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)
{
....
Invalidate(min(OldOff,off),max(OldOff,off));
if (pFrame->SelBlockType==2) {
Invalidate(min(SelStart,SelEnd),max(SelStart,SelEnd));
}
....
¼³Á¤ Á¶Á¤ ±â´ÉÀÌ ¾ÆÁ÷ ÀÛ¼ºµÇÁö ¾Ê¾ÒÀ¸¹Ç·Î »ý¼ºÀÚ¿¡¼ SelBlockTypeÀ» Á÷Á¢ 2·Î ¹Ù²ã ³õ°í Å×½ºÆ®ÇØ º¸ÀÚ. ¼±Åà ºí·ÏÀÇ »ö»óÀ» ¹àÀº »öÀ¸·Î º¯°æÇϰí ÇÁ·¹ÀÓÀÇ »ö»óÀ» Á¶±Ý ¾îµÎ¿î »öÀ¸·Î ¼³Á¤ÇÑ ÈÄ ¼±ÅÃÇØ º¸¸é Á¶±Ý ƯÀÌÇØ º¸ÀÏ °ÍÀÌ´Ù.
ºí·Ï ¿Ü°û¼±Àº ´õºí ¹öÆÛ¸µµÇÁö ¾Ê°í µû·Î ±×¸®±â ¶§¹®¿¡ ±ô¹Ú°Å¸²ÀÌ ½ÉÇÏ´Ù. Űº¸µå·Î À̵¿ÇÒ ¶§´Â ±×³ª¸¶ ºÁÁÙ¸¸ ÇÏÁö¸¸ ¸¶¿ì½º·Î À̵¿ÇÒ ¶§´Â ¹«Ã´ ½ÉÇÏ°Ô ±ô¹Ú°Å¸°´Ù. ´õºí ¹öÆÛ¸µÀº ÁÙ ´ÜÀ§·Î ÇÏÁö¸¸ ¼±Åà ÇÁ·¹ÀÓÀº Àüü¸¦ ÇѲ¨¹ø¿¡ ±×¸®±â ¶§¹®¿¡ ÇöÀç ±¸Á¶·Î¼´Â ÀÌ ±ô¹Ú°Å¸²À» ÇØ°áÇÒ ¹æ¹ýÀÌ ¾ø´Ù. Å×½ºÆ®°¡ ³¡³ ÈÄ ´Ù½Ã µðÆúÆ®ÀÎ 1·Î ¹Ù²ã ³õµµ·Ï ÇÏÀÚ.