// OXSeparator.cpp : implementation file
//
// Version: 9.3
#include "stdafx.h"
#include "OXSeparator.h"
#include "UTB64Bit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COXSeparator
COXSeparator::COXSeparator()
{
// set default values
VERIFY(SetTextColor());
VERIFY(SetSeparatorColors());
SetVertOriented(FALSE);
m_sText.Empty();
}
COXSeparator::~COXSeparator()
{
}
BEGIN_MESSAGE_MAP(COXSeparator, CStatic)
//{{AFX_MSG_MAP(COXSeparator)
ON_WM_CREATE()
ON_WM_PAINT()
ON_MESSAGE(WM_SETTEXT,OnSetText)
ON_MESSAGE(WM_GETTEXT,OnGetText)
ON_MESSAGE(WM_GETTEXTLENGTH,OnGetTextLength)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COXSeparator message handlers
void COXSeparator::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
// make sure there wasn't any border styles specified,
// we don't support them
ModifyStyle(WS_BORDER,0);
ModifyStyleEx(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|
WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,0,SWP_FRAMECHANGED);
/////////////////////////////////
// save the window text
GetWindowText(m_sText);
CStatic::PreSubclassWindow();
}
int COXSeparator::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// make sure there wasn't any border styles specified,
// we don't support them
ASSERT((lpCreateStruct->style&WS_BORDER)==0);
ASSERT((lpCreateStruct->dwExStyle&(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|
WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME))==0);
lpCreateStruct->style&=~WS_BORDER;
lpCreateStruct->dwExStyle&=~(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|
WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME);
/////////////////////////////////
if(CStatic::OnCreate(lpCreateStruct)==-1)
return -1;
// save the window text
m_sText=lpCreateStruct->lpszName;
return 0;
}
void COXSeparator::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// draw text
//
// setup environment
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(m_clrText);
CFont* pOldFont=NULL;
CFont fontVert;
CFont* pFont=GetFont();
if(pFont)
{
if(m_bVertOriented)
{
// setup font for vertically oriented mode
LOGFONT lf;
VERIFY(pFont->GetLogFont(&lf));
lf.lfEscapement=900;
lf.lfOrientation=900;
VERIFY(fontVert.CreateFontIndirect(&lf));
pOldFont=dc.SelectObject(&fontVert);
}
else
pOldFont=dc.SelectObject(pFont);
}
CRect rectClient;
GetClientRect(&rectClient);
CRect rectSeparator=rectClient;
CRect rectText(0,0,0,0);
// flag that specifies that separator is divided in two parts by
// centerd text
BOOL bTwoParts=FALSE;
if(!m_sText.IsEmpty())
{
rectText=rectClient;
CRect rectHelper;
if(m_bVertOriented)
{
// adjust rectangle to display verical texr
rectHelper=rectText;
rectText.top=rectHelper.left;
rectText.bottom=rectHelper.right;
rectText.left=rectHelper.top;
rectText.right=rectHelper.bottom;
}
// calculate the rect to siplay text in
UINT nFormat=DT_LEFT|DT_SINGLELINE;
dc.DrawText(m_sText,&rectText,nFormat|DT_CALCRECT);
rectHelper=rectText;
if(m_bVertOriented)
{
rectText.top=rectHelper.left;
rectText.bottom=rectHelper.right;
rectText.left=rectHelper.top;
rectText.right=rectHelper.bottom;
rectHelper=rectText;
}
// adjust coordinates
if(m_bVertOriented)
{
rectText.left+=(rectClient.Width()-rectHelper.Width())/2+
(rectSeparator.Width()-rectHelper.Width())%2;
rectText.right=rectText.left+rectHelper.Width();
}
else
{
rectText.top+=(rectClient.Height()-rectHelper.Height())/2+
(rectClient.Height()-rectHelper.Height())%2;
rectText.bottom=rectText.top+rectHelper.Height();
}
// adjust the text box depending on text alignment style
DWORD dwStyle=GetStyle()&0x0000000f;
switch(dwStyle)
{
// SS_CENTER
case 1:
bTwoParts=TRUE;
if(m_bVertOriented)
{
rectSeparator.bottom=(rectSeparator.bottom-rectSeparator.top)/2-
rectText.Height()/2-6;
rectText.top+=(rectClient.Height()-rectHelper.Height())/2+
(rectClient.Height()-rectHelper.Height())%2;
rectText.bottom=rectText.top+rectHelper.Height();
}
else
{
rectSeparator.right=(rectSeparator.right-rectSeparator.left)/2-
rectText.Width()/2-6;
rectText.left+=(rectClient.Width()-rectHelper.Width())/2+
(rectSeparator.Width()-rectHelper.Width())%2;
rectText.right=rectText.left+rectHelper.Width();
}
break;
// SS_RIGHT
case 2:
if(m_bVertOriented)
{
rectSeparator.bottom-=rectText.Height()+6;
rectText.bottom=rectClient.bottom;
rectText.top=rectText.bottom-rectHelper.Height();
}
else
{
rectSeparator.right-=rectText.Width()+6;
rectText.right=rectClient.right;
rectText.left=rectText.right-rectHelper.Width();
}
break;
// SS_LEFT
default:
if(m_bVertOriented)
{
rectSeparator.top=rectText.bottom+6;
rectText.top=rectClient.top;
rectText.bottom=rectText.top+rectHelper.Height();
}
else
{
rectSeparator.left=rectText.right+6;
rectText.left=rectClient.left;
rectText.right=rectText.left+rectHelper.Width();
}
}
rectHelper=rectText;
if(m_bVertOriented)
{
rectHelper.bottom+=rectText.Width();
rectHelper.right+=rectText.Height();
}
// draw text
dc.DrawText(m_sText,&rectHelper,DT_BOTTOM|DT_LEFT|DT_SINGLELINE);
}
// adjust rectangle for separator
if(m_bVertOriented)
{
rectSeparator.left+=(rectSeparator.Width())/2+
(rectSeparator.Width())%2-1;
rectSeparator.right=rectSeparator.left+2;
}
else
{
rectSeparator.top+=(rectSeparator.Height())/2+
(rectSeparator.Height())%2-1;
rectSeparator.bottom=rectSeparator.top+2;
}
// draw separator
if((m_bVertOriented && rectSeparator.top<rectSeparator.bottom) ||
(!m_bVertOriented && rectSeparator.left<rectSeparator.right))
{
dc.Draw3dRect(&rectSeparator,m_clrTopLeft,m_clrBottomRight);
if(bTwoParts)
{
if(m_bVertOriented)
{
rectSeparator.top=rectSeparator.bottom+rectText.Height()+12;
rectSeparator.bottom=rectClient.bottom;
}
else
{
rectSeparator.left=rectSeparator.right+rectText.Width()+12;
rectSeparator.right=rectClient.right;
}
dc.Draw3dRect(&rectSeparator,m_clrTopLeft,m_clrBottomRight);
}
}
if(pOldFont!=NULL)
dc.SelectObject(pOldFont);
// Do not call CStatic::OnPaint() for painting messages
}
// v9.3 - update 03 - 64-bit - changed these to LRESULT, WPARAM, LPARAM from LONG, UINT, LONG
LRESULT COXSeparator::OnSetText(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
// save the window text
m_sText=(LPCTSTR)(LONG_PTR)lParam;
RedrawWindow();
return TRUE;
}
// v9.3 - update 03 - 64-bit - changed these to LRESULT, WPARAM, LPARAM from LONG, UINT, LONG
LRESULT COXSeparator::OnGetText(WPARAM wParam, LPARAM lParam)
{
if(wParam>0)
{
wParam=wParam>(UINT)m_sText.GetLength()+1 ?
m_sText.GetLength()+1 : wParam;
VERIFY(lstrcpyn((LPTSTR)(LONG_PTR)lParam,m_sText,wParam-1)!=NULL);
}
return (LONG)wParam;
}
// v9.3 - update 03 - 64-bit - changed these to LRESULT, WPARAM, LPARAM from LONG, UINT, LONG
LRESULT COXSeparator::OnGetTextLength(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
return (LONG)m_sText.GetLength();
}