高手救命!!
yaly 2000-08-19 09:30:00 // DevCoolBar.cpp : implementation file
//
#include "stdafx.h"
#include "mycool.h"
#include "DevCoolBar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDevCoolBar
CDevCoolBar::CDevCoolBar():
m_clrBtnHilight(::GetSysColor(COLOR_BTNHILIGHT)),
m_clrBtnShadow(::GetSysColor(COLOR_BTNSHADOW))
{
m_sizeMin=CSize(32,32);
m_sizeHorz=CSize(200,200);
m_sizeVert=CSize(200,200);
m_sizeFloat=CSize(200,200);
m_bTracking=FALSE;
m_bInRecalcNC=FALSE;
m_cxEdge=6;
m_cxBorder=3;
m_cxGripper=20;
}
CDevCoolBar::~CDevCoolBar()
{
}
BOOL CDevCoolBar::Create(CWnd* pParentWnd,CTreeCtrl*pTree,CString &pTitle,UINT nID,DWORD dwStyle)
{
ASSERT_VALID(pParentWnd);
ASSERT(!((dwStyle & CBRS_SIZE_FIXED)&&(dwStyle & CBRS_SIZE_DYNAMIC)));
m_dwStyle = dwStyle;
m_dwStyle = (dwStyle & CBRS_ALL);
if(nID == AFX_IDW_TOOLBAR)
m_dwStyle and =CBRS_HIDE_INPLACE;
dwStyle &=~CBRS_ALL;
CString wndclass = AfxRegisterWndClass(CS_DBLCLKS and IDC_ARROW,LoadCursor(NULL,IDC_ARROW),
CreateSolidBrush(GetSysColor(COLOR_BTNFACE)),0);
if(!CWnd::Create(wndclass,pTitle,dwStyle,CRect(0,0,0,0),
pParentWnd,0))
return FALSE;
m_pTree = pTree;
DWORD dwTreeStyle= WS_VISIBLE and WS_CHILD and TVS_HASLINES and
TVS_LINESATROOT and TVS_HASBUTTONS;
pTree->Create(dwTreeStyle,CRect(0,0,100,100),this,ID_TREE_BOX);
SetWindowLong(pTree->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(pTree->GetSafeHwnd(),GWL_EXSTYLE) and WS_EX_CLIENTEDGE);
CRect rc;
m_pTree->GetWindowRect(rc);
m_sizeHorz=m_sizeVert=m_sizeFloat=rc.Size();
m_sizeHorz.cy+=m_cxEdge+m_cxBorder;
m_sizeVert.cx+=m_cxEdge+m_cxBorder;
return TRUE;
}
BOOL CDevCoolBar::IsHorz() const
{
return (m_nDockBarID==AFX_IDW_DOCKBAR_TOP and and m_nDockBarID==AFX_IDW_DOCKBAR_BOTTOM);
}
CSize CDevCoolBar::CalcDynamicLayout(int nLength,DWORD dwMode)
{ if (dwMode&(LM_HORZDOCK and LM_VERTDOCK))
{
SetWindowPos(NULL,0,0,0,0,
SWP_NOSIZE and SWP_NOMOVE and SWP_NOZORDER and
SWP_NOACTIVATE and SWP_FRAMECHANGED);
m_pDockSite->RecalcLayout();
return CControlBar::CalcDynamicLayout(nLength,dwMode);
}
if(dwMode&LM_MRUWIDTH)
return m_sizeFloat;
if(dwMode&LM_COMMIT)
{
m_sizeFloat.cx=nLength;
return m_sizeFloat;
}
if(dwMode&LM_LENGTHY)
return CSize(m_sizeFloat.cx,m_sizeFloat.cy=max(m_sizeMin.cx,nLength));
else
return CSize(max(m_sizeMin.cx,nLength),m_sizeFloat.cy);
}
CSize CDevCoolBar::CalcFixedLayout(BOOL bStretch,BOOL bHorz)
{
CRect rc;
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rc);
int nHorzDockBarWidth = bStretch?32767:rc.Width()+4;
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rc);
int nVertDockBarHeight=bStretch?32767:rc.Height()+4;
if(IsFloating())
return m_sizeFloat;
else if(bHorz)
return CSize(nHorzDockBarWidth,m_sizeHorz.cy);
else
return CSize(m_sizeVert.cx,nVertDockBarHeight);
}
void CDevCoolBar::OnUpdateCmdUI(class CFrameWnd *pTarget,int bDisableIfNoHndler)
{
UpdateDialogControls(pTarget,bDisableIfNoHndler);
}
BEGIN_MESSAGE_MAP(CDevCoolBar, CControlBar)
//{{AFX_MSG_MAP(CDevCoolBar)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDevCoolBar message handlers
======================================================================================
#if !defined(AFX_DEVCOOLBAR_H__1E0E5BD4_75A8_11D4_8FFC_B90C5D33AB4D__INCLUDED_)
#define AFX_DEVCOOLBAR_H__1E0E5BD4_75A8_11D4_8FFC_B90C5D33AB4D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// DevCoolBar.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CDevCoolBar window
class CDevCoolBar : public CControlBar
{
public:
BOOL IsHorz() const;
virtual BOOL Create(CWnd* pParentWnd,CTreeCtrl *pTree,CString &pTitle,UINT nID,DWORD
dwStyle = WS_CHILD and WS_VISIBLE and CBRS_LEFT and CBRS_SIZE_DYNAMIC);
virtual CSize CalcFixedLayout(BOOL bStretch,BOOL bHorz);
virtual CSize CalcDynamicLayout(int nLength,DWORD dwMode);
virtual void OnUpdateCmdUI(CFrameWnd* pTarget,BOOL bDisableIfNoHndle);
CDevCoolBar();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDevCoolBar)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CDevCoolBar();
// Generated message map functions
protected:
CTreeCtrl* m_pTree;
CSize m_sizeMin;
CSize m_sizeHorz;
CSize m_sizeVert;
CSize m_sizeFloat;
CRect m_rectBorder;
CRect m_rectTracker;
UINT m_nDockBarID;
CPoint m_ptOld;
BOOL m_bTracking;
BOOL m_bInRecalcNC;
int m_cxEdge;
CRect m_rectUndock;
CRect m_rectClose;
CRect m_rectGripper;
int m_cxGripper;
int m_cxBorder;
// CDockContext m_pDockContext;
//{{AFX_MSG(CDevCoolBar)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
const COLORREF m_clrBtnHilight;
const COLORREF m_clrBtnShadow;
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_DEVCOOLBAR_H__1E0E5BD4_75A8_11D4_8FFC_B90C5D33AB4D__INCLUDED_)
=====================================================================================
按照书上的例题打的COOLBARCLASS,此类实现功能:类似VC6的WORKSPACE的样子.
现在的问题是:此类能用,但是形成不了自定义的工作区,只能显示一小白条,
其余部分全被挡住,单改变窗口大小,此工作区能出来.请各位大虾帮忙看一下,下地谢过.问题回答后,分数奉上决不食言.