这里说一下Notepad++在工具栏中显示图标的功能源码.与显示图标功能相关的类比较多,主要集中在ImageListSet.h/cpp, ToolBar.h/cpp这几个文件中.至于ToolBar中包含哪些图标由Notepad_plus.cpp部分代码定义.我们从基础开始先看看ImageListSet.h/cpp里面的内容,了解其底层的一些机制后.再说一下ToolBar.h/cpp的定义.然后就很容易看懂Notepad_plus.cpp中代码的意思了.
ImageListSet.h中首先定义了IconList类,源码如下
class IconList
{
public :
IconList() : _hImglst(NULL) {};
void create(HINSTANCE hInst, int iconSize) {_iconSize = iconSize;
_hInst = hInst;
InitCommonControls();
_hImglst = ImageList_Create(iconSize, iconSize, ILC_COLOR32 | ILC_MASK, 0, nbMax);
if (!_hImglst)
throw int(25);
};
void create(int iconSize, HINSTANCE hInst, int *iconIDArray, int iconIDArraySize) {
create(hInst, iconSize);
for (int i = 0 ; i < iconIDArraySize ; i++)
addIcon(iconIDArray[i]);
};
void destroy() {
ImageList_Destroy(_hImglst);
};
HIMAGELIST getHandle() const {return _hImglst;};
void addIcon(int iconID) const {
HICON hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(iconID));
//HBITMAP hBmp = (HBITMAP)::LoadImage(_hInst, MAKEINTRESOURCE(iconID), IMAGE_ICON, _iconSize, _iconSize, LR_LOADMAP3DCOLORS);
if (!hIcon)
throw int(26);
ImageList_AddIcon(_hImglst, hIcon);
//ImageList_AddMasked(_hImglst, (HBITMAP)hBmp, RGB(0, 0, 0));
::DeleteObject(hIcon);
//::DeleteObject(hBmp);
};
private :
HIMAGELIST _hImglst;
HINSTANCE _hInst;
int _iconSize;
};
这个类中主要定义了一下几个功能:
a. 首先定义了两个create函数,第一个create主要的功能为创建了image list对象,并将image list handle保存在类型为HIMAGELIST的_hImglit变量中,用_iconSize变量保存图标大小,_hInst保存传入的一个实例句柄.第二个create函数的主要的功能不经初始化IconList类中的三个私有变量(_hImglst, _hInst, _iconSize),而且用图标标号数组来往Image list对象中添加icon对象.这个工作有addIcon函数完成,不过值得注意的是LoadIcon函数,以及被作者注释掉的LoadImage函数.
b. 实现获取image list hand