diff options
Diffstat (limited to 'mmc_updater/depends/win32cpp/tab.h')
-rw-r--r-- | mmc_updater/depends/win32cpp/tab.h | 1658 |
1 files changed, 0 insertions, 1658 deletions
diff --git a/mmc_updater/depends/win32cpp/tab.h b/mmc_updater/depends/win32cpp/tab.h deleted file mode 100644 index 15699144..00000000 --- a/mmc_updater/depends/win32cpp/tab.h +++ /dev/null @@ -1,1658 +0,0 @@ -// Win32++ Version 7.2 -// Released: 5th AUgust 2011 -// -// David Nash -// email: dnash@bigpond.net.au -// url: https://sourceforge.net/projects/win32-framework -// -// -// Copyright (c) 2005-2011 David Nash -// -// Permission is hereby granted, free of charge, to -// any person obtaining a copy of this software and -// associated documentation files (the "Software"), -// to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, -// merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom -// the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -// OR OTHER DEALINGS IN THE SOFTWARE. -// -//////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////// -// tab.h -// Declaration of the CTab and CMDITab classes - -#ifndef _WIN32XX_TAB_H_ -#define _WIN32XX_TAB_H_ - -#include "wincore.h" -#include "dialog.h" -#include "gdi.h" -#include "default_resource.h" - -namespace Win32xx -{ - - struct TabPageInfo - { - TCHAR szTabText[MAX_MENU_STRING]; - int iImage; // index of this tab's image - int idTab; // identifier for this tab (optional) - CWnd* pView; // pointer to the view window - }; - - class CTab : public CWnd - { - protected: - // Declaration of the CSelectDialog class, a nested class of CTab - // It creates the dialog to choose which tab to activate - class CSelectDialog : public CDialog - { - public: - CSelectDialog(LPCDLGTEMPLATE lpTemplate, CWnd* pParent = NULL); - virtual ~CSelectDialog() {} - virtual void AddItem(LPCTSTR szString); - virtual BOOL IsTab() const { return FALSE; } - - protected: - virtual BOOL OnInitDialog(); - virtual void OnOK(); - virtual void OnCancel() { EndDialog(-2); } - - private: - CSelectDialog(const CSelectDialog&); // Disable copy construction - CSelectDialog& operator = (const CSelectDialog&); // Disable assignment operator - - std::vector<tString> m_vItems; - int IDC_LIST; - - }; - public: - CTab(); - virtual ~CTab(); - virtual int AddTabPage(WndPtr pView, LPCTSTR szTabText, HICON hIcon, UINT idTab); - virtual int AddTabPage(WndPtr pView, LPCTSTR szTabText, int nID_Icon, UINT idTab = 0); - virtual int AddTabPage(WndPtr pView, LPCTSTR szTabText); - virtual CRect GetCloseRect() const; - virtual CRect GetListRect() const; - virtual HMENU GetListMenu(); - virtual BOOL GetTabsAtTop() const; - virtual int GetTabIndex(CWnd* pWnd) const; - virtual TabPageInfo GetTabPageInfo(UINT nTab) const; - virtual int GetTextHeight() const; - virtual void RecalcLayout(); - virtual void RemoveTabPage(int nPage); - virtual void SelectPage(int nPage); - virtual void SetFixedWidth(BOOL bEnabled); - virtual void SetOwnerDraw(BOOL bEnabled); - virtual void SetShowButtons(BOOL bShow); - virtual void SetTabIcon(int i, HICON hIcon); - virtual void SetTabsAtTop(BOOL bTop); - virtual void SetTabText(UINT nTab, LPCTSTR szText); - virtual void SwapTabs(UINT nTab1, UINT nTab2); - - // Attributes - std::vector <TabPageInfo>& GetAllTabs() const { return (std::vector <TabPageInfo>&) m_vTabPageInfo; } - HIMAGELIST GetImageList() const { return m_himlTab; } - BOOL GetShowButtons() const { return m_bShowButtons; } - int GetTabHeight() const { return m_nTabHeight; } - CWnd* GetActiveView() const { return m_pActiveView; } - void SetTabHeight(int nTabHeight) { m_nTabHeight = nTabHeight; NotifyChanged();} - - // Wrappers for Win32 Macros - void AdjustRect(BOOL fLarger, RECT *prc) const; - int GetCurFocus() const; - int GetCurSel() const; - BOOL GetItem(int iItem, LPTCITEM pitem) const; - int GetItemCount() const; - int HitTest(TCHITTESTINFO& info) const; - void SetCurFocus(int iItem) const; - int SetCurSel(int iItem) const; - DWORD SetItemSize(int cx, int cy) const; - int SetMinTabWidth(int cx) const; - void SetPadding(int cx, int cy) const; - - protected: - virtual void DrawCloseButton(CDC& DrawDC); - virtual void DrawListButton(CDC& DrawDC); - virtual void DrawTabs(CDC& dcMem); - virtual void DrawTabBorders(CDC& dcMem, CRect& rcTab); - virtual void OnCreate(); - virtual void OnLButtonDown(WPARAM wParam, LPARAM lParam); - virtual void OnLButtonUp(WPARAM wParam, LPARAM lParam); - virtual void OnMouseLeave(WPARAM wParam, LPARAM lParam); - virtual void OnMouseMove(WPARAM wParam, LPARAM lParam); - virtual LRESULT OnNCHitTest(WPARAM wParam, LPARAM lParam); - virtual LRESULT OnNotifyReflect(WPARAM wParam, LPARAM lParam); - virtual void NotifyChanged(); - virtual void Paint(); - virtual void PreCreate(CREATESTRUCT& cs); - virtual void PreRegisterClass(WNDCLASS &wc); - virtual void SetTabSize(); - virtual void ShowListDialog(); - virtual void ShowListMenu(); - virtual LRESULT WndProcDefault(UINT uMsg, WPARAM wParam, LPARAM lParam); - - private: - CTab(const CTab&); // Disable copy construction - CTab& operator = (const CTab&); // Disable assignment operator - - SIZE GetMaxTabSize() const; - void ShowActiveView(CWnd* pView); - - std::vector<TabPageInfo> m_vTabPageInfo; - std::vector<WndPtr> m_vTabViews; - CFont m_Font; - HIMAGELIST m_himlTab; - HMENU m_hListMenu; - CWnd* m_pActiveView; - BOOL m_bShowButtons; // Show or hide the close and list button - BOOL m_IsTracking; - BOOL m_IsClosePressed; - BOOL m_IsListPressed; - BOOL m_IsListMenuActive; - int m_nTabHeight; - }; - - //////////////////////////////////////// - // Declaration of the CTabbedMDI class - class CTabbedMDI : public CWnd - { - public: - CTabbedMDI(); - virtual ~CTabbedMDI(); - virtual CWnd* AddMDIChild(CWnd* pView, LPCTSTR szTabText, int idMDIChild = 0); - virtual void CloseActiveMDI(); - virtual void CloseAllMDIChildren(); - virtual void CloseMDIChild(int nTab); - virtual CWnd* GetActiveMDIChild() const; - virtual int GetActiveMDITab() const; - virtual CWnd* GetMDIChild(int nTab) const; - virtual int GetMDIChildCount() const; - virtual int GetMDIChildID(int nTab) const; - virtual LPCTSTR GetMDIChildTitle(int nTab) const; - virtual HMENU GetListMenu() const { return GetTab().GetListMenu(); } - virtual CTab& GetTab() const {return (CTab&)m_Tab;} - virtual BOOL LoadRegistrySettings(tString tsRegistryKeyName); - virtual void RecalcLayout(); - virtual BOOL SaveRegistrySettings(tString tsRegistryKeyName); - virtual void SetActiveMDIChild(CWnd* pWnd); - virtual void SetActiveMDITab(int nTab); - - protected: - virtual HWND Create(CWnd* pParent); - virtual CWnd* NewMDIChildFromID(int idMDIChild); - virtual void OnCreate(); - virtual void OnDestroy(WPARAM wParam, LPARAM lParam); - virtual LRESULT OnNotify(WPARAM wParam, LPARAM lParam); - virtual void OnWindowPosChanged(WPARAM wParam, LPARAM lParam); - virtual LRESULT WndProcDefault(UINT uMsg, WPARAM wParam, LPARAM lParam); - - private: - CTabbedMDI(const CTabbedMDI&); // Disable copy construction - CTabbedMDI& operator = (const CTabbedMDI&); // Disable assignment operator - - CTab m_Tab; - }; - -} - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - -namespace Win32xx -{ - - ///////////////////////////////////////////////////////////// - // Definitions for the CSelectDialog class nested within CTab - // - inline CTab::CSelectDialog::CSelectDialog(LPCDLGTEMPLATE lpTemplate, CWnd* pParent) : - CDialog(lpTemplate, pParent), IDC_LIST(121) - { - } - - inline BOOL CTab::CSelectDialog::OnInitDialog() - { - for (UINT u = 0; u < m_vItems.size(); ++u) - { - SendDlgItemMessage(IDC_LIST, LB_ADDSTRING, 0, (LPARAM) m_vItems[u].c_str()); - } - - return true; - } - - inline void CTab::CSelectDialog::AddItem(LPCTSTR szString) - { - m_vItems.push_back(szString); - } - - inline void CTab::CSelectDialog::OnOK() - { - int iSelect = (int)SendDlgItemMessage(IDC_LIST, LB_GETCURSEL, 0, 0); - if (iSelect != LB_ERR) - EndDialog(iSelect); - else - EndDialog(-2); - } - - - ////////////////////////////////////////////////////////// - // Definitions for the CTab class - // - inline CTab::CTab() : m_hListMenu(NULL), m_pActiveView(NULL), m_bShowButtons(FALSE), m_IsTracking(FALSE), m_IsClosePressed(FALSE), - m_IsListPressed(FALSE), m_IsListMenuActive(FALSE), m_nTabHeight(0) - { - // Create and assign the image list - m_himlTab = ImageList_Create(16, 16, ILC_MASK|ILC_COLOR32, 0, 0); - - // Set the tab control's font - NONCLIENTMETRICS info = {0}; - info.cbSize = GetSizeofNonClientMetrics(); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); - m_Font.CreateFontIndirect(&info.lfStatusFont); - } - - inline CTab::~CTab() - { - ImageList_Destroy(m_himlTab); - - if (IsMenu(m_hListMenu)) ::DestroyMenu(m_hListMenu); - } - - inline int CTab::AddTabPage(WndPtr pView, LPCTSTR szTabText, HICON hIcon, UINT idTab) - { - assert(pView.get()); - assert(lstrlen(szTabText) < MAX_MENU_STRING); - - m_vTabViews.push_back(pView); - - TabPageInfo tpi = {0}; - tpi.pView = pView.get(); - tpi.idTab = idTab; - lstrcpyn(tpi.szTabText, szTabText, MAX_MENU_STRING); - if (hIcon) - tpi.iImage = ImageList_AddIcon(GetImageList(), hIcon); - else - tpi.iImage = -1; - - int iNewPage = (int)m_vTabPageInfo.size(); - m_vTabPageInfo.push_back(tpi); - - if (m_hWnd) - { - TCITEM tie = {0}; - tie.mask = TCIF_TEXT | TCIF_IMAGE; - tie.iImage = tpi.iImage; - tie.pszText = tpi.szTabText; - TabCtrl_InsertItem(m_hWnd, iNewPage, &tie); - - SetTabSize(); - SelectPage(iNewPage); - NotifyChanged(); - } - - return iNewPage; - } - - inline int CTab::AddTabPage(WndPtr pView, LPCTSTR szTabText, int idIcon, UINT idTab /* = 0*/) - { - HICON hIcon = (HICON)LoadImage(GetApp()->GetResourceHandle(), MAKEINTRESOURCE(idIcon), IMAGE_ICON, 0, 0, LR_SHARED); - return AddTabPage(pView, szTabText, hIcon, idTab); - } - - inline int CTab::AddTabPage(WndPtr pView, LPCTSTR szTabText) - { - return AddTabPage(pView, szTabText, (HICON)0, 0); - } - - inline void CTab::DrawCloseButton(CDC& DrawDC) - { - // The close button isn't displayed on Win95 - if (GetWinVersion() == 1400) return; - - if (!m_bShowButtons) return; - if (!GetActiveView()) return; - if (!(GetWindowLongPtr(GWL_STYLE) & TCS_FIXEDWIDTH)) return; - if (!(GetWindowLongPtr(GWL_STYLE) & TCS_OWNERDRAWFIXED)) return; - - // Determine the close button's drawing position relative to the window - CRect rcClose = GetCloseRect(); - - CPoint pt = GetCursorPos(); - ScreenToClient(pt); - UINT uState = rcClose.PtInRect(pt)? m_IsClosePressed? 2: 1: 0; - - // Draw the outer highlight for the close button - if (!IsRectEmpty(&rcClose)) - { - switch (uState) - { - case 0: - { - DrawDC.CreatePen(PS_SOLID, 1, RGB(232, 228, 220)); - - DrawDC.MoveTo(rcClose.left, rcClose.bottom); - DrawDC.LineTo(rcClose.right, rcClose.bottom); - DrawDC.LineTo(rcClose.right, rcClose.top); - DrawDC.LineTo(rcClose.left, rcClose.top); - DrawDC.LineTo(rcClose.left, rcClose.bottom); - break; - } - - case 1: - { - // Draw outline, white at top, black on bottom - DrawDC.CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); - DrawDC.MoveTo(rcClose.left, rcClose.bottom); - DrawDC.LineTo(rcClose.right, rcClose.bottom); - DrawDC.LineTo(rcClose.right, rcClose.top); - DrawDC.CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); - DrawDC.LineTo(rcClose.left, rcClose.top); - DrawDC.LineTo(rcClose.left, rcClose.bottom); - } - - break; - case 2: - { - // Draw outline, black on top, white on bottom - DrawDC.CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); - DrawDC.MoveTo(rcClose.left, rcClose.bottom); - DrawDC.LineTo(rcClose.right, rcClose.bottom); - DrawDC.LineTo(rcClose.right, rcClose.top); - DrawDC.CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); - DrawDC.LineTo(rcClose.left, rcClose.top); - DrawDC.LineTo(rcClose.left, rcClose.bottom); - } - break; - } - - // Manually draw close button - DrawDC.CreatePen(PS_SOLID, 1, RGB(64, 64, 64)); - - DrawDC.MoveTo(rcClose.left + 3, rcClose.top +3); - DrawDC.LineTo(rcClose.right - 2, rcClose.bottom -2); - - DrawDC.MoveTo(rcClose.left + 4, rcClose.top +3); - DrawDC.LineTo(rcClose.right - 2, rcClose.bottom -3); - - DrawDC.MoveTo(rcClose.left + 3, rcClose.top +4); - DrawDC.LineTo(rcClose.right - 3, rcClose.bottom -2); - - DrawDC.MoveTo(rcClose.right -3, rcClose.top +3); - DrawDC.LineTo(rcClose.left + 2, rcClose.bottom -2); - - DrawDC.MoveTo(rcClose.right -3, rcClose.top +4); - DrawDC.LineTo(rcClose.left + 3, rcClose.bottom -2); - - DrawDC.MoveTo(rcClose.right -4, rcClose.top +3); - DrawDC.LineTo(rcClose.left + 2, rcClose.bottom -3); - } - } - - inline void CTab::DrawListButton(CDC& DrawDC) - { - // The list button isn't displayed on Win95 - if (GetWinVersion() == 1400) return; - - if (!m_bShowButtons) return; - if (!GetActiveView()) return; - if (!(GetWindowLongPtr(GWL_STYLE) & TCS_FIXEDWIDTH)) return; - if (!(GetWindowLongPtr(GWL_STYLE) & TCS_OWNERDRAWFIXED)) return; - - // Determine the list button's drawing position relative to the window - CRect rcList = GetListRect(); - - CPoint pt = GetCursorPos(); - ScreenToClient(pt); - UINT uState = rcList.PtInRect(pt)? 1: 0; - if (m_IsListMenuActive) uState = 2; - - // Draw the outer highlight for the list button - if (!IsRectEmpty(&rcList)) - { - switch (uState) - { - case 0: - { - DrawDC.CreatePen(PS_SOLID, 1, RGB(232, 228, 220)); - - DrawDC.MoveTo(rcList.left, rcList.bottom); - DrawDC.LineTo(rcList.right, rcList.bottom); - DrawDC.LineTo(rcList.right, rcList.top); - DrawDC.LineTo(rcList.left, rcList.top); - DrawDC.LineTo(rcList.left, rcList.bottom); - break; - } - - case 1: - { - // Draw outline, white at top, black on bottom - DrawDC.CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); - DrawDC.MoveTo(rcList.left, rcList.bottom); - DrawDC.LineTo(rcList.right, rcList.bottom); - DrawDC.LineTo(rcList.right, rcList.top); - DrawDC.CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); - DrawDC.LineTo(rcList.left, rcList.top); - DrawDC.LineTo(rcList.left, rcList.bottom); - } - - break; - case 2: - { - // Draw outline, black on top, white on bottom - DrawDC.CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); - DrawDC.MoveTo(rcList.left, rcList.bottom); - DrawDC.LineTo(rcList.right, rcList.bottom); - DrawDC.LineTo(rcList.right, rcList.top); - DrawDC.CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); - DrawDC.LineTo(rcList.left, rcList.top); - DrawDC.LineTo(rcList.left, rcList.bottom); - } - break; - } - - // Manually draw list button - DrawDC.CreatePen(PS_SOLID, 1, RGB(64, 64, 64)); - - int MaxLength = (int)(0.65 * rcList.Width()); - int topGap = 1 + rcList.Height()/3; - for (int i = 0; i <= MaxLength/2; i++) - { - int Length = MaxLength - 2*i; - DrawDC.MoveTo(rcList.left +1 + (rcList.Width() - Length)/2, rcList.top +topGap +i); - DrawDC.LineTo(rcList.left +1 + (rcList.Width() - Length)/2 + Length, rcList.top +topGap +i); - } - } - } - - inline void CTab::DrawTabs(CDC& dcMem) - { - // Draw the tab buttons: - for (int i = 0; i < TabCtrl_GetItemCount(m_hWnd); ++i) - { - CRect rcItem; - TabCtrl_GetItemRect(m_hWnd, i, &rcItem); - if (!rcItem.IsRectEmpty()) - { - if (i == TabCtrl_GetCurSel(m_hWnd)) - { - dcMem.CreateSolidBrush(RGB(248,248,248)); - dcMem.SetBkColor(RGB(248,248,248)); - } - else - { - dcMem.CreateSolidBrush(RGB(200,200,200)); - dcMem.SetBkColor(RGB(200,200,200)); - } - - dcMem.CreatePen(PS_SOLID, 1, RGB(160, 160, 160)); - dcMem.RoundRect(rcItem.left+1, rcItem.top, rcItem.right+2, rcItem.bottom, 6, 6); - - if (rcItem.Width() >= 24) - { - TCHAR szText[30]; - TCITEM tcItem = {0}; - tcItem.mask = TCIF_TEXT | TCIF_IMAGE; - tcItem.cchTextMax = 30; - tcItem.pszText = szText; - TabCtrl_GetItem(m_hWnd, i, &tcItem); - int xImage; - int yImage; - int yOffset = 0; - if (ImageList_GetIconSize(m_himlTab, &xImage, &yImage)) - yOffset = (rcItem.Height() - yImage)/2; - - // Draw the icon - ImageList_Draw(m_himlTab, tcItem.iImage, dcMem, rcItem.left+5, rcItem.top+yOffset, ILD_NORMAL); - - // Draw the text - dcMem.SelectObject(&m_Font); - - // Calculate the size of the text - CRect rcText = rcItem; - - int iImageSize = 20; - int iPadding = 4; - if (tcItem.iImage >= 0) - rcText.left += iImageSize; - - rcText.left += iPadding; - dcMem.DrawText(szText, -1, rcText, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS); - } - } - } - } - - inline void CTab::DrawTabBorders(CDC& dcMem, CRect& rcTab) - { - BOOL IsBottomTab = (BOOL)GetWindowLongPtr(GWL_STYLE) & TCS_BOTTOM; - - // Draw a lighter rectangle touching the tab buttons - CRect rcItem; - TabCtrl_GetItemRect(m_hWnd, 0, &rcItem); - int left = rcItem.left +1; - int right = rcTab.right; - int top = rcTab.bottom; - int bottom = top + 3; - - if (!IsBottomTab) - { - bottom = MAX(rcTab.top, m_nTabHeight +4); - top = bottom -3; - } - - dcMem.CreateSolidBrush(RGB(248,248,248)); - dcMem.CreatePen(PS_SOLID, 1, RGB(248,248,248)); - if (!rcItem.IsRectEmpty()) - { - dcMem.Rectangle(left, top, right, bottom); - - // Draw a darker line below the rectangle - dcMem.CreatePen(PS_SOLID, 1, RGB(160, 160, 160)); - if (IsBottomTab) - { - dcMem.MoveTo(left-1, bottom); - dcMem.LineTo(right, bottom); - } - else - { - dcMem.MoveTo(left-1, top-1); - dcMem.LineTo(right, top-1); - } - - // Draw a lighter line over the darker line for the selected tab - dcMem.CreatePen(PS_SOLID, 1, RGB(248,248,248)); - TabCtrl_GetItemRect(m_hWnd, TabCtrl_GetCurSel(m_hWnd), &rcItem); - OffsetRect(&rcItem, 1, 1); - - if (IsBottomTab) - { - dcMem.MoveTo(rcItem.left, bottom); - dcMem.LineTo(rcItem.right, bottom); - } - else - { - dcMem.MoveTo(rcItem.left, top-1); - dcMem.LineTo(rcItem.right, top-1); - } - } - } - - inline CRect CTab::GetCloseRect() const - { - CRect rcClose; - if (GetShowButtons()) - { - rcClose= GetClientRect(); - int Gap = 2; - int cx = GetSystemMetrics(SM_CXSMICON) -1; - int cy = GetSystemMetrics(SM_CYSMICON) -1; - rcClose.right -= Gap; - rcClose.left = rcClose.right - cx; - - if (GetTabsAtTop()) - rcClose.top = Gap; - else - rcClose.top = MAX(Gap, rcClose.bottom - m_nTabHeight); - - rcClose.bottom = rcClose.top + cy; - } - return rcClose; - } - - inline HMENU CTab::GetListMenu() - { - if (IsMenu(m_hListMenu)) - ::DestroyMenu(m_hListMenu); - - m_hListMenu = CreatePopupMenu(); - - // Add the menu items - for(UINT u = 0; u < MIN(GetAllTabs().size(), 9); ++u) - { - TCHAR szMenuString[MAX_MENU_STRING+1]; - TCHAR szTabText[MAX_MENU_STRING]; - lstrcpyn(szTabText, GetAllTabs()[u].szTabText, MAX_MENU_STRING -4); - wsprintf(szMenuString, _T("&%d %s"), u+1, szTabText); - AppendMenu(m_hListMenu, MF_STRING, IDW_FIRSTCHILD +u, szMenuString); - } - if (GetAllTabs().size() >= 10) - AppendMenu(m_hListMenu, MF_STRING, IDW_FIRSTCHILD +9, _T("More Windows")); - - // Add a checkmark to the menu - int iSelected = GetCurSel(); - if (iSelected < 9) - CheckMenuItem(m_hListMenu, iSelected, MF_BYPOSITION|MF_CHECKED); - - return m_hListMenu; - } - - inline CRect CTab::GetListRect() const - { - CRect rcList; - if (GetShowButtons()) - { - CRect rcClose = GetCloseRect(); - rcList = rcClose; - rcList.OffsetRect( -(rcClose.Width() + 2), 0); - rcList.InflateRect(-1, 0); - } - return rcList; - } - - inline SIZE CTab::GetMaxTabSize() const - { - CSize Size; - - for (int i = 0; i < TabCtrl_GetItemCount(m_hWnd); i++) - { - CClientDC dcClient(this); - dcClient.SelectObject(&m_Font); - std::vector<TCHAR> vTitle(MAX_MENU_STRING, _T('\0')); - TCHAR* pszTitle = &vTitle.front(); - TCITEM tcItem = {0}; - tcItem.mask = TCIF_TEXT |TCIF_IMAGE; - tcItem.cchTextMax = MAX_MENU_STRING; - tcItem.pszText = pszTitle; - TabCtrl_GetItem(m_hWnd, i, &tcItem); - CSize TempSize = dcClient.GetTextExtentPoint32(pszTitle, lstrlen(pszTitle)); - - int iImageSize = 0; - int iPadding = 6; - if (tcItem.iImage >= 0) - iImageSize = 20; - TempSize.cx += iImageSize + iPadding; - - if (TempSize.cx > Size.cx) - Size = TempSize; - } - - return Size; - } - - inline BOOL CTab::GetTabsAtTop() const - // Returns TRUE if the contol's tabs are placed at the top - { - DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE); - return (!(dwStyle & TCS_BOTTOM)); - } - - inline int CTab::GetTextHeight() const - { - CClientDC dcClient(this); - dcClient.SelectObject(&m_Font); - CSize szText = dcClient.GetTextExtentPoint32(_T("Text"), lstrlen(_T("Text"))); - return szText.cy; - } - - inline int CTab::GetTabIndex(CWnd* pWnd) const - { - assert(pWnd); - - for (int i = 0; i < (int)m_vTabPageInfo.size(); ++i) - { - if (m_vTabPageInfo[i].pView == pWnd) - return i; - } - - return -1; - } - - inline TabPageInfo CTab::GetTabPageInfo(UINT nTab) const - { - assert (nTab < m_vTabPageInfo.size()); - - return m_vTabPageInfo[nTab]; - } - - inline void CTab::NotifyChanged() - { - NMHDR nmhdr = {0}; - nmhdr.hwndFrom = m_hWnd; - nmhdr.code = UWM_TAB_CHANGED; - GetParent()->SendMessage(WM_NOTIFY, 0L, (LPARAM)&nmhdr); - } - - inline void CTab::OnCreate() - { - SetFont(&m_Font, TRUE); - - // Assign ImageList unless we are owner drawn - if (!(GetWindowLongPtr(GWL_STYLE) & TCS_OWNERDRAWFIXED)) - TabCtrl_SetImageList(m_hWnd, m_himlTab); - - for (int i = 0; i < (int)m_vTabPageInfo.size(); ++i) - { - // Add tabs for each view. - TCITEM tie = {0}; - tie.mask = TCIF_TEXT | TCIF_IMAGE; - tie.iImage = m_vTabPageInfo[i].iImage; - tie.pszText = m_vTabPageInfo[i].szTabText; - TabCtrl_InsertItem(m_hWnd, i, &tie); - } - - int HeightGap = 5; - SetTabHeight(MAX(20, (GetTextHeight() + HeightGap))); - SelectPage(0); - } - - inline void CTab::OnLButtonDown(WPARAM /*wParam*/, LPARAM lParam) - { - CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - - if (GetCloseRect().PtInRect(pt)) - { - m_IsClosePressed = TRUE; - SetCapture(); - CClientDC dc(this); - DrawCloseButton(dc); - } - else - m_IsClosePressed = FALSE; - - if (GetListRect().PtInRect(pt)) - { - ShowListMenu(); - } - } - - inline void CTab::OnLButtonUp(WPARAM /*wParam*/, LPARAM lParam) - { - ReleaseCapture(); - CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - if (m_IsClosePressed && GetCloseRect().PtInRect(pt)) - { - RemoveTabPage(GetCurSel()); - if (GetActiveView()) - GetActiveView()->RedrawWindow(); - } - - m_IsClosePressed = FALSE; - } - - inline void CTab::OnMouseLeave(WPARAM /*wParam*/, LPARAM /*lParam*/) - { - CClientDC dc(this); - DrawCloseButton(dc); - DrawListButton(dc); - - m_IsTracking = FALSE; - } - - inline void CTab::OnMouseMove(WPARAM /*wParam*/, LPARAM /*lParam*/) - { - if (!m_IsListMenuActive && m_IsListPressed) - { - m_IsListPressed = FALSE; - } - - if (!m_IsTracking) - { - TRACKMOUSEEVENT TrackMouseEventStruct = {0}; - TrackMouseEventStruct.cbSize = sizeof(TrackMouseEventStruct); - TrackMouseEventStruct.dwFlags = TME_LEAVE; - TrackMouseEventStruct.hwndTrack = m_hWnd; - _TrackMouseEvent(&TrackMouseEventStruct); - m_IsTracking = TRUE; - } - - CClientDC dc(this); - DrawCloseButton(dc); - DrawListButton(dc); - } - - inline LRESULT CTab::OnNCHitTest(WPARAM wParam, LPARAM lParam) - { - // Ensure we have an arrow cursor when the tab has no view window - if (0 == GetAllTabs().size()) - SetCursor(LoadCursor(NULL, IDC_ARROW)); - - // Cause WM_LBUTTONUP and WM_LBUTTONDOWN messages to be sent for buttons - CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - ScreenToClient(pt); - if (GetCloseRect().PtInRect(pt)) return HTCLIENT; - if (GetListRect().PtInRect(pt)) return HTCLIENT; - - return CWnd::WndProcDefault(WM_NCHITTEST, wParam, lParam); - } - - inline LRESULT CTab::OnNotifyReflect(WPARAM wParam, LPARAM lParam) - { - UNREFERENCED_PARAMETER(wParam); - - switch (((LPNMHDR)lParam)->code) - { - case TCN_SELCHANGE: - { - // Display the newly selected tab page - int nPage = GetCurSel(); - ShowActiveView(m_vTabPageInfo[nPage].pView); - } - break; - } - - return 0L; - } - - inline void CTab::Paint() - { - // Microsoft's drawing for a tab control is rubbish, so we do our own. - // We use double buffering and regions to eliminate flicker - - // Create the memory DC and bitmap - CClientDC dcView(this); - CMemDC dcMem(&dcView); - CRect rcClient = GetClientRect(); - dcMem.CreateCompatibleBitmap(&dcView, rcClient.Width(), rcClient.Height()); - - if (0 == GetItemCount()) - { - // No tabs, so simply display a grey background and exit - COLORREF rgbDialog = GetSysColor(COLOR_BTNFACE); - dcView.SolidFill(rgbDialog, rcClient); - return; - } - - // Create a clipping region. Its the overall tab window's region, - // less the region belonging to the individual tab view's client area - CRgn rgnSrc1 = ::CreateRectRgn(rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); - CRect rcTab = GetClientRect(); - TabCtrl_AdjustRect(m_hWnd, FALSE, &rcTab); - if (rcTab.Height() < 0) - rcTab.top = rcTab.bottom; - if (rcTab.Width() < 0) - rcTab.left = rcTab.right; - - CRgn rgnSrc2 = ::CreateRectRgn(rcTab.left, rcTab.top, rcTab.right, rcTab.bottom); - CRgn rgnClip = ::CreateRectRgn(0, 0, 0, 0); - ::CombineRgn(rgnClip, rgnSrc1, rgnSrc2, RGN_DIFF); - - // Use the region in the memory DC to paint the grey background - dcMem.SelectClipRgn(&rgnClip); - HWND hWndParent = ::GetParent(m_hWnd); - CDC dcParent = ::GetDC(hWndParent); - HBRUSH hBrush = (HBRUSH) SendMessage(hWndParent, WM_CTLCOLORDLG, (WPARAM)dcParent.GetHDC(), (LPARAM)hWndParent); - dcMem.SelectObject(FromHandle(hBrush)); - dcMem.PaintRgn(&rgnClip); - - // Draw the tab buttons on the memory DC: - DrawTabs(dcMem); - - // Draw buttons and tab borders - DrawCloseButton(dcMem); - DrawListButton(dcMem); - DrawTabBorders(dcMem, rcTab); - - // Now copy our from our memory DC to the window DC - dcView.SelectClipRgn(&rgnClip); - dcView.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, SRCCOPY); - } - - inline void CTab::PreCreate(CREATESTRUCT &cs) - { - // For Tabs on the bottom, add the TCS_BOTTOM style - cs.style = WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; - } - - inline void CTab::PreRegisterClass(WNDCLASS &wc) - { - wc.lpszClassName = WC_TABCONTROL; - } - - inline void CTab::RecalcLayout() - { - if (IsWindow()) - { - if (GetActiveView()) - { - // Set the tab sizes - SetTabSize(); - - // Position the View over the tab control's display area - CRect rc = GetClientRect(); - TabCtrl_AdjustRect(m_hWnd, FALSE, &rc); - GetActiveView()->SetWindowPos(NULL, rc, SWP_SHOWWINDOW); - } - else - RedrawWindow(); - } - } - - inline void CTab::RemoveTabPage(int nPage) - { - if ((nPage < 0) || (nPage > (int)m_vTabPageInfo.size() -1)) - return; - - // Remove the tab - TabCtrl_DeleteItem(m_hWnd, nPage); - - // Remove the TapPageInfo entry - std::vector<TabPageInfo>::iterator itTPI = m_vTabPageInfo.begin() + nPage; - CWnd* pView = (*itTPI).pView; - int iImage = (*itTPI).iImage; - if (iImage >= 0) - TabCtrl_RemoveImage(m_hWnd, iImage); - - if (pView == m_pActiveView) - m_pActiveView = 0; - - (*itTPI).pView->Destroy(); - m_vTabPageInfo.erase(itTPI); - - std::vector<WndPtr>::iterator itView; - for (itView = m_vTabViews.begin(); itView < m_vTabViews.end(); ++itView) - { - if ((*itView).get() == pView) - { - m_vTabViews.erase(itView); - break; - } - } - - if (IsWindow()) - { - if (m_vTabPageInfo.size() > 0) - { - SetTabSize(); - SelectPage(0); - } - else - ShowActiveView(NULL); - - NotifyChanged(); - } - } - - inline void CTab::SelectPage(int nPage) - { - if ((nPage >= 0) && (nPage < GetItemCount())) - { - if (nPage != GetCurSel()) - SetCurSel(nPage); - - ShowActiveView(m_vTabPageInfo[nPage].pView); - } - } - - inline void CTab::SetFixedWidth(BOOL bEnabled) - { - DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE); - if (bEnabled) - SetWindowLongPtr(GWL_STYLE, dwStyle | TCS_FIXEDWIDTH); - else - SetWindowLongPtr(GWL_STYLE, dwStyle & ~TCS_FIXEDWIDTH); - - RecalcLayout(); - } - - inline void CTab::SetOwnerDraw(BOOL bEnabled) - // Enable or disable owner draw - { - DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE); - if (bEnabled) - { - SetWindowLongPtr(GWL_STYLE, dwStyle | TCS_OWNERDRAWFIXED); - TabCtrl_SetImageList(m_hWnd, NULL); - } - else - { - SetWindowLongPtr(GWL_STYLE, dwStyle & ~TCS_OWNERDRAWFIXED); - TabCtrl_SetImageList(m_hWnd, m_himlTab); - } - - RecalcLayout(); - } - - inline void CTab::SetShowButtons(BOOL bShow) - { - m_bShowButtons = bShow; - RecalcLayout(); - } - - inline void CTab::SetTabIcon(int i, HICON hIcon) - // Changes or sets the tab's icon - { - assert (GetItemCount() > i); - TCITEM tci = {0}; - tci.mask = TCIF_IMAGE; - GetItem(i, &tci); - if (tci.iImage >= 0) - { - ImageList_ReplaceIcon(GetImageList(), i, hIcon); - } - else - { - int iImage = ImageList_AddIcon(GetImageList(), hIcon); - tci.iImage = iImage; - TabCtrl_SetItem(m_hWnd, i, &tci); - m_vTabPageInfo[i].iImage = iImage; - } - } - - inline void CTab::SetTabsAtTop(BOOL bTop) - // Positions the tabs at the top or botttom of the control - { - DWORD dwStyle = (DWORD)GetWindowLongPtr(GWL_STYLE); - - if (bTop) - dwStyle &= ~TCS_BOTTOM; - else - dwStyle |= TCS_BOTTOM; - - SetWindowLongPtr(GWL_STYLE, dwStyle); - RecalcLayout(); - } - - inline void CTab::SetTabSize() - { - if (GetItemCount() > 0) - { - CRect rc = GetClientRect(); - TabCtrl_AdjustRect(m_hWnd, FALSE, &rc); - - int xGap = 2; - if (m_bShowButtons) xGap += GetCloseRect().Width() + GetListRect().Width() +2; - - int nItemWidth = MIN( GetMaxTabSize().cx, (rc.Width() - xGap)/GetItemCount() ); - nItemWidth = MAX(nItemWidth, 0); - SendMessage(TCM_SETITEMSIZE, 0L, MAKELPARAM(nItemWidth, m_nTabHeight)); - NotifyChanged(); - } - } - - inline void CTab::SetTabText(UINT nTab, LPCTSTR szText) - { - // Allows the text to be changed on an existing tab - if (nTab < GetAllTabs().size()) - { - TCITEM Item = {0}; - std::vector<TCHAR> vTChar(MAX_MENU_STRING+1, _T('\0')); - TCHAR* pTChar = &vTChar.front(); - lstrcpyn(pTChar, szText, MAX_MENU_STRING); - Item.mask = TCIF_TEXT; - Item.pszText = pTChar; - - if (TabCtrl_SetItem(m_hWnd, nTab, &Item)) - lstrcpyn(m_vTabPageInfo[nTab].szTabText, pTChar, MAX_MENU_STRING); - } - } - - inline void CTab::ShowActiveView(CWnd* pView) - // Sets or changes the View window displayed within the tab page - { - // Hide the old view - if (GetActiveView() && (GetActiveView()->IsWindow())) - GetActiveView()->ShowWindow(SW_HIDE); - - // Assign the view window - m_pActiveView = pView; - - if (m_pActiveView && m_hWnd) - { - if (!m_pActiveView->IsWindow()) - { - // The tab control is already created, so create the new view too - GetActiveView()->Create(this); - } - - // Position the View over the tab control's display area - CRect rc = GetClientRect(); - TabCtrl_AdjustRect(m_hWnd, FALSE, &rc); - GetActiveView()->SetWindowPos(HWND_TOP, rc, SWP_SHOWWINDOW); - GetActiveView()->SetFocus(); - } - } - - inline void CTab::ShowListMenu() - // Displays the list of windows in a popup menu - { - if (!m_IsListPressed) - { - m_IsListPressed = TRUE; - HMENU hMenu = GetListMenu(); - - CPoint pt(GetListRect().left, GetListRect().top + GetTabHeight()); - ClientToScreen(pt); - - // Choosing the frame's hwnd for the menu's messages will automatically theme the popup menu - HWND MenuHwnd = GetAncestor()->GetHwnd(); - int nPage = 0; - m_IsListMenuActive = TRUE; - nPage = TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, pt.x, pt.y, MenuHwnd, NULL) - IDW_FIRSTCHILD; - if ((nPage >= 0) && (nPage < 9)) SelectPage(nPage); - if (nPage == 9) ShowListDialog(); - m_IsListMenuActive = FALSE; - } - - CClientDC dc(this); - DrawListButton(dc); - } - - inline void CTab::ShowListDialog() - { - // Definition of a dialog template which displays a List Box - unsigned char dlg_Template[] = - { - 0x01,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xc8,0x00,0xc8,0x90,0x03, - 0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x8e,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x65, - 0x00,0x6c,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x20,0x00,0x57,0x00,0x69,0x00,0x6e, - 0x00,0x64,0x00,0x6f,0x00,0x77,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x01,0x4d, - 0x00,0x53,0x00,0x20,0x00,0x53,0x00,0x68,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20, - 0x00,0x44,0x00,0x6c,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x01,0x00,0x01,0x50,0x40,0x00,0x7a,0x00,0x25,0x00,0x0f,0x00,0x01, - 0x00,0x00,0x00,0xff,0xff,0x80,0x00,0x4f,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x50,0x7a,0x00,0x7a,0x00,0x25, - 0x00,0x0f,0x00,0x02,0x00,0x00,0x00,0xff,0xff,0x80,0x00,0x43,0x00,0x61,0x00,0x6e, - 0x00,0x63,0x00,0x65,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x02,0x00,0x01,0x01,0x21,0x50,0x06,0x00,0x06,0x00,0xcf,0x00,0x6d,0x00,0x79, - 0x00,0x00,0x00,0xff,0xff,0x83,0x00,0x00,0x00,0x00,0x00 - }; - - // Display the modal dialog. The dialog is defined in the dialog template rather - // than in the resource script (rc) file. - CSelectDialog MyDialog((LPCDLGTEMPLATE) dlg_Template); - for(UINT u = 0; u < GetAllTabs().size(); ++u) - { - MyDialog.AddItem(GetAllTabs()[u].szTabText); - } - - int iSelected = (int)MyDialog.DoModal(); - if (iSelected >= 0) SelectPage(iSelected); - } - - inline void CTab::SwapTabs(UINT nTab1, UINT nTab2) - { - if ((nTab1 < GetAllTabs().size()) && (nTab2 < GetAllTabs().size()) && (nTab1 != nTab2)) - { - int nPage = GetCurSel(); - TabPageInfo T1 = GetTabPageInfo(nTab1); - TabPageInfo T2 = GetTabPageInfo(nTab2); - - TCITEM Item1 = {0}; - Item1.mask = TCIF_IMAGE | TCIF_PARAM | TCIF_RTLREADING | TCIF_STATE | TCIF_TEXT; - GetItem(nTab1, &Item1); - TCITEM Item2 = {0}; - Item2.mask = TCIF_IMAGE | TCIF_PARAM | TCIF_RTLREADING | TCIF_STATE | TCIF_TEXT; - GetItem(nTab2, &Item2); - TabCtrl_SetItem(m_hWnd, nTab1, &Item2); - TabCtrl_SetItem(m_hWnd, nTab2, &Item1); - - m_vTabPageInfo[nTab1] = T2; - m_vTabPageInfo[nTab2] = T1; - SelectPage(nPage); - } - } - - inline LRESULT CTab::WndProcDefault(UINT uMsg, WPARAM wParam, LPARAM lParam) - { - switch(uMsg) - { - case WM_PAINT: - if (GetWindowLongPtr(GWL_STYLE) & TCS_OWNERDRAWFIXED) - { - // Remove all pending paint requests - PAINTSTRUCT ps; - BeginPaint(ps); - EndPaint(ps); - - // Now call our local Paint - Paint(); - return 0; - } - break; - - case WM_ERASEBKGND: - if (GetWindowLongPtr(GWL_STYLE) & TCS_OWNERDRAWFIXED) - return 0; - break; - case WM_KILLFOCUS: - m_IsClosePressed = FALSE; - break; - case WM_LBUTTONDBLCLK: - case WM_LBUTTONDOWN: - OnLButtonDown(wParam, lParam); - break; - case WM_LBUTTONUP: - OnLButtonUp(wParam, lParam); - break; - case WM_MOUSEMOVE: - OnMouseMove(wParam, lParam); - break; - case WM_MOUSELEAVE: - OnMouseLeave(wParam, lParam); - break; - case WM_NCHITTEST: - return OnNCHitTest(wParam, lParam); - - case WM_WINDOWPOSCHANGING: - // A little hack to reduce tab flicker - if (IsWindowVisible() && (GetWindowLongPtr(GWL_STYLE) & TCS_OWNERDRAWFIXED)) - { - LPWINDOWPOS pWinPos = (LPWINDOWPOS)lParam; - pWinPos->flags |= SWP_NOREDRAW; - - Paint(); - } - - break; - - case WM_WINDOWPOSCHANGED: - RecalcLayout(); - break; - } - - // pass unhandled messages on for default processing - return CWnd::WndProcDefault(uMsg, wParam, lParam); - } - - // Wrappers for Win32 Macros - inline void CTab::AdjustRect(BOOL fLarger, RECT *prc) const - { - assert(::IsWindow(m_hWnd)); - TabCtrl_AdjustRect(m_hWnd, fLarger, prc); - } - - inline int CTab::GetCurFocus() const - { - assert(::IsWindow(m_hWnd)); - return TabCtrl_GetCurFocus(m_hWnd); - } - - inline int CTab::GetCurSel() const - { - assert(::IsWindow(m_hWnd)); - return TabCtrl_GetCurSel(m_hWnd); - } - - inline BOOL CTab::GetItem(int iItem, LPTCITEM pitem) const - { - assert(::IsWindow(m_hWnd)); - return TabCtrl_GetItem(m_hWnd, iItem, pitem); - } - - inline int CTab::GetItemCount() const - { - assert(::IsWindow(m_hWnd)); - return TabCtrl_GetItemCount(m_hWnd); - } - - inline int CTab::HitTest(TCHITTESTINFO& info) const - { - assert(::IsWindow(m_hWnd)); - return TabCtrl_HitTest(m_hWnd, &info); - } - - inline void CTab::SetCurFocus(int iItem) const - { - assert(::IsWindow(m_hWnd)); - TabCtrl_SetCurFocus(m_hWnd, iItem); - } - - inline int CTab::SetCurSel(int iItem) const - { - assert(::IsWindow(m_hWnd)); - return TabCtrl_SetCurSel(m_hWnd, iItem); - } - - inline DWORD CTab::SetItemSize(int cx, int cy) const - { - assert(::IsWindow(m_hWnd)); - return TabCtrl_SetItemSize(m_hWnd, cx, cy); - } - - inline int CTab::SetMinTabWidth(int cx) const - { - assert(::IsWindow(m_hWnd)); - return TabCtrl_SetMinTabWidth(m_hWnd, cx); - } - - inline void CTab::SetPadding(int cx, int cy) const - { - assert(::IsWindow(m_hWnd)); - TabCtrl_SetPadding(m_hWnd, cx, cy); - } - - //////////////////////////////////////// - // Definitions for the CTabbedMDI class - inline CTabbedMDI::CTabbedMDI() - { - GetTab().SetShowButtons(TRUE); - } - - inline CTabbedMDI::~CTabbedMDI() - { - } - - inline CWnd* CTabbedMDI::AddMDIChild(CWnd* pView, LPCTSTR szTabText, int idMDIChild /*= 0*/) - { - assert(pView); - assert(lstrlen(szTabText) < MAX_MENU_STRING); - - GetTab().AddTabPage(WndPtr(pView), szTabText, 0, idMDIChild); - - // Fake a WM_MOUSEACTIVATE to propogate focus change to dockers - if (IsWindow()) - GetParent()->SendMessage(WM_MOUSEACTIVATE, (WPARAM)GetAncestor(), MAKELPARAM(HTCLIENT,WM_LBUTTONDOWN)); - - return pView; - } - - inline void CTabbedMDI::CloseActiveMDI() - { - int nTab = GetTab().GetCurSel(); - if (nTab >= 0) - GetTab().RemoveTabPage(nTab); - - RecalcLayout(); - } - - inline void CTabbedMDI::CloseAllMDIChildren() - { - while (GetMDIChildCount() > 0) - { - GetTab().RemoveTabPage(0); - } - } - - inline void CTabbedMDI::CloseMDIChild(int nTab) - { - GetTab().RemoveTabPage(nTab); - - if (GetActiveMDIChild()) - GetActiveMDIChild()->RedrawWindow(); - } - - inline HWND CTabbedMDI::Create(CWnd* pParent /* = NULL*/) - { - CLIENTCREATESTRUCT clientcreate ; - clientcreate.hWindowMenu = m_hWnd; - clientcreate.idFirstChild = IDW_FIRSTCHILD ; - DWORD dwStyle = WS_CHILD | WS_VISIBLE | MDIS_ALLCHILDSTYLES; - - // Create the MDICLIENT view window - if (!CreateEx(0, _T("MDICLIENT"), _T(""), - dwStyle, 0, 0, 0, 0, pParent, NULL, (PSTR) &clientcreate)) - throw CWinException(_T("CMDIClient::Create ... CreateEx failed")); - - return m_hWnd; - } - - inline CWnd* CTabbedMDI::GetActiveMDIChild() const - { - CWnd* pView = NULL; - int nTab = GetTab().GetCurSel(); - if (nTab >= 0) - { - TabPageInfo tbi = GetTab().GetTabPageInfo(nTab); - pView = tbi.pView; - } - - return pView; - } - - inline int CTabbedMDI::GetActiveMDITab() const - { - return GetTab().GetCurSel(); - } - - inline CWnd* CTabbedMDI::GetMDIChild(int nTab) const - { - assert(nTab >= 0); - assert(nTab < GetMDIChildCount()); - return GetTab().GetTabPageInfo(nTab).pView; - } - - inline int CTabbedMDI::GetMDIChildCount() const - { - return (int) GetTab().GetAllTabs().size(); - } - - inline int CTabbedMDI::GetMDIChildID(int nTab) const - { - assert(nTab >= 0); - assert(nTab < GetMDIChildCount()); - return GetTab().GetTabPageInfo(nTab).idTab; - } - - inline LPCTSTR CTabbedMDI::GetMDIChildTitle(int nTab) const - { - assert(nTab >= 0); - assert(nTab < GetMDIChildCount()); - return GetTab().GetTabPageInfo(nTab).szTabText; - } - - inline BOOL CTabbedMDI::LoadRegistrySettings(tString tsRegistryKeyName) - { - BOOL bResult = FALSE; - - if (0 != tsRegistryKeyName.size()) - { - tString tsKey = _T("Software\\") + tsRegistryKeyName + _T("\\MDI Children"); - HKEY hKey = 0; - RegOpenKeyEx(HKEY_CURRENT_USER, tsKey.c_str(), 0, KEY_READ, &hKey); - if (hKey) - { - DWORD dwType = REG_BINARY; - DWORD BufferSize = sizeof(TabPageInfo); - TabPageInfo tbi = {0}; - int i = 0; - TCHAR szNumber[16]; - tString tsSubKey = _T("MDI Child "); - tsSubKey += _itot(i, szNumber, 10); - - // Fill the DockList vector from the registry - while (0 == RegQueryValueEx(hKey, tsSubKey.c_str(), NULL, &dwType, (LPBYTE)&tbi, &BufferSize)) - { - CWnd* pWnd = NewMDIChildFromID(tbi.idTab); - if (pWnd) - { - AddMDIChild(pWnd, tbi.szTabText, tbi.idTab); - i++; - tsSubKey = _T("MDI Child "); - tsSubKey += _itot(i, szNumber, 10); - bResult = TRUE; - } - else - { - TRACE(_T("Failed to get TabbedMDI info from registry")); - bResult = FALSE; - break; - } - } - - // Load Active MDI Tab from the registry - tsSubKey = _T("Active MDI Tab"); - int nTab; - dwType = REG_DWORD; - BufferSize = sizeof(int); - if(ERROR_SUCCESS == RegQueryValueEx(hKey, tsSubKey.c_str(), NULL, &dwType, (LPBYTE)&nTab, &BufferSize)) - SetActiveMDITab(nTab); - else - SetActiveMDITab(0); - - RegCloseKey(hKey); - } - } - - if (!bResult) - CloseAllMDIChildren(); - - return bResult; - } - - inline CWnd* CTabbedMDI::NewMDIChildFromID(int /*idMDIChild*/) - { - // Override this function to create new MDI children from IDs as shown below - CWnd* pView = NULL; - /* switch(idTab) - { - case ID_SIMPLE: - pView = new CViewSimple; - break; - case ID_RECT: - pView = new CViewRect; - break; - default: - TRACE(_T("Unknown MDI child ID\n")); - break; - } */ - - return pView; - } - - inline void CTabbedMDI::OnCreate() - { - GetTab().Create(this); - GetTab().SetFixedWidth(TRUE); - GetTab().SetOwnerDraw(TRUE); - } - - inline void CTabbedMDI::OnDestroy(WPARAM /*wParam*/, LPARAM /*lParam*/ ) - { - CloseAllMDIChildren(); - } - - inline LRESULT CTabbedMDI::OnNotify(WPARAM /*wParam*/, LPARAM lParam) - { - LPNMHDR pnmhdr = (LPNMHDR)lParam; - if (pnmhdr->code == UWM_TAB_CHANGED) - RecalcLayout(); - - return 0L; - } - - inline void CTabbedMDI::OnWindowPosChanged(WPARAM /*wParam*/, LPARAM /*lParam*/) - { - RecalcLayout(); - } - - inline void CTabbedMDI::RecalcLayout() - { - if (GetTab().IsWindow()) - { - if (GetTab().GetItemCount() >0) - { - CRect rcClient = GetClientRect(); - GetTab().SetWindowPos(NULL, rcClient, SWP_SHOWWINDOW); - GetTab().UpdateWindow(); - } - else - { - CRect rcClient = GetClientRect(); - GetTab().SetWindowPos(NULL, rcClient, SWP_HIDEWINDOW); - Invalidate(); - } - } - } - - inline BOOL CTabbedMDI::SaveRegistrySettings(tString tsRegistryKeyName) - { - if (0 != tsRegistryKeyName.size()) - { - tString tsKeyName = _T("Software\\") + tsRegistryKeyName; - HKEY hKey = NULL; - HKEY hKeyMDIChild = NULL; - - try - { - if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_CURRENT_USER, tsKeyName.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL)) - throw (CWinException(_T("RegCreateKeyEx Failed"))); - - RegDeleteKey(hKey, _T("MDI Children")); - if (ERROR_SUCCESS != RegCreateKeyEx(hKey, _T("MDI Children"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyMDIChild, NULL)) - throw (CWinException(_T("RegCreateKeyEx Failed"))); - - for (int i = 0; i < GetMDIChildCount(); ++i) - { - TCHAR szNumber[16]; - tString tsSubKey = _T("MDI Child "); - tsSubKey += _itot(i, szNumber, 10); - TabPageInfo pdi = GetTab().GetTabPageInfo(i); - if (ERROR_SUCCESS != RegSetValueEx(hKeyMDIChild, tsSubKey.c_str(), 0, REG_BINARY, (LPBYTE)&pdi, sizeof(TabPageInfo))) - throw (CWinException(_T("RegSetValueEx Failed"))); - } - - // Add Active Tab to the registry - tString tsSubKey = _T("Active MDI Tab"); - int nTab = GetActiveMDITab(); - if(ERROR_SUCCESS != RegSetValueEx(hKeyMDIChild, tsSubKey.c_str(), 0, REG_DWORD, (LPBYTE)&nTab, sizeof(int))) - throw (CWinException(_T("RegSetValueEx failed"))); - - RegCloseKey(hKeyMDIChild); - RegCloseKey(hKey); - } - catch (const CWinException& e) - { - // Roll back the registry changes by deleting the subkeys - if (hKey) - { - if (hKeyMDIChild) - { - RegDeleteKey(hKeyMDIChild, _T("MDI Children")); - RegCloseKey(hKeyMDIChild); - } - - RegDeleteKey(HKEY_CURRENT_USER ,tsKeyName.c_str()); - RegCloseKey(hKey); - } - - e.what(); - return FALSE; - } - } - - return TRUE; - } - - inline void CTabbedMDI::SetActiveMDIChild(CWnd* pWnd) - { - assert(pWnd); - int nPage = GetTab().GetTabIndex(pWnd); - if (nPage >= 0) - GetTab().SelectPage(nPage); - } - - inline void CTabbedMDI::SetActiveMDITab(int iTab) - { - assert(::IsWindow(m_hWnd)); - assert(GetTab().IsWindow()); - GetTab().SelectPage(iTab); - } - - inline LRESULT CTabbedMDI::WndProcDefault(UINT uMsg, WPARAM wParam, LPARAM lParam) - { - switch(uMsg) - { - case WM_DESTROY: - OnDestroy(wParam, lParam); - break; - - case WM_WINDOWPOSCHANGED: - OnWindowPosChanged(wParam, lParam); - break; - } - - return CWnd::WndProcDefault(uMsg, wParam, lParam); - } - -} // namespace Win32xx - -#endif // _WIN32XX_TAB_H_ |