📄 dockingcont.cpp
字号:
return TRUE;
}
break;
}
case WM_NCLBUTTONDBLCLK :
{
RECT rcWnd = {0};
RECT rcClient = {0};
POINT pt = {HIWORD(lParam), LOWORD(lParam)};
getWindowRect(rcWnd);
getClientRect(rcClient);
ClientToScreen(_hSelf, &rcClient);
rcWnd.bottom = rcClient.top;
/* if in caption */
if ((rcWnd.top < pt.x) && (rcWnd.bottom > pt.x) &&
(rcWnd.left < pt.y) && (rcWnd.right > pt.y))
{
NotifyParent(DMM_DOCKALL);
return TRUE;
}
break;
}
case WM_SYSCOMMAND :
{
switch (wParam & 0xfff0)
{
case SC_MOVE:
NotifyParent(DMM_MOVE);
return TRUE;
default:
break;
}
return FALSE;
}
case WM_COMMAND :
{
switch (LOWORD(wParam))
{
case IDCANCEL:
doClose();
return TRUE;
default :
break;
}
break;
}
default:
break;
}
return FALSE;
}
void DockingCont::onSize(void)
{
TCITEM tcItem = {0};
RECT rc = {0};
RECT rcTemp = {0};
UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);
UINT iTabOff = 0;
getClientRect(rc);
if (iItemCnt >= 1)
{
/* resize to docked window */
if (_isFloating == false)
{
/* draw caption */
if (_isTopCaption == TRUE)
{
::SetWindowPos(_hCaption, NULL, rc.left, rc.top, rc.right, HIGH_CAPTION, SWP_NOZORDER | SWP_NOACTIVATE);
rc.top += HIGH_CAPTION;
rc.bottom -= HIGH_CAPTION;
}
else
{
::SetWindowPos(_hCaption, NULL, rc.left, rc.top, HIGH_CAPTION, rc.bottom, SWP_NOZORDER | SWP_NOACTIVATE);
rc.left += HIGH_CAPTION;
rc.right -= HIGH_CAPTION;
}
if (iItemCnt >= 2)
{
/* resize tab and plugin control if tabs exceeds one */
/* resize tab */
rcTemp = rc;
rcTemp.top = (rcTemp.bottom + rcTemp.top) - (HIGH_TAB+CAPTION_GAP);
rcTemp.bottom = HIGH_TAB;
iTabOff = HIGH_TAB;
::SetWindowPos(_hContTab, NULL,
rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom,
SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE);
}
/* resize client area for plugin */
rcTemp = rc;
if (_isTopCaption == TRUE)
{
rcTemp.top += CAPTION_GAP;
rcTemp.bottom -= (iTabOff + CAPTION_GAP);
}
else
{
rcTemp.left += CAPTION_GAP;
rcTemp.right -= CAPTION_GAP;
rcTemp.bottom -= iTabOff;
}
/* set position of client area */
::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL,
rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom,
SWP_NOZORDER | SWP_NOACTIVATE);
}
/* resize to float window */
else
{
/* update floating size */
if (_isFloating == true)
{
for (size_t iTb = 0; iTb < _vTbData.size(); iTb++)
{
getWindowRect(_vTbData[iTb]->rcFloat);
}
}
/* draw caption */
if (iItemCnt >= 2)
{
/* resize tab if size of elements exceeds one */
rcTemp = rc;
rcTemp.top = rcTemp.bottom - (HIGH_TAB+CAPTION_GAP);
rcTemp.bottom = HIGH_TAB;
::SetWindowPos(_hContTab, NULL,
rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom,
SWP_NOZORDER | SWP_SHOWWINDOW);
}
/* resize client area for plugin */
rcTemp = rc;
rcTemp.bottom -= ((iItemCnt == 1)?0:HIGH_TAB);
::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL,
rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom,
SWP_NOZORDER | SWP_NOACTIVATE);
}
/* get active item data */
UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);
/* resize visible plugin windows */
for (UINT iItem = 0; iItem < iItemCnt; iItem++)
{
tcItem.mask = TCIF_PARAM;
::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
::SetWindowPos(((tTbData*)tcItem.lParam)->hClient, NULL,
0, 0, rcTemp.right, rcTemp.bottom,
SWP_NOZORDER);
}
}
}
void DockingCont::doClose(void)
{
INT iItemOff = 0;
INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);
for (INT iItem = 0; iItem < iItemCnt; iItem++)
{
TCITEM tcItem = {0};
/* get item data */
SelectTab(iItemOff);
tcItem.mask = TCIF_PARAM;
::SendMessage(_hContTab, TCM_GETITEM, iItemOff, (LPARAM)&tcItem);
/* notify child windows */
if (NotifyParent(DMM_CLOSE) == 0)
{
/* delete tab */
hideToolbar((tTbData*)tcItem.lParam);
}
else
{
iItemOff++;
}
}
if (iItemOff == 0)
{
/* hide dialog first */
this->doDialog(false);
::SendMessage(_hParent, WM_SIZE, 0, 0);
}
}
void DockingCont::showToolbar(tTbData* pTbData, BOOL state)
{
if (state == SW_SHOW)
{
viewToolbar(pTbData);
}
else
{
hideToolbar(pTbData);
}
}
INT DockingCont::hideToolbar(tTbData *pTbData, BOOL hideClient)
{
INT iItem = SearchPosInTab(pTbData);
/* delete item */
if (TRUE == ::SendMessage(_hContTab, TCM_DELETEITEM, iItem, 0))
{
UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);
if (iItemCnt != 0)
{
TCITEM tcItem = {0};
tcItem.mask = TCIF_PARAM;
if (iItem == iItemCnt)
{
iItem--;
}
/* activate new selected item and view plugin dialog */
_prevItem = iItem;
SelectTab(iItem);
/* hide tabs if only one element */
if (iItemCnt == 1)
{
::ShowWindow(_hContTab, SW_HIDE);
}
}
else
{
/* hide dialog */
this->doDialog(false);
/* send message to docking manager for resize */
if (_isFloating == false)
{
::SendMessage(_hParent, WM_SIZE, 0, 0);
}
}
/* keep sure, that client is hide!!! */
if (hideClient == TRUE)
{
::ShowWindow(pTbData->hClient, SW_HIDE);
}
}
onSize();
return iItem;
}
void DockingCont::viewToolbar(tTbData *pTbData)
{
TCITEM tcItem = {0};
INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);
if (iItemCnt > 0)
{
UINT iItem = getActiveTb();
tcItem.mask = TCIF_PARAM;
::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
/* hide active dialog */
::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_HIDE);
}
/* create new tab if it not exists */
INT iTabPos = SearchPosInTab(pTbData);
if (iTabPos == -1)
{
/* set only params and text even if icon available */
tcItem.mask = TCIF_PARAM;
tcItem.lParam = (LPARAM)pTbData;
::SendMessage(_hContTab, TCM_INSERTITEM, iItemCnt, (LPARAM)&tcItem);
SelectTab(iItemCnt);
}
/* if exists select it and update data */
else
{
tcItem.mask = TCIF_PARAM;
tcItem.lParam = (LPARAM)pTbData;
::SendMessage(_hContTab, TCM_SETITEM, iTabPos, (LPARAM)&tcItem);
SelectTab(iTabPos);
}
/* show dialog and notify parent to update dialog view */
if (isVisible() == false)
{
this->doDialog();
::SendMessage(_hParent, WM_SIZE, 0, 0);
}
/* set position of client */
onSize();
}
INT DockingCont::SearchPosInTab(tTbData* pTbData)
{
TCITEM tcItem = {0};
INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);
INT ret = -1;
tcItem.mask = TCIF_PARAM;
for (INT iItem = 0; iItem < iItemCnt; iItem++)
{
::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
if (((tTbData*)tcItem.lParam)->hClient == pTbData->hClient)
{
ret = iItem;
break;
}
}
return ret;
}
void DockingCont::SelectTab(INT iTab)
{
if (iTab != -1)
{
LPSTR pszMaxTxt = NULL;
TCITEM tcItem = {0};
SIZE size = {0};
INT maxWidth = 0;
INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);
/* get data of new active dialog */
tcItem.mask = TCIF_PARAM;
::SendMessage(_hContTab, TCM_GETITEM, iTab, (LPARAM)&tcItem);
/* show active dialog */
::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_SHOW);
::SetFocus(((tTbData*)tcItem.lParam)->hClient);
if (iTab != _prevItem)
{
/* hide previous dialog */
::SendMessage(_hContTab, TCM_GETITEM, _prevItem, (LPARAM)&tcItem);
::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_HIDE);
}
/* resize tab item */
/* get at first largest item ... */
HDC hDc = ::GetDC(_hContTab);
SelectObject(hDc, _hFont);
for (INT iItem = 0; iItem < iItemCnt; iItem++)
{
LPSTR pszTabTxt = NULL;
::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
pszTabTxt = ((tTbData*)tcItem.lParam)->pszName;
/* get current font width */
GetTextExtentPoint32(hDc, pszTabTxt, strlen(pszTabTxt), &size);
if (maxWidth < size.cx)
{
maxWidth = size.cx;
pszMaxTxt = pszTabTxt;
}
}
::ReleaseDC(_hSelf, hDc);
tcItem.mask = TCIF_TEXT;
for (INT iItem = 0; iItem < iItemCnt; iItem++)
{
if (iItem == iTab)
{
/* fake here an icon before text ... */
char szText[64];
strcpy(szText, " ");
strcat(szText, pszMaxTxt);
tcItem.pszText = szText;
tcItem.cchTextMax = strlen(szText);
}
else
{
/* ... and resize old and new item */
tcItem.pszText = "";
tcItem.cchTextMax = strlen("");
}
::SendMessage(_hContTab, TCM_SETITEM, iItem, (LPARAM)&tcItem);
}
/* selects the pressed tab and store previous tab */
::SendMessage(_hContTab, TCM_SETCURSEL, iTab, 0);
_prevItem = iTab;
/* update caption text */
updateCaption();
onSize();
}
}
void DockingCont::updateCaption(void)
{
TCITEM tcItem = {0};
INT iItem = getActiveTb();
if (iItem < 0)
return;
/* get data of new active dialog */
tcItem.mask = TCIF_PARAM;
::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
/* update caption text */
strcpy(_pszCaption, ((tTbData*)tcItem.lParam)->pszName);
/* test if additional information are available */
if ((((tTbData*)tcItem.lParam)->uMask & DWS_ADDINFO) &&
(strlen(((tTbData*)tcItem.lParam)->pszAddInfo) != 0))
{
strcat(_pszCaption, " - ");
strcat(_pszCaption, ((tTbData*)tcItem.lParam)->pszAddInfo);
}
if (_isFloating == true)
{
::SetWindowText(_hSelf, _pszCaption);
}
else
{
::SetWindowText(_hCaption, _pszCaption);
}
}
void DockingCont::focusClient(void)
{
TCITEM tcItem = {0};
INT iItem = getActiveTb();
if (iItem != -1)
{
/* get data of new active dialog */
tcItem.mask = TCIF_PARAM;
::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
/* set focus */
::SetFocus(((tTbData*)tcItem.lParam)->hClient);
}
}
LPARAM DockingCont::NotifyParent(UINT message)
{
return ::SendMessage(_hParent, message, 0, (LPARAM)this);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -