2025-11-27 16:46:48 +09:00

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));
}