?? tabbedframe.h
字號:
// NOTE: This causes the tab to get the WM_SETTINGCHANGE message twice,
// but that's OK.
m_TabCtrl.SendMessage(uMsg, wParam, lParam);
CalcTabAreaHeight();
bHandled = FALSE;
return 0;
}
LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
if(m_hWndActive)
{
// Let the active view and the tabs do all the drawing
// as flicker-free as possible.
bHandled = TRUE;
return 1;
}
else
{
// There is no active tab view.
// Let the default erase happen with the window class brush.
bHandled = FALSE;
return 0;
}
}
LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
// NOTE: ::IsWindowVisible(m_hWndActive) will be false if
// the frame is maximized. So just use "IsWindow" instead.
if(m_hWndActive != NULL && ::IsWindow(m_hWndActive))
{
// Also - only forward the focus on to the active view
// if the tab isn't currently capturing the mouse
if(m_TabCtrl != ::GetCapture())
{
::SetFocus(m_hWndActive);
}
}
bHandled = FALSE;
return 1;
}
LRESULT OnForwardMsg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
//LPMSG pMsg = (LPMSG)lParam;
//
//if(PreTranslateMessage(pMsg))
// return TRUE;
//
//return m_view.PreTranslateMessage(pMsg);
return ::SendMessage(m_hWndActive, WM_FORWARDMSG, 0, lParam);
}
LRESULT OnClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
// If they left click on an item, set focus on the tab view,
// but only if the view was already the active tab view.
NMCTCITEM* item = (NMCTCITEM*)pnmh;
if(item && (item->iItem >= 0) && (item->iItem == m_TabCtrl.GetCurSel()))
{
TTabCtrl::TItem* pItem = m_TabCtrl.GetItem(item->iItem);
if(pItem->UsingTabView())
{
::SetFocus(pItem->GetTabView());
}
}
bHandled = FALSE;
return 0;
}
LRESULT OnAcceptItemDrag(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
// If finished dragging, set focus on the tab view.
NMCTC2ITEMS* item = (NMCTC2ITEMS*)pnmh;
if(item && (item->iItem2 >= 0))
{
TTabCtrl::TItem* pItem = m_TabCtrl.GetItem(item->iItem2);
if(pItem->UsingTabView())
{
::SetFocus(pItem->GetTabView());
}
}
bHandled = FALSE;
return 0;
}
LRESULT OnCancelItemDrag(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
// If finished dragging, set focus on the tab view.
NMCTCITEM* item = (NMCTCITEM*)pnmh;
if(item && (item->iItem >= 0))
{
TTabCtrl::TItem* pItem = m_TabCtrl.GetItem(item->iItem);
if(pItem->UsingTabView())
{
::SetFocus(pItem->GetTabView());
}
}
bHandled = FALSE;
return 0;
}
LRESULT OnDeleteItem(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& bHandled)
{
bHandled = FALSE;
return 0;
}
LRESULT OnSelChanging(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& bHandled)
{
bHandled = FALSE;
return 0;
}
LRESULT OnSelChange(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& bHandled)
{
int nNewTab = m_TabCtrl.GetCurSel();
if(nNewTab >= 0)
{
TTabCtrl::TItem* pItem = m_TabCtrl.GetItem(nNewTab);
if(pItem->UsingTabView())
{
HWND hWndNew = pItem->GetTabView();
HWND hWndOld = m_hWndActive;
if( hWndNew != hWndOld )
{
m_hWndActive = hWndNew;
//UpdateLayout is going to essentially do a
// "ShowWindow(hWndNew, SW_SHOW)" for us
// (Call the most derived class's version of UpdateLayout)
T* pT = static_cast<T*>(this);
pT->UpdateLayout();
if(hWndOld)
{
::ShowWindow(hWndOld, SW_HIDE);
}
::SetFocus(hWndNew);
}
}
}
bHandled = FALSE;
return 0;
}
// Overrides from CCustomTabOwnerImpl
public:
void SetTabAreaHeight(int nNewTabAreaHeight)
{
if(m_nTabAreaHeight != nNewTabAreaHeight)
{
m_nTabAreaHeight = nNewTabAreaHeight;
T* pT = static_cast<T*>(this);
pT->UpdateLayout();
Invalidate();
}
}
void OnRemoveLastTab()
{
// NOTE: Derived classes should call this base class version as well
m_hWndActive = NULL;
customTabOwnerClass::OnRemoveLastTab();
}
// Overrides from TBase
public:
void UpdateLayout(BOOL bResizeBars = TRUE)
{
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
T* pT = static_cast<T*>(this);
pT->UpdateBarsPosition(rect, bResizeBars);
/*
// resize client window
if(m_hWndClient != NULL)
::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_NOZORDER | SWP_NOACTIVATE);
*/
int nWindowPosCount=0;
if(m_TabCtrl) nWindowPosCount++;
if(m_hWndActive) nWindowPosCount++;
if(nWindowPosCount > 0)
{
HDWP hdwp = BeginDeferWindowPos(nWindowPosCount);
DWORD dwStyle = (DWORD)m_TabCtrl.GetWindowLong(GWL_STYLE);
if(CTCS_BOTTOM == (dwStyle & CTCS_BOTTOM))
{
if(m_TabCtrl)
{
::DeferWindowPos(
hdwp,
m_TabCtrl,
NULL,
rect.left, rect.bottom - m_nTabAreaHeight,
rect.right - rect.left, m_nTabAreaHeight,
SWP_NOZORDER | SWP_NOACTIVATE);
}
if(m_hWndActive)
{
::DeferWindowPos(
hdwp,
m_hWndActive,
NULL,
rect.left, rect.top,
rect.right - rect.left, (rect.bottom-m_nTabAreaHeight) - rect.top,
SWP_NOZORDER | SWP_SHOWWINDOW);
}
}
else
{
if(m_TabCtrl)
{
::DeferWindowPos(
hdwp,
m_TabCtrl,
NULL,
rect.left, rect.top,
rect.right-rect.left, m_nTabAreaHeight,
SWP_NOZORDER | SWP_NOACTIVATE);
}
if(m_hWndActive)
{
::DeferWindowPos(
hdwp,
m_hWndActive,
NULL,
rect.left, rect.top + m_nTabAreaHeight,
rect.right - rect.left,
rect.bottom - (rect.top+m_nTabAreaHeight),
SWP_NOZORDER | SWP_SHOWWINDOW);
}
}
EndDeferWindowPos(hdwp);
}
m_TabCtrl.UpdateLayout();
}
};
/////////////////////////////////////////////////////////////////////////////
//
// CTabbedPopupFrame
//
/////////////////////////////////////////////////////////////////////////////
typedef CWinTraits<WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_SYSMENU | WS_THICKFRAME, WS_EX_TOOLWINDOW> TabbedPopupFrameWinTraits;
template <class TTabCtrl = CDotNetTabCtrl<CTabViewTabItem> >
class CTabbedPopupFrame :
public CTabbedFrameImpl<CTabbedPopupFrame<TTabCtrl>, TTabCtrl, CFrameWindowImpl<CTabbedPopupFrame<TTabCtrl>, CWindow, TabbedPopupFrameWinTraits> >
{
protected:
typedef CTabbedPopupFrame<TTabCtrl> thisClass;
typedef CTabbedFrameImpl<CTabbedPopupFrame<TTabCtrl>, TTabCtrl, CFrameWindowImpl<CTabbedPopupFrame<TTabCtrl>, CWindow, TabbedPopupFrameWinTraits> > baseClass;
// Members:
protected:
// NOTE: If the "Close Command" is 0, than we really
// just let the default frame handling of "closing"
// happen, otherwise, we send the specified command to the parent
WORD m_nCloseCommand;
// Constructors
public:
CTabbedPopupFrame(bool bReflectNotifications = false) :
baseClass(bReflectNotifications),
m_nCloseCommand(0U)
{
}
// Accessors
public:
WORD GetCloseCommand(void) const
{
return m_nCloseCommand;
}
void SetCloseCommand(WORD nCloseCommand)
{
m_nCloseCommand = nCloseCommand;
}
// Message Handling
public:
DECLARE_FRAME_WND_CLASS_EX(_T("TabbedPopupFrame"), 0, 0, COLOR_APPWORKSPACE)
BOOL PreTranslateMessage(MSG* pMsg)
{
if(baseClass::PreTranslateMessage(pMsg))
return TRUE;
//return m_view.PreTranslateMessage(pMsg);
HWND hWndFocus = ::GetFocus();
if(m_hWndActive != NULL && ::IsWindow(m_hWndActive) &&
(m_hWndActive == hWndFocus || ::IsChild(m_hWndActive, hWndFocus)))
{
//active.PreTranslateMessage(pMsg);
if(::SendMessage(m_hWndActive, WM_FORWARDMSG, 0, (LPARAM)pMsg))
{
return TRUE;
}
}
return FALSE;
}
BEGIN_MSG_MAP(thisClass)
if(m_nCloseCommand != 0)
{
if(uMsg == WM_SYSCOMMAND && wParam == SC_CLOSE)
{
bHandled = TRUE;
lResult = ::SendMessage(this->GetParent(), WM_COMMAND, MAKEWPARAM(m_nCloseCommand, 0), 0);
return TRUE;
}
}
CHAIN_MSG_MAP(baseClass)
END_MSG_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//
// CTabbedChildWindow
//
/////////////////////////////////////////////////////////////////////////////
// We need CTabbedChildWindowBase because of how CTabbedFrameImpl is currently implemented -
// It's expecting that the "base" class to usually be derived from CFrameWindowImpl.
// We'll have this special class for CTabbedChildWindow to
// inherit from instead of CWindowImpl, so that we provide
// the couple of extra things that CTabbedFrameImpl would
// like to be able to depend on (currently - a message map that
// at least handles WM_SIZE and overrideable methods
// "UpdateLayout" and "UpdateBarsPosition")
typedef CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE> TabbedChildWindowWinTraits;
template <class T, class TBase = CWindow, class TWinTraits = TabbedChildWindowWinTraits>
class ATL_NO_VTABLE CTabbedChildWindowBase : public CWindowImpl< T, TBase, TWinTraits >
{
typedef CTabbedChildWindowBase< T, TBase, TWinTraits > thisClass;
BEGIN_MSG_MAP(thisClass)
MESSAGE_HANDLER(WM_SIZE, OnSize)
END_MSG_MAP()
LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
if(wParam != SIZE_MINIMIZED)
{
T* pT = static_cast<T*>(this);
pT->UpdateLayout();
}
bHandled = FALSE;
return 1;
}
// Overrideables
public:
void UpdateLayout(BOOL bResizeBars = TRUE)
{
}
void UpdateBarsPosition(RECT& /*rect*/, BOOL /*bResizeBars = TRUE*/)
{
}
};
template <class TTabCtrl = CDotNetTabCtrl<CTabViewTabItem> >
class CTabbedChildWindow :
public CTabbedFrameImpl<CTabbedChildWindow<TTabCtrl>, TTabCtrl, CTabbedChildWindowBase<CTabbedChildWindow<TTabCtrl>, CWindow, TabbedChildWindowWinTraits> >
{
protected:
typedef CTabbedChildWindow<TTabCtrl> thisClass;
typedef CTabbedFrameImpl<CTabbedChildWindow<TTabCtrl>, TTabCtrl, CTabbedChildWindowBase<CTabbedChildWindow<TTabCtrl>, CWindow, TabbedChildWindowWinTraits> > baseClass;
// Constructors
public:
CTabbedChildWindow(bool bReflectNotifications = false) :
baseClass(bReflectNotifications)
{
}
// Message Handling
public:
DECLARE_FRAME_WND_CLASS_EX(_T("TabbedChildWindow"), 0, 0, COLOR_APPWORKSPACE)
BOOL PreTranslateMessage(MSG* pMsg)
{
//if(baseClass::PreTranslateMessage(pMsg))
// return TRUE;
//return m_view.PreTranslateMessage(pMsg);
HWND hWndFocus = ::GetFocus();
if(m_hWndActive != NULL && ::IsWindow(m_hWndActive) &&
(m_hWndActive == hWndFocus || ::IsChild(m_hWndActive, hWndFocus)))
{
//active.PreTranslateMessage(pMsg);
if(::SendMessage(m_hWndActive, WM_FORWARDMSG, 0, (LPARAM)pMsg))
{
return TRUE;
}
}
return FALSE;
}
BEGIN_MSG_MAP(thisClass)
CHAIN_MSG_MAP(baseClass)
END_MSG_MAP()
};
#endif // __WTL_TABBED_FRAME_H__
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -