Changeset 282 for trunk/src/3rdparty/os2/xsystray
- Timestamp:
- Nov 3, 2009, 2:39:49 AM (16 years ago)
- Location:
- trunk/src/3rdparty/os2/xsystray
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/3rdparty/os2/xsystray/xsystray.c
r281 r282 75 75 #pragma hdrstop // VAC++ keeps crashing otherwise 76 76 77 // copy paste from helpers\comctl.h 78 // @todo not necessary when we become part of XWorkplace 79 80 #define TTN_NEEDTEXT 1000 81 #define TTN_SHOW 1001 82 #define TTN_POP 1002 83 84 #define TTFMT_PSZ 0x01 85 #define TTFMT_STRINGRES 0x02 86 87 typedef struct _TOOLTIPTEXT 88 { 89 HWND hwndTooltip; 90 HWND hwndTool; 91 ULONG ulFormat; 92 PSZ pszText; 93 HMODULE hmod; 94 ULONG idResource; 95 } TOOLTIPTEXT, *PTOOLTIPTEXT; 96 97 #define TTM_FIRST (WM_USER + 1000) 98 #define TTM_UPDATETIPTEXT (TTM_FIRST + 9) 99 #define TTM_SHOWTOOLTIPNOW (TTM_FIRST + 17) 100 77 101 // primitive debug logging to a file 78 102 #if 0 … … 123 147 PSZ pszToolTip; 124 148 // icon tooltip (NULL if none) 149 BOOL bIsToolTipShowing; 150 // whether the tooltip is currently shown 125 151 BOOL bMemoryPoolGiven; 126 152 // TRUE if SYSTRAYDATA::pvMemoryPool is already given to … … 150 176 size_t cIconsMax; 151 177 // maximum number of icons pIcons can fit 178 CHAR szToolTip[sizeof(((PSYSTRAYCTLDATA)0)->u.icon.szToolTip)]; 179 // "static" buffer for the tooltip (XCenter requirement) 152 180 PVOID pvMemoryPool; 153 181 // memory pool for NOTIFYDATA structures … … 207 235 INTCLASS_WIDGET_XSYSTRAY, // internal widget class name 208 236 HUMANSTR_WIDGET_XSYSTRAY, // widget class name displayed to user 209 WGTF_UNIQUEGLOBAL, // widget class flags 237 WGTF_UNIQUEGLOBAL | // widget class flags 238 WGTF_TOOLTIP, 210 239 NULL // no settings dialog 211 240 } … … 360 389 *pIdx = i; 361 390 return NULL; 391 } 392 393 /* 394 *@@ FindIconDataAtPt: 395 * Searches for the icon under the given point. 396 * Returns NULL if no icon found (e.g. the pad space). 397 * 398 * Refer to WgtPaint() for system tray geometry description. 399 */ 400 401 static 402 PICONDATA FindIconDataAtPt(PXCENTERWIDGET pWidget, 403 PPOINTL pptl, // point coordinates (relative to systray) 404 size_t *pIdx) // out: index of the icon in the icon array 405 // (optional, may be NULL) 406 { 407 PSYSTRAYDATA pSysTrayData = (PSYSTRAYDATA)pWidget->pUser; 408 409 SWP swp; 410 RECTL rcl; 411 BOOL bLeftToRight; 412 LONG y, lIconStep; 413 size_t i; 414 415 // start with invalid index index 416 if (pIdx) 417 *pIdx = pSysTrayData->cIcons; 418 419 WinQueryWindowPos(pWidget->hwndWidget, &swp); 420 WinQueryWindowRect(pWidget->pGlobals->hwndClient, &rcl); 421 422 y = (swp.cy - pSysTrayData->lIconHeight) / 2; 423 if (pptl->y < y || pptl->y >= y + pSysTrayData->lIconHeight) 424 return NULL; // hit pad space 425 426 // detect the direction 427 bLeftToRight = swp.x + swp.cx / 2 < (rcl.xRight / 2); 428 429 lIconStep = pSysTrayData->lIconWidth + pSysTrayData->lIconPad; 430 431 // which icon is that? 432 if (bLeftToRight) 433 { 434 i = pptl->x / lIconStep; 435 if (pptl->x % lIconStep < pSysTrayData->lIconPad) 436 return NULL; // hit pad space 437 } 438 else 439 { 440 i = (swp.cx - pptl->x - 1) / lIconStep; 441 if ((swp.cx - pptl->x - 1) % lIconStep < pSysTrayData->lIconPad) 442 return NULL; // hit pad space 443 } 444 if (i >= pSysTrayData->cIcons) 445 return NULL; // hit pad space 446 447 if (pIdx) 448 *pIdx = i; 449 return &pSysTrayData->pIcons[i]; 450 } 451 452 static 453 VOID FreeSysTrayData(PSYSTRAYDATA pSysTrayData) 454 { 455 // destroy the server 456 if (pSysTrayData->hwndServer != NULLHANDLE) 457 { 458 WinDestroyWindow(pSysTrayData->hwndServer); 459 pSysTrayData->hwndServer = NULLHANDLE; 460 } 461 462 // free all system tray data 463 if (pSysTrayData->pvMemoryPool) 464 { 465 DosFreeMem(pSysTrayData->pvMemoryPool); 466 } 467 if (pSysTrayData->pIcons) 468 { 469 size_t i; 470 for (i = 0; i < pSysTrayData->cIcons; ++i) 471 FreeIconData(&pSysTrayData->pIcons[i]); 472 pSysTrayData->cIcons = 0; 473 free(pSysTrayData->pIcons); 474 pSysTrayData->pIcons = NULL; 475 } 476 477 free(pSysTrayData); 362 478 } 363 479 … … 558 674 break; 559 675 560 } // end switch (usNotifyCode) 561 } // end if (usID == ID_XCENTER_CLIENT) 676 } 677 } 678 else if (usID == ID_XCENTER_TOOLTIP) 679 { 680 PICONDATA pIconData; 681 POINTL ptl; 682 683 WinQueryMsgPos(pWidget->habWidget, &ptl); 684 // make the coordinates systray-relative 685 WinMapWindowPoints(HWND_DESKTOP, pWidget->hwndWidget, &ptl, 1); 686 687 pIconData = FindIconDataAtPt(pWidget, &ptl, NULL); 688 689 switch (usNotifyCode) 690 { 691 case TTN_NEEDTEXT: 692 { 693 LOGF(("TTN_NEEDTEXT\n")); 694 695 PTOOLTIPTEXT pttt = (PTOOLTIPTEXT)mp2; 696 pttt->ulFormat = TTFMT_PSZ; 697 698 if (!pIconData || !pIconData->pszToolTip) 699 pttt->pszText = NULL; 700 else 701 { 702 strncpy(pSysTrayData->szToolTip, pIconData->pszToolTip, 703 sizeof(pSysTrayData->szToolTip) - 1); 704 // be on the safe side 705 pSysTrayData->szToolTip[sizeof(pSysTrayData->szToolTip) - 1] = '\0'; 706 707 pttt->pszText = pSysTrayData->szToolTip; 708 } 709 710 LOGF((" pszText '%s'\n", pttt->pszText)); 711 } 712 break; 713 714 case TTN_SHOW: 715 if (pIconData) 716 pIconData->bIsToolTipShowing = TRUE; 717 break; 718 719 case TTN_POP: 720 if (pIconData) 721 pIconData->bIsToolTipShowing = FALSE; 722 break; 723 } 724 } 562 725 563 726 return brc; … … 571 734 * the XCenter's center, icons go left to right. Otherwise, they go right 572 735 * to left. 736 * 737 * NOTE: This function must be keept in sync with FindIconDataAtPt() in 738 * terms of system tray geometry. 573 739 */ 574 740 /* … … 695 861 696 862 POINTL ptl; 697 SWP swp;698 RECTL rcl;699 BOOL bLeftToRight;700 LONG y, lIconStep;701 size_t i;702 863 703 864 PICONDATA pIconData; … … 709 870 LOGF(("msg %x ptl %ld,%ld\n", msg, ptl.x, ptl.y)); 710 871 711 WinQueryWindowPos(hwnd, &swp); 712 WinQueryWindowRect(pWidget->pGlobals->hwndClient, &rcl); 713 714 y = (swp.cy - pSysTrayData->lIconHeight) / 2; 715 if (ptl.y < y || ptl.y >= y + pSysTrayData->lIconHeight) 872 pIconData = FindIconDataAtPt(pWidget, &ptl, NULL); 873 if (!pIconData) 716 874 return FALSE; // hit pad space 717 718 // detect the direction719 bLeftToRight = swp.x + swp.cx / 2 < (rcl.xRight / 2);720 721 lIconStep = pSysTrayData->lIconWidth + pSysTrayData->lIconPad;722 723 // which icon is that?724 if (bLeftToRight)725 {726 i = ptl.x / lIconStep;727 if (ptl.x % lIconStep < pSysTrayData->lIconPad)728 return FALSE; // hit pad space729 }730 else731 {732 i = (swp.cx - ptl.x - 1) / lIconStep;733 if ((swp.cx - ptl.x - 1) % lIconStep < pSysTrayData->lIconPad)734 return FALSE; // hit pad space735 }736 if (i >= pSysTrayData->cIcons)737 return FALSE; // hit pad space738 739 pIconData = &pSysTrayData->pIcons[i];740 875 741 876 LOGF(("hwnd %x\n", pIconData->hwnd)); … … 785 920 786 921 return TRUE; 787 }788 789 static790 VOID FreeSysTrayData(PSYSTRAYDATA pSysTrayData)791 {792 // destroy the server793 if (pSysTrayData->hwndServer != NULLHANDLE)794 {795 WinDestroyWindow(pSysTrayData->hwndServer);796 pSysTrayData->hwndServer = NULLHANDLE;797 }798 799 // free all system tray data800 if (pSysTrayData->pvMemoryPool)801 {802 DosFreeMem(pSysTrayData->pvMemoryPool);803 }804 if (pSysTrayData->pIcons)805 {806 size_t i;807 for (i = 0; i < pSysTrayData->cIcons; ++i)808 FreeIconData(&pSysTrayData->pIcons[i]);809 pSysTrayData->cIcons = 0;810 free(pSysTrayData->pIcons);811 pSysTrayData->pIcons = NULL;812 }813 814 free(pSysTrayData);815 922 } 816 923 … … 1101 1208 1102 1209 LOGF(("SYSTRAYCMD_ADDICON\n")); 1103 LOGF((" hwnd %x\n", pCtlData->hwndSender)); 1104 LOGF((" usId %d\n", pCtlData->u.icon.usId)); 1105 LOGF((" hIcon %x\n", pCtlData->u.icon.hIcon)); 1210 LOGF((" hwnd %x\n", pCtlData->hwndSender)); 1211 LOGF((" usId %d\n", pCtlData->u.icon.usId)); 1212 LOGF((" hIcon %x\n", pCtlData->u.icon.hIcon)); 1213 LOGF((" szToolTip '%s'\n", pCtlData->u.icon.szToolTip)); 1106 1214 1107 1215 pCtlData->bAcknowledged = TRUE; … … 1120 1228 if (pData) 1121 1229 { 1122 LOGF((" Updating hIcon %x\n", hIcon)); 1123 1230 LOGF((" Replacing with hIcon %x\n", hIcon)); 1231 1232 // try update the tooltip first 1233 free(pData->pszToolTip); 1234 pData->pszToolTip = NULL; 1235 if (pCtlData->u.icon.szToolTip[0] != '\0') 1236 { 1237 pData->pszToolTip = strdup(pCtlData->u.icon.szToolTip); 1238 if (!pData->pszToolTip) 1239 { 1240 WinDestroyPointer(hIcon); 1241 break; 1242 } 1243 } 1244 1245 if (pData->bIsToolTipShowing) 1246 { 1247 if (pData->pszToolTip) 1248 // update the tooltip on screen 1249 WinSendMsg(pWidget->pGlobals->hwndTooltip, 1250 TTM_UPDATETIPTEXT, 1251 (MPARAM)pData->pszToolTip, 0); 1252 else 1253 // hide the tooltip 1254 WinSendMsg(pWidget->pGlobals->hwndTooltip, 1255 TTM_SHOWTOOLTIPNOW, 1256 (MPARAM)FALSE, 0); 1257 } 1258 1259 // now update the icon 1124 1260 WinDestroyPointer(pData->hIcon); 1125 1261 pData->hIcon = hIcon; … … 1156 1292 1157 1293 i = pSysTrayData->cIcons; 1158 ++pSysTrayData->cIcons;1159 1294 1160 1295 pData = &pSysTrayData->pIcons[i]; … … 1166 1301 pData->ulMsgId = pCtlData->u.icon.ulMsgId; 1167 1302 1303 if (pCtlData->u.icon.szToolTip[0] != '\0') 1304 { 1305 pData->pszToolTip = strdup(pCtlData->u.icon.szToolTip); 1306 if (!pData->pszToolTip) 1307 { 1308 WinDestroyPointer(hIcon); 1309 break; 1310 } 1311 } 1312 1168 1313 WgtXSysTrayUpdateAfterIconAddRemove(pWidget); 1314 1315 ++pSysTrayData->cIcons; 1169 1316 1170 1317 xrc = XST_OK; 1171 1318 } 1319 } 1320 break; 1321 1322 case SYSTRAYCMD_REPLACEICON: 1323 { 1324 POINTERINFO Info; 1325 HPOINTER hIcon = NULLHANDLE; 1326 size_t i; 1327 PICONDATA pData; 1328 1329 LOGF(("SYSTRAYCMD_REPLACEICON\n")); 1330 LOGF((" hwnd %x\n", pCtlData->hwndSender)); 1331 LOGF((" usId %d\n", pCtlData->u.icon.usId)); 1332 1333 pCtlData->bAcknowledged = TRUE; 1334 1335 // make a private copy of the provided icon (it will get lost after 1336 // we return from this message) 1337 brc = WinQueryPointerInfo(pCtlData->u.icon.hIcon, &Info); 1338 if (!brc) 1339 break; 1340 hIcon = WinCreatePointerIndirect(HWND_DESKTOP, &Info); 1341 if (hIcon == NULLHANDLE) 1342 break; 1343 1344 pData = FindIconData(pSysTrayData, pCtlData->hwndSender, 1345 pCtlData->u.icon.usId, &i); 1346 if (pData) 1347 { 1348 LOGF((" Replacing with hIcon %x\n", hIcon)); 1349 1350 WinDestroyPointer(pData->hIcon); 1351 pData->hIcon = hIcon; 1352 pData->ulMsgId = pCtlData->u.icon.ulMsgId; 1353 1354 // we didn't change the number of icons so simply invalidate 1355 WinInvalidateRect(pWidget->hwndWidget, NULL, FALSE); 1356 1357 xrc = XST_OK; 1358 } 1359 else 1360 LOGF((" Icon not found!\n")); 1172 1361 } 1173 1362 break; … … 1201 1390 1202 1391 WgtXSysTrayUpdateAfterIconAddRemove(pWidget); 1392 1393 xrc = XST_OK; 1394 } 1395 else 1396 LOGF((" Icon not found!\n")); 1397 } 1398 break; 1399 1400 case SYSTRAYCMD_SETTOOLTIP: 1401 { 1402 size_t i; 1403 PICONDATA pData; 1404 1405 LOGF(("SYSTRAYCMD_SETTOOLTIP\n")); 1406 LOGF((" hwnd %x\n", pCtlData->hwndSender)); 1407 LOGF((" usId %d\n", pCtlData->u.icon.usId)); 1408 1409 pCtlData->bAcknowledged = TRUE; 1410 1411 pData = FindIconData(pSysTrayData, pCtlData->hwndSender, 1412 pCtlData->u.icon.usId, &i); 1413 if (pData) 1414 { 1415 LOGF((" Replacing with szToolTip '%s'\n", 1416 pCtlData->u.icon.szToolTip)); 1417 1418 free(pData->pszToolTip); 1419 pData->pszToolTip = NULL; 1420 if (pCtlData->u.icon.szToolTip[0] != '\0') 1421 { 1422 pData->pszToolTip = strdup(pCtlData->u.icon.szToolTip); 1423 if (!pData->pszToolTip) 1424 break; 1425 } 1426 1427 if (pData->bIsToolTipShowing) 1428 { 1429 if (pData->pszToolTip) 1430 // update the tooltip on screen 1431 WinSendMsg(pWidget->pGlobals->hwndTooltip, 1432 TTM_UPDATETIPTEXT, 1433 (MPARAM)pData->pszToolTip, 0); 1434 else 1435 // hide the tooltip 1436 WinSendMsg(pWidget->pGlobals->hwndTooltip, 1437 TTM_SHOWTOOLTIPNOW, 1438 (MPARAM)FALSE, 0); 1439 } 1203 1440 1204 1441 xrc = XST_OK; -
trunk/src/3rdparty/os2/xsystray/xsystray.h
r281 r282 47 47 SYSTRAYCMD_GETVERSION, 48 48 SYSTRAYCMD_ADDICON, 49 SYSTRAYCMD_REPLACEICON, 49 50 SYSTRAYCMD_REMOVEICON, 50 51 SYSTRAYCMD_SETTOOLTIP, … … 74 75 // command to execute, must always be set 75 76 HWND hwndSender; 76 // sender window, a must for SYSTRAYCMD_ADDICON, REMOVEICON,77 // SETTOOLTIP, SHOWBALLOON,HIDEBALLOON77 // sender window, a must for SYSTRAYCMD_ADDICON, _CHANGEICON, 78 // _REMOVEICON, _SETTOOLTIP, _SHOWBALLOON, _HIDEBALLOON 78 79 union 79 80 { … … 90 91 USHORT usId; 91 92 HPOINTER hIcon; 93 CHAR szToolTip[512]; 92 94 ULONG ulMsgId; 93 95 } icon; 94 // used by SYSTRAYCMD_ADDICON, SYSTRAYCMD_REMOVEICON 95 96 struct 97 { 98 USHORT usId; 99 CHAR szText[512]; 100 } tooltip; 101 96 // used by SYSTRAYCMD_ADDICON, _CHANGEICON, _REMOVEICON, _SETTOOLTIP 102 97 } u; 103 98 -
trunk/src/3rdparty/os2/xsystray/xsystray_api.c
r281 r282 316 316 * Mouse wheel event in the icon area. param2 is a pointer to the 317 317 * XSTWHEELTMSG structure containing full message details. 318 * 319 * NOTE: The maximum tooltip text length (including terminating null) is 320 * limited to a value returned by xstGetSysTrayMaxTextLen(). If the 321 * supplied string is longer, it will be truncated. 318 322 */ 319 323 … … 321 325 USHORT usId, // in: icon ID to add 322 326 HPOINTER hIcon, // in: icon handle 327 PCSZ pcszToolTip,// in: tooltip text 323 328 ULONG ulMsgId, // in: message ID for notifications 324 329 ULONG ulFlags) // in: flags (not currently used, must be 0) … … 366 371 pData->ulCommand = SYSTRAYCMD_ADDICON; 367 372 pData->hwndSender = hwnd; 373 368 374 pData->u.icon.usId = usId; 369 375 pData->u.icon.hIcon = hIcon; 370 376 pData->u.icon.ulMsgId = ulMsgId; 377 378 if (!pcszToolTip) 379 pData->u.icon.szToolTip[0] = '\0'; 380 else 381 { 382 strncpy(pData->u.icon.szToolTip, pcszToolTip, 383 sizeof(pData->u.icon.szToolTip) - 1); 384 // be on the safe side 385 pData->u.icon.szToolTip[sizeof(pData->u.icon.szToolTip) - 1] = '\0'; 386 } 371 387 372 388 xrc = SendSysTrayCtlMsg(pData); … … 425 441 426 442 /* 443 *@@ xstReplaceSysTrayIcon: 444 * 445 * Replaces the existing icon previously added by xstAddSysTrayIcon() with 446 * a new icon. 447 * 448 * Returns TRUE on success and FALSE otherwise. 449 */ 450 451 BOOL xstReplaceSysTrayIcon(HWND hwnd, // in: window handle associated with the icon 452 USHORT usId, // in: icon ID to change 453 HPOINTER hIcon) // in: new icon handle 454 { 455 BOOL brc; 456 PPIB ppib; 457 458 PSYSTRAYCTLDATA pData = AllocSysTrayCtlDataPtr(); 459 if (!pData) 460 return FALSE; 461 462 // give all processes temporary access to hIcon 463 brc = WinSetPointerOwner(hIcon, 0, FALSE); 464 if (brc) 465 { 466 pData->ulCommand = SYSTRAYCMD_REPLACEICON; 467 pData->hwndSender = hwnd; 468 469 pData->u.icon.usId = usId; 470 pData->u.icon.hIcon = hIcon; 471 472 brc = SendSysTrayCtlMsg(pData) == XST_OK; 473 474 // revoke temporary access to hIcon 475 DosGetInfoBlocks(NULL, &ppib); 476 WinSetPointerOwner(hIcon, ppib->pib_ulpid, TRUE); 477 } 478 479 FreeSysTrayCtlDataPtr(pData); 480 481 return brc; 482 } 483 484 /* 427 485 *@@ xstRemoveSysTrayIcon: 428 486 * … … 498 556 */ 499 557 500 BOOL xstSetSysTrayIconToolTip(HWND hwnd, // in: window handle associated with the icon501 USHORT usId, // in: icon ID to set the tooltip for502 P SZ pszText)// in: tooltip text558 BOOL xstSetSysTrayIconToolTip(HWND hwnd, // in: window handle associated with the icon 559 USHORT usId, // in: icon ID to set the tooltip for 560 PCSZ pcszToolTip) // in: tooltip text 503 561 { 504 562 BOOL brc; … … 509 567 pData->ulCommand = SYSTRAYCMD_SETTOOLTIP; 510 568 pData->hwndSender = hwnd; 511 pData->u.tooltip.usId = usId; 512 513 if (pszText == NULL) 514 pData->u.tooltip.szText[0] = '\0'; 569 pData->u.icon.usId = usId; 570 571 572 if (!pcszToolTip) 573 pData->u.icon.szToolTip[0] = '\0'; 515 574 else 516 575 { 517 strncpy(pData->u. tooltip.szText, pszText,518 sizeof(pData->u. tooltip.szText) - 1);576 strncpy(pData->u.icon.szToolTip, pcszToolTip, 577 sizeof(pData->u.icon.szToolTip) - 1); 519 578 // be on the safe side 520 pData->u. tooltip.szText[sizeof(pData->u.tooltip.szText) - 1] = '\0';579 pData->u.icon.szToolTip[sizeof(pData->u.icon.szToolTip) - 1] = '\0'; 521 580 } 522 581 … … 528 587 } 529 588 530 BOOL xstShowSysTrayIconBalloon(HWND hwnd, USHORT usId, P SZ pszTitle, PSZ pszText,531 ULONG ulFlags, ULONG ulTimeout)589 BOOL xstShowSysTrayIconBalloon(HWND hwnd, USHORT usId, PCSZ pcszTitle, 590 PCSZ pcszText, ULONG ulFlags, ULONG ulTimeout) 532 591 { 533 592 // @todo implement … … 595 654 ULONG xstGetSysTrayMaxTextLen() 596 655 { 597 return sizeof(((PSYSTRAYCTLDATA)0)->u. tooltip.szText);598 } 599 656 return sizeof(((PSYSTRAYCTLDATA)0)->u.icon.szToolTip); 657 } 658 -
trunk/src/3rdparty/os2/xsystray/xsystray_api.h
r280 r282 76 76 77 77 BOOL xstQuerySysTrayVersion(PULONG pulMajor, PULONG pulMinor, PULONG pulRevision); 78 BOOL xstAddSysTrayIcon(HWND hwnd, USHORT usId, HPOINTER hIcon, ULONG ulMsgId, 79 ULONG ulFlags); 78 BOOL xstAddSysTrayIcon(HWND hwnd, USHORT usId, HPOINTER hIcon, PCSZ pcszToolTip, 79 ULONG ulMsgId, ULONG ulFlags); 80 BOOL xstReplaceSysTrayIcon(HWND hwnd, USHORT usId, HPOINTER hIcon); 80 81 BOOL xstRemoveSysTrayIcon(HWND hwnd, USHORT usId); 81 BOOL xstSetSysTrayIconToolTip(HWND hwnd, USHORT usId, P SZ pszText);82 BOOL xstShowSysTrayIconBalloon(HWND hwnd, USHORT usId, P SZ pszTitle, PSZ pszText,83 ULONG ulFlags, ULONG ulTimeout);82 BOOL xstSetSysTrayIconToolTip(HWND hwnd, USHORT usId, PCSZ pcszToolTip); 83 BOOL xstShowSysTrayIconBalloon(HWND hwnd, USHORT usId, PCSZ pcszTitle, 84 PCSZ pcszText, ULONG ulFlags, ULONG ulTimeout); 84 85 BOOL xstHideSysTrayIconBalloon(HWND hwnd, USHORT usId); 85 86
Note:
See TracChangeset
for help on using the changeset viewer.