Win32 SDK Gui编程系列之--工具提示ToolTip

33 篇文章 1 订阅
32 篇文章 1 订阅

1.工具提示(ToolTip)

在HTML中添加链接和按钮等工具提示时,只需添加title属性,如下所示即可。

<a href="windows/commctrl/tooltips01.html" title="工具提示ToolTip</a>

<input type="submit" value="検索" style="width:30px; height:20px"
 title="搜索无需输入,点击搜索按钮,在下一个画面上输入搜索词"/>

在Windows编程中,在按钮等各种控件上添加工具提示并不是那么简单。

在标签控件和工具栏上添加工具提示的方法在各个页面上都有显示。

这里介绍更通用的方法。

2.在按钮上贴上工具提示。

调查了标签控制和工具栏等方法是否也不能用于按钮控制,但是没有找到。

在下面的程序中显示了在按钮上添加工具提示的方法。这是Tooltips也作为一个窗口用CreateWindowEx函数生成的。(工具提示是普通控制之一。)

将显示的字符串和鼠标光标进入哪个区域时显示工具提示等信息设置为TOOLINFO结构体,用SendMessage函数设置为工具提示窗口。

Tooltips01.c

#include <windows.h>
#include <commctrl.h>
#pragma  comment(lib, "comctl32.lib")

void onCreate(HWND hWnd, LPARAM lp) {
    HWND hBtn = CreateWindowEx(0, "BUTTON", "BTN", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                   0, 0, 100, 30, hWnd, (HMENU)777, ((CREATESTRUCT*)lp)->hInstance, NULL);
    HWND hTool = CreateWindowEx(0, TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP, 
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		hBtn, NULL, ((CREATESTRUCT*)lp)->hInstance, NULL);
    TOOLINFO ti = { sizeof(TOOLINFO), TTF_SUBCLASS, hBtn };
    ti.lpszText = "按钮";
    GetClientRect(hBtn, &ti.rect);
    SendMessage(hTool, TTM_ADDTOOL, 0, (LPARAM)&ti);
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
      case WM_CREATE: onCreate(hwnd, lParam); break;
      case WM_DESTROY: PostQuitMessage(0); break;
      default: return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
    MSG msg;
    WNDCLASS wc = { 0, WindowProc, 0, 0, hInst, NULL, LoadCursor(NULL,IDC_ARROW),
		    (HBRUSH)(COLOR_WINDOW+1), NULL, "mh" };
    if (!RegisterClass(&wc)) return FALSE;
    InitCommonControls();
    if (!CreateWindowEx(0, "mh", "ToolTips", WS_OVERLAPPEDWINDOW|WS_VISIBLE,
	 	100, 100, 350, 100, NULL, NULL, hInst, NULL)) return FALSE;
    while (GetMessage(&msg,NULL,0,0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

d87d44c7b9834c599ae5b93264186ef4.png

工具提示hTool的父窗口将hBtn变更为hWnd也没有问题。但是,如果把ti.hwnd换成hWnd的话,就不会显示工具提示。
将鼠标光标放在按钮上,鼠标光标的信息会发送到按钮控制hBtn。SendMessage(hTool, TTM_ADDTOOL, 0, (LPARAM)&ti); 进行按钮控制的子类化,工具提示接收鼠标光标的信息。

因此,ti.hwnd不能用hWnd,必须是hBtn。

2.在任意区域设置工具提示。

不是控件或子窗口,而是可以在主窗口的特定区域设置工具提示。节目示例如下所示。

#include <windows.h>
#include <commctrl.h>
#pragma  comment(lib, "comctl32.lib")

RECT rc = { 10, 5, 100, 30 };	// 设置工具提示的矩形区域
void onCreate(HWND hWnd, LPARAM lp) {
    HWND hTool = CreateWindowEx(0, TOOLTIPS_CLASS, NULL, WS_POPUP|TTS_ALWAYSTIP, 
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                hWnd, NULL, ((CREATESTRUCT*)lp)->hInstance, NULL);
    TOOLINFO ti = { sizeof(TOOLINFO), TTF_SUBCLASS, hWnd };
    ti.lpszText = "按钮";
    ti.rect = rc;
    SendMessage(hTool, TTM_ADDTOOL, 0, (LPARAM)&ti);
}

void onPaint(HWND hWnd) {
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);
    DrawFocusRect(hdc, &rc);
    EndPaint(hWnd, &ps);
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
      case WM_CREATE: onCreate(hwnd, lParam); break;
      case WM_PAINT: onPaint(hwnd); break;
      case WM_DESTROY: PostQuitMessage(0); break;
      default: return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
    MSG msg;
    WNDCLASS wc = { 0, WindowProc, 0, 0, hInst, NULL, LoadCursor(NULL,IDC_ARROW),
                    (HBRUSH)(COLOR_WINDOW+1), NULL, "mh" };
    if (!RegisterClass(&wc)) return FALSE;
    InitCommonControls();
    if (!CreateWindowEx(0, "mh", "ToolTips", WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                 100, 100, 350, 100, NULL, NULL, hInst, NULL)) return FALSE;
    while (GetMessage(&msg,NULL,0,0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

程序的编译、执行结果如下所示。 工具提示被设定为虚线表示的矩形区域。 当鼠标光标进入该区域并静止一定时间时,会显示工具提示字符串。
74f8c418d95944bcb3454575da50b900.png

因此,在不是按钮控制的自己的按钮上(不是独立的窗口,而是直接画在主窗口)上附加工具提示。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值