¸¶.Äݹé Ç׸ñ

ÅøÆÁÀÌ º¸¿©ÁÙ Åø ÅØ½ºÆ®´Â ÅøÀ» µî·ÏÇÒ ¶§ TOOLINFO.lpszText·Î ÁöÁ¤ÇÑ´Ù. Áï, óÀ½ µî·ÏÇÒ ¶§ Åø ÅØ½ºÆ®°¡ °íÁ¤µÇ¸ç Åø¹ÙÀÇ ¹öưÀ̳ª ÄÁÆ®·Ñ¿¡ ´ëÇÑ ¼³¸íÀº º¸Åë ¹Ì¸® ÀÛ¼ºµÇ¾î ÀÖ´Â °ÍÀ̱⠶§¹®¿¡ ÀÌ·¸°Ô ÇØµµ ¹®Á¦°¡ ¾ø´Ù. ±×·¯³ª ÅøÆÁÀÌ º¸¿© ÁÖ´Â Á¤º¸°¡ Ç×»ó °íÁ¤µÈ ¼³¸íÀÎ °Í¸¸Àº ¾Æ´Ï¸ç ÇÁ·Î±×·¥ÀÇ ÇöÀç »óȲÀ̳ª ¼±ÅÃÇÑ ºÎºÐ¿¡ ´ëÇÑ ¼³¸í ¶Ç´Â ³×Æ®¿÷À» ÅëÇØ µé¾î¿À´Â ½Ç½Ã°£ Á¤º¸ÀÎ °æ¿ì´Â °íÁ¤ÀûÀÌÁö ¾Ê´Ù. ºñÁÖ¾ó C++ÀÇ µð¹ö±ë ÆÁÀ» º¸¿©ÁÖ´Â ÅøÆÁÀÇ °æ¿ì º¯¼ö À§¿¡¼­ º¯¼öÀÇ ÇöÀç°ªÀ» º¸¿©Áִµ¥ ÀÌ Á¤º¸µµ µð¹ö±ëÁß¿¡ ¼ö½Ã·Î º¯ÇÒ ¼ö ÀÖ´Â °ªÀ̸ç ÅøÀ» µî·ÏÇÒ ¶§ ¹Ì¸® ¾Ë ¼ö ÀÖ´Â °ÍÀÌ ¾Æ´Ï´Ù.

ÀÌ·± °¡º¯ÀûÀÎ Á¤º¸¸¦ ÅøÆÁÀ¸·Î º¸¿©ÁÖ±â À§Çؼ­´Â ÅøÀ» µî·ÏÇÑ ÈÄ¿¡ Åø ÅØ½ºÆ®¸¦ º¯°æÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÇÊ¿äÇѵ¥ À̶§ TTM_UPDATETIPTEXT¶ó´Â ¸Þ½ÃÁö¸¦ »ç¿ëÇÑ´Ù. ÀÌ ¸Þ½ÃÁöÀÇ lParamÀ¸·Î TOOLINFO ±¸Á¶Ã¼¸¦ Àü´ÞÇϴµ¥ cbSize´Â ¹Ýµå½Ã ±¸Á¶Ã¼ Å©±â°ªÀ¸·Î ÁöÁ¤ÇØ ÁÖ¾î¾ß Çϸç uFlags, hwnd, uId ¸â¹ö·Î ´ë»ó ÅøÀ» ÁöÁ¤ÇÑ´Ù. ´ë»ó ÅøÀÌ À©µµ¿ìÀ̸é uFlags¿¡ TTF_IDISHWND°ªÀ» ÁÖ¸ç ±×·¸Áö ¾ÊÀ¸¸é 0ÀÇ °ªÀ» ÁÖ¸é µÈ´Ù. ÅøÀ» µî·ÏÇÏ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î TTF_SUBCLASS Ç÷¡±×´Â ÁÙ Çʿ䰡 ¾ø´Ù.

lpszText ¸â¹ö¿¡´Â »õ·Î º¯°æÇÒ ¹®ÀÚ¿­À» Áִµ¥ ¸¸¾à ÀÌ ÅØ½ºÆ®°¡ ¹®ÀÚ¿­ ¸®¼Ò½º¿¡¼­ Àоî¿À´Â °ÍÀ̶ó¸é hinst¿¡´Â ¸®¼Ò½º¸¦ °¡Áø ÀνºÅϽº ÇÚµéÀ» Àü´ÞÇØ ÁÖ¾î¾ß ÇÏ¸ç ±×·¸Áö ¾Ê´Ù¸é hinst¿¡´Â NULLÀ» ´ëÀÔÇØ ÁØ´Ù. ÀÌ ¸Þ½ÃÁö¸¸ º¸³»ÁÖ¸é Áï½Ã Åø ÅØ½ºÆ®°¡ º¯°æµÇ¸ç ´ÙÀ½ ÅøÆÁÀÌ ³ªÅ¸³¯ ¶§ º¯°æµÈ ÅØ½ºÆ®°¡ ³ªÅ¸³­´Ù. ÀÌ ¸Þ½ÃÁö·Î ÇÊ¿äÇÒ ¶§ Åø ÅØ½ºÆ®¸¦ º¯°æÇϰųª ¾Æ´Ï¸é ¾Æ¿¹ Åø ÅØ½ºÆ®¸¦ ÄݹéÀ¸·Î µî·ÏÇÒ ¼öµµ ÀÖ´Ù.

Äݹé Ç׸ñÀ̶õ ÅøÆÁÀÌ ÅØ½ºÆ®¸¦ Ãâ·ÂÇϱâ Àü¿¡ ºÎ¸ð À©µµ¿ì¿¡°Ô ÅëÁö ¸Þ½ÃÁö¸¦ º¸³» Åø ÅØ½ºÆ®¸¦ Áú¹®ÇÏ°í ±× °á°ú¸¦ Ãâ·ÂÇÏ´Â °ÍÀÌ´Ù. Äݹé Ç׸ñÀº µî·ÏÇÒ ¶§ lpszText ¸â¹ö¿¡ LPSTR_TEXTCALLBACKÀ» ´ëÀÔÇØ ÁØ´Ù. ÅøÆÁÀº Äݹé Ç׸ñÀ» Ãâ·ÂÇϱâ Á÷Àü¿¡ TTN_GETDISPINFO ÅëÁö ¸Þ½ÃÁö¸¦ ºÎ¸ð À©µµ¿ì·Î º¸³» ÅøÀÇ ½ÇÁ¦ ÅØ½ºÆ®¸¦ ¹°¾îº»´Ù. ÅøÆÁµµ °øÅë ÄÁÆ®·ÑÀ̹ǷΠÀÌ ÅëÁö ¸Þ½ÃÁö´Â WM_NOTIFY ¸Þ½ÃÁö·Î Àü´ÞµÈ´Ù. ÀÌ ÅëÁö ¸Þ½ÃÁöÀÇ lParam¿¡´Â ´ÙÀ½ ±¸Á¶Ã¼°¡ Àü´ÞµÈ´Ù.

 

typedef struct tagNMTTDISPINFO {

    NMHDR      hdr;

    LPTSTR     lpszText;

    char       szText[80];

    HINSTANCE  hinst;

    UINT       uFlags;

#if (_WIN32_IE >= 0x0300)

    LPARAM     lParam;

#endif

} NMTTDISPINFO, FAR *LPNMTTDISPINFO;

 

uFlags, hdr.idFrom ¸â¹ö´Â ÅØ½ºÆ®¸¦ ¿äûÇÑ ÅøÀÌ ´©±¸Àΰ¡¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö¸ç uFlags¿¡ TTF_IDISHWND°¡ ÀÖÀ¸¸é hdr.idFromÀº À©µµ¿ì ÅøÀÌ¸ç ±×·¸Áö ¾ÊÀ¸¸é ÅøÀÇ IDÀÌ´Ù. ºÎ¸ð À©µµ¿ì´Â ¾î¶² Åø¿¡ ´ëÇÑ ¿äûÀΰ¡¸¦ ºÐ¼®ÇÑ ÈÄ lpszText, szText, hinst ¸â¹ö¿¡ °á°ú ÅØ½ºÆ®¸¦ ´ëÀÔÇØ ÁÖ¸é µÈ´Ù. ÅØ½ºÆ®°¡ 80ÀÚ ÀÌÇÏÀÎ °æ¿ì szText ¹öÆÛ¿¡ ÅØ½ºÆ®¸¦ º¹»çÇØ ÁÖ¸ç 80ÀÚ ÀÌ»óÀÎ °æ¿ì´Â lpszText¿¡ ¹®ÀÚ¿­ Æ÷ÀÎÅͳª ¸®¼Ò½ºÀÇ ID¸¦ Àü´ÞÇÑ´Ù. ¸®¼Ò½º IDÀÎ °æ¿ì hinst´Â ¸®¼Ò½º¸¦ °¡Áø ÀνºÅϽºÀÇ ÇÚµéÀÌ´Ù.

Âü°í·Î TTN_GETDISPINFO ÅëÁö ¸Þ½ÃÁö´Â TTN_NEEDTEXT¶ó´Â ´Ù¸¥ À̸§À¸·Îµµ Á¤ÀǵǾî ÀÖÀ¸¸ç NMTTDISPINFO ±¸Á¶Ã¼´Â ¶ÇÇÑ TOOLIPTEXT¶ó´Â ´Ù¸¥ À̸§À¸·Î Á¤ÀǵǾî ÀÖ´Ù. °øÅë ÄÁÆ®·ÑÀÇ ¸Þ½ÃÁö¿Í ±¸Á¶Ã¼ À̸§À» Àϰü¼ºÀÖ°Ô ÅëÇÕÇϱâ À§ÇØ À̸§ÀÌ º¯°æµÇ¾úÀ» »ÓÀÌ¸ç ½ÇÁ¦°ªÀº µ¿ÀÏÇÏ´Ù. TTN_GETDISPINFO, NMTTDISPINFO¶ó´Â »õ À̸§À» »ç¿ëÇÒ °ÍÀ» ±ÇÀåÇϰí ÀÖÁö¸¸ ¾ÆÁ÷µµ ¹®¼­ÀÇ ¸¹Àº ºÎºÐ¿¡ °ú°ÅÀÇ À̸§ÀÌ »ç¿ëµÇ°í ÀÖÀ¸¹Ç·Î ÀÌ À̸§µéµµ ÀÏ´Ü ¾Ë¾ÆµÎ±â ¹Ù¶õ´Ù. MFC ¼Ò½º´Â ¾ÆÁ÷µµ °ú°ÅÀÇ À̸§À¸·Î ÀÛ¼ºµÇ¾î ÀÖ´Ù.

±×·³ ÀÌÁ¦ ½ÇÇàÁß¿¡ ÅØ½ºÆ®¸¦ º¯°æÇÏ´Â ¿¹Á¦¸¦ ÀÛ¼ºÇØ º¸ÀÚ. °¡º¯ÀûÀÎ ÅØ½ºÆ®ÀÇ ¿¹´Â ¿©·¯ °¡Áö°¡ ÀÖ°ÚÁö¸¸ ÀÌ ¿¹Á¦¿¡¼­´Â ÇöÀç ½Ã°£°ªÀ» º¸¿© ÁÖ±â·Î ÇÑ´Ù. ¹°·Ð ÇÁ·Î±×·¥ »óȲ¿¡ µû¶ó ´Ù¸¥ ÇüÅÂÀÇ Á¤º¸¸¦ º¸¿©ÁÖ´Â °Íµµ ¾ó¸¶µçÁö °¡´ÉÇÏ´Ù. ¼¼°¡Áö ¹æ¹ýÀ¸·Î ÅØ½ºÆ®¸¦ º¯°æÇØ º¼ °ÍÀÌ´Ù.

 

#include <commctrl.h>

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT ps;

INITCOMMONCONTROLSEX iccex;

static HWND hTip, hBtn;

RECT rt1={300,50,500,150};

RECT rt2={550,50,750,150};

TOOLINFO ti;

SYSTEMTIME st;

char sTime[128];

LPNMHDR pNmHdr;

LPNMTTDISPINFO di;

 

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);

 

    hBtn=CreateWindow("button","¹öư",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

       50,50,200,100,hWnd,(HMENU)0,g_hInst,NULL);

 

    ti.cbSize=sizeof(TOOLINFO);

    ti.uFlags=TTF_SUBCLASS | TTF_IDISHWND;

    ti.hwnd=hWnd;

    ti.uId=(WPARAM)hBtn;

    ti.lpszText="empty";

    SendMessage(hTip,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);

 

    ti.uFlags=TTF_SUBCLASS;

    ti.hwnd=hWnd;

    ti.uId=0;

    ti.lpszText="empty";

    ti.rect=rt1;

    SendMessage(hTip,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);

 

    ti.uFlags=TTF_SUBCLASS;

    ti.hwnd=hWnd;

    ti.uId=1;

    ti.lpszText=LPSTR_TEXTCALLBACK;

    ti.rect=rt2;

    SendMessage(hTip,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);

 

    SetTimer(hWnd,0,1000,NULL);

    return 0;

case WM_TIMER:

    GetLocalTime(&st);

    wsprintf(sTime,"ÇöÀç½Ã°£ = %d:%d:%d",st.wHour,st.wMinute,st.wSecond);

    ti.cbSize=sizeof(TOOLINFO);

    ti.hwnd=hWnd;

    ti.uFlags=TTF_IDISHWND;

    ti.uId=(WPARAM)hBtn;

    ti.hinst=NULL;

    ti.lpszText=sTime;

    SendMessage(hTip,TTM_UPDATETIPTEXT,0,(LPARAM)&ti);

    return 0;

case WM_NOTIFY:

    pNmHdr=(LPNMHDR)lParam;

    if (pNmHdr->hwndFrom == hTip) {

       switch (pNmHdr->code) {

       case TTN_SHOW:

          GetLocalTime(&st);

          wsprintf(sTime,"%d¿ù %dÀÏ %d:%d:%d",st.wMonth, st.wDay,

             st.wHour,st.wMinute,st.wSecond);

          ti.cbSize=sizeof(TOOLINFO);

          ti.hwnd=hWnd;

          ti.uFlags=0;

          ti.uId=0;

          ti.hinst=NULL;

          ti.lpszText=sTime;

          SendMessage(hTip,TTM_UPDATETIPTEXT,0,(LPARAM)&ti);

          break;

       case TTN_GETDISPINFO:

          di=(LPNMTTDISPINFO)lParam;

          GetLocalTime(&st);

          wsprintf(sTime,"%d:%d:%d",st.wHour,st.wMinute,st.wSecond);

          // lstrcpy(di->szText,sTime);

          di->lpszText=sTime;

          di->hinst=NULL;

          break;

       }

    }

    return 0;

case WM_PAINT:

    hdc=BeginPaint(hWnd, &ps);

    Rectangle(hdc,rt1.left,rt1.top,rt1.right,rt1.bottom);

    SelectObject(hdc,GetStockObject(LTGRAY_BRUSH));

    Rectangle(hdc,rt2.left,rt2.top,rt2.right,rt2.bottom);

    EndPaint(hWnd, &ps);

    return 0;

case WM_DESTROY:

    KillTimer(hWnd,0);

    PostQuitMessage(0);

    return 0;

}

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

½ÇÇàÇØ º¸ÀÚ.

¹öư°ú µÎ °³ÀÇ »ç°¢ ¿µ¿ªÀÌ Àִµ¥ °¢ Åø À§¿¡ ¸¶¿ì½º¸¦ ¿Ã·Á ³õÀ¸¸é ÇöÀç ½Ã°£ÀÌ ÅøÆÁÀ¸·Î Ãâ·ÂµÉ °ÍÀÌ´Ù. ¼¼ ÅøÀº °¢°¢ ´Ù¸¥ ¹æ¹ýÀ¸·Î ½Ç½Ã°£ ÅØ½ºÆ®¸¦ ±¸ÇÑ´Ù. ¿ÞÂÊ ¹öưºÎÅÍ ¾î¶² ¹æ¹ýÀ» »ç¿ëÇß´ÂÁö ¼Ò½º¸¦ ºÐ¼®ÇØ º¸µµ·Ï ÇÏÀÚ.

 

1.ù¹øÂ° ¹æ¹ýÀº ŸÀ̸Ӹ¦ ¼³Ä¡ÇÑ ÈÄ ¸Å Áֱ⸶´Ù TTM_UPDATETPTEXT ¸Þ½ÃÁö·Î Åø ÅØ½ºÆ®¸¦ °­Á¦ º¯°æÇØ ÁÖ´Â ¹æ¹ýÀÌ´Ù. Áï ÅØ½ºÆ®°¡ º¯°æµÉ ½ÃÁ¡¿¡ ¹Ù·Î ¹Ù·Î Åø ÅØ½ºÆ®µµ °°ÀÌ º¯°æÇØ ÁÖ´Â ¹æ¹ýÀε¥ ÀÌ ÇÁ·Î±×·¥Àº ½Ã°£À» º¸¿©Áֱ⠶§¹®¿¡ ŸÀ̸Ӹ¦ »ç¿ëÇßÁö¸¸ ³×Æ®¿÷ Á¤º¸¶ó¸é ¼ÒÄÏ ÀÔ·Â ½ÃÁ¡¿¡, µ¥ÀÌÅÍ º£À̽ºÀÇ °ªÀ̶ó¸é Æ®¸®°Å¿¡¼­ ÅØ½ºÆ®¸¦ º¯°æÇØ ÁÖ¾î¾ß ÇÒ °ÍÀÌ´Ù. °­Á¦·Î Åø ÅØ½ºÆ®¸¦ º¯°æÇϹǷΠ½ÉÁö¾î ÅøÆÁÀÌ Ãâ·ÂµÇ¾î ÀÖ´Â »óÅ¿¡¼­µµ ½Ã°£ÀÌ °è¼Ó ¾÷µ¥ÀÌÆ®µÈ´Ù.

2.µÎ¹øÂ° ¹æ¹ýÀº ÅøÆÁÀÌ Ãâ·ÂµÇ±â Á÷ÀüÀÎ TTN_SHOW ÅëÁö ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ÅØ½ºÆ®¸¦ °è»êÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ ÅëÁö ¸Þ½ÃÁö´Â ÅøÆÁÀÌ È­¸éÀ¸·Î Ãâ·ÂµÇ±â Á÷Àü¿¡ º¸³»Áö¹Ç·Î À̶§ ÅØ½ºÆ®¸¦ ¹Ù²Ù¸é »õ·Î ´ëÀÔÇÑ ÅØ½ºÆ®°¡ Ãâ·ÂµÈ´Ù. ÅØ½ºÆ®¸¦ º¯°æÇÒ ¶§´Â ¹°·Ð TTM_UPDATETIPTEXT ¸Þ½ÃÁö¸¦ »ç¿ëÇÏ¿´´Ù. Ãâ·ÂµÇ±â Á÷Àü¿¡ Çѹø¸¸ ÅØ½ºÆ®¸¦ º¯°æÇÏ¹Ç·Î ÅøÆÁÀÌ Ãâ·ÂµÈ »óÅ¿¡¼­´Â ½Ã°£ÀÌ ¾÷µ¥ÀÌÆ®µÇÁö ¾Ê´Â´Ù.

3.ÅøÆÁÀ» Äݹé Ç׸ñÀ¸·Î µî·ÏÇϰí TTN_GETDISPINFO ÅëÁö ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ Åø ÅØ½ºÆ®¸¦ Á¶»çÇØÁØ´Ù. 80ÀÚ ÀÌÇÏÀÎ °æ¿ì szText ¹öÆÛ¿¡, 80ÀÚ ÀÌ»óÀÎ °æ¿ì lpszText ¸â¹ö¿¡ Æ÷ÀÎÅ͸¦ ´ëÀÔÇØ ÁÖ¸é µÇ´Âµ¥ ÀÌ °æ¿ì´Â 80ÀÚ ÀÌÇÏÀ̹ǷΠµÎ ¹æ¹ý ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹®ÀÚ¿­ ¸®¼Ò½ºµµ ¹°·Ð »ç¿ëÇÒ ¼ö ÀÖ´Ù. Äݹé Ç׸ñÀº ¸Å¹ø Ãâ·ÂÇϱâ Á÷Àü¿¡ ºÎ¸ð À©µµ¿ì¿¡°Ô ÅØ½ºÆ®¸¦ ¿ä±¸Çϴµ¥ NMTTDISPINFO.uFlags¿¡ TTF_DI_SETITEM°ªÀ» ´ëÀÔÇØ ÁÖ¸é À̶§ ¼³Á¤µÈ ÅØ½ºÆ®¸¦ °íÁ¤ÇÏ°í ´Ù½Ã Áú¹®ÇÏÁö ¾Ê´Â´Ù. ÅëÁö ¸Þ½ÃÁö ó¸® ·çƾ¿¡¼­ ´õ ÀÌ»ó ÅØ½ºÆ®°¡ º¯°æµÇÁö ¾ÊÀ» °Í °°À¸¸é ÀÌ Ç÷¡±×¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

 

ÅØ½ºÆ®¸¦ ½Ç½Ã°£À¸·Î º¯°æÇÏ´Â ¸î°¡Áö ¹æ¹ýÀ» º¸¿´´Âµ¥ ÀÌ ¿Ü¿¡µµ »óȲ¿¡ µû¶ó ÀûÀýÇÑ ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.