259 lines
8.8 KiB
C++
259 lines
8.8 KiB
C++
// LayoutView.cpp : implementation of the CLayoutView class
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "Layout.h"
|
|
|
|
#include "LayoutDoc.h"
|
|
#include "LayoutView.h"
|
|
|
|
#include "OXLayoutManager.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define OX_OFFSET (7) // This is the default padding in the Visual C++ Dialog editor
|
|
// so we use it here too. This number must be >= 0
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLayoutView
|
|
|
|
IMPLEMENT_DYNCREATE(CLayoutView, CFormView)
|
|
|
|
BEGIN_MESSAGE_MAP(CLayoutView, CFormView)
|
|
//{{AFX_MSG_MAP(CLayoutView)
|
|
ON_WM_SIZE()
|
|
//}}AFX_MSG_MAP
|
|
// Standard printing commands
|
|
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
|
|
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
|
|
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLayoutView construction/destruction
|
|
|
|
CLayoutView::CLayoutView()
|
|
: CFormView(CLayoutView::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CLayoutView)
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_pLayoutManager = NULL;
|
|
}
|
|
|
|
CLayoutView::~CLayoutView()
|
|
{
|
|
if (m_pLayoutManager != NULL)
|
|
{
|
|
delete m_pLayoutManager;
|
|
m_pLayoutManager = NULL;
|
|
}
|
|
}
|
|
|
|
void CLayoutView::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CFormView::DoDataExchange(pDX);
|
|
|
|
//{{AFX_DATA_MAP(CLayoutView)
|
|
DDX_Control(pDX, IDC_TREE, m_tree);
|
|
DDX_Control(pDX, IDC_SLIDER, m_slider);
|
|
DDX_Control(pDX, IDC_PROGRESS, m_progress);
|
|
DDX_Control(pDX, IDC_LIST, m_list);
|
|
DDX_Control(pDX, IDC_COMBO, m_combo);
|
|
DDX_Control(pDX, IDC_EDIT, m_edit);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BOOL CLayoutView::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
// TODO: Modify the Window class or styles here by modifying
|
|
// the CREATESTRUCT cs
|
|
return CFormView::PreCreateWindow(cs);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLayoutView printing
|
|
|
|
BOOL CLayoutView::OnPreparePrinting(CPrintInfo* pInfo)
|
|
{
|
|
// default preparation
|
|
return DoPreparePrinting(pInfo);
|
|
}
|
|
|
|
void CLayoutView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
|
|
{
|
|
// TODO: add extra initialization before printing
|
|
}
|
|
|
|
void CLayoutView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
|
|
{
|
|
// TODO: add cleanup after printing
|
|
}
|
|
|
|
void CLayoutView::OnPrint(CDC* /*pDC*/, CPrintInfo*)
|
|
{
|
|
// TODO: add code to print the controls
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLayoutView diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CLayoutView::AssertValid() const
|
|
{
|
|
CFormView::AssertValid();
|
|
}
|
|
|
|
void CLayoutView::Dump(CDumpContext& dc) const
|
|
{
|
|
CFormView::Dump(dc);
|
|
}
|
|
|
|
CLayoutDoc* CLayoutView::GetDocument() // non-debug version is inline
|
|
{
|
|
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLayoutDoc)));
|
|
return (CLayoutDoc*)m_pDocument;
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLayoutView message handlers
|
|
|
|
void CLayoutView::OnInitialUpdate()
|
|
{
|
|
CFormView::OnInitialUpdate();
|
|
|
|
if (m_pLayoutManager == NULL)
|
|
{
|
|
if ((m_pLayoutManager = new COXLayoutManager(this)) != NULL)
|
|
{
|
|
ASSERT_VALID(m_pLayoutManager);
|
|
|
|
// Force the Frame to size with the parent window on the left and right
|
|
// sides with an offset of OX_OFFSET (Note: On the right side we need
|
|
// to use a negative offset)
|
|
m_pLayoutManager->SetConstraint(IDC_FRAME, OX_LMS_LEFT, OX_LMT_SAME, OX_OFFSET);
|
|
m_pLayoutManager->SetConstraint(IDC_FRAME, OX_LMS_RIGHT, OX_LMT_SAME, -OX_OFFSET);
|
|
|
|
// Force progress bar to size between the (above) frame with the same offset
|
|
m_pLayoutManager->SetConstraint(IDC_PROGRESS, OX_LMS_LEFT, OX_LMT_SAME, OX_OFFSET, IDC_FRAME);
|
|
m_pLayoutManager->SetConstraint(IDC_PROGRESS, OX_LMS_RIGHT, OX_LMT_SAME, -OX_OFFSET, IDC_FRAME);
|
|
|
|
// Size combo box with the right side of the Frame
|
|
// The combo box window will not resize, it will only move; This is because we
|
|
// have not setup a constraint on combo box on the left side.
|
|
m_pLayoutManager->SetConstraint(IDC_COMBO, OX_LMS_RIGHT, OX_LMT_SAME, -OX_OFFSET, IDC_FRAME);
|
|
|
|
// Setup the slider bar to fill the space between the FRAME on the left side
|
|
// and the combo box on the right side. Note the usage of the OX_LMT_OPPOSITE
|
|
// flag here instead of OX_LMT_SAME.
|
|
m_pLayoutManager->SetConstraint(IDC_SLIDER, OX_LMS_LEFT, OX_LMT_SAME, OX_OFFSET, IDC_FRAME);
|
|
m_pLayoutManager->SetConstraint(IDC_SLIDER, OX_LMS_RIGHT, OX_LMT_OPPOSITE, -OX_OFFSET, IDC_COMBO);
|
|
//
|
|
// Set the minimum size for the slider control
|
|
m_pLayoutManager->SetMinMax(IDC_SLIDER, CSize(50, 0));
|
|
|
|
// BUTTON SIZING
|
|
m_pLayoutManager->SetConstraint(IDC_BUTTON, OX_LMS_RIGHT, OX_LMT_SAME, -OX_OFFSET);
|
|
m_pLayoutManager->SetConstraint(IDC_BUTTON, OX_LMS_TOP, OX_LMT_OPPOSITE, OX_OFFSET);
|
|
m_pLayoutManager->SetConstraint(IDC_BUTTON, OX_LMS_TOP, OX_LMT_OPPOSITE, OX_OFFSET, IDC_FRAME);
|
|
|
|
// EDIT SIZING
|
|
m_pLayoutManager->SetConstraint(IDC_EDIT, OX_LMS_LEFT, OX_LMT_SAME, OX_OFFSET);
|
|
m_pLayoutManager->SetConstraint(IDC_EDIT, OX_LMS_RIGHT, OX_LMT_OPPOSITE, -3 /* = 3 pixels (just because OX_OFFSET is too big here*/, IDC_BUTTON);
|
|
m_pLayoutManager->SetConstraint(IDC_EDIT, OX_LMS_TOP, OX_LMT_OPPOSITE, OX_OFFSET, IDC_FRAME);
|
|
|
|
// The following enclosed controls are sized between each other. This is done using the
|
|
// OX_LMT_POSITION flag and setting a percentage of fill space for the window
|
|
//
|
|
// The Tree control is positioned relative to the FormView filling 33% of
|
|
// the window space.
|
|
// The Radio, Picture and Picture2 controls are sized between the Tree and
|
|
// the Listbox filling the remaining space (33%)
|
|
//
|
|
// The listbox is sized on from 66% of the window until the window edge; it is
|
|
// sized to 33% of the window.
|
|
|
|
// TREE SIZING
|
|
m_pLayoutManager->SetConstraint(IDC_TREE, OX_LMS_BOTTOM, OX_LMT_SAME, -OX_OFFSET);
|
|
m_pLayoutManager->SetConstraint(IDC_TREE, OX_LMS_LEFT, OX_LMT_SAME, OX_OFFSET);
|
|
m_pLayoutManager->SetConstraint(IDC_TREE, OX_LMS_TOP, OX_LMT_OPPOSITE, OX_OFFSET, IDC_EDIT);
|
|
m_pLayoutManager->SetConstraint(IDC_TREE, OX_LMS_RIGHT, OX_LMT_POSITION, 33);
|
|
|
|
// RADIO SIZING
|
|
m_pLayoutManager->SetConstraint(IDC_RADIO, OX_LMS_TOP, OX_LMT_OPPOSITE, OX_OFFSET, IDC_PICTURE);
|
|
m_pLayoutManager->SetConstraint(IDC_RADIO, OX_LMS_LEFT, OX_LMT_OPPOSITE, OX_OFFSET, IDC_TREE);
|
|
m_pLayoutManager->SetConstraint(IDC_RADIO, OX_LMS_RIGHT, OX_LMT_OPPOSITE, -OX_OFFSET, IDC_LIST);
|
|
|
|
// PICTURE2 SIZING
|
|
m_pLayoutManager->SetConstraint(IDC_PICTURE2, OX_LMS_TOP, OX_LMT_OPPOSITE, OX_OFFSET, IDC_RADIO);
|
|
m_pLayoutManager->SetConstraint(IDC_PICTURE2, OX_LMS_BOTTOM, OX_LMT_OPPOSITE, -OX_OFFSET, IDC_TEXT);
|
|
m_pLayoutManager->SetConstraint(IDC_PICTURE2, OX_LMS_LEFT, OX_LMT_OPPOSITE, OX_OFFSET, IDC_TREE);
|
|
m_pLayoutManager->SetConstraint(IDC_PICTURE2, OX_LMS_RIGHT, OX_LMT_OPPOSITE, -OX_OFFSET, IDC_LIST);
|
|
//
|
|
// Set minium height of this picture
|
|
m_pLayoutManager->SetMinMax(IDC_PICTURE2, CSize(0, 5));
|
|
|
|
// PICTURE SIZING
|
|
m_pLayoutManager->SetConstraint(IDC_PICTURE, OX_LMS_TOP, OX_LMT_OPPOSITE, OX_OFFSET, IDC_EDIT);
|
|
m_pLayoutManager->SetConstraint(IDC_PICTURE, OX_LMS_LEFT, OX_LMT_OPPOSITE, OX_OFFSET, IDC_TREE);
|
|
m_pLayoutManager->SetConstraint(IDC_PICTURE, OX_LMS_RIGHT, OX_LMT_OPPOSITE, -OX_OFFSET, IDC_LIST);
|
|
|
|
// LIST SIZING
|
|
// (The bottom edge of this window is sized according to the upper edge of
|
|
// the (below) Static Text control using the OX_LMT_OPPOSITE)
|
|
m_pLayoutManager->SetConstraint(IDC_LIST, OX_LMS_RIGHT, OX_LMT_SAME, -OX_OFFSET);
|
|
m_pLayoutManager->SetConstraint(IDC_LIST, OX_LMS_LEFT, OX_LMT_POSITION, 66);
|
|
m_pLayoutManager->SetConstraint(IDC_LIST, OX_LMS_TOP, OX_LMT_OPPOSITE, OX_OFFSET, IDC_EDIT);
|
|
m_pLayoutManager->SetConstraint(IDC_LIST, OX_LMS_BOTTOM, OX_LMT_OPPOSITE, -OX_OFFSET, IDC_TEXT);
|
|
|
|
// TEXT SIZING
|
|
m_pLayoutManager->SetConstraint(IDC_TEXT, OX_LMS_LEFT, OX_LMT_OPPOSITE, OX_OFFSET, IDC_TREE);
|
|
m_pLayoutManager->SetConstraint(IDC_TEXT, OX_LMS_BOTTOM, OX_LMT_SAME, -OX_OFFSET);
|
|
|
|
// Redraw the controls in the window with the new layout
|
|
m_pLayoutManager->RedrawLayout();
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Set some data on the dialog
|
|
|
|
m_progress.SetRange(0, 100);
|
|
m_progress.SetPos(30);
|
|
|
|
m_edit.SetWindowText(_T("C:\\Ultimate Toolbox\\"));
|
|
|
|
HTREEITEM hItem = m_tree.InsertItem(_T("Root"));
|
|
TCHAR szBuffer[10];
|
|
int i = 0;
|
|
for (; i < 100; i++)
|
|
{
|
|
wsprintf(szBuffer, _T("Item #%d"), i);
|
|
|
|
m_combo.InsertString(i, szBuffer);
|
|
m_list.InsertString(i, szBuffer);
|
|
|
|
m_tree.InsertItem(szBuffer, hItem);
|
|
}
|
|
|
|
m_tree.ModifyStyle(NULL, TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);
|
|
m_tree.Expand(hItem, TVE_EXPAND);
|
|
}
|
|
|
|
void CLayoutView::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CFormView::OnSize(nType, cx, cy);
|
|
|
|
////////////////////////////////////////////
|
|
//
|
|
// Undo MFC's adding of Vertical and/or Horizontal
|
|
// scroll bars
|
|
|
|
SetScrollSizes(MM_TEXT, CSize(0, 0));
|
|
}
|