您的位置:首页 > 其它

win32强化练习4.6_自定义图标或图像的工具栏

2016-11-26 23:40 211 查看
上一节直接使用了内置的工具栏(按钮),这一节练习使用自己的图标或图像来制作工具栏。

示例如下:



话不多说,步骤如下:

1. 自己想办法制作一个bmp的图,例如:



2. 把图放到res文件夹下,在RC文件中定义:IDB_BIT_ICON BITMAP
"chessIcon.bmp"

3. 必须包含头文件 : #include <commctrl.h>

4. 由于会使用到:TB_ADDIMAGELIST,以及ImageList_Create()函数,需要连接库: Comctl32.lib  / libcomctl32.a

5. 如果“TB_SETIMAGELIST”不能用,可以直接用其#define的值 WM_USER + 48

6. 使用CreateWindowEx创建HWND hToobar

hToolbar = CreateWindow(TOOLBARCLASSNAME,"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
0,0,0,0,hwnd, (HMENU)12011, g_hInst, NULL);
7. 声明全局变量:HIMAGELIST g_imagelist ;

8. 用ImageList_Create创建图像列表,将资源中的图放到列表中,并发送TB_SETIMAGELIST消息,将图像指定给工具栏(与标准工具栏TBADDBITMAP类似)

g_imagelist = ImageList_Create(48,48,ILC_COLOR24,4,0); //48*48 4个
int iBitmap = ImageList_Add(g_imagelist,LoadBitmapA(g_hInst, MAKEINTRESOURCEA(IDB_BIT_ICON)), NULL);

SendMessage(hToolbar,WM_USER + 48,(WPARAM)0, (LPARAM)g_imagelist);9. TTBUTTON,这个与上一节差不多,需要注意要使用MAKELONG这个函数,MAKELONG无法使用则#include <windef.h>
TBBUTTON tb[4];
tb[0].iBitmap = MAKELONG(iBitmap, 0); //标准工具栏是:STD_FILENEW;
tb[0].fsState = TBSTATE_ENABLED;
tb[0].fsStyle = TBSTYLE_BUTTON;
tb[0].iString = 0;//如果这句不写,图像下方可能有字符,或者用zeroMemory(tb, sizeof(tb));先清除
tb[0].idCommand = IDT_NEW;
tb[1].iBitmap = MAKELONG(iBitmap + 1, 0);
tb[1].fsState = TBSTATE_ENABLED;
tb[1].fsStyle = TBSTYLE_BUTTON;
tb[1].iString = 0;
tb[1].idCommand = IDT_OPEN;

10. 仍然需要设定结构体大小,然后将按钮指定给工具栏,并进行自动大小适应:
SendMessageA(hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON),0);
SendMessageA(hToolbar, TB_ADDBUTTONS,(WPARAM)4,(LPARAM)&tb);
SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0);
ShowWindow(hToolbar,TRUE);以上就是使用位图创建工具栏按钮了;

再简单补充一下用图标创建,大部分的步骤是相同的,包括声明变量HIMAGELIST,但不是把位图loadBitmap,而是LoadIcon,而且有几个ICON要load几次,比较直观,但比较繁琐,见代码:

HIMAGELIST himgIcon ;
himgIcon = ImageList_Create(30,30,ILC_COLOR8, 2, 0);
int id1 = ImageList_AddIcon(himgIcon, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1)));
int id2 = ImageList_AddIcon(himgIcon, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON2)));
SendMessage(hToolbar, TB_SETIMAGELIST, 0, (LPARAM)himgIcon);
另外一点,在TTBUTTON结构体中,不需要使用MAKELONG了,直接把ID放进去就可以了:
tb[0].iBitmap = id1;
tb[0].fsState = TBSTATE_ENABLED;
tb[0].fsStyle = TBSTYLE_BUTTON;
tb[0].idCommand = IDT_NEW;了解原理再加上适当练习后,要做一个简单的自定义的工具栏也不是什么难事了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  WIN32 工具栏