📄 tooltips.c
字号:
case TTDT_INITIAL:
if(nTime < 0)
nTime = GetDoubleClickTime();
infoPtr->nInitialTime = nTime;
break;
default:
WARN("Invalid wParam %x\n", wParam);
break;
}
return 0;
}
static LRESULT
TOOLTIPS_SetMargin (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LPRECT lpRect = (LPRECT)lParam;
infoPtr->rcMargin.left = lpRect->left;
infoPtr->rcMargin.right = lpRect->right;
infoPtr->rcMargin.bottom = lpRect->bottom;
infoPtr->rcMargin.top = lpRect->top;
return 0;
}
inline static LRESULT
TOOLTIPS_SetMaxTipWidth (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
INT nTemp = infoPtr->nMaxTipWidth;
infoPtr->nMaxTipWidth = (INT)lParam;
return nTemp;
}
inline static LRESULT
TOOLTIPS_SetTipBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
infoPtr->clrBk = (COLORREF)wParam;
return 0;
}
inline static LRESULT
TOOLTIPS_SetTipTextColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
infoPtr->clrText = (COLORREF)wParam;
return 0;
}
static LRESULT
TOOLTIPS_SetTitleA (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LPCSTR pszTitle = (LPCSTR)lParam;
UINT_PTR uTitleIcon = (UINT_PTR)wParam;
UINT size;
TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_a(pszTitle),
(void*)uTitleIcon);
Free(infoPtr->pszTitle);
if (pszTitle)
{
size = sizeof(WCHAR)*MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, NULL, 0);
infoPtr->pszTitle = Alloc(size);
if (!infoPtr->pszTitle)
return FALSE;
MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, infoPtr->pszTitle, size/sizeof(WCHAR));
}
else
infoPtr->pszTitle = NULL;
if (uTitleIcon <= TTI_ERROR)
infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon];
else
infoPtr->hTitleIcon = CopyIcon((HICON)wParam);
return TRUE;
}
static LRESULT
TOOLTIPS_SetTitleW (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LPCWSTR pszTitle = (LPCWSTR)lParam;
UINT_PTR uTitleIcon = (UINT_PTR)wParam;
UINT size;
TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_w(pszTitle),
(void*)uTitleIcon);
Free(infoPtr->pszTitle);
if (pszTitle)
{
size = (strlenW(pszTitle)+1)*sizeof(WCHAR);
infoPtr->pszTitle = Alloc(size);
if (!infoPtr->pszTitle)
return FALSE;
memcpy(infoPtr->pszTitle, pszTitle, size);
}
else
infoPtr->pszTitle = NULL;
if (uTitleIcon <= TTI_ERROR)
infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon];
else
infoPtr->hTitleIcon = CopyIcon((HICON)wParam);
TRACE("icon = %p\n", infoPtr->hTitleIcon);
return TRUE;
}
static LRESULT
TOOLTIPS_SetToolInfoA (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
if (lpToolInfo == NULL)
return 0;
if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
return 0;
nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
if (nTool == -1) return 0;
TRACE("tool %d\n", nTool);
toolPtr = &infoPtr->tools[nTool];
/* copy tool data */
toolPtr->uFlags = lpToolInfo->uFlags;
toolPtr->hwnd = lpToolInfo->hwnd;
toolPtr->uId = lpToolInfo->uId;
toolPtr->rect = lpToolInfo->rect;
toolPtr->hinst = lpToolInfo->hinst;
if (IS_INTRESOURCE(lpToolInfo->lpszText)) {
TRACE("set string id %x\n", LOWORD(lpToolInfo->lpszText));
toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
}
else if (lpToolInfo->lpszText) {
if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA)
toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
else {
if ( (toolPtr->lpszText) &&
!IS_INTRESOURCE(toolPtr->lpszText) ) {
if( toolPtr->lpszText != LPSTR_TEXTCALLBACKW)
Free (toolPtr->lpszText);
toolPtr->lpszText = NULL;
}
if (lpToolInfo->lpszText) {
INT len = MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText,
-1, NULL, 0);
toolPtr->lpszText = Alloc (len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1,
toolPtr->lpszText, len);
}
}
}
if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA))
toolPtr->lParam = lpToolInfo->lParam;
return 0;
}
static LRESULT
TOOLTIPS_SetToolInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
if (lpToolInfo == NULL)
return 0;
if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
return 0;
nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
if (nTool == -1) return 0;
TRACE("tool %d\n", nTool);
toolPtr = &infoPtr->tools[nTool];
/* copy tool data */
toolPtr->uFlags = lpToolInfo->uFlags;
toolPtr->hwnd = lpToolInfo->hwnd;
toolPtr->uId = lpToolInfo->uId;
toolPtr->rect = lpToolInfo->rect;
toolPtr->hinst = lpToolInfo->hinst;
if (IS_INTRESOURCE(lpToolInfo->lpszText)) {
TRACE("set string id %x!\n", LOWORD(lpToolInfo->lpszText));
toolPtr->lpszText = lpToolInfo->lpszText;
}
else {
if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW)
toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
else {
if ( (toolPtr->lpszText) &&
!IS_INTRESOURCE(toolPtr->lpszText) ) {
if( toolPtr->lpszText != LPSTR_TEXTCALLBACKW)
Free (toolPtr->lpszText);
toolPtr->lpszText = NULL;
}
if (lpToolInfo->lpszText) {
INT len = lstrlenW (lpToolInfo->lpszText);
toolPtr->lpszText = Alloc ((len+1)*sizeof(WCHAR));
strcpyW (toolPtr->lpszText, lpToolInfo->lpszText);
}
}
}
if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW))
toolPtr->lParam = lpToolInfo->lParam;
if (infoPtr->nCurrentTool == nTool)
{
TOOLTIPS_GetTipText (hwnd, infoPtr, infoPtr->nCurrentTool);
if (infoPtr->szTipText[0] == 0)
TOOLTIPS_Hide(hwnd, infoPtr);
else
TOOLTIPS_Show (hwnd, infoPtr);
}
return 0;
}
static LRESULT
TOOLTIPS_TrackActivate (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
if ((BOOL)wParam) {
LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
if (lpToolInfo == NULL)
return 0;
if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
return FALSE;
/* activate */
infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
if (infoPtr->nTrackTool != -1) {
TRACE("activated!\n");
infoPtr->bTrackActive = TRUE;
TOOLTIPS_TrackShow (hwnd, infoPtr);
}
}
else {
/* deactivate */
TOOLTIPS_TrackHide (hwnd, infoPtr);
infoPtr->bTrackActive = FALSE;
infoPtr->nTrackTool = -1;
TRACE("deactivated!\n");
}
return 0;
}
static LRESULT
TOOLTIPS_TrackPosition (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
infoPtr->xTrackPos = (INT)LOWORD(lParam);
infoPtr->yTrackPos = (INT)HIWORD(lParam);
if (infoPtr->bTrackActive) {
TRACE("[%d %d]\n",
infoPtr->xTrackPos, infoPtr->yTrackPos);
TOOLTIPS_TrackShow (hwnd, infoPtr);
}
return 0;
}
static LRESULT
TOOLTIPS_Update (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
if (infoPtr->nCurrentTool != -1)
UpdateWindow (hwnd);
return 0;
}
static LRESULT
TOOLTIPS_UpdateTipTextA (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
if (lpToolInfo == NULL)
return 0;
if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
return FALSE;
nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
if (nTool == -1) return 0;
TRACE("tool %d\n", nTool);
toolPtr = &infoPtr->tools[nTool];
/* copy tool text */
toolPtr->hinst = lpToolInfo->hinst;
if (IS_INTRESOURCE(lpToolInfo->lpszText)){
toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
}
else if (lpToolInfo->lpszText) {
if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA)
toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
else {
if ( (toolPtr->lpszText) &&
!IS_INTRESOURCE(toolPtr->lpszText) ) {
if( toolPtr->lpszText != LPSTR_TEXTCALLBACKW)
Free (toolPtr->lpszText);
toolPtr->lpszText = NULL;
}
if (lpToolInfo->lpszText) {
INT len = MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText,
-1, NULL, 0);
toolPtr->lpszText = Alloc (len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1,
toolPtr->lpszText, len);
}
}
}
if(infoPtr->nCurrentTool == -1) return 0;
/* force repaint */
if (infoPtr->bActive)
TOOLTIPS_Show (hwnd, infoPtr);
else if (infoPtr->bTrackActive)
TOOLTIPS_TrackShow (hwnd, infoPtr);
return 0;
}
static LRESULT
TOOLTIPS_UpdateTipTextW (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
if (lpToolInfo == NULL)
return 0;
if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
if (nTool == -1)
return 0;
TRACE("tool %d\n", nTool);
toolPtr = &infoPtr->tools[nTool];
/* copy tool text */
toolPtr->hinst = lpToolInfo->hinst;
if (IS_INTRESOURCE(lpToolInfo->lpszText)){
toolPtr->lpszText = lpToolInfo->lpszText;
}
else if (lpToolInfo->lpszText) {
if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW)
toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
else {
if ( (toolPtr->lpszText) &&
!IS_INTRESOURCE(toolPtr->lpszText) ) {
if( toolPtr->lpszText != LPSTR_TEXTCALLBACKW)
Free (toolPtr->lpszText);
toolPtr->lpszText = NULL;
}
if (lpToolInfo->lpszText) {
INT len = lstrlenW (lpToolInfo->lpszText);
toolPtr->lpszText = Alloc ((len+1)*sizeof(WCHAR));
strcpyW (toolPtr->lpszText, lpToolInfo->lpszText);
}
}
}
if(infoPtr->nCurrentTool == -1) return 0;
/* force repaint */
if (infoPtr->bActive)
TOOLTIPS_Show (hwnd, infoPtr);
else if (infoPtr->bTrackActive)
TOOLTIPS_TrackShow (hwnd, infoPtr);
return 0;
}
static LRESULT
TOOLTIPS_WindowFromPoint (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
return (LRESULT)WindowFromPoint (*((LPPOINT)lParam));
}
static LRESULT
TOOLTIPS_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
{
TOOLTIPS_INFO *infoPtr;
/* allocate memory for info structure */
infoPtr = (TOOLTIPS_INFO *)Alloc (sizeof(TOOLTIPS_INFO));
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
/* initialize info structure */
infoPtr->bActive = TRUE;
infoPtr->bTrackActive = FALSE;
infoPtr->nMaxTipWidth = -1;
infoPtr->nTool = -1;
infoPtr->nCurrentTool = -1;
infoPtr->nTrackTool = -1;
/* initialize colours and fonts */
TOOLTIPS_InitSystemSettings(info
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -