Á¦ÀÚ¸® ÅøÆÁ(In place ToolTip)Àº ÀÏ¹Ý ÅøÆÁ°ú´Â ¿ëµµ°¡ Á» ´Ù¸£´Ù. ÀÏ¹Ý ÅøÆÁÀº Åø¿¡ ´ëÇÑ ¼û°ÜÁø Á¤º¸¸¦ º¸¿© ÁÖÁö¸¸ Á¦ÀÚ¸® ÅøÆÁÀº ÁÖ·Î Àß·Á¼ º¸ÀÌÁö ¾Ê´Â, Áï °¡·ÁÁ® ÀÖ´Â ³ª¸ÓÁö ºÎºÐÀ» È®ÀνÃÄÑ ÁÖ±â À§ÇØ »ç¿ëÇÑ´Ù. ÁÖ·Î Æ®¸®ºä³ª ¸®½ºÆ®ºä°°ÀÌ Ç¥ÇöÇÏ´Â Á¤º¸°¡ ¸¹Àº ÄÁÆ®·ÑµéÀÌ Á¦ÀÚ¸® ÅøÆÁÀ» ä¿ëÇϰí Àִµ¥ Ž»ö±â³ª MSDN¿¡¼ ½±°Ô È®ÀÎÇÒ ¼ö ÀÖ´Ù.
Documents and Settings¶ó´Â Æú´õ À̸§ÀÌ ³Ê¹« ±æ¾î ¿À¸¥ÂÊÀÌ Àß·Á º¸ÀÌÁö ¾Ê´Âµ¥ ÀÌ Æú´õ À§·Î Ä¿¼¸¦ ¿Å±â¸é Æú´õ¸íÀÇ ³ª¸ÓÁö ºÎºÐÀ» ÅøÆÁÀ¸·Î È®ÀÎÇÒ ¼ö ÀÖ´Ù. À©µµ¿ì¸¦ µå·¡±×ÇÏ¿© Å©±â¸¦ ´Ã¸± Çʿ䰡 ¾øÀ¸¹Ç·Î ÈξÀ Æí¸®ÇÏ´Ù. MSDNµµ ¸¶Âù°¡Áö·Î ±ä ÅäÇȸíÀ» ÀÌ·± ½ÄÀ¸·Î Á¦ÀÚ¸® ÅøÆÁÀ» »ç¿ëÇÏ¿© º¸¿© ÁØ´Ù. Ä¿½ºÅÒ ÄÁÆ®·ÑÀ̳ª ÀÏ¹Ý À©µµ¿ì¸¦ ÀÛ¼ºÇÒ ¶§µµ ÀÌ ±â¹ýÀ» Ȱ¿ëÇϸé Á¼Àº ȸ鿡 ¸¹Àº Á¤º¸¸¦ Ç¥ÇöÇϸ鼵µ ºÒÆíÇÏÁö ¾Ê°Ô ¸¸µé ¼ö ÀÖ´Ù.
Á¦ÀÚ¸® ÅøÆÁÀº ¿©·¯ °¡Áö ¹æ¹ýÀ¸·Î ±¸ÇöÇÒ ¼ö ÀÖÁö¸¸ Æ®·¡Å· ÅøÆÁÀ» »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå Æí¸®ÇÏ´Ù. ¿Ö³ÄÇÏ¸é Æ®·¡Å· ÅøÆÁÀº Á¤È®ÇÑ ÁÂÇ¥¿¡ ³õÀ» ¼ö ÀÖ°í ¶Ç ÅøÆÁ À§¿¡¼ Ä¿¼°¡ À̵¿Çصµ ÅøÆÁÀÌ »ç¶óÁöÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÀÏ¹Ý ÅøÆÁÀº ¸¶¿ì½º Ä¿¼°¡ À§·Î ¿Ã¶ó¿À¸é Áï½Ã »ç¶óÁöµµ·Ï µÇ¾î ÀÖ´Ù. Á¦ÀÚ¸® ÅøÆÁÀÇ ÅØ½ºÆ®´Â ¼±ÅÃÀÇ ¿©Áö ¾øÀÌ °¡·ÁÁö±â ÀüÀÇ Àüü ÅØ½ºÆ®À̹ǷΠ°í¹ÎÇÒ Çʿ䰡 ¾øÀ¸¸ç ÅøÆÁ Ãâ·Â ½ÃÁ¡°ú À§Ä¡¸¦ °áÁ¤ÇÏ´Â °ÍÀÌ ¹®Á¦´Ù.
¸ÕÀú Ãâ·Â ½ÃÁ¡Àº ÅØ½ºÆ® À§¿¡ Ä¿¼°¡ ÀÖ¾î¾ß Çϰí ÇØ´ç ÅØ½ºÆ®ÀÇ ÀϺΰ¡ Àß·Á¼ º¸ÀÌÁö ¾Ê´Â »óÅ¿©¾ß ÇÑ´Ù. ÅØ½ºÆ® À§¿¡ Ä¿¼°¡ ÀÖ´õ¶óµµ ÀüºÎ ´Ù º¸ÀÌ´Â »óȲ¿¡¼´Â Á¦ÀÚ¸® ÅøÆÁÀ» º¸¿©ÁÙ Çʿ䰡 ¾ø´Ù. ÀÌ °è»êÀ» À§Çؼ ÅØ½ºÆ®ÀÇ Ãâ·Â À§Ä¡¿Í Æø, ³ôÀÌ¿¡ ´ëÇÑ Á¤º¸¸¦ ¹Ì¸® °è»êÇØ ³õ¾Æ¾ß ÇÑ´Ù.
Ãâ·Â À§Ä¡´Â ÅØ½ºÆ® ¹Ù·Î À§°¡ µÇ¹Ç·Î ¾ÆÁÖ °£´ÜÇÒ °Í °°Áö¸¸ ¾à°£ÀÇ Á¶Á¤ÀÌ ÇÊ¿äÇÏ´Ù. ¿Ö³ÄÇϸé ÅøÆÁÀÇ À©µµ¿ì ¿µ¿ª°ú ÅØ½ºÆ® ¿µ¿ª°£¿¡´Â ¾à°£ÀÇ ¿ÀÂ÷°¡ Àֱ⠶§¹®ÀÌ´Ù. ÅØ½ºÆ® ÁÂÇ¥¿¡ ÅøÆÁ ÄÁÆ®·ÑÀ» ±×³É ³õÀ¸¸é ÅøÆÁ ÄÁÆ®·Ñ ³»¿¡¼ÀÇ °æ°è¼±°ú Åø ÅØ½ºÆ®¿ÍÀÇ ¿©¹é Â÷À̸¸Å ±ÛÀÚ°¡ ¿À¸¥ÂÊ ¾Æ·¡·Î À̵¿µÇ¾î º¸À̹ǷΠº°·Î ÁÁÁö ¾Ê´Ù. ¸¶Ä¡ Á¦ÀÚ¸® ÅøÆÁÀÌ ÅØ½ºÆ®¿Í °°Àº À§Ä¡¿¡¼ È®ÀåµÇ´Â °Íó·³ º¸ÀÌ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.
Á¤È®ÇÑ À§Ä¡ °è»êÀ» À§Çؼ´Â ÅøÆÁÀÇ ÅØ½ºÆ® ¿µ¿ªÀ» À©µµ¿ì ¿µ¿ªÀ¸·Î º¯È¯ÇØ¾ß Çϴµ¥ ÀÌ °è»êÀº ÅøÆÁÀÇ ¿©¹é ¼³Á¤À̳ª ÆùÆ® Å©±â µî¿¡ µû¶ó ´Þ¶óÁö¹Ç·Î ÀϹÝÀûÀÎ ±ÔÄ¢À» ã±â´Â ¾î·Æ´Ù. °æÇèÀûÀ¸·Î °è»êÇØ º¸¸é 2~3Çȼ¿ Á¤µµÀÇ Â÷À̰¡ ÀÖÀ¸¹Ç·Î ÀÌ °ªÀ» ¹Ù·Î Àû¿ëÇØµµ ÀÏ´ÜÀº ±¦Âú¾Æ º¸À̰ÚÁö¸¸ ½Ã½ºÅÛ ¼¼ÆÃ º¯°æ¿¡ ÀÇÇÑ ¹®Á¦ ¹ß»ýÀÇ ¼ÒÁö°¡ ÀÖ´Ù.
´ÙÇàÈ÷ ÀÌ °è»êÀº ÅøÆÁ ÄÁÆ®·ÑÀÌ ´ë½ÅÇØ Áִµ¥ TTM_ADJUSTRECT ¸Þ½ÃÁö¸¦ º¸³» ÁÖ¸é µÈ´Ù. wParamÀ¸·Î º¯È¯ ¹æ¹ýÀ» ÁöÁ¤Çϴµ¥ ÀÌ °ªÀÌ TRUEÀ̸é ÅØ½ºÆ® ¿µ¿ªÀ» À©µµ¿ì ¿µ¿ªÀ¸·Î º¯È¯Çϸç FALSEÀÌ¸é ¹Ý´ë·Î À©µµ¿ì ¿µ¿ªÀ» ÅØ½ºÆ® ¿µ¿ªÀ¸·Î º¯È¯ÇØ ÁØ´Ù. lParam¿¡´Â º¯È¯ÀüÀÇ ¿øº» RECT¸¦ ÁÖ¸ç º¯È¯µÈ °á°ú°¡ ÀÌ ±¸Á¶Ã¼·Î ´Ù½Ã ¸®ÅϵȴÙ. lParam¿¡ ÅØ½ºÆ® ¿µ¿ªÀ» ÁÖ°í wParam¿¡ TRUE¸¦ ÁÖ¸é º¯È¯µÈ À©µµ¿ì ¿µ¿ªÀÌ lParamÀ¸·Î ¸®ÅϵǴµ¥ ÀÌ ÁÂÇ¥¿¡ ÅøÆÁ ÄÁÆ®·ÑÀ» Ãâ·ÂÇϸé Á¤È®ÇÑ À§Ä¡ÀÌ´Ù. ÀÌ·ÐÀûÀÎ ¼³¸íÀº ¿©±â±îÁöÀ̰í ÀÌÁ¦ ¿¹Á¦¸¦ ¸¸µé¾î º¸°í ºÐ¼®ÇØ º¸ÀÚ.
#include <commctrl.h>
struct tag_Text
{
int x,y;
SIZE sz;
char *Text;
};
tag_Text arText[]={
{200,30,{0,0},"ÅøÆÁ"},
{200,50,{0,0},"Windows API ToolTip Control"},
{200,70,{0,0},"¾ÆÁÖ Á¤¸» ¹«Ã´ ¸Å¿ì ¸¹ÀÌ ±ä ÅØ½ºÆ®ÀÔ´Ï´Ù."},
{200,90,{0,0},"ÀÌ ¹®ÀåÀÇ ÀϺΰ¡ °¡·ÁÁö¸é Á¦ÀÚ¸® ÅøÆÁÀÌ À§¿¡ Ãâ·ÂµÇ¾î °¡·ÁÁø ÅØ½ºÆ®¸¦ º¸¿© ÁÝ´Ï´Ù."}
};
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
INITCOMMONCONTROLSEX iccex;
static HWND hTip;
TOOLINFO ti;
int i;
POINT pt;
RECT crt, trt;
switch(iMessage) {
case WM_CREATE:
iccex.dwICC=ICC_WIN95_CLASSES;
iccex.dwSize=sizeof(INITCOMMONCONTROLSEX);
InitCommonControlsEx(&iccex);
// ÅøÆÁ ÄÁÆ®·Ñ »ý¼º
hTip=CreateWindowEx(WS_EX_TOPMOST,TOOLTIPS_CLASS,NULL,0,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
hWnd,NULL,g_hInst,NULL);
// ½Ã½ºÅÛ ±Û²Ã·Î º¯°æ
SendMessage(hTip,WM_SETFONT,(WPARAM)(HFONT)GetStockObject(SYSTEM_FONT),0);
ti.cbSize=sizeof(TOOLINFO);
ti.uFlags=TTF_TRACK | TTF_ABSOLUTE;
ti.hwnd=hWnd;
ti.uId=0;
ti.lpszText="dummy";
SetRect(&ti.rect,0,0,0,0);
SendMessage(hTip,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);
// ÅØ½ºÆ®ÀÇ Å©±â °è»ê
hdc=GetDC(hWnd);
for (i=0;i<sizeof(arText)/sizeof(arText[0]);i++) {
GetTextExtentPoint32(hdc,arText[i].Text,lstrlen(arText[i].Text),&arText[i].sz);
}
ReleaseDC(hWnd,hdc);
return 0;
case WM_MOUSEMOVE:
// ÅØ½ºÆ® ¿µ¿ª ¾ÈÀÎÁö Á¶»ç
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
for (i=0;i<sizeof(arText)/sizeof(arText[0]);i++) {
if (pt.x > arText[i].x && pt.x < arText[i].x+arText[i].sz.cx &&
pt.y > arText[i].y && pt.y < arText[i].y+arText[i].sz.cy)
break;
}
ti.cbSize=sizeof(TOOLINFO);
ti.uFlags=0;
ti.hwnd=hWnd;
ti.uId=0;
// ¿µ¿ª ¹ÛÀ̸é ÅøÆÁ ¼û±è
if (i==sizeof(arText)/sizeof(arText[0])) {
SendMessage(hTip, TTM_TRACKACTIVATE,(WPARAM)FALSE,(LPARAM)&ti);
return 0;
}
// ¿µ¿ª ¾ÈÀÌ´õ¶óµµ À߸®Áö ¾Ê¾ÒÀ¸¸é »ó°ü¾ø´Ù.
GetClientRect(hWnd,&crt);
if (crt.right >= arText[i].x+arText[i].sz.cx &&
crt.bottom >= arText[i].y+arText[i].sz.cy) {
return 0;
}
// ÅØ½ºÆ® º¯°æ
ti.lpszText=arText[i].Text;
SendMessage(hTip,TTM_UPDATETIPTEXT,0,(LPARAM)&ti);
// À§Ä¡ Á¶Á¤
pt.x=arText[i].x;
pt.y=arText[i].y;
ClientToScreen(hWnd,&pt);
SetRect(&trt,pt.x,pt.y,pt.x+arText[i].sz.cx,pt.y+arText[i].sz.cy);
SendMessage(hTip,TTM_ADJUSTRECT,(WPARAM)TRUE,(LPARAM)&trt);
// ÅøÆÁ º¸ÀÓ
SendMessage(hTip,TTM_TRACKPOSITION,0,(LPARAM)MAKELPARAM(trt.left, trt.top));
SendMessage(hTip, TTM_TRACKACTIVATE,(WPARAM)TRUE,(LPARAM)&ti);
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
for (i=0;i<sizeof(arText)/sizeof(arText[0]);i++) {
TextOut(hdc,arText[i].x,arText[i].y,arText[i].Text,lstrlen(arText[i].Text));
}
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
±æÀ̰¡ °¢°¢ ´Ù¸¥ ¼¼ Á¾·ùÀÇ ¹®ÀÚ¿À» ¹èÄ¡ÇßÀ¸¸ç À©µµ¿ìÀÇ ÆøÀ» 450À¸·Î ÁöÁ¤ÇÏ¿© Àû´çÈ÷ ÅØ½ºÆ®°¡ À߸®µµ·Ï Çß´Ù. Àß·ÁÁø ÅØ½ºÆ® À§·Î Ä¿¼¸¦ À̵¿½ÃÄÑ º¸¸é Á¦ÀÚ¸® ÅøÆÁÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù. ¹«Á¶°Ç ³ªÅ¸³ª´Â °ÍÀº ¾Æ´Ï¸é ÅØ½ºÆ®°¡ Àß·ÁÁ® ÀÖÀ» ¶§¸¸ ³ªÅ¸³´Ù.
arText ¹è¿Àº Ãâ·ÂÇÒ ¹®ÀÚ¿°ú À§Ä¡, ±×¸®°í Å©±â°ªÀ» °¡Áö¸ç WM_PAINT ¸Þ½ÃÁö¿¡¼´Â ÀÌ ¹è¿ÀÇ ¹®ÀÚ¿À» ´Ü¼øÈ÷ Ãâ·ÂÇϱ⸸ ÇÑ´Ù.
WM_CREATE¿¡¼ ÅøÆÁ ÄÁÆ®·ÑÀ» »ý¼ºÇÏ°í ½Ã½ºÅÛ ÆùÆ®·Î º¯°æÇÑ´Ù. Á¦ÀÚ¸® ÅøÆÁÀº °¡·ÁÁø ÅøÀ» ´ë½Å º¸¿©ÁÖ´Â °ÍÀ̹ǷΠÆùÆ®°¡ µ¿ÀÏÇØ¾ß ÇÑ´Ù. ¹°·Ð ÅøÆÁ ÄÁÆ®·ÑÀÇ ÆùÆ®·Î ÅøÀ» Ãâ·ÂÇØµµ È¿°ú´Â µ¿ÀÏÇÒ °ÍÀÌ´Ù. Æ®·¡Å· ÅøÆÁÀ» »ý¼ºÇÏ°í °¢ ÅøÀÇ ¹®ÀÚ¿ Å©±â¸¦ ¹Ì¸® ±¸ÇØ ³õ´Â´Ù. ÀÌ °ªÀº ½Ç½Ã°£À¸·Î °è»êÇØµµ µÇÁö¸¸ ½Ã°£ÀÌ ¿À·¡ °É¸®¹Ç·Î ÃÖÃÊ Çѹø¸¸ ¹Ì¸® °è»êÇØ ³õ´Â °ÍÀÌ ÈξÀ ´õ À¯¸®ÇÏ´Ù.
WM_MOUSEMOVE¿¡¼´Â Ä¿¼ÀÇ À§Ä¡¸¦ º¸°í ÀÏ´Ü ÅØ½ºÆ® ¿µ¿ª ¾ÈÀÎÁö¸¦ Á¶»çÇÑ´Ù. ÅØ½ºÆ® ¿µ¿µ ¹Û¿¡ ÀÖÀ¸¸é ÅøÆÁÀ» ¼û±â°í ¸®ÅÏÇÑ´Ù. ¿µ¿ª ¾ÈÀÎ °æ¿ì´Â ´Ù½Ã ÀÌ ÅØ½ºÆ®°¡ Àß·ÁÁ® ÀÖ´ÂÁö Á¶»çÇϴµ¥ ÅØ½ºÆ®°¡ Ãâ·ÂµÈ ÀÛ¾÷ ¿µ¿ª ÁÂÇ¥¿Í ÅØ½ºÆ®ÀÇ ¿ìÇÏ´Ü ÁÂÇ¥¸¦ ºñ±³ÇØ º»´Ù. ÆøÀ̳ª ³ôÀÌ ¾î´ÀÂÊÀÌ¶óµµ ºÎÁ·Çϸé À߸° °ÍÀ̹ǷΠÀ̶§´Â Á¦ÀÚ¸® ÅøÆÁÀ» Ãâ·ÂÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é ±×³É ¸®ÅÏÇÑ´Ù.
ÅøÀÇ ¿ø·¡ ÅØ½ºÆ®·Î Åø ÅØ½ºÆ®¸¦ º¯°æÇϰí À§Ä¡¸¦ Á¶Á¤ÇÑ´Ù. À̶§ TTM_ADJUSTRECT ¸Þ½ÃÁö·Î ÅøÆÁÀÌ Ãâ·ÂµÉ À§Ä¡¸¦ Á¤È®ÇÏ°Ô Á¶Á¤Çϴµ¥ ÀÌ ¸Þ½ÃÁö°¡ ¾î¶² ¿ªÇÒÀ» ÇÏ´ÂÁö È®ÀÎÇØ º¸°í ½Í´Ù¸é ÀÌ ¸Þ½ÃÁö¸¦ º¸³»´Â Äڵ带 ÁÖ¼® ó¸®ÇÑ ÈÄ ºñ±³ÇØ º¸±â ¹Ù¶õ´Ù. ÅØ½ºÆ®¿Í Á¦ÀÚ¸® ÅøÆÁÀÇ À§Ä¡°¡ ¸ÂÁö ¾Ê¾Æ ¹«Ã´ º¸±â ½È¾îÁú °ÍÀÌ´Ù. ÅØ½ºÆ®¿Í À§Ä¡ Á¶Á¤±îÁö ³¡³µÀ¸¸é TTM_TRACKACTIVATE ¸Þ½ÃÁö¸¦ º¸³» ÅøÆÁ ÄÁÆ®·ÑÀ» Ãâ·ÂÇÑ´Ù.