// WindowContainer.cpp : implementation file // #include "stdafx.h" #include "PrismII.h" #include "PageDllStatus.h" #include "WindowContainer.h" #include "EmWindow.h" #include "PUBLIB2\CommonInterface.h" #include "PUBLIB2\Winutil.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CWindowContainer CWindowContainer::CWindowContainer():splitThick(2) { m_splitMode=SPLIT_NONE; m_ptSplit=CPoint(splitThick,splitThick); m_CurTab=0; m_ToolbarHeight=20; } CWindowContainer::~CWindowContainer() { } BEGIN_MESSAGE_MAP(CWindowContainer, CWnd) //{{AFX_MSG_MAP(CWindowContainer) ON_WM_MOUSEMOVE() ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_RBUTTONDOWN() ON_WM_RBUTTONUP() ON_WM_SIZE() ON_WM_CREATE() ON_WM_DESTROY() //}}AFX_MSG_MAP ON_NOTIFY(TCN_SELCHANGE, 201, OnTabSelchanging) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWindowContainer message handlers BOOL CWindowContainer::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { m_szClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,LoadCursor(NULL,IDC_ARROW),(HBRUSH)GetStockObject(BLACK_BRUSH)); return CreateEx(WS_EX_TOOLWINDOW ,m_szClassName,lpszWindowName,dwStyle,rect,pParentWnd,NULL,NULL); } void CWindowContainer::OnMouseMove(UINT nFlags, CPoint pt) { if(m_splitMode!=SPLIT_NONE){ HDC hdc=::GetDC(m_hWnd); RECT rc; GetClientRect(&rc); if(m_splitMode==SPLIT_QUAD){ DrawPtSplitVert(hdc,rc,m_ptLast); DrawPtSplitHorz(hdc,rc,m_ptLast); DrawPtSplitVert(hdc,rc,pt); DrawPtSplitHorz(hdc,rc,pt); }else if(m_splitMode==SPLIT_HORZ){ DrawPtSplitHorz(hdc,rc,m_ptLast); DrawPtSplitHorz(hdc,rc,pt); }else if(m_splitMode==SPLIT_VERT){ DrawPtSplitVert(hdc,rc,m_ptLast); DrawPtSplitVert(hdc,rc,pt); } m_ptLast=pt; ::ReleaseDC(m_hWnd,hdc); } CWnd::OnMouseMove(nFlags, pt); } void CWindowContainer::OnLButtonDblClk(UINT nFlags, CPoint pt) { CWnd::OnLButtonDblClk(nFlags, pt); } void CWindowContainer::OnLButtonDown(UINT nFlags, CPoint pt) { bool bIsInX = (m_ptSplit.x-splitThick <= pt.x) && (pt.x <= m_ptSplit.x+splitThick); bool bIsInY = (m_ptSplit.y-splitThick <= pt.y) && (pt.y <= m_ptSplit.y+splitThick); if(bIsInX || bIsInY){ HDC hdc=::GetDC(m_hWnd); RECT rc; GetClientRect(&rc); SetCapture(); if(bIsInX && bIsInY){ m_splitMode=SPLIT_QUAD; DrawPtSplitVert(hdc,rc,pt); DrawPtSplitHorz(hdc,rc,pt); }else if(bIsInY){ m_splitMode=SPLIT_HORZ; DrawPtSplitHorz(hdc,rc,pt); }else if(bIsInX){ m_splitMode=SPLIT_VERT; DrawPtSplitVert(hdc,rc,pt); } m_ptLast=pt; ::ReleaseDC(m_hWnd,hdc); } CWnd::OnLButtonDown(nFlags, pt); } BOOL CWindowContainer::DrawPtSplitVert(HDC hdc,RECT rc,CPoint pt) { rc.left=pt.x-splitThick; rc.right=pt.x+splitThick+1; DrawFocusRect(hdc,&rc); return TRUE; } BOOL CWindowContainer::DrawPtSplitHorz(HDC hdc,RECT rc,CPoint pt) { rc.top=pt.y-splitThick; rc.bottom=pt.y+splitThick+1; DrawFocusRect(hdc,&rc); return TRUE; } void CWindowContainer::OnLButtonUp(UINT nFlags, CPoint pt) { if(m_splitMode!=SPLIT_NONE){ HDC hdc=::GetDC(m_hWnd); RECT rc; GetClientRect(&rc); ReleaseCapture(); if(m_splitMode==SPLIT_QUAD){ DrawPtSplitVert(hdc,rc,m_ptLast); DrawPtSplitHorz(hdc,rc,m_ptLast); m_ptSplit=pt; }else if(m_splitMode==SPLIT_HORZ){ DrawPtSplitHorz(hdc,rc,m_ptLast); m_ptSplit.y=pt.y; }else if(m_splitMode==SPLIT_VERT){ DrawPtSplitVert(hdc,rc,m_ptLast); m_ptSplit.x=pt.x; } m_splitMode=SPLIT_NONE; //rect -1¿µ¿ª¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù. #define MARGIN 10 //¿µ¿ªÀ» ¹þ¾î ³µ´ÂÁö üũ.. //clpping bool bLeft = false; bool bRight = false; bool bTop = false; bool bBottom= false; if(m_ptSplit.xrc.right -splitThick-1-MARGIN){m_ptSplit.x=rc.right -splitThick-1;bRight =true;} if(m_ptSplit.yrc.bottom-splitThick-1-MARGIN){m_ptSplit.y=rc.bottom-splitThick-1;bBottom=true;} DrawPtSplitVert(hdc,rc,m_ptSplit); DrawPtSplitHorz(hdc,rc,m_ptSplit); ::ReleaseDC(m_hWnd,hdc); } CWnd::OnLButtonUp(nFlags, pt); } void CWindowContainer::OnRButtonDown(UINT nFlags, CPoint pt) { CWnd::OnRButtonDown(nFlags, pt); } void CWindowContainer::OnRButtonUp(UINT nFlags, CPoint pt) { CWnd::OnRButtonUp(nFlags, pt); } struct TCITEM2:public TCITEM{ LPARAM lParam2; }; void CWindowContainer::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); SIZE size; m_Toolbar.GetMaxSize(&size); RECT rc3; GetClientRect(&rc3); m_Toolbar.MoveWindow(rc3.left,rc3.bottom-size.cy,size.cx,size.cy); m_Tab.MoveWindow(size.cx,rc3.bottom-size.cy,rc3.right-size.cx,size.cy); TCITEM2 item; item.mask=TCIF_PARAM; if(m_Tab.GetItem(m_CurTab,&item)){ rc3.bottom-=size.cy; ((IPrismIIWindowManage*)(item.lParam))->MoveWindow(item.lParam2,rc3); } } static TBBUTTON buttons[]={ {27,900,TBSTATE_ENABLED ,TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE,0,0}, {28,901,TBSTATE_ENABLED ,TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE,0,0}, {29,902,TBSTATE_ENABLED ,TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE,0,0}, TB_SEPERATOR, }; int CWindowContainer::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here m_himl1=ImageList_LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBARCOLOR),16,4,CLR_DEFAULT ,IMAGE_BITMAP,LR_CREATEDIBSECTION); m_himl2=ImageList_LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBARBW),16,4,CLR_DEFAULT ,IMAGE_BITMAP,LR_CREATEDIBSECTION); // 3. Create Toolbar RECT rc1={0,}; m_Toolbar.Create(WS_CHILD|TBSTYLE_FREESIZE|TBSTYLE_LIST,rc1,this,200 );//CBRS_ALIGN_TOP ); m_Toolbar.SetImageList(CImageList::FromHandle(m_himl2)); m_Toolbar.SetHotImageList(CImageList::FromHandle(m_himl1)); m_Toolbar.AddButtons(ARRAYSIZE(buttons),buttons); SIZE size; m_Font=new CFont(); m_Font->CreatePointFont(85,"Verdana"); m_Toolbar.GetMaxSize(&size); m_ToolbarHeight=size.cy; RECT rc3; GetClientRect(&rc3); m_Toolbar.MoveWindow(rc3.left,rc3.bottom-size.cy,size.cx,size.cy); m_Toolbar.ShowWindow(SW_SHOW); m_Toolbar.UpdateWindow(); m_Tab.Create(WS_CHILD|TCS_BOTTOM|TCS_MULTISELECT,rc1,this,201); m_Tab.SetItemExtra(2*sizeof(ULONG)); m_Tab.MoveWindow(size.cx,rc3.bottom-size.cy,rc3.right-size.cx,size.cy); m_Tab.SetFont(m_Font); m_Tab.ShowWindow(SW_SHOW); m_Tab.UpdateWindow(); return 0; } BOOL CWindowContainer::GetInternalRect(RECT * prc) { RECT rc; GetClientRect(&rc); rc.bottom-=22; *prc=rc; return TRUE; } BOOL CWindowContainer::InsertTab(char * name,DWORD param,ULONG extra) { //m_Tab.InsertItem(TCIF_TEXT|TCIF_PARAM,m_Tab.GetItemCount(),name,0,param); TCITEM2 item; item.mask=TCIF_PARAM; if(m_Tab.GetItem(m_CurTab,&item)){ ((IPrismIIWindowManage*)(item.lParam))->SetVisible(item.lParam2,FALSE); } item.mask=TCIF_PARAM|TCIF_TEXT; item.pszText=name; item.lParam=param; item.lParam2=extra; //m_Tab.InsertItem(TCIF_TEXT|TCIF_PARAM,0,name,0,param); m_Tab.InsertItem(0,&item); m_CurTab=0;//??? return TRUE; } BOOL CWindowContainer::RemoveTab(DWORD param,ULONG extra) { int count=m_Tab.GetItemCount(); for(int i=0;iSetVisible(item.lParam2,FALSE); //set current to new.. int iPage=m_Tab.GetCurSel(); m_Tab.GetItem(iPage,&item); RECT rc3; GetClientRect(&rc3); rc3.bottom-=m_ToolbarHeight; ((IPrismIIWindowManage*)(item.lParam))->MoveWindow(item.lParam2,rc3); ((IPrismIIWindowManage*)(item.lParam))->SetVisible(item.lParam2,TRUE); //activate new m_CurTab=iPage; *pResult=FALSE; } void CWindowContainer::OnDestroy() { CWnd::OnDestroy(); delete m_Font; }