// StaticEx.cpp : implementation file
//
#include "stdafx.h"
#include "StaticEx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStaticEx
CStaticEx* CStaticEx::m_pThis = NULL;
CStaticEx::CStaticEx()
{
CStaticEx::m_pThis = this;
}
CStaticEx::CStaticEx(CRelationalCheckList* pBuddy)
{
CStaticEx::m_pThis = this;
m_pBuddy = pBuddy;
}
CStaticEx::~CStaticEx()
{
}
BEGIN_MESSAGE_MAP(CStaticEx, CWnd)
//{{AFX_MSG_MAP(CStaticEx)
ON_WM_PAINT()
ON_WM_SHOWWINDOW()
//}}AFX_MSG_MAP
ON_WM_NCPAINT()
ON_WM_NCHITTEST()
ON_WM_NCLBUTTONUP()
ON_WM_NCCALCSIZE()
ON_WM_NCLBUTTONDOWN()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
//
/////////////////////////////////////////////////////////////////////////////
// CStaticEx message handlers
void CStaticEx::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC mdc;
CRect rc;
GetClientRect(&rc);
mdc.CreateCompatibleDC(&dc);
CBitmap bm;
bm.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
CBitmap* pOldBm = mdc.SelectObject(&bm);
mdc.FillSolidRect(rc,0x00F0FFF0/*GetSysColor(COLOR_3DFACE)*/);
dc.BitBlt(0, 0, rc.Width(), rc.Height(), &mdc, 0, 0, SRCCOPY);
mdc.SelectObject(pOldBm);
ReleaseDC(&dc);
bm.DeleteObject();
mdc.DeleteDC();
}
void CStaticEx::OnNcPaint()
{
// get window DC that is clipped to the non-client area
CWindowDC dc(this);
CRect rcClient, rcBar;
GetClientRect(rcClient);
ClientToScreen(rcClient);
GetWindowRect(rcBar);
CRect rcSave = rcBar;
rcClient.OffsetRect(-rcBar.TopLeft());
rcBar.OffsetRect(-rcBar.TopLeft());
CDC mdc;
mdc.CreateCompatibleDC(&dc);
CBitmap bm;
bm.CreateCompatibleBitmap(&dc, rcBar.Width(), rcBar.Height());
CBitmap* pOldBm = mdc.SelectObject(&bm);
// client area is not our bussiness :)
dc.ExcludeClipRect(rcClient);
// draw borders in non-client area
CRect rcDraw = rcBar;
// DrawBorders(&mdc, rcDraw);
// erase parts not drawn
mdc.IntersectClipRect(rcDraw);
// erase the NC background
mdc.FillSolidRect(rcDraw,0x0087CEFA);
//draw close button
CRect rcClose(rcBar.right-20,2,rcBar.right-20,0);
rcClose.InflateRect(0,0,15,17);
mdc.FillSolidRect(rcClose,0x007FFFD4);
m_rcClose = rcClose;
//draw close border
mdc.Draw3dRect(rcClose,0x0000008B,0x0000008B);
//liners
CBrush nLinerBrush;
nLinerBrush.CreateHatchBrush(0,0x00D3D3D3);
CBrush* pOld = mdc.SelectObject(&nLinerBrush);
CRect rcLiner(rcBar);
rcLiner.top = rcClose.top+2;rcLiner.bottom = rcClose.top+2;
rcLiner.InflateRect(-5,0,-(rcBar.right-rcClose.left+5),5);
mdc.RoundRect(rcLiner,rcLiner.TopLeft());
//second liner
rcLiner.OffsetRect(CPoint(0,rcLiner.Height()+1));
mdc.RoundRect(rcLiner,rcLiner.TopLeft());
mdc.SelectObject(pOld);
COLORREF clrOldTextColor = mdc.GetTextColor();
mdc.SetTextColor(::GetSysColor(COLOR_BTNTEXT));
int nPrevBkMode = mdc.SetBkMode(TRANSPARENT);
CFont font;
int ppi = mdc.GetDeviceCaps(LOGPIXELSX);
int pointsize = MulDiv(60, 96, ppi); // 6 points at 96 ppi
font.CreatePointFont(/*pointsize*/100, _T("Marlett"));
CFont* oldfont = mdc.SelectObject(&font);
mdc.TextOut(rcClose.left+1, rcClose.top + 1, CString(_T("r"))); // x-like
mdc.SelectObject(oldfont);
mdc.SetBkMode(nPrevBkMode);
mdc.SetTextColor(clrOldTextColor);
dc.BitBlt(0, 0, rcBar.Width(), rcBar.Height(), &mdc, 0, 0, SRCCOPY);
ReleaseDC(&dc);
mdc.SelectObject(pOldBm);
bm.DeleteObject();
mdc.DeleteDC();
}
void CStaticEx::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{
// compute the the client area
CRect rcClient = lpncsp->rgrc[0];
rcClient.DeflateRect(5,20,5,5);
lpncsp->rgrc[0] = rcClient;
}
void CStaticEx::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
//if(m_rcClose.PtInRect(point))
// m_pBuddy->GetParent()->SendMessage(PN_MESSAGE_UPDATEDATA,(WPARAM)m_pBuddy->m_CurDropDownItem);
}
UINT CStaticEx::OnNcHitTest(CPoint point)
{
CRect rcBar;
GetWindowRect(rcBar);
CRect rcClose(m_rcClose);
rcClose.OffsetRect(rcBar.TopLeft());
if(rcClose.PtInRect(point))
return HTCLOSE;
return HTCLIENT;
}
void CStaticEx::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
if(nHitTest == HTCLOSE)
HideItems();
}
void CStaticEx::OnLButtonDown(UINT nHitTest, CPoint point)
{
}
void CStaticEx::HideItems()
{
if(m_pBuddy->m_pCurArray != NULL)
{
for(int i=0; i<m_pBuddy->m_pCurArray->GetSize(); i++)
{
m_pBuddy->m_pCurArray->GetAt(i)->m_pwnd->ShowWindow(SW_HIDE);
m_pBuddy->m_pCurArray->GetAt(i)->m_pwnd->SetParent(m_pBuddy->m_pCurArray->GetAt(i)->m_pwndOrgParent);
}
}
ShowWindow(SW_HIDE);
}
void CStaticEx::OnShowWindow(BOOL bShow, UINT nStatus)
{
if(bShow)
{
//lpMouseHook = SetWindowsHookEx(WH_MOUSE,CStaticEx::HookProc,NULL,GetCurrentThreadId());
m_pBuddy->GetParent()->SendMessage(PN_MESSAGE_LOADDATA,(WPARAM)m_pBuddy->m_CurDropDownItem);
}
else
{
// ASSERT(UnhookWindowsHookEx(lpMouseHook));
m_pBuddy->GetParent()->SendMessage(PN_MESSAGE_UPDATEDATA,(WPARAM)m_pBuddy->m_CurDropDownItem);
}
CWnd::OnShowWindow(bShow, nStatus);
}
BOOL CStaticEx::PreCreateWindow(CREATESTRUCT& cs)
{
static CString sClassName;
if (sClassName.IsEmpty())
sClassName = AfxRegisterWndClass(0);
cs.lpszClass = sClassName;
cs.style = WS_POPUP|WS_BORDER;
return CWnd::PreCreateWindow(cs);
}
BOOL CStaticEx::Create(CWnd* pParentWnd, UINT nStyle/*=0*/, UINT nID/*=0*/)
{
return CreateEx(0,
NULL,
NULL,
WS_POPUP,
CRect(),
pParentWnd,
nID);
}