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

177 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 酷工具栏
酷工具栏coolbar是一个可以显示一排文字或图标按钮的工具栏。它很简单易于使用。
你可以通过调用 `CreateWindow` 函数,使用控件类名称 CTRL_COOLBAR 来创建一个酷工具栏控件。
## 1.1 酷工具栏风格
`CBS_BMP_16X16``CBS_BMP_32X32` 风格的酷工具栏的按钮项分别显示 16x16 和 32x32 的位图;`CBS_BMP_CUSTOM` 风格的酷工具栏的按钮项使用自定义大小的位图,对于这个风格的控件,使用 `CreateWindow` 创建时需要通过 `dwAddData` 参数把位图的高度和宽度传递给控件,如下:
```c
CreateWindowEx (CTRL_COOLBAR, ..., MAKELONG (item_width, item_height)));
```
`CBS_USEBKBMP` 风格的酷工具栏有背景位图,创建控件时需要把位图文件的路径通过 `CreateWindow` 函数的 `spCaption` 参数传递给控件。
```c
CreateWindowEx (CTRL_COOLBAR, res/bk.bmp, ...);
```
建立酷工具栏不接受指定的高度值。
## 1.2 酷工具栏消息
在创建酷工具栏之后,我们需要使用 `CBM_ADDITEM` 消息来往工具栏中添加按钮项。
```c
COOLBARITEMINFO itemInfo;
SendMessage (hwndCoolBar, CBM_ADDITEM, 0, (LPARAM)&itemInfo) ;
```
`itemInfo` 是一个 `COOLBARITEMINFO` 类型的结构。
```c
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_BARITEM``TYPE_BMPITEM``TYPE_TEXTITEM``TYPE_BARITEM` 类型的按钮项为垂直分隔线;`TYPE_BMPITEM` 类型的按钮项为位图按钮;`TYPE_TEXTITEM` 类型的按钮项为文字按钮。
如果按钮项的类型为 `TYPE_BMPITEM `的话,`Bmp` 位图句柄指定该按钮项所使用的位图。`ItemHint` 为鼠标移动到按钮项之上时所显示的提示文字;按钮项的类型为 `TPYE_TEXTITEM` 时,`Caption` 中应该存放按钮项所显示的文字字符串。
`dwAddData` 为按钮项的附加数据。
`CBM_ENABLE` 消息禁止或恢复某个按钮项。
```c
int id;
BOOL beEnabled;
SendMessage (hwndCoolBar, CBM_ENABLE, id, beEnabled) ;
```
`id` 为所要设置的按钮项的标示符值,`beEnabled``TRUE` 时恢复,为 `FALSE` 时禁止。
## 1.3 编程实例
__清单 1.1__ 中的代码演示了酷工具栏控件的使用。该程序的完整源代码可见本指南示例程序包 `mg-samples` 中的 `coolbar.c` 程序。
__清单 1.1__ 酷工具栏示例程序
```c
#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);
}
/* 以下创建主窗口的代码省略 */
```
![酷工具栏控件的使用](figures/Part4Chapter17-1.1.jpeg)
__图 1.1__ 酷工具栏控件的使用
`coolbar.c` 程序在对话框中创建了一个由“09”数字组成的酷工具栏点击该工具栏的按钮时对应的数字将输入到上面的编辑框中。