《Winodws API每日一练》11.3 工具栏控件

本节将讲述工具栏控件的创建和使用。

本节必须掌握的知识点:

        工具栏控件

        第72练:工具栏控件

11.3.1 工具栏控件

工具栏控件(Toolbar Control)是Windows操作系统提供的一种用户界面元素,用于显示常用的命令按钮、工具图标和下拉菜单,以便用户快速访问和执行特定的操作。

工具栏通常位于应用程序窗口的顶部或边缘,并由一系列按钮和其他控件组成。用户可以单击工具栏上的按钮来触发相应的命令或操作。

在Windows编程中,工具栏控件由TOOLBARCLASSNAME类名标识,并使用CreateWindowEx或CreateWindow函数创建。

以下是创建和设置工具栏控件的一般步骤

1.定义和初始化工具栏按钮信息:创建一个TBBUTTON结构体数组,每个结构体表示一个工具栏按钮。可以指定按钮的标识符、样式、图标等属性。

2.创建工具栏控件:使用CreateWindowEx或CreateWindow函数创建工具栏控件,并指定类名为TOOLBARCLASSNAME。

3.设置工具栏样式和按钮信息:使用工具栏控件的消息,如TB_BUTTONSTRUCTSIZE、TB_ADDBUTTONS、TB_SETBITMAPSIZE等,来设置工具栏的样式和按钮信息。

4.处理工具栏按钮的消息:通过处理工具栏按钮的消息,如WM_COMMAND,来响应用户的点击操作,并执行相应的命令或操作。

以下是一个使用工具栏控件的简单示例

//创建工具栏

HWND hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,

                  WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT, 0, 0, 0, 0,

                  hWndParent, NULL, hInstance, NULL);

// 设置按钮信息

TBBUTTON tbButtons[3];

ZeroMemory(tbButtons, sizeof(tbButtons));

tbButtons[0].iBitmap = 0;

tbButtons[0].idCommand = ID_BUTTON1;

tbButtons[0].fsState = TBSTATE_ENABLED;

tbButtons[0].fsStyle = TBSTYLE_BUTTON;

tbButtons[1].iBitmap = 1;

tbButtons[1].idCommand = ID_BUTTON2;

tbButtons[1].fsState = TBSTATE_ENABLED;

tbButtons[1].fsStyle = TBSTYLE_BUTTON;

tbButtons[2].iBitmap = 2;

tbButtons[2].idCommand = ID_BUTTON3;

tbButtons[2].fsState = TBSTATE_ENABLED;

tbButtons[2].fsStyle = TBSTYLE_BUTTON;

// 设置按钮尺寸

SendMessage(hWndToolbar, TB_SETBITMAPSIZE, 0, MAKELPARAM(16, 16));

// 添加按钮到工具栏

SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);

SendMessage(hWndToolbar, TB_ADDBUTTONS, sizeof(tbButtons) / sizeof(TBBUTTON), (LPARAM)tbButtons);

在上述示例中,使用CreateWindowEx函数创建了一个工具栏控件,并设置了一些基本的样式。然后,通过设置按钮信息、按钮尺寸和添加按钮到工具栏,完成了工具栏的初始化。

以上只是一个简单的示例,实际上可以根据需要对工具栏进行更多的设置和定制,如添加分隔符、下拉菜单、工具提示等。

工具栏控件通知信息的处理

方法一:使用NMTOOLBAR消息

NMTOOLBAR 是一种通知消息(notification message),用于在工具栏控件(Toolbar Control)中传递通知信息。

当工具栏控件中的按钮被点击或其他状态改变时,工具栏控件会发送 NMTOOLBAR 消息给其父窗口,以便通知父窗口相应的事件和状态变化。

NMTOOLBAR 消息的参数是一个 NMHDR 结构体,其中包含了关于通知消息的详细信息,包括发送消息的控件句柄、标识符和消息代码。对于 NMTOOLBAR 消息,NMHDR 结构体的 code 域会被设置为 TBN_* 常量之一,表示不同的通知类型。

以下是一些常见的 NMTOOLBAR 消息和对应的 code 值:

●TBN_BEGINDRAG:当用户开始拖动工具栏按钮时发送的消息。

●TBN_ENDDRAG:当用户结束拖动工具栏按钮时发送的消息。

●TBN_BEGINADJUST:当用户开始自定义工具栏按钮时发送的消息。

●TBN_ENDEDIT:当用户结束自定义工具栏按钮时发送的消息。

●TBN_GETBUTTONINFO:当需要获取工具栏按钮的信息时发送的消息。

●TBN_DROPDOWN:当用户点击工具栏按钮上的下拉箭头时发送的消息。

父窗口可以通过处理 NMTOOLBAR 消息来响应工具栏控件的事件和状态改变。处理 NMTOOLBAR 消息的一种常见方式是使用 switch 语句来根据 code 值进行分支处理,以执行相应的操作。

以下是一个处理 NMTOOLBAR 消息的示例:

case WM_NOTIFY:

{

    NMHDR* pnmhdr = (NMHDR*)lParam;

    // 判断消息来源是工具栏控件

    if (pnmhdr->hwndFrom == hWndToolbar)

    {

        // 判断通知消息的类型(code 值)

        switch (pnmhdr->code)

        {

            case TBN_BEGINDRAG:

                // 工具栏按钮开始拖动的处理

                // ...

                break;

            case TBN_ENDDRAG:

                // 工具栏按钮结束拖动的处理

                // ...

                break;

            case TBN_DROPDOWN:

                // 工具栏按钮下拉菜单的处理

                // ...

                break;

            // 其他工具栏通知的处理...

            default:

                break;

        }

    }

    break;

}

以上示例中,通过判断 NMTOOLBAR 消息的来源是工具栏控件,并根据不同的 code 值进行分支处理,来执行相应的操作。

●方法二:使用LPNMTTDISPINFO结构指针

LPNMTTDISPINFO 是一个指向 NMTTDISPINFO 结构体的指针类型。

NMTTDISPINFO 结构体是 ToolTip 控件(工具提示控件)发送的通知消息 TTN_GETDISPINFO 的参数,用于提供工具提示的显示信息。

NMTTDISPINFO 结构体定义如下:

typedef struct tagNMTTDISPINFO {

  NMHDR hdr;                     // 通知消息的头部信息

  LPTSTR lpszText;                    // 工具提示的文本

  TCHAR  szText[MAX_TIPTEXT];      // 工具提示的文本(兼容旧版本)

  HINSTANCE hinst;                  // 包含工具提示文本的模块实例句柄

  UINT     uFlags;                  // 工具提示的标志

  LPARAM   lParam;                // 消息特定的额外参数

#if (_WIN32_IE >= 0x0300)

  int      iIcon;                      // 额外的图标索引

#endif

} NMTTDISPINFO, *LPNMTTDISPINFO;

在 TTN_GETDISPINFO 通知消息中,ToolTip 控件会发送一个 NMTTDISPINFO 结构体给父窗口,父窗口可以使用该结构体来提供工具提示的显示信息。

在接收到 TTN_GETDISPINFO 通知消息时,父窗口可以修改 NMTTDISPINFO 结构体的成员,以提供自定义的工具提示文本、图标等信息。通过修改 lpszText 或 szText 成员,可以设置工具提示控件要显示的文本内容。

以下是一个处理 TTN_GETDISPINFO 消息的示例:

case WM_NOTIFY:

{

    NMHDR* pnmhdr = (NMHDR*)lParam;

    // 判断消息来源是工具提示控件

    if (pnmhdr->hwndFrom == hWndTooltip &&

pnmhdr->code == TTN_GETDISPINFO)

    {

        LPNMTTDISPINFO pDispInfo = (LPNMTTDISPINFO)lParam;

        // 修改工具提示的文本

        pDispInfo->lpszText = _T("This is a tooltip.");

        // 如果需要设置额外的图标索引

        // pDispInfo->iIcon = iconIndex;

    }

    break;

}

在上述示例中,当收到 TTN_GETDISPINFO 消息,并且消息来源是工具提示控件时,通过修改 LPNMTTDISPINFO 结构体的 lpszText 成员,设置了工具提示的文本内容为 "This is a tooltip."。

●方法三:使用LPTOOLTIPTEXT结构指针

LPTOOLTIPTEXT 是一个指向 TOOLTIPTEXT 结构体的指针类型。

TOOLTIPTEXT 结构体是 ToolTip 控件(工具提示控件)发送的通知消息 TTN_NEEDTEXT 的参数,用于提供工具提示的显示信息。

TOOLTIPTEXT 结构体定义如下:

typedef struct tagTOOLTIPTEXT {

  NMHDR hdr;             // 通知消息的头部信息

  LPTSTR lpszText;      // 工具提示的文本

#if (_WIN32_IE >= 0x0300)

  TCHAR  szText[MAX_TIPTEXT];     // 工具提示的文本(兼容旧版本)

#endif

  HINSTANCE hinst;       // 包含工具提示文本的模块实例句柄

  UINT     uFlags;            // 工具提示的标志

  LPARAM   lParam;      // 消息特定的额外参数

} TOOLTIPTEXT, *LPTOOLTIPTEXT;

在 TTN_NEEDTEXT 通知消息中,ToolTip 控件会发送一个 TOOLTIPTEXT 结构体给父窗口,父窗口可以使用该结构体来提供工具提示的显示信息。

在接收到 TTN_NEEDTEXT 通知消息时,父窗口可以修改 TOOLTIPTEXT 结构体的成员,以提供自定义的工具提示文本。

以下是一个处理 TTN_NEEDTEXT 消息的示例:

case WM_NOTIFY:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值