📄 mditabctrl.h
字号:
return;
ATLTRACE2(atlTraceUser, 4, _T("CMDITabCtrl::SetDowloding\n"));
_SetImageListIndex(nItem, 1);
}
void SetComplete(HWND hWnd)
{
int nItem = GetTabIndex(hWnd);
if (nItem == -1)
return;
ATLTRACE2(atlTraceUser, 4, _T("CMDITabCtrl::SetComplete\n"));
_SetImageListIndex(nItem, -1);
}
void _SetImageListIndex(int nItem, int nIndex)
{
SetItemImageIndex(nItem, nIndex);
}
bool IsConnecting(HWND hWnd)
{
int nItem = GetTabIndex(hWnd);
if (nItem == -1)
return false;
return _GetImageListIndex(nItem) == 0;
}
bool IsDownloading(HWND hWnd)
{
int nItem = GetTabIndex(hWnd);
if (nItem == -1)
return false;
return _GetImageListIndex(nItem) == 1;
}
bool IsCompleted(HWND hWnd)
{
int nItem = GetTabIndex(hWnd);
if (nItem == -1)
return false;
return _GetImageListIndex(nItem) == -1;
}
int _GetImageListIndex(int nItem)
{
int nImgIndex = -1;
GetItemImageIndex(nItem, nImgIndex);
return nImgIndex;
}
int ManageClose(HWND m_hWnd)
{
int nIndex = GetCurSel();
HWND hWndActive = GetTabHwnd(nIndex);
ATLASSERT(hWndActive == m_hWnd);
int nCount = GetItemCount();
if (m_dwExtendedStyle & MTB_EX_RIGHTACTIVEONCLOSE) {
int nNext = nIndex + 1;
if (nNext < nCount) {
// SetCurSelEx(nNext);
return nNext;
}
else {
nNext = nIndex - 1;
if (nNext >= 0) {
// SetCurSelEx(nNext);
return nNext;
}
}
}
else if (m_dwExtendedStyle & MTB_EX_LEFTACTIVEONCLOSE) {
int nNext = nIndex - 1;
if (nNext >= 0) {
// SetCurSelEx(nNext);
return nNext;
}
else {
nNext = nIndex + 1;
if (nNext < nCount) {
// SetCurSelEx(nNext);
return nNext;
}
}
}
return -1;
}
void NavigateLockTab(HWND hWnd, bool bOn)
{
int nIndex = GetTabIndex(hWnd);
ATLASSERT(nIndex != -1);
if (bOn)
SetItemDisabled(nIndex);
else
SetItemEnabled(nIndex);
}
// Overrides
CString OnGetToolTipText(int nIndex)
{
CString strTip;
HWND hWnd = GetTabHwnd(nIndex);
if (hWnd) {
CWebBrowser2 browser = DonutGetIWebBrowser2(hWnd);
if (!browser.IsBrowserNull()) {
const int TIPBUF = 79;
CString strName = MtlGetWindowText(hWnd);
CString strUrl = browser.GetLocationURL();
strTip = MtlMakeFavoriteToolTipText(strName, strUrl, TIPBUF);
}
}
return strTip;
}
void OnDeleteItemDrag(int nIndex)
{
HWND hWnd;
if (hWnd = GetTabHwnd(nIndex))
::PostMessage((HWND)hWnd, WM_CLOSE, 0, 0);
}
bool m_bDragAccept;
DROPEFFECT OnDragEnter(IDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
m_bDragAccept = _MtlIsHlinkDataObject(pDataObject);
return _MtlStandardDropEffect(dwKeyState);
}
DROPEFFECT OnDragOver(IDataObject* pDataObject, DWORD dwKeyState, CPoint point, DROPEFFECT dropOkEffect)
{
if (!m_bDragAccept)
return DROPEFFECT_NONE;
return COleDragDropTabCtrl<CMDITabCtrl>::OnDragOver(pDataObject, dwKeyState, point, dropOkEffect);
// if (dropEffect != DROPEFFECT_NONE && !m_bDragFromItself) {// DROPEFFECT_LINK eats DROPEFFECT_COPY cursor, so check if from itself or not.
// dropEffect |= DROPEFFECT_LINK;
// }
// return dropEffect;
}
bool OnNewTabCtrlItems(int nInsertIndex, CSimpleArray<CTabCtrlItem>& /*items*/, IDataObject* pDataObject, DROPEFFECT& dropEffect)
{
CSimpleArray<CString> arrUrls;
if (MtlGetDropFileName(pDataObject, arrUrls)) {
ATLTRACE(" HDROP found\n");
m_bInsertHere = true;
m_nInsertIndex = nInsertIndex;
for (int i = 0; i < arrUrls.GetSize(); ++i) {
HWND hWnd = DonutOpenFile(m_hWnd, arrUrls[i]);
if (hWnd)
++m_nInsertIndex;
}
m_nInsertIndex = -1;
m_bInsertHere = false;
dropEffect = DROPEFFECT_COPY;
return true;
}
CString strText;
if ( MtlGetHGlobalText(pDataObject, strText) ||
MtlGetHGlobalText(pDataObject, strText, ::RegisterClipboardFormat(CFSTR_SHELLURL)) ) {
m_bInsertHere = true;
m_nInsertIndex = nInsertIndex;
DonutOpenFile(m_hWnd, strText);
m_nInsertIndex = -1;
m_bInsertHere = false;
dropEffect = DROPEFFECT_COPY;
return true;
}
dropEffect = DROPEFFECT_NONE;
return false;
}
bool OnDropTabCtrlItem(int nIndex, IDataObject* pDataObject, DROPEFFECT& dropEffect)
{
HWND hWnd = GetTabHwnd(nIndex);
ATLASSERT(::IsWindow(hWnd));
// first, get drop filename
CSimpleArray<CString> arrFiles;
if (MtlGetDropFileName(pDataObject, arrFiles)) {
CWebBrowser2 browser = DonutGetIWebBrowser2(hWnd);
if (browser.m_spBrowser != NULL) {
CString strFile = arrFiles[0];
if ( !MtlIsProtocol(strFile, _T("http")) &&
!MtlIsProtocol(strFile, _T("https")) )
{
if (MtlPreOpenFile(strFile))
return false;// handled
}
MtlParseIntenetShortcutFile(strFile);
browser.Navigate2(strFile);
dropEffect = DROPEFFECT_COPY;
return false;
}
}
// last, get text
CString strText;
if ( MtlGetHGlobalText(pDataObject, strText) ||
MtlGetHGlobalText(pDataObject, strText, ::RegisterClipboardFormat(CFSTR_SHELLURL)) )
{
CWebBrowser2 browser = DonutGetIWebBrowser2(hWnd);
if (browser.m_spBrowser != NULL) {
browser.Navigate2(strText);
dropEffect = DROPEFFECT_COPY;
return false;
}
}
dropEffect = (DROPEFFECT)-1;
return false;
}
HRESULT OnGetTabCtrlDataObject(CSimpleArray<int>& arrIndex, IDataObject** ppDataObject)
{
ATLASSERT(ppDataObject != NULL);
ATLASSERT(arrIndex.GetSize() > 0);
HRESULT hr = CHlinkDataObject::_CreatorClass::CreateInstance(NULL, IID_IDataObject, (void**)ppDataObject);
if (FAILED(hr)) {
*ppDataObject = NULL;
return E_NOTIMPL;
}
#ifdef _ATL_DEBUG_INTERFACES
ATLASSERT(FALSE && _T("_ATL_DEBUG_INTERFACES crashes the following\n"));
#endif
CHlinkDataObject* pHlinkDataObject = NULL;// this is hack, no need to release
hr = (*ppDataObject)->QueryInterface(IID_NULL, (void**)&pHlinkDataObject);
if (SUCCEEDED(hr)) {
for (int i = 0; i < arrIndex.GetSize(); ++i) {
int nIndex = arrIndex[i];
DWORD dwData;
GetItemUserData(nIndex, dwData);
HWND hWnd = (HWND)dwData;
ATLASSERT(::IsWindow(hWnd));
CWebBrowser2 browser = (IWebBrowser2*)::SendMessage(hWnd, WM_USER_GET_IWEBBROWSER, 0, 0);
CString strName = MtlGetWindowText(hWnd);
CString strUrl = browser.GetLocationURL();
if (strUrl.Left(5) == _T("file:")) {// Donut, to be explorer or not
strName.Empty();
strUrl = strUrl.Right(strUrl.GetLength() - 8);
strUrl.Replace(_T('/'), _T('\\'));
}
pHlinkDataObject->m_arrNameAndUrl.Add(std::make_pair(strName, strUrl));
}
}
return S_OK;
}
template <class _Function>
_Function ForEachWindow(_Function __f)
{
DWORD dwData = 0;
for (int i = 0; i < GetItemCount(); ++i) {
GetItemUserData(i, dwData);
HWND hWnd = (HWND)dwData;
ATLASSERT(::IsWindow(hWnd));
__f(hWnd);
}
return __f;
}
void _LockRedraw(bool bLock)
{
if (bLock) {
m_bRedrawLocked = true;
}
else {
m_bRedrawLocked = false;
int nIndex = GetCurSel();
if (m_wndMDIChildPopuping.MDIGetActive() == GetTabHwnd(nIndex)) {
SetItemActive(nIndex);
}
}
}
class CLockRedraw
{
public:
CMDITabCtrl& m_tab;
CLockRedraw(CMDITabCtrl& tab) : m_tab(tab)
{
m_tab._LockRedraw(true);
m_tab.SetRedraw(FALSE);
}
~CLockRedraw()
{
m_tab._LockRedraw(false);
m_tab.SetRedraw(TRUE);
m_tab.Invalidate();
m_tab.UpdateWindow();
}
};
};
#define PASS_MSG_MAP_MDICHILD_TO_MDITAB(x) CHAIN_MSG_MAP_ALT_MEMBER(x, 1)
/////////////////////////////////////////////////////////////////////////////
// CMDITabPropertyPage
class CMDITabPropertyPage : public CInitPropertyPageImpl<CMDITabPropertyPage>,
public CWinDataExchange<CMDITabPropertyPage>
{
public:
// Constants
enum { IDD = IDD_PROPPAGE_MDITAB };
// Data members
int m_nAddPos, m_nMultiLine, m_nWheel, m_nFixedSize, m_nAnchorColor;
int m_nRadioRightClick, m_nRadioDoubleClick, m_nRadioXClick;
int m_nRadioOnClose;
int m_nFixedSizeX, m_nFixedSizeY;
int m_nMaxTextLength;
CMDITabCtrl* m_pMDITab;
// DDX map
BEGIN_DDX_MAP(CMDITabPropertyPage)
DDX_CHECK(IDC_CHECK_WHEEL, m_nWheel)
DDX_CHECK(IDC_CHECK_MDITAB_MULTILINE, m_nMultiLine)
DDX_CHECK(IDC_CHECK_MDITAB_FIXEDSIZE, m_nFixedSize)
DDX_CHECK(IDC_CHECK_MDITAB_ANCHORCOLOR, m_nAnchorColor)
DDX_INT_RANGE(IDC_EDIT_MDITAB_FIXEDSIZEX, m_nFixedSizeX, 1, 500)
DDX_INT_RANGE(IDC_EDIT_MDITAB_FIXEDSIZEY, m_nFixedSizeY, 1, 500)
DDX_CBINDEX(IDC_COMBO_MDITAB_ADDPOS, m_nAddPos)
DDX_CBINDEX(IDC_COMBO_MDITAB_RIGHTCLICK, m_nRadioRightClick)
DDX_CBINDEX(IDC_COMBO_MDITAB_DOUBLECLICK, m_nRadioDoubleClick)
DDX_CBINDEX(IDC_COMBO_MDITAB_MCLICK, m_nRadioXClick)
DDX_CBINDEX(IDC_COMBO_ONCLOSE, m_nRadioOnClose)
DDX_INT_RANGE(IDC_EDIT_TABTEXTMAX, m_nMaxTextLength, 1, 255)
END_DDX_MAP()
// Constructor
CMDITabPropertyPage(CMDITabCtrl* pMDITab)
: m_pMDITab(pMDITab)
{
DWORD dwExStyle = m_pMDITab->GetMDITabExtendedStyle();
m_nWheel = dwExStyle & MTB_EX_WHEEL ? 1 : 0;
m_nFixedSize = dwExStyle & MTB_EX_FIXEDSIZE ? 1 : 0;
m_nMultiLine = dwExStyle & MTB_EX_MULTILINE ? 1 : 0;
m_nAnchorColor = dwExStyle & MTB_EX_ANCHORCOLOR ? 1 : 0;
CSize sizeItem = m_pMDITab->GetItemSize();
m_nFixedSizeX = sizeItem.cx;
m_nFixedSizeY = sizeItem.cy;
m_nMaxTextLength = m_pMDITab->GetMaxTabItemTextLength();
if (dwExStyle & MTB_EX_RIGHTCLICKCLOSE)
m_nRadioRightClick = 1;
else if (dwExStyle & MTB_EX_RIGHTCLICKREFRESH)
m_nRadioRightClick = 2;
else
m_nRadioRightClick = 0;
if (dwExStyle & MTB_EX_DOUBLECLICKCLOSE)
m_nRadioDoubleClick = 1;
else if (dwExStyle & MTB_EX_DOUBLECLICKREFRESH)
m_nRadioDoubleClick = 2;
else
m_nRadioDoubleClick = 0;
if (dwExStyle & MTB_EX_XCLICKCLOSE)
m_nRadioXClick = 1;
else if (dwExStyle & MTB_EX_XCLICKREFRESH)
m_nRadioXClick = 2;
else
m_nRadioXClick = 0;
if (dwExStyle & MTB_EX_RIGHTACTIVEONCLOSE)
m_nRadioOnClose = 1;
else if (dwExStyle & MTB_EX_LEFTACTIVEONCLOSE)
m_nRadioOnClose = 2;
else
m_nRadioOnClose = 0;
if (dwExStyle & MTB_EX_ADDLEFT)
m_nAddPos = 1;
else if (dwExStyle & MTB_EX_ADDRIGHTACTIVE)
m_nAddPos = 2;
else if (dwExStyle & MTB_EX_ADDLEFTACTIVE)
m_nAddPos = 3;
else
m_nAddPos = 0;
}
// Overrides
BOOL OnSetActive()
{
SetModified(TRUE);
return DoDataExchange(FALSE);
}
BOOL OnKillActive()
{
return DoDataExchange(TRUE);
}
BOOL OnApply()
{
if (DoDataExchange(TRUE)) {
DWORD dwExtendedStyle = 0;
if (m_nWheel == 1)
dwExtendedStyle |= MTB_EX_WHEEL;
if (m_nMultiLine == 1)
dwExtendedStyle |= MTB_EX_MULTILINE;
if (m_nFixedSize == 1)
dwExtendedStyle |= MTB_EX_FIXEDSIZE;
if (m_nAnchorColor == 1)
dwExtendedStyle |= MTB_EX_ANCHORCOLOR;
switch (m_nRadioRightClick) {
case 1:
dwExtendedStyle |= MTB_EX_RIGHTCLICKCLOSE;
break;
case 2:
dwExtendedStyle |= MTB_EX_RIGHTCLICKREFRESH;
break;
}
switch (m_nRadioDoubleClick) {
case 1:
dwExtendedStyle |= MTB_EX_DOUBLECLICKCLOSE;
break;
case 2:
dwExtendedStyle |= MTB_EX_DOUBLECLICKREFRESH;
break;
}
switch (m_nRadioXClick) {
case 1:
dwExtendedStyle |= MTB_EX_XCLICKCLOSE;
break;
case 2:
dwExtendedStyle |= MTB_EX_XCLICKREFRESH;
break;
}
switch (m_nRadioOnClose) {
case 1:
dwExtendedStyle |= MTB_EX_RIGHTACTIVEONCLOSE;
break;
case 2:
dwExtendedStyle |= MTB_EX_LEFTACTIVEONCLOSE;
break;
}
switch (m_nAddPos) {
case 1:
dwExtendedStyle |= MTB_EX_ADDLEFT;
break;
case 2:
dwExtendedStyle |= MTB_EX_ADDRIGHTACTIVE;
break;
case 3:
dwExtendedStyle |= MTB_EX_ADDLEFTACTIVE;
break;
}
m_pMDITab->SetItemSize(CSize(m_nFixedSizeX, m_nFixedSizeY));
m_pMDITab->SetMaxTabItemTextLength(m_nMaxTextLength);
m_pMDITab->SetMDITabExtendedStyle(dwExtendedStyle);
return TRUE;
}
else
return FALSE;
}
// Message map and handlers
BEGIN_MSG_MAP(CMDITabPropertyPage)
CHAIN_MSG_MAP(CInitPropertyPageImpl<CMDITabPropertyPage>)
COMMAND_ID_HANDLER_EX(IDC_BUTTON_MDITAB_FONT, OnFont)
END_MSG_MAP()
void OnFont(WORD /*wNotifyCode*/, WORD /*wID*/, HWND hWndCtl)
{
CLogFont lf;
if (!m_pMDITab->GetMDITabLogFont(lf))
return;
CFontDialog dlg(&lf);
if (dlg.DoModal() == IDOK) {
m_pMDITab->SetMDITabLogFont(dlg.m_lf);
}
}
};
template <class _Profile>
void MtlGetProfileMDITab(_Profile& __profile, CMDITabCtrl& tabMDI)
{
DWORD dwStyle = 0;
LONG lRet = __profile.QueryValue(dwStyle, _T("Extended_Style"));
DWORD dwLength = 30;
lRet = __profile.QueryValue(dwLength, _T("Max_Text_Length"));
CLogFont lf;
lf.InitDefault();
if (lf.GetProfile(__profile)) {
ATLTRACE2(atlTraceUser, 4, _T("MtlGetProfileMDITab fontface : %s\n"), lf.lfFaceName);
tabMDI.SetMDITabLogFont(lf);
}
// load fixed size
DWORD dwX = 60, dwY = 30;
__profile.QueryValue(dwX, _T("Fixed_Size_X"));
__profile.QueryValue(dwY, _T("Fixed_Size_Y"));
tabMDI.SetItemSize(CSize(dwX, dwY));
tabMDI.SetMDITabExtendedStyle(dwStyle);
tabMDI.SetMaxTabItemTextLength(dwLength);
}
template <class _Profile>
void MtlWriteProfileMDITab(_Profile& __profile, CMDITabCtrl& tabMDI)
{
__profile.SetValue(tabMDI.GetMDITabExtendedStyle(), _T("Extended_Style"));
__profile.SetValue(tabMDI.GetMaxTabItemTextLength(), _T("Max_Text_Length"));
CLogFont lf;
if (tabMDI.GetMDITabLogFont(lf)) {
lf.WriteProfile(__profile);
}
CSize sizeItem = tabMDI.GetItemSize();
__profile.SetValue(sizeItem.cx, _T("Fixed_Size_X"));
__profile.SetValue(sizeItem.cy, _T("Fixed_Size_Y"));
}
} //namespace MTL
#ifndef _WTL_NO_AUTOMATIC_NAMESPACE
using namespace MTL;
#endif //!_WTL_NO_AUTOMATIC_NAMESPACE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -