´ÙÀ½Àº °¡Àå º¹ÀâÇÑ °´Ã¼ÀÎ ÅØ½ºÆ®¸¦ »ðÀÔÇØ º¸ÀÚ. ¿ÜºÎ ÆÄÀÏ¿¡¼ ÀÐ¾î ¿À´Â ºñÆ®¸ÊÀ̳ª ¸ÞŸ¿Í´Â ´Þ¸® ÅØ½ºÆ®´Â »ç¿ëÀڷκÎÅÍ Á÷Á¢ ¹®ÀÚ¿À» ÀÔ·Â¹Þ¾Æ¾ß ÇϹǷΠÁ» ´õ º¹ÀâÇÏ´Ù. ¹®ÀÚ¿À» ÀԷ¹ޱâ À§Çؼ´Â ¿¡µðÆ® ÄÁÆ®·ÑÀ» »ç¿ëÇØ¾ß Çϴµ¥ ¸ð´Þ ´ëÈ»óÀÚ¸¦ ¿¾î¼ ÀԷ¹޴ ¹æ¹ýÀÌ °¡Àå Æí¸®ÇÏ´Ù. ¸®¼Ò½º¿¡´Â ÀÌ¹Ì ÀÌ ´ëÈ»óÀÚ°¡ ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î Äڵ常 Ãß°¡ÇÏ¸é µÈ´Ù.
Áß¾ÓÀÇ ¿¡µðÆ® ¹Ú½º¿¡ Àü´ÞµÈ ÅØ½ºÆ®¸¦ º¸¿© ÁÖ°í »ç¿ëÀÚ°¡ ÆíÁýÇÒ ¼ö ÀÖµµ·Ï Çϸç È®ÀÎ ¹öưÀ» ´©¸£¸é ÆíÁý °á°ú¸¦ ´Ù½Ã ¸®ÅÏÇØ¾ß ÇÑ´Ù. ÆíÁý ´ë»ó ¹®ÀÚ¿Àº ´ëÈ»óÀÚÀÇ ÆÄ¶ó¹ÌÅÍ·Î Àü´ÞµÇ¾î¾ß Çϴµ¥ °íÁ¤ ±æÀÌÀÇ ¹®ÀÚ¿À» Àü´ÞÇÑ´Ù¸é TCHAR *ÇüÀ» ³Ñ±â°í ´ëÈ»óÀÚ´Â ±× °á°ú¸¦ ´Ù½Ã ÀÌ ¹öÆÛ¿¡ ÀúÀåÇÏ¸é µÉ °ÍÀÌ´Ù. ±×·¯³ª ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ °æ¿ì »ç¿ëÀÚ°¡ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ¿ÀÇ ±æÀÌ¿¡ Á¦ÇÑÀÌ ¾ø±â ¶§¹®¿¡ ´ëÈ»óÀÚ°¡ ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ ±æÀ̸¸Å ¸Þ¸ð¸®¸¦ µ¿ÀûÀ¸·Î ÀçÇÒ´çÇÏ¿© ÆíÁý °á°ú¸¦ ¸®ÅÏÇØ¾ß ÇÑ´Ù.
±×·¡¼ ÀÌ ´ëÈ»óÀÚ´Â ÆÄ¶ó¹ÌÅÍ·Î TCHAR *¸¦ ¹Þ¾Æ¼´Â ¾ÈµÇ¸é µ¿Àû ÇÒ´çÀÌ °¡´ÉÇÑ TCHAR **¸¦ ¹Þ¾Æ¾ß ÇÑ´Ù. ±×·¡¾ß Àü´ÞµÈ Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â °÷¿¡ ÀÖ´Â TCHAR *ÇüÀÇ º¯¼ö¸¦ ¿øÇÏ´Â Å©±â´ë·Î ¸¶À½´ë·Î ´Ã¸®°Å³ª ÁÙÀÏ ¼ö ÀÖ´Ù. ´ëÈ»óÀÚ ÇÁ·Î½ÃÀú´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
BOOL CALLBACK TextDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
static TCHAR **ppText;
int len;
switch(iMessage) {
case WM_INITDIALOG:
ppText=(TCHAR **)lParam;
if (*ppText) {
SetDlgItemText(hDlg,IDC_EDSTR,*ppText);
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
len=GetWindowTextLength(GetDlgItem(hDlg,IDC_EDSTR));
*ppText=(TCHAR *)realloc(*ppText,len+1);
GetDlgItemText(hDlg,IDC_EDSTR,*ppText,len+1);
EndDialog(hDlg,IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg,IDCANCEL);
return TRUE;
}
break;
}
return FALSE;
}
WM_INITDIALOG¿¡¼ lParamÀ¸·Î Àü´Þ¹ÞÀº ¹®ÀÚ¿ ¹öÆÛÀÇ Æ÷ÀÎÅ͸¦ ppText¿¡ ´ëÀÔÇØ µÎ°í ÀÌ ¹öÆÛÀÇ ³»¿ëÀÎ *ppText¸¦ ¿¡µðÆ® ¹Ú½º¿¡ Ãâ·ÂÇß´Ù. ´Ü *ppText°¡ NULLÀÎ °æ¿ì, Áï »õ·Î »ý¼ºµÇ´Â °´Ã¼ÀÎ °æ¿ì´Â Ãâ·ÂÇÒ ³»¿ëÀÌ ¾øÀ¸¹Ç·Î ¿¡µðÆ®¸¦ ºñ¿ö µÐ´Ù. »ç¿ëÀÚ°¡ ÆíÁýÀ» ¸¶Ä¡°í È®ÀÎ ¹öưÀ» ´©¸£¸é ÆíÁýµÈ ±æÀ̸¦ len¿¡ Á¶»çÇϰí *ppText¸¦ ÀÌ ±æÀÌ¿¡ ¸Â°Ô ÀçÇÒ´çÇÑ´Ù. ÆíÁýµÈ ¹®ÀÚ¿ÀÌ ¹öÆÛ Å©±âº¸´Ù ´õ Å©¸é ¹öÆÛ°¡ È®ÀåµÉ °ÍÀÌ°í ´õ ÀÛ´Ù¸é Ãà¼ÒµÉ °ÍÀÌ´Ù. ±æÀ̸¦ Á¶Á¤ÇÑ *ppText¿¡ ¿¡µðÆ®ÀÇ ³»¿ëÀ» º¹»çÇÑ´Ù.
ÅØ½ºÆ® °´Ã¼¸¦ »ðÀÔÇÒ ½ÃÁ¡Àº ¿ª½Ã OnLButtonDownÀÌ´Ù. ÀÌ ÇÔ¼öÀÇ ¼±µÎ¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÏ¿© NowToolÀÌ DT_TEXTÀÏ ¶§ ÅØ½ºÆ® ÆíÁý ´ëÈ»óÀÚ¸¦ È£ÃâÇÏ¿© »ç¿ëÀڷκÎÅÍ ÅØ½ºÆ®¸¦ ÀÔ·Â¹Þ¾Æ ÅØ½ºÆ® °´Ã¼¸¦ ¹è¿¿¡ Ãß°¡ÇÑ´Ù. ºñÆ®¸ÊÀ̳ª ¸ÞŸ¿Í ¸¶Âù°¡Áö·Î ÅØ½ºÆ® »ðÀÔ ÄÚµåÀÇ ¼ø¼µµ Áß¿äÇÏÁö ¾Ê´Ù.
LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int TempSel;
int nHit;
TCHAR *pText;
if (NowTool==DT_TEXT) {
pText=NULL;
if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_TEXT),hWnd,
TextDlgProc,(LPARAM)&pText) == IDOK) {
if (lstrlen(pText) == 0) {
free(pText);
} else {
AppendObject(DT_TEXT,LOWORD(lParam),HIWORD(lParam),
LOWORD(lParam)+200,HIWORD(lParam)+50);
arObj[arNum-1]->Text=pText;
arObj[arNum-1]->Len=lstrlen(pText)+1;
arObj[arNum-1]->PlaneColor=-1;
InvalidateRect(hWndMain,NULL,TRUE);
}
NowTool=DT_SELECT;
NowSel=arNum-1;
}
return 0;
}
....
ÅØ½ºÆ® °´Ã¼¸¦ »õ·Î Ãß°¡ÇÏ´Â °ÍÀ̹ǷΠ´ëÈ»óÀÚÀÇ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ°ÜÁö´Â Æ÷ÀÎÅÍ´Â NULL·Î ÃʱâÈµÈ °ªÀ̾î¾ß ÇÑ´Ù. pText°¡ ÆíÁýµÈ ÅØ½ºÆ®¸¦ ÀúÀåÇÒ ¹è¿Àε¥ ÀÌ Æ÷ÀÎÅ͸¦ NULL·Î ÃʱâÈÇÏ°í Æ÷ÀÎÅÍ º¯¼öÀÇ ¹øÁöÀÎ &pText¸¦ ´ëÈ»óÀÚ·Î Àü´ÞÇÑ´Ù. ´ëÈ»óÀÚ´Â »ç¿ëÀڷκÎÅÍ ÀÔ·ÂÀ» ¹ÞÀº ÈÄ pText¸¦ ÇÒ´çÇÏ¿© ÆíÁý °á°ú¸¦ º¹»çÇÒ °ÍÀÌ´Ù. ÆíÁýÀÌ ¿Ï·áµÇ¸é AppendObject·Î ÅØ½ºÆ® °´Ã¼¸¦ Ãß°¡Çϰí Text¸â¹ö´Â ´ëÈ»óÀÚ°¡ ÇÒ´çÇÑ pText¸¦ ´ëÀÔÇÏ°í ±æÀÌ´Â ³Î ¹®ÀںбîÁö °í·ÁÇØ¼ ¹®ÀÚ¿ ±æÀÌ+1·Î ¼³Á¤ÇÑ´Ù. ¿ÂÀüÇÑ ¹®ÀÚ¿ÀÌ µÇ·Á¸é Ç×»ó ³Î Á¾·á ¹®ÀÚ°¡ Á¦ÀÏ µÚ¿¡ ÀÖ¾î¾ß ÇÑ´Ù.
¸¸¾à ´ëÈ»óÀÚ¿¡¼ ¹®ÀÚ¿À» Çϳªµµ ÀÔ·ÂÇÏÁö ¾Ê°í °ð¹Ù·Î È®ÀÎ ¹öưÀ» ´·¶´Ù¸é À̶§´Â ºó ÅØ½ºÆ® °´Ã¼°¡ µÇ¹Ç·Î °´Ã¼¸¦ »ý¼ºÇؼ´Â ¾ÈµÈ´Ù. ¾îÂ÷ÇÇ »ý¼ºÇØ ºÁ¾ß º¸ÀÌÁöµµ ¾ÊÀ» °ÍÀÌ´Ù. ÅØ½ºÆ® °´Ã¼¸¦ Ãß°¡ÇÑ ÈÄ È¸éÀ» ¹«È¿ÈÇÏ°í ¼±Åà ¸ðµå·Î ¼³Á¤ÇÏ¸ç ¹æ±Ý »ðÀÔµÈ ÅØ½ºÆ® °´Ã¼¸¦ ¼±ÅÃÇÑ´Ù. DObject ±¸Á¶Ã¼¿¡´Â ÅØ½ºÆ®ÀÇ ¼Ó¼º¿¡ °ü·ÃµÈ ¸î°¡Áö ¼³Á¤°ªµéÀÌ Àִµ¥ ÀÌ °ªÀ» ÃʱâÈÇÏ´Â ÀÛ¾÷Àº AppendObject¿¡¼ ÇÑ´Ù.
BOOL AppendObject(DTool Type,int x1,int y1,int x2,int y2)
{
....
arObj[arNum]->LineWidth=Opt.LineWidth;
arObj[arNum]->LineColor=Opt.LineColor;
arObj[arNum]->PlaneColor=Opt.PlaneColor;
arObj[arNum]->FontColor=Opt.FontColor;
arObj[arNum]->FontSize=Opt.FontSize;
lstrcpy(arObj[arNum]->FontFace,Opt.FontFace);
arNum++;
return TRUE;
}
Àü¿ª ¿É¼Ç¿¡ ±â¾ïµÇ¾î ÀÖ´Â ±Û²Ã °ü·Ã ¼³Á¤À» »õ·Î »ðÀÔµÇ´Â ÅØ½ºÆ® °´Ã¼¿¡µµ ±×´ë·Î Àû¿ëÇØ¾ß ÇÑ´Ù. ÅØ½ºÆ®°¡ ´Ù¸¥ °´Ã¼¿Í Á¶±Ý ´Ù¸¥ Á¡À̶ó¸é ¸éÀÇ »ö»óÀÌ Ç×»ó Åõ¸íÀ̶ó´Â Á¡ÀÌ´Ù. AppendObject¿¡¼ PlaneColor¸¦ Àü¿ª ¿É¼ÇÀ¸·Î ´ëÀÔÇÏÁö¸¸ OnLButtonDown¿¡¼ ÀÌ °ªÀ» ´Ù½Ã -1·Î ¹Ù²Ù¾î Àü¿ª ¿É¼ÇÀ» µû¸£Áö ¾Êµµ·Ï ¿¹¿Ü 󸮸¦ Çß´Ù. ÅØ½ºÆ®´Â ¹®ÀÚ¿ÀÏ »ÓÀ̹ǷΠ¹è°æ »ö»óÀÌ Åõ¸íÇÑ °ÍÀÌ º¸ÅëÀÌ´Ù. ¹°·Ð óÀ½ »ý¼ºÇÒ ¶§¸¸ Åõ¸íÇϸç ÀÏ´Ü »ý¼ºµÈ ÈÄ »ç¿ëÀÚ°¡ ¸í½ÃÀûÀ¸·Î ¹è°æ»öÀ» ÁÙ ¼ö´Â ÀÖ´Ù. OnPaint¿¡¼´Â ¹è¿¿¡ »ðÀÔµÈ ÅØ½ºÆ®¸¦ ±×¸°´Ù.
LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
HFONT hFont,hOldFont;
int FontHeight;
SetBkMode(hMemDC,TRANSPARENT);
for (idx=0;idx<arNum;idx++) {
....
case DT_TEXT:
FillRect(hMemDC,&arObj[idx]->rt,hBrush);
FontHeight=arObj[idx]->FontSize*GetDeviceCaps(hMemDC,LOGPIXELSY)/72;
hFont=CreateFont(FontHeight,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,
VARIABLE_PITCH | FF_ROMAN,arObj[idx]->FontFace);
hOldFont=(HFONT)SelectObject(hMemDC,hFont);
if (arObj[idx]->FontColor != (COLORREF)-1) {
SetTextColor(hMemDC,arObj[idx]->FontColor);
DrawText(hMemDC,arObj[idx]->Text,-1,&arObj[idx]->rt,DT_WORDBREAK);
}
DeleteObject(SelectObject(hMemDC,hOldFont));
break;
µµÇü Ãâ·Â ·çÇÁ¿¡ µé¾î°¡±â Àü¿¡ ¹è°æ ¸ðµå¸¦ ¹Ì¸® Åõ¸íÀ¸·Î ¹Ù²Ù¾î µÐ´Ù. DT_TEXT °´Ã¼¸¦ ¸¸³ª¸é ¼Ó¼º¿¡ ±â·ÏµÈ ´ë·Î ±Û²ÃÀ» »ý¼ºÇÏ°í ±Û²Ã»ö»óÀ» º¯°æÇÑ ÈÄ DrawText·Î °´Ã¼ÀÇ ¿µ¿ª¿¡ ÅØ½ºÆ®¸¦ Ãâ·ÂÇß´Ù. ¿É¼Ç¿¡ ±â·ÏµÇ´Â ±Û²ÃÀÇ Å©±â´Â Æ÷ÀÎÆ® ´ÜÀ§À̹ǷΠÀÌ ´ÜÀ§¸¦ Çȼ¿ ´ÜÀ§·Î º¯È¯ÇØ¾ß ÇÑ´Ù. Æ÷ÀÎÆ®°ªÀ» ȸé ÇØ»óµµ¿Í °öÇϰí 72·Î ³ª´©¸é ÆùÆ®ÀÇ Çȼ¿ ´ÜÀ§¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. Âü°í·Î À§ Äڵ尡 ÆùÆ®¸¦ ´Ù·ç´Â ¹æ¹ýÀº Á¤È®ÇÏÁö ¸øÇѵ¥ ¼Ó¼º¿¡ ÆùÆ®ÀÇ À̸§¸¸ ÁöÁ¤µÇ¹Ç·Î ¹®ÀÚ¼ÂÀ̳ª ÇÇÄ¡ Á¤º¸¸¦ ¾Ë ¼ö°¡ ¾ø´Ù. ÀÌ ¹®Á¦´Â Àá½Ã ÈÄ¿¡ ´Ù½Ã Á¡°ËÇØ º¸µµ·Ï ÇÏÀÚ.
´ÙÀ½Àº ÀÌ¹Ì ÀÛ¼ºµÈ ÅØ½ºÆ® °´Ã¼ÀÇ ¹®ÀÚ¿À» ¼öÁ¤ÇÏ´Â ±â´ÉÀ» ³Ö¾î º¸ÀÚ. ºñÆ®¸ÊÀº ¿ÜºÎ ÆÄÀÏ¿¡¼ ÀÐ¾î ¿ÔÀ¸¹Ç·Î ÆíÁý±îÁö ÇÒ Çʿ䰡 ¾øÁö¸¸ ÅØ½ºÆ®´Â »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °ÍÀ̹ǷΠ¿øÇÒ °æ¿ì ³»¿ëÀ» ÆíÁýÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÆíÁý ¸í·ÉÀº ¸¶¿ì½º ´õºíŬ¸¯À¸·Î ¹Þ¾ÆµéÀ̵µ·Ï ÇÏÀÚ. ĵ¹ö½ºÀÇ À©µµ¿ì Ŭ·¡½º´Â ´õºí Ŭ¸¯À» ¹Þ¾ÆµéÀÏ ¼ö ÀÖµµ·Ï CS_DBLCLKS ½ºÅ¸ÀÏÀ» ÀÌ¹Ì ºÎ¿©ÇØ ³õ¾Ò´Ù.
LRESULT OnLButtonDblclk(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int TempSel;
TCHAR *pText;
TempSel=FindObject(LOWORD(lParam),HIWORD(lParam));
if (TempSel == -1) {
return 0;
}
if (arObj[TempSel]->Type == DT_TEXT) {
pText=arObj[TempSel]->Text;
if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_TEXT),hWnd,
TextDlgProc,(LPARAM)&pText) == IDOK) {
if (lstrlen(pText) == 0) {
DelObject(TempSel);
} else {
arObj[arNum-1]->Text=pText;
arObj[arNum-1]->Len=lstrlen(pText)+1;
}
InvalidateRect(hWndMain,NULL,TRUE);
}
}
return 0;
}
ÆíÁýÇϱâ Àü¿¡ ´õºíŬ¸¯ÇÑ °÷ÀÇ °´Ã¼¸¦ Á¶»çÇØ¼ ÅØ½ºÆ® °´Ã¼ÀÎÁö¸¦ ¸ÕÀú Á¡°ËÇØ¾ß ÇÑ´Ù. ¸¸¾à ºó ¿©¹éÀ» ´õºíŬ¸¯Çߴٰųª ÅØ½ºÆ®°¡ ¾Æ´Ñ °´Ã¼¸¦ ´õºíŬ¸¯Çß´Ù¸é ¾Æ¹« °Íµµ ÇÒ Çʿ䰡 ¾ø´Ù. ¼±ÅÃµÈ ÅØ½ºÆ® °´Ã¼ÀÇ Text¸â¹ö¸¦ pText¿¡ ´ëÀÔÇÑ ÈÄ pTextÀÇ ¹øÁö¸¦ ÆíÁý ´ëÈ»óÀÚÀÇ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ°Ü ÆíÁýÇϵµ·Ï Çß´Ù. ÆíÁýÀÌ ¿Ï·áµÇ¸é ±âÁ¸ ÅØ½ºÆ®°¡ Áö¿öÁ³´ÂÁö º¸°í ¸¸¾à ÅØ½ºÆ®¸¦ ¸ðµÎ Áö¿ü´Ù¸é À̸¦ °´Ã¼ »èÁ¦ ¸í·ÉÀ¸·Î ÀνÄÇÏ¿© »èÁ¦Çϵµ·Ï Çß´Ù. ¸¸¾à ÀÌ Ã³¸®¸¦ ÇÏÁö ¾ÊÀ¸¸é ÅØ½ºÆ®µµ ¾ø´Â ºó °´Ã¼°¡ Á¸ÀçÇÏ°Ô µÉ °ÍÀÌ´Ù.
ºó °´Ã¼°¡ ¾Æ´Ï¶ó¸é ÆíÁýµÈ °á°úÀÎ pText¸¦ ´Ù½Ã Text¸â¹ö¿¡ ´ëÀÔÇÏ°í ±æÀ̵µ ´Ù½Ã Á¶»çÇÑ´Ù. ´ëÈ»óÀÚ¸¦ È£ÃâÇÒ ¶§ Text¸¦ pText¿¡ ´ëÀÔÇßÁö¸¸ ´ëÈ»óÀÚ°¡ ¸®ÅÏµÈ ÈÄ pText°¡ ¿©ÀüÈ÷ °°Àº ¹øÁö¸¦ °¡¸®Å²´Ù°í ÇÒ ¼ö ¾øÀ¸¹Ç·Î Text ¸â¹ö´Â ÀçÇÒ´çµÈ ¹øÁö¸¦ ´Ù½Ã ´ëÀÔ¹Þ¾Æ¾ß ÇÑ´Ù. ÅØ½ºÆ® °´Ã¼°¡ »õ·Î »ý¼ºµÉ ¶§¿Í ÀÌ¹Ì »ý¼ºµÈ °´Ã¼¸¦ ÆíÁýÇÒ ¶§ ´ëÈ»óÀÚ ÇÁ·Î½ÃÀú·Î Àü´ÞµÇ´Â °ªÀ» ºñ±³ÇØ º¸ÀÚ.
»õ·Î »ý¼ºÇÒ ¶§´Â NULL°ªÀ» °¡Áö´Â, Áï ÇÒ´çµÇÁö ¾ÊÀº Æ÷ÀÎÅ͸¦ °¡Áö´Â ¹®ÀÚÇü Æ÷ÀÎÅͰ¡ Àü´ÞµÇ¸ç À̶§ ´ëÈ»óÀÚ´Â ÀÌ Æ÷ÀÎÅ͸¦ »õ·Î ÇÒ´çÇÑ´Ù. ÆíÁý½Ã¿¡´Â ÆíÁý ´ë»ó ÅØ½ºÆ®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÇ ¹øÁö°¡ Àü´ÞµÇ¸ç ´ëÈ»óÀÚ´Â ÀÌ Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â °÷ÀÇ Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â ¹®ÀÚ¿·Î ¿¡µðÆ®¸¦ ÃʱâÈÇÏ°í ÆíÁýµÈ °á°ú¸¸Å ÀçÇÒ´ç±îÁö ÇØ¼ ´Ù½Ã º¹»çÇÑ´Ù.