pull/3/head
chen 1 year ago
parent d77a96a9f5
commit 45c8aab648

@ -40,7 +40,7 @@ COLORREF TabBarPlus::_inactiveBgColour = RGB(192, 192, 192);
HWND TabBarPlus::_hwndArray[nbCtrlMax] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; HWND TabBarPlus::_hwndArray[nbCtrlMax] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
int TabBarPlus::_nbCtrl = 0; int TabBarPlus::_nbCtrl = 0;
//初始化标签栏,创建窗口
void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLine) void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLine)
{ {
Window::init(hInst, parent); Window::init(hInst, parent);
@ -49,7 +49,7 @@ void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLin
_isVertical = isVertical; _isVertical = isVertical;
_isMultiLine = isMultiLine; _isMultiLine = isMultiLine;
INITCOMMONCONTROLSEX icce{}; INITCOMMONCONTROLSEX icce{};//初始化通用控件库
icce.dwSize = sizeof(icce); icce.dwSize = sizeof(icce);
icce.dwICC = ICC_TAB_CLASSES; icce.dwICC = ICC_TAB_CLASSES;
InitCommonControlsEx(&icce); InitCommonControlsEx(&icce);
@ -75,27 +75,27 @@ void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLin
} }
} }
//清理与TabBar相关的资源
void TabBar::destroy() void TabBar::destroy()
{ {
if (_hFont) if (_hFont)
{ {
::DeleteObject(_hFont); ::DeleteObject(_hFont);
_hFont = nullptr; _hFont = nullptr;
} }//删除字体对象
if (_hLargeFont) if (_hLargeFont)
{ {
::DeleteObject(_hLargeFont); ::DeleteObject(_hLargeFont);
_hLargeFont = nullptr; _hLargeFont = nullptr;
} }//删除字体大小格式
if (_hVerticalFont) if (_hVerticalFont)
{ {
::DeleteObject(_hVerticalFont); ::DeleteObject(_hVerticalFont);
_hVerticalFont = nullptr; _hVerticalFont = nullptr;
} }
//删除垂直字体对象
if (_hVerticalLargeFont) if (_hVerticalLargeFont)
{ {
::DeleteObject(_hVerticalLargeFont); ::DeleteObject(_hVerticalLargeFont);
@ -106,13 +106,13 @@ void TabBar::destroy()
_hSelf = nullptr; _hSelf = nullptr;
} }
//在TabBar末尾插入一个新的选项卡并设置名称。使用TCITEM结构设置选项卡的属性并发送消息将选项卡插入TabBar中
int TabBar::insertAtEnd(const TCHAR *subTabName) int TabBar::insertAtEnd(const TCHAR *subTabName)
{ {
TCITEM tie{}; TCITEM tie{};
tie.mask = TCIF_TEXT | TCIF_IMAGE; tie.mask = TCIF_TEXT | TCIF_IMAGE;
int index = -1; int index = -1;
//如果存在图像列表那么新TabItem应该被放置在列表的开始。
if (_hasImgLst) if (_hasImgLst)
index = 0; index = 0;
tie.iImage = index; tie.iImage = index;
@ -120,7 +120,7 @@ int TabBar::insertAtEnd(const TCHAR *subTabName)
return int(::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast<LPARAM>(&tie))); return int(::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast<LPARAM>(&tie)));
} }
//获取当前选定选项卡的标题。
void TabBar::getCurrentTitle(TCHAR *title, int titleLen) void TabBar::getCurrentTitle(TCHAR *title, int titleLen)
{ {
TCITEM tci{}; TCITEM tci{};
@ -130,7 +130,7 @@ void TabBar::getCurrentTitle(TCHAR *title, int titleLen)
::SendMessage(_hSelf, TCM_GETITEM, getCurrentTabIndex(), reinterpret_cast<LPARAM>(&tci)); ::SendMessage(_hSelf, TCM_GETITEM, getCurrentTabIndex(), reinterpret_cast<LPARAM>(&tci));
} }
//为TabBar中的选项卡设置字体。根据提供的参数创建新字体并发送消息为TabBar设置该字体
void TabBar::setFont(const TCHAR *fontName, int fontSize) void TabBar::setFont(const TCHAR *fontName, int fontSize)
{ {
if (_hFont) if (_hFont)
@ -147,7 +147,7 @@ void TabBar::setFont(const TCHAR *fontName, int fontSize)
::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast<WPARAM>(_hFont), 0); ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast<WPARAM>(_hFont), 0);
} }
//激活指定索引处的选项卡。发送消息以确保在TabBar中激活指定索引处的选项卡。
void TabBar::activateAt(int index) const void TabBar::activateAt(int index) const
{ {
if (getCurrentTabIndex() != index) if (getCurrentTabIndex() != index)
@ -163,14 +163,14 @@ void TabBar::activateAt(int index) const
} }
} }
//删除指定索引处的选项卡
void TabBar::deletItemAt(size_t index) void TabBar::deletItemAt(size_t index)
{ {
if (index == _nbItem - 1) if (index == _nbItem - 1)
{ {
//prevent invisible tabs. If last visible tab is removed, other tabs are put in view but not redrawn //prevent invisible tabs. If last visible tab is removed, other tabs are put in view but not redrawn
//Therefore, scroll one tab to the left if only one tab visible //Therefore, scroll one tab to the left if only one tab visible
if (_nbItem > 1) if (_nbItem > 1)//至少两个
{ {
RECT itemRect{}; RECT itemRect{};
::SendMessage(_hSelf, TCM_GETITEMRECT, index, reinterpret_cast<LPARAM>(&itemRect)); ::SendMessage(_hSelf, TCM_GETITEMRECT, index, reinterpret_cast<LPARAM>(&itemRect));
@ -182,7 +182,7 @@ void TabBar::deletItemAt(size_t index)
//There seems to be no negative effect on any internal state of the tab control or the up/down control //There seems to be no negative effect on any internal state of the tab control or the up/down control
int wParam = MAKEWPARAM(SB_THUMBPOSITION, index - 1); int wParam = MAKEWPARAM(SB_THUMBPOSITION, index - 1);
::SendMessage(_hSelf, WM_HSCROLL, wParam, 0); ::SendMessage(_hSelf, WM_HSCROLL, wParam, 0);
//TabBar控件向左滚动一个Tab项的位置。
wParam = MAKEWPARAM(SB_ENDSCROLL, index - 1); wParam = MAKEWPARAM(SB_ENDSCROLL, index - 1);
::SendMessage(_hSelf, WM_HSCROLL, wParam, 0); ::SendMessage(_hSelf, WM_HSCROLL, wParam, 0);
} }
@ -192,14 +192,14 @@ void TabBar::deletItemAt(size_t index)
_nbItem--; _nbItem--;
} }
//设置TabBar中的图像列表。使用TCM_SETIMAGELIST消息来设置图像列表。
void TabBar::setImageList(HIMAGELIST himl) void TabBar::setImageList(HIMAGELIST himl)
{ {
_hasImgLst = true; _hasImgLst = true;
::SendMessage(_hSelf, TCM_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(himl)); ::SendMessage(_hSelf, TCM_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(himl));
} }
//调整TabBar的大小以适应给定的矩形区域。调整TabBar的显示方式并计算新的大小然后调整提供的矩形区域。
void TabBar::reSizeTo(RECT & rc2Ajust) void TabBar::reSizeTo(RECT & rc2Ajust)
{ {
RECT rowRect{}; RECT rowRect{};
@ -208,6 +208,7 @@ void TabBar::reSizeTo(RECT & rc2Ajust)
// Important to do that! // Important to do that!
// Otherwise, the window(s) it contains will take all the resouce of CPU // Otherwise, the window(s) it contains will take all the resouce of CPU
// We don't need to resize the contained windows if they are even invisible anyway // We don't need to resize the contained windows if they are even invisible anyway
//调用display方法根据调整矩形的右边界是否大于10来决定是否显示TabBar中的窗口
display(rc2Ajust.right > 10); display(rc2Ajust.right > 10);
RECT rc = rc2Ajust; RECT rc = rc2Ajust;
Window::reSizeTo(rc); Window::reSizeTo(rc);
@ -226,7 +227,7 @@ void TabBar::reSizeTo(RECT & rc2Ajust)
if (rowCount == 1) if (rowCount == 1)
{ {
style &= ~TCS_BUTTONS; style &= ~TCS_BUTTONS;
} }// 如果有多行Tab项至少两行则启用TabCtrl的按钮样式并计算间距的值
else // (rowCount >= 2) else // (rowCount >= 2)
{ {
style |= TCS_BUTTONS; style |= TCS_BUTTONS;
@ -249,15 +250,19 @@ void TabBar::reSizeTo(RECT & rc2Ajust)
} }
} }
//销毁TabBarPlus及其资源。
void TabBarPlus::destroy() void TabBarPlus::destroy()
{ {
TabBar::destroy(); TabBar::destroy();
::DestroyWindow(_tooltips); ::DestroyWindow(_tooltips);
_tooltips = NULL; _tooltips = NULL;
} }
/*
TabBarPlus
TabControl
TabBarPlus便
*/
void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLine) void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLine)
{ {
Window::init(hInst, parent); Window::init(hInst, parent);
@ -290,7 +295,7 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMult
{ {
throw std::runtime_error("TabBarPlus::init : CreateWindowEx() function return null"); throw std::runtime_error("TabBarPlus::init : CreateWindowEx() function return null");
} }
//工具提示
_tooltips = ::CreateWindowEx( _tooltips = ::CreateWindowEx(
0, 0,
TOOLTIPS_CLASS, TOOLTIPS_CLASS,
@ -306,7 +311,7 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMult
{ {
throw std::runtime_error("TabBarPlus::init : tooltip CreateWindowEx() function return null"); throw std::runtime_error("TabBarPlus::init : tooltip CreateWindowEx() function return null");
} }
//暗色主题
NppDarkMode::setDarkTooltips(_tooltips, NppDarkMode::ToolTipsType::tooltip); NppDarkMode::setDarkTooltips(_tooltips, NppDarkMode::ToolTipsType::tooltip);
::SendMessage(_hSelf, TCM_SETTOOLTIPS, reinterpret_cast<WPARAM>(_tooltips), 0); ::SendMessage(_hSelf, TCM_SETTOOLTIPS, reinterpret_cast<WPARAM>(_tooltips), 0);
@ -317,12 +322,13 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMult
_ctrlID = _nbCtrl; _ctrlID = _nbCtrl;
} }
else else
{ {//查找第一个为空的位置并设置_ctrlID为该位置的值
int i = 0; int i = 0;
bool found = false; bool found = false;
for ( ; i < nbCtrlMax && !found ; ++i) for ( ; i < nbCtrlMax && !found ; ++i)
if (!_hwndArray[i]) if (!_hwndArray[i])
found = true; found = true;
//满了未找到,销毁
if (!found) if (!found)
{ {
_ctrlID = -1; _ctrlID = -1;
@ -354,7 +360,7 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMult
_hVerticalLargeFont = CreateFontIndirect(&lfVer); _hVerticalLargeFont = CreateFontIndirect(&lfVer);
} }
//处理选项卡控件的自定义填充。
void TabBarPlus::doOwnerDrawTab() void TabBarPlus::doOwnerDrawTab()
{ {
::SendMessage(_hwndArray[0], TCM_SETPADDING, 0, MAKELPARAM(6, 0)); ::SendMessage(_hwndArray[0], TCM_SETPADDING, 0, MAKELPARAM(6, 0));
@ -363,6 +369,7 @@ void TabBarPlus::doOwnerDrawTab()
if (_hwndArray[i]) if (_hwndArray[i])
{ {
LONG_PTR style = ::GetWindowLongPtr(_hwndArray[i], GWL_STYLE); LONG_PTR style = ::GetWindowLongPtr(_hwndArray[i], GWL_STYLE);
//检查是否需要自定义
if (isOwnerDrawTab()) if (isOwnerDrawTab())
style |= TCS_OWNERDRAWFIXED; style |= TCS_OWNERDRAWFIXED;
else else
@ -378,7 +385,7 @@ void TabBarPlus::doOwnerDrawTab()
} }
} }
//根据给定的索引为选项卡栏设置不同的颜色(如活动文本颜色、背景颜色等)。在更新颜色之后它调用doOwnerDrawTab()来刷新显示。
void TabBarPlus::setColour(COLORREF colour2Set, tabColourIndex i) void TabBarPlus::setColour(COLORREF colour2Set, tabColourIndex i)
{ {
switch (i) switch (i)
@ -404,7 +411,7 @@ void TabBarPlus::setColour(COLORREF colour2Set, tabColourIndex i)
doOwnerDrawTab(); doOwnerDrawTab();
} }
//设置垂直选项卡
void TabBarPlus::doVertical() void TabBarPlus::doVertical()
{ {
for (int i = 0 ; i < _nbCtrl ; ++i) for (int i = 0 ; i < _nbCtrl ; ++i)
@ -414,7 +421,7 @@ void TabBarPlus::doVertical()
} }
} }
//显示多行选项卡
void TabBarPlus::doMultiLine() void TabBarPlus::doMultiLine()
{ {
for (int i = 0 ; i < _nbCtrl ; ++i) for (int i = 0 ; i < _nbCtrl ; ++i)
@ -423,7 +430,7 @@ void TabBarPlus::doMultiLine()
SendMessage(_hwndArray[i], WM_TABSETSTYLE, isMultiLine(), TCS_MULTILINE); SendMessage(_hwndArray[i], WM_TABSETSTYLE, isMultiLine(), TCS_MULTILINE);
} }
} }
//向父窗口发送通知消息,其中包含有关选项卡索引和特定通知代码的信息。
void TabBarPlus::notify(int notifyCode, int tabIndex) void TabBarPlus::notify(int notifyCode, int tabIndex)
{ {
TBHDR nmhdr{}; TBHDR nmhdr{};
@ -433,7 +440,7 @@ void TabBarPlus::notify(int notifyCode, int tabIndex)
nmhdr._tabOrigin = tabIndex; nmhdr._tabOrigin = tabIndex;
::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast<LPARAM>(&nmhdr)); ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast<LPARAM>(&nmhdr));
} }
//启动对选项卡栏控件上的鼠标事件的跟踪,例如当鼠标进入或离开控件区域时。
void TabBarPlus::trackMouseEvent(DWORD event2check) void TabBarPlus::trackMouseEvent(DWORD event2check)
{ {
TRACKMOUSEEVENT tme = {}; TRACKMOUSEEVENT tme = {};
@ -442,12 +449,13 @@ void TabBarPlus::trackMouseEvent(DWORD event2check)
tme.hwndTrack = _hSelf; tme.hwndTrack = _hSelf;
TrackMouseEvent(&tme); TrackMouseEvent(&tme);
} }
//消息处理,处理窗口消息
LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{ {
switch (Message) switch (Message)
{ {
// Custom window message to change tab control style on the fly // Custom window message to change tab control style on the fly
//改变窗口样式
case WM_TABSETSTYLE: case WM_TABSETSTYLE:
{ {
LONG_PTR style = ::GetWindowLongPtr(hwnd, GWL_STYLE); LONG_PTR style = ::GetWindowLongPtr(hwnd, GWL_STYLE);
@ -465,13 +473,13 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara
return TRUE; return TRUE;
} }
//深色模式
case NPPM_INTERNAL_REFRESHDARKMODE: case NPPM_INTERNAL_REFRESHDARKMODE:
{ {
NppDarkMode::setDarkTooltips(hwnd, NppDarkMode::ToolTipsType::tabbar); NppDarkMode::setDarkTooltips(hwnd, NppDarkMode::ToolTipsType::tabbar);
return TRUE; return TRUE;
} }
//鼠标滚轮
case WM_MOUSEWHEEL: case WM_MOUSEWHEEL:
{ {
// .............................................................................. // ..............................................................................
@ -489,7 +497,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara
// CTRL + SHIFT + MOUSEWHEEL: // CTRL + SHIFT + MOUSEWHEEL:
// will switch to the first/last tab // will switch to the first/last tab
// .............................................................................. // ..............................................................................
//是否被拖动
if (_isDragging) if (_isDragging)
return TRUE; return TRUE;

Loading…
Cancel
Save