186 lines
7.9 KiB
C++
186 lines
7.9 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;
|
||
}
|