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

187 lines
3.8 KiB
C++

// This software along with its related components, documentation and files ("The Libraries")
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
// to obtain this file, or directly from our office. For a copy of the license governing
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
// OXTreeEdit.cpp : implementation file
//
// Version: 9.3
#include "stdafx.h"
#include "OXTreeEdit.h"
#include "UTB64Bit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COXTreeEdit
COXTreeEdit::COXTreeEdit()
{
m_bKeepColumnSize = FALSE;
m_bKeepPos = FALSE;
m_bHasBorder = TRUE;
m_nDeltaX = 14;
m_nDeltaY = 6;
}
COXTreeEdit::~COXTreeEdit()
{
}
BEGIN_MESSAGE_MAP(COXTreeEdit, CEdit)
//{{AFX_MSG_MAP(COXTreeEdit)
ON_WM_WINDOWPOSCHANGING()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COXTreeEdit message handlers
void COXTreeEdit::KeepPos(CPoint pt,DWORD dwAlign)
{
m_bKeepPos = TRUE;
m_pos = pt;
m_dwAlign = dwAlign;
if(::IsWindow(m_hWnd))
{
DWORD dwStyle = WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|dwAlign;
::SetWindowLongPtr(m_hWnd,GWL_STYLE,dwStyle);
}
}
void COXTreeEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
CEdit::OnWindowPosChanging(lpwndpos);
if (m_bHasBorder)
{
CString sWndText;
GetWindowText(sWndText);
int nTextLen = GetWindowTextLength();
if(!nTextLen)
{
//there are no text in edit window
// use sample text to measure
sWndText = _T("W");
}
CDC *pDC = GetDC();
CFont *pOldFont = pDC->SelectObject(GetFont());
CSize sz = pDC->GetTextExtent(sWndText);
pDC->SelectObject(pOldFont);
ReleaseDC(pDC);
sz.cx += m_nDeltaX;
sz.cy += m_nDeltaY;
lpwndpos->cx = sz.cx;
lpwndpos->cy = sz.cy;
}
else
lpwndpos->y -= 1;
if (m_bKeepPos)
switch(m_dwAlign)
{
case ES_LEFT:
if (m_bHasBorder)
{
lpwndpos->x = m_pos.x;
lpwndpos->y = m_pos.y;
}
else
lpwndpos->x = m_pos.x - 2;
break;
case ES_RIGHT:
lpwndpos->x = m_pos.x - lpwndpos->cx;
if (m_bHasBorder)
lpwndpos->y = m_pos.y;
break;
case ES_CENTER:
lpwndpos->x = m_pos.x - lpwndpos->cx/2;
if (m_bHasBorder)
lpwndpos->y = m_pos.y;
break;
default:
// unknown style found!
ASSERT(FALSE);
break;
}
if (m_bKeepColumnSize)
{
if (m_bHasBorder)
lpwndpos->cx = m_szBounds.cx - lpwndpos->x;
else
lpwndpos->cx = m_szBounds.cx;
}
else if (m_bKeepBounds)
{
if (m_bHasBorder)
{
if(lpwndpos->x + lpwndpos->cx > m_szBounds.cx)
lpwndpos->cx = m_szBounds.cx - lpwndpos->x;
}
else
{
if (lpwndpos->cx < m_szBounds.cx)
lpwndpos->cx = m_szBounds.cx;
}
}
}
void COXTreeEdit::Init()
{
m_bKeepPos = FALSE;
m_bKeepBounds = FALSE;
m_bKeepColumnSize = FALSE;
m_dwAlign = 0;
}
void COXTreeEdit::KeepBounds(CSize sz)
{
m_bKeepBounds = TRUE;
m_bKeepColumnSize = FALSE;
m_szBounds = sz;
}
void COXTreeEdit::KeepColumnSize(CSize sz)
{
m_bKeepBounds = FALSE;
m_bKeepColumnSize = TRUE;
m_szBounds = sz;
}
void COXTreeEdit::OnPaint()
{
if (!m_bHasBorder)
{
CPaintDC dc(this); // device context for painting
// Do not call CEdit::OnPaint() for painting messages
CString strText;
GetWindowText(strText);
CFont* pOldFont = dc.SelectObject(GetFont());
dc.TextOut(5, 2, strText);
dc.SelectObject(pOldFont);
}
else
Default();
}
void COXTreeEdit::SetBorder(BOOL bHasBorder)
{
m_bHasBorder = bHasBorder;
}