»ç.Á¦ÀÚ¸® ÅøÆÁ

Á¦ÀÚ¸® ÅøÆÁ(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 ¸Þ½ÃÁö¸¦ º¸³» ÅøÆÁ ÄÁÆ®·ÑÀ» Ãâ·ÂÇÑ´Ù.