ÅøÆÁÀÌ º¸¿©ÁÙ Åø ÅØ½ºÆ®´Â ÅøÀ» µî·ÏÇÒ ¶§ 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°ªÀ» ´ëÀÔÇØ ÁÖ¸é À̶§ ¼³Á¤µÈ ÅØ½ºÆ®¸¦ °íÁ¤ÇÏ°í ´Ù½Ã Áú¹®ÇÏÁö ¾Ê´Â´Ù. ÅëÁö ¸Þ½ÃÁö ó¸® ·çƾ¿¡¼ ´õ ÀÌ»ó ÅØ½ºÆ®°¡ º¯°æµÇÁö ¾ÊÀ» °Í °°À¸¸é ÀÌ Ç÷¡±×¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
ÅØ½ºÆ®¸¦ ½Ç½Ã°£À¸·Î º¯°æÇÏ´Â ¸î°¡Áö ¹æ¹ýÀ» º¸¿´´Âµ¥ ÀÌ ¿Ü¿¡µµ »óȲ¿¡ µû¶ó ÀûÀýÇÑ ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.