ÀÌ ±â´ÉÀº Æ÷¸ËÆà ¿µ¿ª ¹è°æ¿¡ ºñÆ®¸ÊÀ» Ãâ·ÂÇÏ´Â ±â´ÉÀÌ´Ù. ÅؽºÆ® ÆíÁý±â¿¡´Â ´Ù¼Ò »çÄ¡½º·¯¿ö º¸ÀÌ´Â ±â´ÉÀε¥ ¾ÖÀÎÀ̳ª ¾Æ±â, ÁÁ¾ÆÇÏ´Â ¿¬¿¹ÀÎÀ̳ª dz°æÈ µîÀ» ±ò¾Æ ³õ°í ÀÌ ±×¸²À» ´Ã»ó º¸¸é¼ ÀÛ¾÷ÇÒ ¼ö ÀÖ´Ù. ¿î¿µÃ¼Á¦ÀÇ ¹è°æ º®Áö ±â´É°úµµ ºñ½ÁÇѵ¥ ¹è°æ º®Áö´Â ¹Ø¹Ù´Ú¿¡ ±ò·Á¸¸ ÀÖÁö¸¸ ´ç±ÙÀÇ ¹è°æ ºñÆ®¸ÊÀº ±ÛÀÚÀÇ È¹»çÀÌ·Î º¸Àδٴ Á¡ÀÌ ´Ù¸£´Ù.
¹è°æ¿¡ ºñÆ®¸ÊÀ» ±ò¾Æ ³õ´Â´Ù°í Çؼ ±â´ÉÀÌ Å©°Ô °³¼±µÇ´Â °Íµµ ¾Æ´Ï°í ¿ÀÈ÷·Á ó¸® ¼Óµµ¸¸ ´À·ÁÁö¹Ç·Î ºÒÇÊ¿äÇÑ ±â´ÉÀÎ °Íó·³ º¸À̳ª ÀÀ¿ëÇϱ⿡ µû¶ó¼´Â ¾ÆÁÖ ¼¼·ÃµÈ È¿°ú¸¦ º¼ ¼ö ÀÖ´Ù. ¹è°æ»ö¸¸À¸·Î ¿øÇÏ´Â ºÐÀ§±â¸¦ ¸¸µé±â ¾î·Á¿îµ¥ ÀÌ·² ¶§ ÅؽºÃ³ ºñÆ®¸ÊÀ» ÁöÁ¤ÇØ ³õÀ¸¸é ¹è°æÀÌ ¾ÆÁÖ ºÎµå·¯¿öÁö°í ´«µµ Æí¾ÈÇØÁø´Ù. À¥ ÆäÀÌÁö¸¦ ºñÆ®¸ÊÀ¸·Î ŸÀÏÇϵíÀÌ ±ò¾Æ ³õ´Â ºñÆ®¸Ê¿¡ µû¶ó ÆíÁý±âÀÇ ºÐÀ§±â°¡ ¿ÏÀüÈ÷ ´Þ¶óÁú ¼öµµ ÀÖ´Ù.
»ó¾÷ÀûÀ¸·Îµµ Àǹ̰¡ Àִµ¥ ȸ»çÀÇ ·Î°í¸¦ ¿À¸¥ÂÊ ¾Æ·¡ Á¤µµ¿¡ »ì¦Äô ±ò¾Æ ³õÀ¸¸é ´«¿¡ °Å½½¸®Áöµµ ¾Ê°í ±¤°íµµ ÇÒ ¼ö ÀÖ¾î¼ ¾ÆÁÖ ÁÁ´Ù. ´ÙÀ½Àº "È¥ÀÚ ¿¬±¸ÇÏ´Â C/C++"À̶ó´Â Ã¥ÀÇ ¿¹Á¦ ½©¿¡ »ç¿ëµÈ ApiEdit ÄÁÆ®·ÑÀÇ ¸ð½ÀÀÌ´Ù. ¾Æ·¡ ¿À¸¥ÂÊ¿¡ Çпø ŸÀÌƲ ºñÆ®¸ÊÀÌ È帴ÇÏ°Ô Ç¥½ÃµÇ¾î Àִµ¥ ±¤°í È¿°úµµ ÀÖ°í ¿îÄ¡µµ ÀÖ´Ù. ±×¸®°í ¹«¾ùº¸´Ù Ç¥ÁØ ¿¡µðÆ® ÄÁÆ®·ÑÀÌ ¾Æ´Ï¶ó´Â Á¡À» È®½ÇÇÏ°Ô º¸¿©ÁÙ ¼öµµ ÀÖ¾î Á¤¼ºÀÌ µé¾î°£ °Íó·³ º¸À̱⵵ ÇÑ´Ù.
±â´É ±¸ÇöÀ» À§ÇÑ º¯¼ö¸¦ ¸ÕÀú ¼±¾ðÇÑ´Ù.
enum { AEBB_LEFTTOP, AEBB_RIGHTTOP, AEBB_LEFTBOTTOM, AEBB_RIGHTBOTTOM,
AEBB_CENTER, AEBB_TILE, AEBB_TILESCROLL };
class CApiEdit : public CWindow
{
private:
....
HBITMAP hBackBit;
int BackBitPos;
public:
....
HBITMAP GetBackBit() { return hBackBit; }
void SetBackBit(HBITMAP hBit);
int GetBackBitPos() { return BackBitPos; }
void SetBackBitPos(int aValue);
};
hBackBit´Â ¹è°æ ºñÆ®¸ÊÀÇ ÇÚµéÀ̸ç BackBitPos´Â ºñÆ®¸ÊÀ» ¹èÄ¡ÇÒ ¹æ¹ýÀ» ÁöÁ¤ÇÏ´Â ¿É¼Ç º¯¼öÀÌ´Ù. »ý¼ºÀÚ¿¡¼ ÀÌ º¯¼öµéÀ» ÃʱâÈÇÏ°í ¾×¼¼½º ÇÔ¼öµµ ÀÛ¼ºÇÑ´Ù.
CApiEdit::CApiEdit()
{
....
hBackBit=NULL;
BackBitPos=0;
}
void CApiEdit::SetBackBit(HBITMAP hBit)
{
hBackBit=hBit;
ForAllView(Invalidate(-1))
}
void CApiEdit::SetBackBitPos(int aValue)
{
BackBitPos=aValue;
ForAllView(Invalidate(-1))
}
ÄÁÆ®·ÑÀº ¿ÜºÎ ÆÄÀÏÀ» Á÷Á¢ ´Ù·ê ¼ö°¡ ¾ø´Ù. ±×·¡¼ È£½ºÆ®°¡ ºñÆ®¸ÊÀÇ ÇÚµéÀ» ³Ñ°ÜÁÖ¸é ÀÌ ÇÚµé·Î ºñÆ®¸ÊÀ» Ãâ·ÂÇØ¾ß ÇÑ´Ù. CApiEdit´Â ºñÆ®¸ÊÀÇ ÆÄÀÏ °æ·Î¸¦ °¡Áö´Â °ÍÀÌ ¾Æ´Ï¶ó ºñÆ®¸ÊÀÇ Çڵ鸸À» °¡Áø´Ù. È£½ºÆ®´Â ÆÄÀÏÀ» ¿µçÁö ¾Æ´Ï¸é ÀÚ½ÅÀÌ ¸®¼Ò½º·Î º¸À¯ÇÑ ºñÆ®¸ÊÀ» ³Ñ±âµçÁö ¾î¶² ¹æ¹ýÀ¸·Îµç ºñÆ®¸ÊÀ» ÄÁÆ®·Ñ¿¡ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ¿ÜºÎ ÆÄÀÏÀº DIB·Î µÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ÆÄÀÏÀ» »ç¿ëÇÏ·Á¸é DDB·Î ÀüȯÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â È£½ºÆ®°¡ »ç¿ëÇϹǷΠUtil.cpp¿¡ ÀÛ¼ºÇÑ´Ù.
HBITMAP MakeDDBFromDIB(TCHAR *Path)
{
HDC hdc;
HANDLE hFile;
DWORD FileSize, dwRead;
BITMAPFILEHEADER *fh;
HBITMAP hBit;
PVOID ih;
TCHAR AbsPath[MAX_PATH];
lstrcpy(AbsPath,Path);
MakeAbsolutePath(AbsPath);
hFile=CreateFile(AbsPath,GENERIC_READ,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE) {
return NULL;
}
FileSize=GetFileSize(hFile,NULL);
fh=(BITMAPFILEHEADER *)malloc(FileSize);
ReadFile(hFile,fh,FileSize,&dwRead,NULL);
CloseHandle(hFile);
ih=((PBYTE)fh+sizeof(BITMAPFILEHEADER));
hdc=GetDC(NULL);
hBit=CreateDIBitmap(hdc,(BITMAPINFOHEADER *)ih,CBM_INIT,
(PBYTE)fh+fh->bfOffBits,(BITMAPINFO *)ih,DIB_RGB_COLORS);
ReleaseDC(NULL,hdc);
free(fh);
return hBit;
}
BOOL MakeRelativePath(TCHAR *Path)
{
TCHAR ExePath[MAX_PATH];
TCHAR Drive[_MAX_DRIVE];
TCHAR Dir[_MAX_DIR];
GetModuleFileName(g_hInst,ExePath,MAX_PATH);
_splitpath(ExePath,Drive,Dir,NULL,NULL);
if (strnicmp(ExePath,Path,lstrlen(Drive)+lstrlen(Dir))==0) {
lstrcpy(ExePath,Path);
lstrcpy(Path,ExePath+lstrlen(Drive)+lstrlen(Dir));
return TRUE;
} else {
return FALSE;
}
}
void MakeAbsolutePath(TCHAR *Path)
{
TCHAR ExePath[MAX_PATH];
TCHAR Drive[_MAX_DRIVE];
TCHAR Dir[_MAX_DIR];
if (strchr(Path,':')==NULL) {
GetModuleFileName(g_hInst,ExePath,MAX_PATH);
_splitpath(ExePath,Drive,Dir,NULL,NULL);
lstrcpy(ExePath,Path);
wsprintf(Path,"%s%s%s",Drive,Dir,ExePath);
}
}
Àμö·Î Àü´ÞµÈ DIBÆÄÀÏÀ» Àоî DDB·Î º¯È¯ÇÏ¿© ÇÚµéÀ» ¸®ÅÏÇϴµ¥ ÀÌ ÇÔ¼ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ »çÇ×Àº API Á¤º¹ Á¦ 2ÆÇ 29ÀåÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù. »ó´ë°æ·Î·Î Àü´ÞµÈ ºñÆ®¸Ê ÆÄÀϵµ ÀÐÀ» ¼ö ÀÖ´Ù.
È£½ºÆ®¿¡ ¾ÆÁ÷ UI°¡ ¸¸µé¾îÁ® ÀÖÁö ¾ÊÀ¸¹Ç·Î ÀÓ½ÃÀûÀ¸·Î ApiEdit°¡ Á÷Á¢ ¹è°æ ºñÆ®¸ÊÀ» Àоî¿Àµµ·Ï ÇÏÀÚ. Å×½ºÆ®¸¦ À§ÇÑ Àӽà ÄÚµåÀ̹ǷΠ»èÁ¦ ÄÚµå´Â ÀÛ¼ºÇÏÁö ¾Ê¾Ò´Ù.
BOOL CApiEdit::OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
hBackBit=MakeDDBFromDIB("c:\\BackBit.bmp");
....
·çÆ® µð·ºÅ丮¿¡ BackBit.bmp¶ó´Â ÆÄÀÏÀ» Çϳª ¸¸µé¾î µÎ¸é ÀÌ ÆÄÀÏÀ» Àоî¿Í Æ÷¸ËÆà ¿µ¿ª¿¡ Ãâ·ÂÇÒ °ÍÀÌ´Ù. ±×·¸´Ù¸é ºñÆ®¸ÊÀ» Ãâ·ÂÇÏ´Â ÁÖü´Â °ú¿¬ ´©±¸Àϱî? ºñÆ®¸ÊÀº Å« ±×¸²À̹ǷΠOnPaint¿¡¼ Ãâ·ÂÇØ ³õ°í ±× À§¿¡ DrawLine µîÀÇ Á¹º´ ÇÔ¼öµéÀÌ ÅؽºÆ®¸¦ Ãâ·ÂÇÏ´Â ¹æ½ÄÀ» ¸ÕÀú ¶°¿Ã¸± ¼ö Àִµ¥ ÀÌ ¹æ¹ýÀº ºÒ°¡´É¤·ÇÏ´Ù. ¿Ö³ÄÇϸé ApiEdit´Â ÁÙ ´ÜÀ§·Î ´õºí ¹öÆÛ¸µÀ» ÇϹǷΠOnPaint¿¡¼ ¾Æ¹«¸® ¿¹»Û ±×¸²À» ±×·Á ºÁ¾ß DrawLineÀÌ ¹è°æÀ» µ¤¾î ¹ö¸®±â ¶§¹®ÀÌ´Ù.
±×·¡¼ DrawLineÀÌ °¢ ÁÙÀ» Ãâ·ÂÇÒ ¶§ ÀÌ ÁÙ¿¡ ´ëÀÀµÇ´Â ºñÆ®¸Ê À§Ä¡¸¦ ã¾Æ Á¶°¢ Á¶°¢ ³ª´©¾î Ãâ·ÂÇØ¾ß ÇÑ´Ù. Á¶±Ý ¹ø°Å·Ó±â´Â ÇÏÁö¸¸ ²À ÇÊ¿äÇÑ ºÎºÐ¸¸ Ãâ·ÂÇϹǷΠºñÆ®¸Ê Àüü¸¦ ÇѲ¨¹ø¿¡ Ãâ·ÂÇÏ´Â °Íº¸´Ù ¼Óµµ´Â ¿ÀÈ÷·Á ÀÌÂÊÀÌ ´õ ºü¸£´Ù. Ãâ·ÂÇÒ ºñÆ®¸Ê ºÎºÐÀ» ã´Â ¿¬»ê °úÁ¤ÀÌ »ó´çÈ÷ º¹ÀâÇϹǷΠDrawLineÀÌ ÀÌ ÀÛ¾÷À» Á÷Á¢ ÇÏ´Â °Íº¸´Ù´Â º°µµÀÇ Àü´ã ÇÔ¼ö¸¦ ¸¸µå´Â °ÍÀÌ ÁÁÀ» °Í °°´Ù.
void CApiEditText::DrawBackBit(HDC hdc,int nLine)
{
int sLine;
HDC hMemDC;
HBITMAP OldBitmap;
BITMAP bit;
int bx,by,ys,xs;
int ax,ay,bs;
hMemDC=CreateCompatibleDC(hdc);
OldBitmap=(HBITMAP)SelectObject(hMemDC,pFrame->hBackBit);
GetObject(pFrame->hBackBit,sizeof(BITMAP),&bit);
bx=bit.bmWidth;
by=bit.bmHeight;
// 6¹ø¿Ü¿¡´Â ȸé»óÀÇ ÁÙ ¼ö¸¦ ±âÁØÀ¸·Î ÇÑ´Ù.
if (pFrame->BackBitPos==AEBB_TILESCROLL) {
sLine=nLine;
} else {
sLine=nLine-yPos/LineHeight;
}
switch (pFrame->BackBitPos) {
case AEBB_LEFTTOP:
if (sLine*LineHeight < by) {
BitBlt(hdc,frt.left,0,frt.right,LineHeight,hMemDC,0,
sLine*LineHeight,SRCCOPY);
}
break;
case AEBB_RIGHTTOP:
if (sLine*LineHeight < by) {
BitBlt(hdc,max(frt.right-bx,frt.left),0,frt.right,LineHeight,hMemDC,0,
sLine*LineHeight,SRCCOPY);
}
break;
case AEBB_LEFTBOTTOM:
// ºñÆ®¸Ê Ãâ·Â ½ÃÀÛ À§Ä¡ = Æ÷¸ËÆà ¿µ¿ª ³ôÀÌ - ºñÆ®¸Ê ³ôÀÌ
ys=max(0,(frt.bottom-frt.top)-by);
// ÇöÀçÁÙÀÇ ½ÃÀÛ ÁÂÇ¥°¡ ºñÆ®¸Ê Ãâ·Â ½ÃÀÛ ÁÂÇ¥ ÀÌ»óÀ̸é. ´ëÀÀµÇ´Â ºñÆ®¸Ê ºÎºÐ Ãâ·Â
if (sLine*LineHeight >= ys) {
BitBlt(hdc,frt.left,0,frt.right,LineHeight,hMemDC,0,
sLine*LineHeight-ys,SRCCOPY);
// ³¡ ÁÂÇ¥°¡ ºñÆ®¸Ê Ãâ·Â ÁÂÇ¥ ÀÌ»óÀ̸é(ºñÆ®¸ÊÀÌ Ãâ·ÂµÇ´Â ùÁÙ¿¡¸¸ ÇØ´çµÈ´Ù)
} else if (sLine*LineHeight+LineHeight-1 >= ys) {
BitBlt(hdc,frt.left,ys % LineHeight,frt.right,LineHeight,hMemDC,0,
0,SRCCOPY);
}
break;
case AEBB_RIGHTBOTTOM:
ys=max(0,(frt.bottom-frt.top)-by);
if (sLine*LineHeight >= ys) {
BitBlt(hdc,max(frt.right-bx,frt.left),0,frt.right,LineHeight,hMemDC,0,
sLine*LineHeight-ys,SRCCOPY);
} else if (sLine*LineHeight+LineHeight-1 >= ys) {
BitBlt(hdc,max(frt.right-bx,frt.left),ys % LineHeight,frt.right,LineHeight,hMemDC,0,
0,SRCCOPY);
}
break;
case AEBB_CENTER:
ys=max(0,(frt.bottom-frt.top)-by)/2;
xs=max(0,(frt.right-frt.left)-bx)/2;
if (sLine*LineHeight >= ys) {
BitBlt(hdc,xs,0,frt.right,LineHeight,hMemDC,0,
sLine*LineHeight-ys,SRCCOPY);
} else if (sLine*LineHeight+LineHeight-1 >= ys) {
BitBlt(hdc,xs,ys % LineHeight,frt.right,LineHeight,hMemDC,0,
0,SRCCOPY);
}
break;
case AEBB_TILE:
case AEBB_TILESCROLL:
// by-bs : ½ÇÁ¦ Ãâ·ÂµÈ ³ôÀÌ. ºñÆ®¸Ê Ãâ·Â ½ÃÀÛÁ¡ ÀÌÈÄÀÇ ³²Àº Çȼ¿¼ö.
for (ay=0;ay < LineHeight;ay+=(by-bs)) {
// Ãâ·ÂÀ» ½ÃÀÛÇÒ ºñÆ®¸ÊÀÇ ¼öÁ÷ ÁÂÇ¥
if (ay==0) {
bs=sLine*LineHeight % by;
} else {
bs=0;
}
// ¼öÆòÀ¸·Î ¹Ýº¹ Ãâ·Â
for (ax=frt.left;;ax+=bx) {
if (ax >= frt.right) {
break;
}
BitBlt(hdc,ax,ay,ax+bx,LineHeight,hMemDC,0,
bs,SRCCOPY);
}
}
break;
}
SelectObject(hMemDC,OldBitmap);
DeleteDC(hMemDC);
}
ÀÌ ÇÔ¼ö´Â ±æÀ̵µ ªÁö ¾ÊÁö¸¸ ³»ºÎ ÄÚµå´Â ±æÀ̺¸´Ù ÈξÀ ´õ º¹ÀâÇÏ´Ù. ¸ÕÀú ¸Þ¸ð¸® DC¿¡ ºñÆ®¸ÊÀ» ÀÐ¾î ³õ°í ºñÆ®¸ÊÀÇ Å©±â¸¦ ¹Ì¸® ±¸ÇØ ³õ´Â´Ù. sLineÀº ȸé»óÀÇ ÁÙ ¹øÈ£ÀÌµÇ AEBB_TILESCROLLÀÇ °æ¿ì´Â ¹®¼»óÀÇ ÁÙ ¹øÈ£°¡ µÇ¾î¾ß ÇÑ´Ù. °¢ À¯Çüº°·Î ºÐ¼®ÇØ º¸ÀÚ.
À§ÂÊ¿¡ Ãâ·ÂÇÏ´Â µÎ °æ¿ì´Â ¾ÆÁÖ ½±´Ù. ¸ÕÀú AEBB_LEFTTOPÀ» ºÐ¼®ÇØ º¸ÀÚ. Ãâ·ÂÇÒ Á¶°ÇÀº ÇöÀç Ãâ·ÂµÇ´Â ÁÙÀÇ ½ÃÀÛ ÁÂÇ¥ÀÎ sLine*LineHeight°¡ ºñÆ®¸Ê ³ôÀÌÀÎ byº¸´Ù ´õ ÀÛÀ» ¶§ÀÌ´Ù. °°Àº °æ¿ì´Â Ãâ·ÂÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ´ÙÀ½ ±×¸²À» º¸ÀÚ.
0,1,2,3¹ø ÁÙÀÇ Ãâ·Â ½ÃÀÛ ÁÂÇ¥´Â byº¸´Ù ÀÛÀ¸¹Ç·Î ÀÌ ÁÙ¿¡ ºñÆ®¸ÊÀ» Ãâ·ÂÇØ¾ß Çϳª 4¹øÁÙÀº ºñÆ®¸ÊÀÇ ³ôÀ̺¸´Ù ´õ ¾Æ·¡ÂÊÀ̹ǷΠÃâ·ÂÇÒ ÇÊ¿ä°¡ ¾ø´Ù. Ãâ·ÂµÉ ÁÂÇ¥´Â (frt.left,0) ~ (frt.right,LineHeight)±îÁöÀε¥ ÀÌ ÇÔ¼ö°¡ Àü´Þ¹ÞÀº hdc´Â ³ôÀÌ°¡ LineHeight¹Û¿¡ ¾ÈµÇ´Â ¸Þ¸ð¸® ºñÆ®¸ÊÀ̹ǷΠ¹«Á¶°Ç ¼öÁ÷ ÁÂÇ¥ 0¿¡¼ LineHeight±îÁö Ãâ·ÂÇÏ¸é µÈ´Ù. ¿ÞÂÊ Á¤·ÄÀ̹ǷΠ¼öÆòÀ¸·Î frt.left¿¡¼ Ãâ·ÂÀ» ½ÃÀÛÇÏ°í frt.right±îÁö Ãâ·ÂÇÑ´Ù. ¸¸¾à ºñÆ®¸ÊÀÇ Æø bx°¡ Æ÷¸ËÆà ¿µ¿ªÀÇ Æøº¸´Ù ªÀ¸¸é µÞºÎºÐÀº ¾Ë¾Æ¼ Ãâ·ÂµÇÁö ¾Ê´Â´Ù.
ºñÆ®¸ÊÀÇ Ãâ·Â ´ë»óÀº (0,sLine*LineHeight)ÀÌ´Ù. ¼öÆò ÁÂÇ¥´Â Ç×»ó 0ºÎÅÍÀÌ°í ¼öÁ÷ ÁÂÇ¥´Â ÇöÀç Ãâ·ÂµÇ´Â ÁÙÀÇ ½ÃÀÛ ÁÂÇ¥¿Í µ¿ÀÏÇÏ´Ù. AEBB_RIGHTTOPÀÇ °æ¿ìµµ ºñ½ÁÇÏ´Ù. Ãâ·ÂµÉ ÁÂÇ¥°¡ frt.right-bx¶ó´Â Á¡¸¸ ´Ù¸£´Ù. ¿À¸¥ÂÊ Á¤·ÄÀ̹ǷΠÆ÷¸ËÆà ¿µ¿ªÀÇ ¿À¸¥ÂÊ ³¡¿¡¼ ºñÆ®¸ÊÀÇ Æø¸¸Å »« ÁÂÇ¥¿¡ Ãâ·ÂÇÏ¸é µÈ´Ù. ´Ü, ºñÆ®¸ÊÀÇ Æøº¸´Ù Æ÷¸ËÆà ¿µ¿ª ÆøÀÌ ÀÛÀ» ¶§´Â frt.left¿¡ Ãâ·ÂÇÑ´Ù.
¾Æ·¡ÂÊ¿¡ Ãâ·ÂÇÏ´Â °ÍÀº À§Âʺ¸´Ù Á¶±Ý º¹ÀâÇÏ´Ù. ´ÙÀ½ ±×¸²À» º¸ÀÚ.
ys´Â ºñÆ®¸ÊÀÌ Ãâ·ÂµÇ±â ½ÃÀÛÇÒ ¼öÁ÷ ÁÂÇ¥ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ªÀÇ ³ôÀÌ¿¡¼ ºñÆ®¸Ê ³ôÀÌ by¸¦ »©¸é ±¸ÇÒ ¼ö ÀÖµÇ, ´Ü Æ÷¸ËÆà ¿µ¿ªÀÌ ´õ ³·À» ¶§´Â óÀ½ºÎÅÍ Ãâ·ÂÇØ¾ß ÇϹǷΠ0ÀÇ °ªÀ» °¡Áø´Ù. ÀÌ ±×¸²¿¡¼ 2¹ø ÁÙÀ» º¸ÀÚ. 2¹ø ÁÙÀÇ Ãâ·Â ½ÃÀÛ ÁÂÇ¥ÀÎ sLine*LineHeight°¡ ysº¸´Ù ´õ ¾Æ·¡ÂÊ¿¡ ÀÖÀ¸¹Ç·Î ÀÌ ÁÙ¿¡´Â ºñÆ®¸ÊÀ» Ãâ·ÂÇØ¾ß ÇÑ´Ù. Ãâ·ÂÇÒ ´ë»óÀº 2¹øÁÙÀÇ ½ÃÀÛ ÁÂÇ¥¿¡¼ ys¸¦ »«¸¸Å ¾Æ·¡ÂÊ ºñÆ®¸Ê ºÎºÐÀÌ´Ù. 3,4¹øÁÙµµ ¸¶Âù°¡Áö·Î 󸮵ȴÙ.
±×¸²ÀÇ ÀϺθ¸ °ÉÃÄ ÀÖ´Â 1¹øÁÙÀÇ °æ¿ì¸¦ º¸ÀÚ. Ãâ·Â ½ÃÀÛ ÁÂÇ¥ÀÌ ysº¸´Ù´Â ´õ À§ÂÊ¿¡ ÀÖÀ¸¹Ç·Î ù ¹ø° Á¶°Ç¿¡´Â °É¸®Áö ¾Ê´Â´Ù. ÇÏÁö¸¸ Ãâ·Â ³¡ ÁÂÇ¥´Â ysº¸´Ù ´õ ¾Æ·¡ÂÊ¿¡ ÀÖÀ¸¹Ç·Î ºñÆ®¸ÊÀÇ ÀϺΰ¡ ÀÌ ÁÙ¿¡ Ãâ·ÂµÇ¾î¾ß ÇÑ´Ù. Ãâ·ÂÀ» ½ÃÀÛÇÒ À§Ä¡´Â ys¸¦ LineHeight·Î ³ª´« ³ª¸ÓÁöÀ̹ǷΠÃâ·Â ´ë»óÀº ºñÆ®¸ÊÀÇ Ã³À½ÀÎ 0ÀÌ´Ù. ¿À¸¥ÂÊ ¾Æ·¡ Ãâ·Âµµ °ÅÀÇ ºñ½ÁÇÏ´Ù.
ºñÆ®¸ÊÀÌ Ãâ·ÂµÉ ÁÂÇ¥ xs, ys¸¦ ¸ÕÀú ±¸ÇØ ³õ°í ÀÌ ¿µ¿ª¿¡ °ÉÄ£ ÁÙ¿¡ ºñÆ®¸ÊÀ» Ãâ·ÂÇÏ¸é µÈ´Ù. ¹æ½ÄÀº ¾Æ·¡ÂÊ Ãâ·Â°ú °ÅÀÇ ºñ½ÁÇϸç ÁÂÇ¥¸¦ °è»êÇÏ´Â ¼ö½Ä¸¸ ´Ù¸£´Ù.
°°Àº ºñÆ®¸ÊÀ» ¿©·¯¹ø ¹Ýº¹ÀûÀ¸·Î Ãâ·ÂÇÑ´Ù. µû¶ó¼ xÂÊ, yÂÊÀ¸·Î °¢°¢ ·çÇÁ¸¦ µ¹¸é¼ ¿ÏÀüÈ÷ Ãâ·ÂµÉ ¶§±îÁö ¹Ýº¹ÇÑ´Ù.
·çÇÁ Á¦¾î º¯¼ö ax, ay´Â °¢ ¹æÇâÀ¸·Î Ãâ·ÂÀÌ ¿Ï·áµÈ ÁÂÇ¥°ªÀ» °¡Áø´Ù. ay´Â 0ºÎÅÍ ½ÃÀÛÇÏ°í ax´Â frt.leftºÎÅÍ ½ÃÀÛÇÑ´Ù. ¾ÈÂÊ ·çÇÁ¸¦ ¸ÕÀú º¸ÀÚ. ax¿¡ ºñÆ®¸Ê ÆøÀÎ bx¸¦ °è¼Ó ´õÇØ°¡¸é¼ frt.right¿¡ µµ´ÞÇÒ ¶§±îÁö Ãâ·ÂÀ» ¹Ýº¹ÇÑ´Ù. ¾ÆÁÖ ½±´Ù.
¹Ù±ùÂÊ ·çÇÁ´Â Á¶±Ý ¾î·Æ´Ù. ay´Â 0ºÎÅÍ ½ÃÀÛÇؼ LineHeight¸¦ ³ÑÀ» ¶§±îÁö ¹Ýº¹µÈ´Ù. bs´Â ºñÆ®¸ÊÀÇ Ãâ·Â ´ë»ó ¼öÁ÷ ÁÂÇ¥Àε¥ ay°¡ 0À̸é, Áï ÀÌ ÁÙ¿¡ ´ëÇØ Ã³À½ Ãâ·ÂÇÏ´Â °æ¿ì¶ó¸é ÇöÀç ÁÙÀÇ ¼öÁ÷ ÁÂÇ¥¸¦ by·Î ³ª´« ³ª¸ÓÁö°¡ µÈ´Ù.ay°¡ 0ÀÌ ¾Æ´Ï¶ó¸é Áï, ºñÆ®¸ÊÀÇ ³¡ ºÎºÐÀÌ ÀÌ ÁÙ¿¡¼ Çѹø Ãâ·ÂµÇ°íµµ ¾ÆÁ÷ ay°¡ LineHeight°¡ µÇÁö ¾Ê¾Æ ·çÇÁ¸¦ µ¹¾Æ¿Â °æ¿ìÀÌ´Ù. ±×¸²ÀÇ 3¹øÁÙÀÌ ÀÌ °æ¿ì¿¡ ÇØ´çµÈ´Ù. ÀÌ °æ¿ì ºñÆ®¸ÊÀº À§ÂʺÎÅÍ ´Ù½Ã ¹Ýº¹ Ãâ·ÂµÇ¾î¾ß ÇϹǷΠbs´Â 0ÀÌ µÈ´Ù.
ay·çÇÁ¸¦ ¸Å¹ø µ¹ ¶§¸¶´Ù ay´Â by-bs¸¸Å Áõ°¡Çϴµ¥ ÀÌ °ªÀº ºñÆ®¸ÊÀ» Ãâ·ÂÇÑ ÁÂÇ¥ ÀÌÈÄÀÇ ³²Àº Çȼ¿ ¼öÀÌ´Ù. 3¹øÁÙ°°ÀÌ ºñÆ®¸ÊÀÇ ³¡ ºÎºÐÀ» Ãâ·ÂÇÑ °æ¿ì ÀÌ °ªÀº ½ÇÁ¦ Ãâ·ÂµÈ ³ôÀÌ°ªÀÌ µÈ´Ù. ay´Â ÀÌ ¸¸Å ´õÇØÁö°í ´ÙÀ½ ·çÇÁ¸¦ µ¹¾Æ ºñÆ®¸ÊÀÇ 0¹ø Çȼ¿ºÎÅÍ ´Ù½Ã Ãâ·ÂÇÑ´Ù. AEBB_TILESCROLLÀº AEBB_TILE°ú µ¿ÀÏÇ쵂 ÂüÁ¶µÇ´Â ÁÙ ¹øÈ£°¡ ȸé»óÀÇ ÁÙ ¹øÈ£°¡ ¾Æ´Ï¶ó ¹®¼»óÀÇ ÁÙ¹øÈ£¶ó´Â Á¡¸¸ ´Ù¸£´Ù.
ÀÌ ÇÔ¼öÀÇ Äڵ带 º¸°í ¼ö½ÄÀÌ ÀÌÇØÇϱâ´Â »ç½Ç ½±Áö ¾ÊÀºµ¥ ÀÌ·± ÇÔ¼ö´Â ºÐ¼®ÇÏ´Â °Íº¸´Ù Á÷Á¢ ¸¸µå´Â °ÍÀÌ ¿ÀÈ÷·Á ´õ ½±´Ù. ÀÌ ÇÔ¼ö´Â DrawLine¿¡¼ ÅؽºÆ®¸¦ Ãâ·ÂÇϱâ Àü¿¡ È£ÃâÇÑ´Ù. Çí»çºäµµ ¹°·Ð ÀÌ ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.
int CApiEditText::DrawLine(HDC hdc, int Line)
{
....
// ¹è°æ ºñÆ®¸Ê Ãâ·Â
if (pFrame->hBackBit) {
DrawBackBit(hdc,Line);
}
y=GetCharYPos();
if (bCurLine && (pFrame->nShowCurLine == 3 || pFrame->nShowCurLine == 4)) {
....
int CApiEditHexa::DrawLine(HDC hdc, int Line)
{
....
// ¹è°æ ºñÆ®¸Ê Ãâ·Â
if (pFrame->hBackBit) {
DrawBackBit(hdc,Line);
}
y=GetCharYPos();
if (bCurLine && (pFrame->nShowCurLine == 3 || pFrame->nShowCurLine == 4)) {
....
ºñÆ®¸Êº¸´Ù ÇöÀçÇà Ç¥½Ã°¡ ´õ À§¿¡ ÀÖ¾î¾ß ÇϹǷΠÇöÀçÇà Ç¥½Ã¸¦ Ãâ·ÂÇϱâ Àü¿¡ ºñÆ®¸ÊÀ» ¸ÕÀú Ãâ·ÂÇÑ´Ù. ¾î·µç ºñÆ®¸ÊÀº ¹è°æ¿¡ ±ò¸®´Â °ÍÀ̹ǷΠÅؽºÆ®»Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ ¸ðµç °Íº¸´Ù ¸ÕÀú Ãâ·ÂµÇ¾î¾ß ÇÑ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇØ º¸ÀÚ. ¹è°æ ºñÆ®¸ÊÀÌ Àß º¸ÀδÙ. ±×·¯³ª ³¡±îÁö ½ºÅ©·ÑÇßÀ» ¶§ ¹®¼ µÚÂÊ¿¡ ºñÆ®¸ÊÀÌ º¸ÀÌÁö ¾ÊÀ¸¸ç ºñÆ®¸Ê±îÁö °°ÀÌ ½ºÅ©·ÑµÈ´Ù´Â ¹®Á¦Á¡ÀÌ ÀÖ´Ù. ù¹ø° ¹®Á¦´Â DrawLineÀÌ ¹®¼¿¡ Á¸ÀçÇÏ´Â ÁÙ¸¸ Ãâ·ÂÇϱ⠶§¹®¿¡ ¹ß»ýÇϴµ¥ ³ª¸ÓÁö ¿µ¿ªÀº OnPaint¿¡¼ Á÷Á¢ ±×·Á¾ß ÇÑ´Ù.
void CApiEditText::OnPaint(HWND hWnd)
{
int l,l2;
int s,e,t,e2;
....
e2=e=max((yPos+PureY(ps.rcPaint.bottom)-1)/LineHeight,t);
....
if (MarginWidth != 0) {
....
}
// ¹®¼ µÞºÎºÐÀÇ ¹è°æ ºñÆ®¸ÊÀ» ±×¸°´Ù.
if (pFrame->hBackBit) {
SetRect(&lrt,MarginWidth,0,frt.right,LineHeight);
for (l2=l;l2<=e2;l2++) {
FillRect(hMemDC,&lrt,hBrush);
DrawBackBit(hMemDC,l2);
BitBlt(hdc,frt.left,(l2-t)*LineHeight+frt.top,frt.right,
(l2-t)*LineHeight+LineHeight+frt.top,hMemDC,frt.left,0,SRCCOPY);
}
} else {
SetRect(&lrt,frt.left,(l-t)*LineHeight+frt.top,frt.right,frt.bottom);
FillRect(hdc,&lrt,hBrush);
}
// ¹®¼ µÞºÎºÐÀÇ ¿ÞÂÊ ¿©¹é ±×¸². ´õºí ¹öÆÛ¸µµÇÁö ¾ÊÀ¸¹Ç·Î Á÷Á¢ ±×·Á¾ß ÇÑ´Ù.
if (pFrame->InnerRect.left) {
....
¹è°æ ºñÆ®¸ÊÀÌ ÀÖÀ¸¸é ±×³É Áö¿ìÁö ¸»°í ºñÆ®¸ÊÀ» Ãâ·ÂÇÑ´Ù. µÎ¹ø° ¹®Á¦´Â ScrollWindow°¡ ¹üÀÎÀÌ´Ù. ºñÆ®¸Ê±îÁö °°ÀÌ ½ºÅ©·ÑµÇ´Âµ¥ ºñÆ®¸ÊÀº ¹è°æÀÌÁö ¹®¼ÀÇ ÀϺΰ¡ ¾Æ´Ï¹Ç·Î ½ºÅ©·ÑµÇ¾î¼´Â ¾ÈµÈ´Ù. ¾ÈŸ±õ°Ôµµ ¹è°æ ºñÆ®¸ÊÀÌ ÀÖÀ» ¶§´Â ½ºÅ©·Ñ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç ȸé Àüü¸¦ ´Ù½Ã ±×¸®´Â ¼ö¹Û¿¡ ¾ø´Ù.
void CApiEditText::OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)
{
....
if (pFrame->hBackBit && pFrame->BackBitPos!=AEBB_TILESCROLL) {
Invalidate(-1);
} else {
ScrollWindow(hWnd, -xInc, 0, &frt, &frt);
}
void CApiEditText::OnVScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)
{
....
if (pFrame->hBackBit && pFrame->BackBitPos!=AEBB_TILESCROLL) {
Invalidate(-1);
} else {
ScrollWindow(hWnd, 0, -yInc, &srt,&srt);
}
void CApiEditText::Scroll(int nLine, int nCode/*=0*/)
{
....
if (pFrame->hBackBit && pFrame->BackBitPos!=AEBB_TILESCROLL) {
Invalidate(-1);
} else {
ScrollWindow(hWnd, 0, -yInc, &srt, &srt);
}
OnMouseWheelµµ ¼öÁ¤ÇØ¾ß Çϴµ¥ ¹Ù·Î ´ÙÀ½ Àý¿¡¼ ´Ù½Ã ÀÛ¼ºÇÒ °ÍÀ̱⠶§¹®¿¡ ÀÏ´ÜÀº ±×´ë·Î ³»¹ö·Á µÎ¾ú´Ù. ¹è°æ ºñÆ®¸ÊÀÌ ÀÖ°í ½ºÅ©·ÑµÇ´Â ŸÀÏÀÌ ¾Æ´Ñ °æ¿ì´Â ¹«Á¶°Ç Àüü ȸéÀ» ´Ù½Ã ±×¸®´Â ¼ö¹Û¿¡ ¾ø´Ù. ±×·¡¼ ÀÌ·± Àå½Ä ±â´ÉÀÌ ¼Óµµ¸¦ ´À¸®°Ô ¸¸µé°í ¸®¼Ò½º¸¦ ¸¹ÀÌ ¸Ô´Â °ÍÀÌ´Ù. »ç¶÷À̳ª ±â°è³ª ¿¹»Ú´Ù´Â °ÍÀÇ ´ñ°¡´Â ÂüÀ¸·Î Å©´Ù. ¹è°æ ºñÆ®¸Ê ±â´ÉÀ» Á÷Á¢ »ç¿ëÇØ º¸¸é ±×·° Àú·° ¾µ¸¸ÇÏ°í ¿äÁòÀÇ °í¼º´É ÄÄÇ»ÅÍ È¯°æ¿¡¼´Â ¼Óµµµµ »ý°¢¸¸Å ´À¸®Áö ¾Ê´Ù.
±×·¯³ª ¾ÆÁ÷ ¸î °¡Áö ¾Æ½¬¿î Á¡ÀÌ ÀÖ´Ù. ¹è°æÀ¸·Î ¾µ¸¸ÇÑ ºñÆ®¸ÊµéÀÌ ³Ê¹« ¾îµÎ¿ö ±ÛÀÚµéÀÌ Àß ¾Èº¸À̴µ¥ °¨¸¶ Á¶Á¤ ±â´ÉÀÌ ÀÖ´Ù¸é ÁÁÀ» °Í °°´Ù. ¶ÇÇÑ BMP°¡ ¾Æ´Ñ JPGµµ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù¸é È°¿ëµµ°¡ ÈξÀ ´õ ³ô¾ÆÁú °ÍÀÌ´Ù. Çö½ÇÀûÀ¸·Î JPG ÆÄÀÏÀÌ °¡Àå ÀϹÝÀûÀε¥ À©µµ¿ìÁî API°¡ JPG¸¦ Á÷Á¢ ´Ù·ê ¼ö ¾ø±â ¶§¹®¿¡ JPG Æ÷¸ËÀÇ ¹è°æ ºñÆ®¸ÊÀº ¾ÆÁ÷ ¾µ ¼ö ¾ø´Ù. °£´ÜÇÑ ¶óÀ̺귯¸®³ª GdiPlus Á¤µµ¸¸ »ç¿ëÇصµ JPG ÆÄÀÏÀ» ¾µ ¼ö ÀÖÁö¸¸ ¿¹Á¦ ¼öÁØ¿¡¼´Â ´Ù¼Ò »çÄ¡½º·¯¿ö ÀÌ ±â´ÉÀ» ³ÖÁö ¾Ê¾Ò´Ù. ÀÌ µÎ °¡Áö ±â´ÉÀº ´ÙÀ½ ¹öÀü¿¡¼ ±¸ÇöÇØ º¼ »ý°¢ÀÌ´Ù. Å×½ºÆ®°¡ ³¡³µÀ¸¹Ç·Î OnCreate¿¡ ÀÛ¼ºÇß´ø ¹è°æ ºñÆ®¸Ê »ý¼º ÄÚµå´Â »èÁ¦ÇÑ´Ù. ÀÌÈĺÎÅÍ È£½ºÆ®°¡ ÁÙ ¶§¸¸ ¹è°æ ºñÆ®¸ÊÀ» »ç¿ëÇÑ´Ù.
ÀÌ Àå¿¡¼´Â ¾ÈÂÊ ¿©¹é, ¼±Åà ºí·ÏÀÇ ¸ð¾ç, ¹è°æ ºñÆ®¸Ê µîÀÇ ±â´ÉÀ» Ãß°¡Çߴµ¥ »ç¿ëÀÚ°¡ ´ëÈ»óÀÚ¿¡¼ ÀÌ ¿É¼ÇµéÀ» º¸°í ÆíÁýÇÒ ¼ö ÀÖµµ·Ï ÇØ º¸ÀÚ. ¿É¼Ç Ãß°¡ ÀÛ¾÷À» ÀÌ¹Ì ¿©·¯ ¹ø ¹Ýº¹µÇ´Â °ÍÀ̹ǷΠ¼ø¼´ë·Î Äڵ常 ÀÛ¼ºÇÏ¸é µÈ´Ù. ¸ÕÀú SOption¿¡ ¸â¹ö¸¦ Ãß°¡ÇÑ´Ù.
struct SOption
{
....
RECT InnerRect;
COLORREF InnerRectColor;
BOOL bShowRuler;
COLORREF RulerColor;
int VAlign;
int SelBlockType;
COLORREF SelFrameColor;
TCHAR BackBit[MAX_PATH];
int BackBitPos;
};
¹è°æ ºñÆ®¸ÊÀº ÇÚµéÀÌ ¾Æ´Ñ °æ·Î¸¦ ÀúÀåÇÑ´Ù. ApiEdit´Â ºñÆ®¸Ê ÇÚµéÀ» ¿ä±¸ÇÏÁö¸¸ È£½ºÆ®´Â ¸Å ½ÇÇà½Ã¸¶´Ù ºñÆ®¸Ê ÆÄÀÏÀ» Àоî ÄÁÆ®·Ñ¿¡°Ô Àü´ÞÇØ¾ß ÇϹǷΠ°æ·Î¸¦ ÀúÀåÇØ¾ß ÇÑ´Ù. ÀÌ º¯¼öµéÀº ´ÙÀ½°ú °°ÀÌ ÃʱâÈÇÑ´Ù. °¡±ÞÀû ¹«³ÇÑ °ªÀ¸·Î ÃʱⰪÀ» ¼³Á¤Çß´Ù. ÀÌ ¿É¼ÇµéÀº »ç¿ëÀÚ¿¡ ÀÇÇØ ¿øÇϴ´ë·Î ÆíÁýµÇ¸ç ·¹Áö½ºÆ®¸®¿¡ ÀúÀåµÇ¾ú´Ù°¡ ´ÙÀ½ ½ÇÇàÇÒ ¶§ º¹±¸µÈ´Ù.
void SOption::Init()
{
...
SetRect(&InnerRect,1,2,0,0);
InnerRectColor=0;
bShowRuler=FALSE;
RulerColor=0;
VAlign=1;
SelBlockType=1;
SelFrameColor=0;
BackBit[0]=0;
BackBitPos=0;
}
void SOption::Load(TCHAR *Key)
{
....
InnerRect.left=SHRegReadInt(SHCU,szKey,"InnerRectLeft",0);
InnerRect.top=SHRegReadInt(SHCU,szKey,"InnerRectTop",0);
InnerRect.right=SHRegReadInt(SHCU,szKey,"InnerRectRight",0);
InnerRect.bottom=SHRegReadInt(SHCU,szKey,"InnerRectBottom",0);
InnerRectColor=SHRegReadInt(SHCU,szKey,"InnerRectColor",0);
bShowRuler=SHRegReadInt(SHCU,szKey,"bShowRuler",0);
RulerColor=SHRegReadInt(SHCU,szKey,"RulerColor",0);
VAlign=SHRegReadInt(SHCU,szKey,"VAlign",0);
SelBlockType=SHRegReadInt(SHCU,szKey,"SelBlockType",0);
SelFrameColor=SHRegReadInt(SHCU,szKey,"SelFrameColor",0);
SHRegReadString(SHCU,szKey,"BackBit","",BackBit,MAX_PATH);
BackBitPos=SHRegReadInt(SHCU,szKey,"BackBitPos",0);
void SOption::Save(TCHAR *Key)
{
....
SHRegWriteInt(SHCU,szKey,"InnerRectLeft",InnerRect.left);
SHRegWriteInt(SHCU,szKey,"InnerRectTop",InnerRect.top);
SHRegWriteInt(SHCU,szKey,"InnerRectRight",InnerRect.right);
SHRegWriteInt(SHCU,szKey,"InnerRectBottom",InnerRect.bottom);
SHRegWriteInt(SHCU,szKey,"InnerRectColor",InnerRectColor);
SHRegWriteInt(SHCU,szKey,"bShowRuler",bShowRuler);
SHRegWriteInt(SHCU,szKey,"RulerColor",RulerColor);
SHRegWriteInt(SHCU,szKey,"VAlign",VAlign);
SHRegWriteInt(SHCU,szKey,"SelBlockType",SelBlockType);
SHRegWriteInt(SHCU,szKey,"SelFrameColor",SelFrameColor);
SHRegWriteString(SHCU,szKey,"BackBit",BackBit);
SHRegWriteInt(SHCU,szKey,"BackBitPos",BackBitPos);
ÀÌÁ¦ »ç¿ëÀÚ°¡ ÀÌ ¿É¼Ç°ªÀ» º¸°í ÆíÁýÇÒ ¼ö ÀÖµµ·Ï ´ëÈ»óÀÚ¿¡ ¼³Á¤ »óŸ¦ Ãâ·ÂÇÏ°í º¯°æµÈ °ªÀ» °ü¸®ÇÑ´Ù. ¿É¼ÇµéÀº °¢ ÆäÀÌÁö¿¡ Èð¾îÁ® ¹èÄ¡µÇ´Âµ¥ ÀÌ ÀåÀÇ ½Ç½ÀÀÌ ÄÁÆ®·ÑÀÇ ¸ð¾ç¿¡ °ü·ÃµÈ °ÍµéÀ̹ǷΠ¿É¼Çµéµµ ´ëºÎºÐ ¸ð¾ç ÆäÀÌÁö¿¡ ¹èÄ¡µÈ´Ù.
BOOL CALLBACK ShapeDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HWND hCon;
int t1,t2,t3,t4;
OPENFILENAME OFN;
TCHAR lpstrFile[MAX_PATH]="";
TCHAR Sample[128];
switch(iMessage) {
case WM_INITDIALOG:
hCon=GetDlgItem(hDlg,IDC_CBBACKBITPOS);
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¿ÞÂÊ À§");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¿À¸¥ÂÊ À§");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¿ÞÂÊ ¾Æ·¡");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¿À¸¥ÂÊ ¾Æ·¡");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"Áß¾Ó");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¹Ýº¹");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¹Ýº¹ ½ºÅ©·Ñ");
hCon=GetDlgItem(hDlg,IDC_CBSELBLOCKTYPE);
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¹®ÀÚ ³ôÀÌ");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"ÁÙ°£ ³ôÀÌ");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¿Ü°û¼±");
hCon=GetDlgItem(hDlg,IDC_CBVALIGN);
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"À§ÂÊ");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"°¡¿îµ¥");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¾Æ·¡ÂÊ");
SendDlgItemMessage(hDlg,IDC_FRTLEFTSPIN,UDM_SETRANGE,0,MAKELPARAM(32,0));
SendDlgItemMessage(hDlg,IDC_FRTTOPSPIN,UDM_SETRANGE,0,MAKELPARAM(32,0));
SendDlgItemMessage(hDlg,IDC_FRTRIGHTSPIN,UDM_SETRANGE,0,MAKELPARAM(32,0));
SendDlgItemMessage(hDlg,IDC_FRTBOTTOMSPIN,UDM_SETRANGE,0,MAKELPARAM(32,0));
hCon=GetDlgItem(hDlg,IDC_CBSAMPLEBITMAP);
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"±¹È");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"Äá");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"¾Æ°¡");
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_MARGIN:
AdjustDlgUI(2,hDlg);
case IDC_LINENUM:
case IDC_SHOWENTER:
case IDC_SHOWTAB:
case IDC_SHOWSPACE:
case IDC_SHOWRULER:
PropSheet_Changed(GetParent(hDlg),hDlg);
return TRUE;
case IDC_CBBACKBITPOS:
case IDC_CBSELBLOCKTYPE:
case IDC_CBVALIGN:
switch (HIWORD(wParam)) {
case CBN_SELCHANGE:
case CBN_EDITCHANGE:
PropSheet_Changed(GetParent(hDlg),hDlg);
return TRUE;
}
break;
case IDC_FRTLEFT:
case IDC_FRTTOP:
case IDC_FRTRIGHT:
case IDC_FRTBOTTOM:
switch (HIWORD(wParam)) {
case EN_CHANGE:
if (bEditByCode==FALSE) {
PropSheet_Changed(GetParent(hDlg),hDlg);
return TRUE;
}
break;
}
break;
case IDC_BTNBRBACKBIT:
memset(&OFN, 0, sizeof(OPENFILENAME));
OFN.lStructSize = sizeof(OPENFILENAME);
OFN.hwndOwner=hDlg;
OFN.lpstrFilter="±×¸² ÆÄÀÏ(*.bmp)\0*.bmp\0";
OFN.lpstrFile=lpstrFile;
OFN.nMaxFile=MAX_PATH;
if (GetOpenFileName(&OFN)) {
MakeRelativePath(lpstrFile);
SetDlgItemText(hDlg,IDC_EDBACKBIT,lpstrFile);
PropSheet_Changed(GetParent(hDlg),hDlg);
}
return TRUE;
case IDC_CBSAMPLEBITMAP:
switch (HIWORD(wParam)) {
case CBN_SELCHANGE:
t1=SendDlgItemMessage(hDlg,IDC_CBSAMPLEBITMAP,CB_GETCURSEL,0,0);
SendDlgItemMessage(hDlg,IDC_CBSAMPLEBITMAP,CB_GETLBTEXT,t1,(LPARAM)Sample);
wsprintf(lpstrFile,"»ùÇÃ:%s",Sample);
SetDlgItemText(hDlg,IDC_EDBACKBIT,lpstrFile);
PropSheet_Changed(GetParent(hDlg),hDlg);
break;
}
return TRUE;
case IDC_BTNREMOVEBACKBIT:
SetDlgItemText(hDlg,IDC_EDBACKBIT,"");
PropSheet_Changed(GetParent(hDlg),hDlg);
return TRUE;
}
break;
case WM_NOTIFY:
LPNMHDR hdr;
hdr=(LPNMHDR)lParam;
switch (hdr->code) {
case PSN_SETACTIVE:
g_StartPage=2;
bEditByCode=TRUE;
CheckDlgButton(hDlg,IDC_MARGIN,NewOption.bShowMargin);
CheckDlgButton(hDlg,IDC_LINENUM,NewOption.bShowLineNum);
CheckDlgButton(hDlg,IDC_SHOWENTER,NewOption.bShowEnter);
CheckDlgButton(hDlg,IDC_SHOWTAB,NewOption.bShowTab);
CheckDlgButton(hDlg,IDC_SHOWSPACE,NewOption.bShowSpace);
CheckDlgButton(hDlg,IDC_SHOWRULER,NewOption.bShowRuler);
SetDlgItemInt(hDlg,IDC_FRTLEFT,NewOption.InnerRect.left,FALSE);
SetDlgItemInt(hDlg,IDC_FRTTOP,NewOption.InnerRect.top,FALSE);
SetDlgItemInt(hDlg,IDC_FRTRIGHT,NewOption.InnerRect.right,FALSE);
SetDlgItemInt(hDlg,IDC_FRTBOTTOM,NewOption.InnerRect.bottom,FALSE);
SetDlgItemText(hDlg,IDC_EDBACKBIT,NewOption.BackBit);
SendDlgItemMessage(hDlg,IDC_CBBACKBITPOS,CB_SETCURSEL,NewOption.BackBitPos,0);
SendDlgItemMessage(hDlg,IDC_CBSELBLOCKTYPE,CB_SETCURSEL,NewOption.SelBlockType,0);
SendDlgItemMessage(hDlg,IDC_CBVALIGN,CB_SETCURSEL,NewOption.VAlign,0);
bEditByCode=FALSE;
AdjustDlgUI(2,hDlg);
return TRUE;
case PSN_APPLY:
ApplyNow();
return TRUE;
case PSN_KILLACTIVE:
t1=GetDlgItemInt(hDlg,IDC_FRTLEFT,NULL,FALSE);
t2=GetDlgItemInt(hDlg,IDC_FRTTOP,NULL,FALSE);
t3=GetDlgItemInt(hDlg,IDC_FRTRIGHT,NULL,FALSE);
t4=GetDlgItemInt(hDlg,IDC_FRTBOTTOM,NULL,FALSE);
if (t1<0 || t1>32 || t2<0 || t2>32 || t3<0 || t3>32 || t4<0 || t4>32) {
MessageBox(hDlg,"¾ÈÂÊ ¿©¹éÀº 0~32»çÀÌ¿©¾ß ÇÕ´Ï´Ù.","¾Ë¸²",MB_OK);
SetWindowLong(hDlg,DWL_MSGRESULT,TRUE);
return TRUE;
}
NewOption.InnerRect.left=t1;
NewOption.InnerRect.top=t2;
NewOption.InnerRect.right=t3;
NewOption.InnerRect.bottom=t4;
NewOption.bShowMargin=IsDlgButtonChecked(hDlg,IDC_MARGIN);
NewOption.bShowLineNum=IsDlgButtonChecked(hDlg,IDC_LINENUM);
NewOption.bShowEnter=IsDlgButtonChecked(hDlg,IDC_SHOWENTER);
NewOption.bShowTab=IsDlgButtonChecked(hDlg,IDC_SHOWTAB);
NewOption.bShowSpace=IsDlgButtonChecked(hDlg,IDC_SHOWSPACE);
NewOption.bShowRuler=IsDlgButtonChecked(hDlg,IDC_SHOWRULER);
GetDlgItemText(hDlg,IDC_EDBACKBIT,NewOption.BackBit,MAX_PATH);
NewOption.BackBitPos=SendDlgItemMessage(hDlg,IDC_CBBACKBITPOS,CB_GETCURSEL,0,0);
NewOption.SelBlockType=SendDlgItemMessage(hDlg,IDC_CBSELBLOCKTYPE,CB_GETCURSEL,0,0);
NewOption.VAlign=SendDlgItemMessage(hDlg,IDC_CBVALIGN,CB_GETCURSEL,0,0);
return TRUE;
}
break;
}
return FALSE;
}
¹è°æ ºñÆ®¸ÊÀº °¡±ÞÀûÀÌ¸é »ó´ë °æ·Î·Î ÀúÀåÇß´Ù. ´ç±Ù°ú °°Àº °æ·Î¿¡ ºñÆ®¸ÊÀ» µÎ¾úÀ» °æ¿ì µð·ºÅ丮¸¦ Åë°·Î ¿Å°Üµµ µ¿ÀÛÇÒ ¼ö ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ¹è°æ ºñÆ®¸Ê ±â´ÉÀÇ Á¸À縦 ¾Ë¸®±â À§ÇØ ¼¼ °³ÀÇ »ùÇà ºñÆ®¸ÊÀ» Á¦°øÇϴµ¥ ¿ë·®»óÀÇ ¹®Á¦·Î Å« ºñÆ®¸ÊÀº »ç¿ëÇÏÁö ¸øÇß°í ÀÛÀº ºñÆ®¸Ê¸¸ »ç¿ëÇß´Ù. ´ÙÀ½Àº ¼¼ °³ÀÇ »ö»ó¿¡ ´ëÇÑ ¼³Á¤ Äڵ带 ÀÛ¼ºÇÑ´Ù. ¸ÕÀú Ãß°¡µÈ »ö»óÀÇ ±âº» »ö»óÀ» Á¤ÀÇÇÑ´Ù.
COLORREF arSysColor[13]={0,0,0,0,RGB(192,192,192),RGB(160,160,160),RGB(255,255,0),
RGB(128,128,128),RGB(255,255,0),RGB(0,0,0),RGB(0,0,0),0,
RGB(220,220,220)};
¹è¿ Å©±â¸¦ 13À¸·Î ´Ã¸®°í ¼±Åà ºí·Ï ¿Ü°û¼±, ¾ÈÂÊ ¿©¹é, ´«±ÝÀÚÀÇ ±âº» »ö»óÀ» Á¤ÀÇÇÏ¿´´Ù. ¿©±â¼ ¾ÈÂÊ ¿©¹éÀÇ ±âº» »ö»óÀº ½Ã½ºÅÛ »ö»óÀ̹ǷΠInitSysColor¿¡¼ ÃʱâÈÇÑ´Ù.
void InitSysColor()
{
arSysColor[0]=GetSysColor(COLOR_WINDOWTEXT);
arSysColor[1]=arSysColor[11]=GetSysColor(COLOR_WINDOW);
arSysColor[2]=GetSysColor(COLOR_HIGHLIGHTTEXT);
arSysColor[3]=GetSysColor(COLOR_HIGHLIGHT);
}
À©µµ¿ìÀÇ ¹è°æ»ö°ú °°Àº »öÀ¸·Î ÃʱâÈÇß´Ù. »ö»ó ´ëÈ»óÀÚ¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ ÀÛ¼ºÇÑ´Ù.
COLORREF& GetColorFromID(int ID)
{
switch (ID) {
....
case IDC_SELFRAMECOLOR:
return NewOption.SelFrameColor;
case IDC_INNERRECTCOLOR:
return NewOption.InnerRectColor;
case IDC_RULERCOLOR:
return NewOption.RulerColor;
}
}
BOOL CALLBACK ColorDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
case WM_INITDIALOG:
for (idx=IDC_CFORE;idx<=IDC_RULERCOLOR;idx++) {
for (i=0;i<sizeof(arPreColor)/sizeof(arPreColor[0]);i++) {
SendDlgItemMessage(hDlg,idx,CB_ADDSTRING,0,0);
}
}
return TRUE;
....
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_SETACTIVE:
g_StartPage=4;
for (idx=IDC_CFORE;idx<=IDC_RULERCOLOR;idx++) {
SendDlgItemMessage(hDlg,idx,CB_SETCURSEL,GetColorFromID(idx) >> 24,0);
}
....
»ö»ó ¼±Åà ÄÞº¸ ¹Ú½ºÀÇ Ç׸ñµéÀº ¸ðµÎ µ¿ÁúÀûÀ̱⠶§¹®¿¡ ·çÇÁÀÇ ³¡ ÷ÀÚ¸¸ Á¶Á¤ÇÏ¸é µÈ´Ù. »ö»ó ÄÞº¸ ¹Ú½ºÀÇ ID´Â ¿¬¼ÓÀûÀÎ °ªÀ» °¡Áöµµ·Ï ¸®¼Ò½º¸¦ ÀÛ¼ºÇØ µÎ¾ú´Ù. ´ÙÀ½Àº ¿É¼ÇµéÀÌ º¯°æµÉ ¶§ÀÇ Ã³¸® Äڵ带 ÀÛ¼ºÇÑ´Ù. ¹è°æ ºñÆ®¸ÊÀº ÄÁÆ®·ÑÀÌ ¾Æ´Ñ È£½ºÆ®°¡ °ü¸®ÇØ¾ß ÇÑ´Ù. Dangeun.cpp¿¡ ºñÆ®¸Ê ÇÚµéÀ» Àü¿ª º¯¼ö·Î ¼±¾ðÇÑ´Ù.
HBITMAP hBackBit;
global.h¿¡¼ extern ¼±¾ðÇÑ´Ù.
extern HBITMAP hBackBit;
OnCreate¿¡¼ ¿É¼Ç¿¡ ¼³Á¤µÈ ºñÆ®¸Ê ÆÄÀÏÀ» Àоî DDB¸¦ »ý¼ºÇÏ°í OnDestroy¿¡¼ Æı«ÇÑ´Ù.
int OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
// »ùÇà ºñÆ®¸ÊÀ» Àд´Ù.
if (IsStrEmpty(Option.BackBit)==FALSE) {
if (strncmp(Option.BackBit,"»ùÇÃ:",5) == 0) {
if (strcmp(Option.BackBit+5,"±¹È")==0)
hBackBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_SAMPLE1));
if (strcmp(Option.BackBit+5,"Äá")==0)
hBackBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_SAMPLE2));
if (strcmp(Option.BackBit+5,"¾Æ°¡")==0)
hBackBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_SAMPLE3));
} else {
hBackBit=MakeDDBFromDIB(Option.BackBit);
}
}
SetTimer(hWnd,100,1,NULL);
return 0;
}
void OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (hBackBit) {
DeleteObject(hBackBit);
}
KillTimer(hWnd,1);
}
¹è°æ ºñÆ®¸ÊÀÌ ÁöÁ¤µÇ¾î ÀÖÀ¸¸é È£½ºÆ®°¡ µü Çѹø ºñÆ®¸ÊÀ» Àоî ÇÚµéÀ» °¡Áö°í ÀÖÀ¸¸ç ApiEdit´Â ÀÌ ºñÆ®¸Ê ÇÚµéÀ» ¹Þ¾Æ »ç¿ëÇÏ¸é µÈ´Ù. ApplyNow¿¡¼ ¿É¼Ç º¯°æÀ» Àû¿ëÇÑ´Ù.
void ApplyNow()
{
....
BOOL bChangeBackBit=FALSE;
....
if (lstrcmpi(Option.BackBit,NewOption.BackBit)!=0) {
if (hBackBit) {
DeleteObject(hBackBit);
hBackBit=NULL;
}
if (IsStrEmpty(NewOption.BackBit)==FALSE) {
if (strncmp(NewOption.BackBit,"»ùÇÃ:",5) == 0) {
if (strcmp(NewOption.BackBit+5,"±¹È")==0)
hBackBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_SAMPLE1));
if (strcmp(NewOption.BackBit+5,"Äá")==0)
hBackBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_SAMPLE2));
if (strcmp(NewOption.BackBit+5,"¾Æ°¡")==0)
hBackBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_SAMPLE3));
} else {
hBackBit=MakeDDBFromDIB(NewOption.BackBit);
}
}
bChangeBackBit=TRUE;
}
hChild=GetWindow(g_hMDIClient,GW_CHILD);
while (hChild) {
....
if (EqualRect(&Option.InnerRect,&NewOption.InnerRect)==FALSE) {
pSi->Ae.SetInnerRect(NewOption.InnerRect);
}
if (Option.InnerRectColor != NewOption.InnerRectColor) {
pSi->Ae.SetInnerRectColor(NewOption.InnerRectColor & 0xff000000 ?
NewOption.InnerRectColor & 0xffffff:arSysColor[11]);
}
if (Option.bShowRuler != NewOption.bShowRuler) {
pSi->Ae.SetShowRuler(NewOption.bShowRuler);
}
if (Option.InnerRectColor != NewOption.InnerRectColor) {
pSi->Ae.SetInnerRectColor(NewOption.InnerRectColor & 0xff000000 ?
NewOption.InnerRectColor & 0xffffff:arSysColor[11]);
}
if (Option.VAlign != NewOption.VAlign) {
pSi->Ae.SetVAlign(NewOption.VAlign);
}
if (Option.SelBlockType != NewOption.SelBlockType) {
pSi->Ae.SetSelBlockType(NewOption.SelBlockType);
}
if (Option.SelFrameColor != NewOption.SelFrameColor) {
pSi->Ae.SetSelFrameColor(NewOption.SelFrameColor & 0xff000000 ?
NewOption.SelFrameColor & 0xffffff:arSysColor[10]);
}
if (bChangeBackBit) {
pSi->Ae.SetBackBit(hBackBit);
}
if (Option.BackBitPos != NewOption.BackBitPos) {
pSi->Ae.SetBackBitPos(NewOption.BackBitPos);
}
hChild=GetWindow(hChild,GW_HWNDNEXT);
}
....
Áö±Ý±îÁö ¸¹Àº ¿É¼ÇµéÀ» Ãß°¡ÇØ ¿Ô´Âµ¥ ´ëºÎºÐ µ¿ÀÏÇÑ ÀÛ¾÷ÀÇ ¹Ýº¹ÀÏ »ÓÀÌ´Ù. ±×·¯³ª ¹è°æ ºñÆ®¸Ê ¿É¼ÇÀº Á» ƯÀÌÇÏ°Ô Ãë±ÞµÇ´Âµ¥ º¯°æµÇ¾úÀ» ¶§ ºñÆ®¸ÊÀ» ÀÏ´Ü Æı«ÇÑ ÈÄ ´Ù½Ã ¸¸µç´Ù. ¸¸¾à ¹è°æ ºñÆ®¸Ê ¿É¼ÇÀ» Á¦°ÅÇ߰ųª À߸øµÈ ÆÄÀÏÀ» ÁöÁ¤ÇßÀ¸¸é hBackBit´Â NULL°ªÀ» °¡Áø´Ù. Á¦°ÅµÇ´Â °æ¿ì¸¦ À§ÇØ ºñÆ®¸ÊÀ» Æı«ÇÑ ÈÄ ¹Ýµå½Ã hBackBit¿¡ NULLÀ» ´ëÀÔÇÏ¿© ºñÆ®¸ÊÀÌ ÁöÁ¤µÇÁö ¾Ê¾ÒÀ½À» È®½ÇÈ÷ ÇØ¾ß ÇÑ´Ù.
¹è°æ ºñÆ®¸ÊÀÌ º¯°æµÇ¾ú´ÂÁö´Â bChangeBackBit º¯¼ö¿¡ µû·Î ÀúÀåÇØ µÎ°í while ·çÇÁ¿¡¼ ¸ðµç ApiEdit ÄÁÆ®·Ñ¿¡ ´ëÇØ º¯°æµÈ ¹è°æ ºñÆ®¸ÊÀ» ´Ù½Ã ÁöÁ¤ÇÑ´Ù. È£½ºÆ®°¡ À¯ÁöÇÏ°í ÀÖ´Â hBackBit¸¦ ³Ñ±â¸¸ ÇÏ¸é µÈ´Ù. À̶§ hBackBit°¡ NULLÀÌ´õ¶óµµ ApiEdit¿¡°Ô ³Ñ°Ü¾ß ÀÌ¹Ì ÁöÁ¤µÇ¾î ÀÖ´Â ¹è°æ ºñÆ®¸ÊÀÌ »ç¶óÁø´Ù. »õ·Î »ý¼ºµÇ´Â ÄÁÆ®·Ñ¿¡µµ ÀÌ ¿É¼ÇµéÀ» Àû¿ëÇÑ´Ù.
void SetSetting(CApiEdit &Ae)
{
....
if (EqualRect(&Option.InnerRect,&Ori.InnerRect)==FALSE) {
Ae.SetInnerRect(Option.InnerRect);
}
if (Option.InnerRectColor & 0xff000000) {
Ae.SetInnerRectColor(Option.InnerRectColor & 0xffffff);
}
if (Option.bShowRuler != Ori.bShowRuler) {
Ae.SetShowRuler(Option.bShowRuler);
}
if (Option.RulerColor & 0xff000000) {
Ae.SetRulerColor(Option.RulerColor & 0xffffff);
}
if (Option.VAlign != Ori.VAlign) {
Ae.SetVAlign(Option.VAlign);
}
if (Option.SelBlockType != Ori.SelBlockType) {
Ae.SetSelBlockType(Option.SelBlockType);
}
if (Option.SelFrameColor & 0xff000000) {
Ae.SetSelFrameColor(Option.SelFrameColor & 0xffffff);
}
if (hBackBit) {
Ae.SetBackBit(hBackBit);
}
if (Option.BackBitPos != Ori.BackBitPos) {
Ae.SetBackBitPos(Option.BackBitPos);
}
}
¹è°æ ºñÆ®¸ÊÀº ÁöÁ¤µÇ¾î ÀÖÀ¸¸é ¹«Á¶°Ç ÁöÁ¤ÇÑ´Ù. ÀÌÁ¦ ½ÇÇàÁß ¾ðÁ¦¶óµµ ¼³Á¤ ´ëÈ»óÀÚ¿¡¼ ¿É¼ÇÀ» º¯°æÇÒ ¼ö ÀÖ´Ù.