Files
minigui-docs/programming-guide-zh/MiniGUIProgGuidePart6Chapter17-zh.md
lisimeng123 12ea4e47e4 update
2022-11-18 00:00:48 +08:00

6.1 KiB
Raw Blame History

酷工具栏

酷工具栏coolbar是一个可以显示一排文字或图标按钮的工具栏。它很简单易于使用。

你可以通过调用 CreateWindow 函数,使用控件类名称 CTRL_COOLBAR 来创建一个酷工具栏控件。

1.1 酷工具栏风格

CBS_BMP_16X16CBS_BMP_32X32 风格的酷工具栏的按钮项分别显示 16x16 和 32x32 的位图;CBS_BMP_CUSTOM 风格的酷工具栏的按钮项使用自定义大小的位图,对于这个风格的控件,使用 CreateWindow 创建时需要通过 dwAddData 参数把位图的高度和宽度传递给控件,如下:

CreateWindowEx (CTRL_COOLBAR, ..., MAKELONG (item_width, item_height)));

CBS_USEBKBMP 风格的酷工具栏有背景位图,创建控件时需要把位图文件的路径通过 CreateWindow 函数的 spCaption 参数传递给控件。

CreateWindowEx (CTRL_COOLBAR, res/bk.bmp, ...);

建立酷工具栏不接受指定的高度值。

1.2 酷工具栏消息

在创建酷工具栏之后,我们需要使用 CBM_ADDITEM 消息来往工具栏中添加按钮项。

COOLBARITEMINFO itemInfo;
SendMessage (hwndCoolBar, CBM_ADDITEM, 0, (LPARAM)&itemInfo) ;

itemInfo 是一个 COOLBARITEMINFO 类型的结构。

typedef struct _COOLBARITEMINFO
{
        /* 保留 */
        int insPos;
        /* 按钮项id */
        int id;
        /* 按钮项类型 */
        int ItemType;
        /* 按钮使用的位图 */
        PBITMAP Bmp;
        /* 按钮提示文字 */
        const char *ItemHint;
        /* 按钮标题 */
        const char *Caption;
        /* 按钮项的附加数据 */
        DWORD dwAddData;
} COOLBARITEMINFO;

id 项为工具栏中各按钮项的 id 值。用户点击按钮项时,酷工具栏将产生通知消息,wParam 参数的高字节部分(HIWORD)就是相应按钮项的 id 值,wParam 的低字节部分(LOWORD)为工具栏控件本身的控件标识符。

ItemType 指定按钮项的类型,值可以是 TYPE_BARITEMTYPE_BMPITEMTYPE_TEXTITEMTYPE_BARITEM 类型的按钮项为垂直分隔线;TYPE_BMPITEM 类型的按钮项为位图按钮;TYPE_TEXTITEM 类型的按钮项为文字按钮。

如果按钮项的类型为 TYPE_BMPITEM 的话,Bmp 位图句柄指定该按钮项所使用的位图。ItemHint 为鼠标移动到按钮项之上时所显示的提示文字;按钮项的类型为 TPYE_TEXTITEM 时,Caption 中应该存放按钮项所显示的文字字符串。

dwAddData 为按钮项的附加数据。

CBM_ENABLE 消息禁止或恢复某个按钮项。

int id;
BOOL beEnabled;
SendMessage (hwndCoolBar, CBM_ENABLE, id, beEnabled) ;

id 为所要设置的按钮项的标示符值,beEnabledTRUE 时恢复,为 FALSE 时禁止。

1.3 编程实例

清单 1.1 中的代码演示了酷工具栏控件的使用。该程序的完整源代码可见本指南示例程序包 mg-samples 中的 coolbar.c 程序。

清单 1.1 酷工具栏示例程序

#define ITEM_NUM    10

/* 要在酷工具栏上显示的文本 */
static const char* caption[] =
{
        "0", "1", "2", "3", "4", "5","6", "7", "8", "9"
};

/* 提示窗口中的文本 */
static const char* hint[] =
{
        "数字 0", "数字 1", "数字 2", "数字 3", "数字 4", 
        "数字 5", "数字 6", "数字 7", "数字 8", "数字 9"
};

/* 创建酷工具栏,并添加工具项 */
static void create_coolbar (HWND hWnd)
{
        HWND cb;
        COOLBARITEMINFO item;
        int i;
        
        cb = CreateWindow (CTRL_COOLBAR,
        "",
        WS_CHILD | WS_VISIBLE | WS_BORDER, 
        100,
        10, 100, 100, 20,
        hWnd,
        0);
        
        item.ItemType = TYPE_TEXTITEM;
        item.Bmp = NULL;
        item.dwAddData = 0;
        for (i = 0; i < ITEM_NUM; i++) {
                item.insPos = i;
                item.id = i;
                item.Caption = caption[i];
                item.ItemHint = hint[i];
                SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
        }
}

static int CoolbarWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
        static HWND ed;
        
        switch (message) {
                case MSG_CREATE:
                /* 创建编辑框,用来反馈用户对酷工具栏的操作 */
                ed = CreateWindow (CTRL_EDIT,
                "",
                WS_CHILD | WS_VISIBLE | WS_BORDER, 
                200,
                10, 10, 100, 20,
                hWnd,
                0);
                
                create_coolbar (hWnd);
                break;
                
                case MSG_COMMAND:
                {
                        int id = LOWORD (wParam);
                        int code = HIWORD (wParam);
                        
                        if (id == 100) {
                                static char buffer[100];
                                char buf[2];
                                
                                /* 根据用户按下的工具项将适当的字符写入编辑框 */
                                sprintf (buf, "%d", code);
                                SendMessage (ed, MSG_GETTEXT, 90, (LPARAM)buffer);
                                strcat (buffer, buf);
                                SendMessage (ed, MSG_SETTEXT, 0, (LPARAM)buffer);
                        }
                }
                break;
                
                case MSG_DESTROY:
                DestroyAllControls (hWnd);
                return 0;
                
                case MSG_CLOSE:
                DestroyMainWindow (hWnd);
                PostQuitMessage (hWnd);
                return 0;
        }
        
        return DefaultMainWinProc(hWnd, message, wParam, lParam);
}

/* 以下创建主窗口的代码省略 */

酷工具栏控件的使用 图 1.1 酷工具栏控件的使用

coolbar.c 程序在对话框中创建了一个由“09”数字组成的酷工具栏点击该工具栏的按钮时对应的数字将输入到上面的编辑框中。