You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
6.6 KiB
C++
263 lines
6.6 KiB
C++
2 years ago
|
// XTPCaptionPopupWnd.cpp : implementation of the CXTPCaptionPopupWnd class.
|
||
|
//
|
||
|
// This file is a part of the XTREME CONTROLS MFC class library.
|
||
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
||
|
//
|
||
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
||
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
||
|
// CONSENT OF CODEJOCK SOFTWARE.
|
||
|
//
|
||
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
||
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
||
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
||
|
// SINGLE COMPUTER.
|
||
|
//
|
||
|
// CONTACT INFORMATION:
|
||
|
// support@codejock.com
|
||
|
// http://www.codejock.com
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "Common/XTPResourceManager.h"
|
||
|
#include "Common/XTPColorManager.h"
|
||
|
#include "Common/XTPDrawHelpers.h"
|
||
|
#include "../Util/XTPControlTheme.h"
|
||
|
|
||
|
#include "../Resource.h"
|
||
|
#include "../Defines.h"
|
||
|
#include "../Util/XTPUtil.h"
|
||
|
#include "../Button/XTPButton.h"
|
||
|
#include "XTPCaption.h"
|
||
|
#include "XTPCaptionPopupWnd.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
#define XTCAPTIONPOPUP_CLASSNAME _T("XTPCaptionPopupWnd") // Window class name
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPCaptionPopupWnd
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CXTPCaptionPopupWnd::CXTPCaptionPopupWnd()
|
||
|
{
|
||
|
m_pChildWnd = NULL;
|
||
|
m_pChildParent = NULL;
|
||
|
m_pParentWnd = NULL;
|
||
|
|
||
|
// register the wnd class.
|
||
|
RegisterWindowClass();
|
||
|
}
|
||
|
|
||
|
CXTPCaptionPopupWnd::~CXTPCaptionPopupWnd()
|
||
|
{
|
||
|
if (::IsWindow(m_hWnd))
|
||
|
DestroyWindow();
|
||
|
}
|
||
|
|
||
|
IMPLEMENT_DYNAMIC(CXTPCaptionPopupWnd, CWnd)
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CXTPCaptionPopupWnd, CWnd)
|
||
|
//{{AFX_MSG_MAP(CXTPCaptionPopupWnd)
|
||
|
ON_WM_DESTROY()
|
||
|
ON_BN_CLICKED(XTP_IDC_BTN_CLOSE, OnCaptButton)
|
||
|
ON_WM_PAINT()
|
||
|
ON_WM_TIMER()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
BOOL CXTPCaptionPopupWnd::RegisterWindowClass()
|
||
|
{
|
||
|
return XTPDrawHelpers()->RegisterWndClass(0, XTCAPTIONPOPUP_CLASSNAME,
|
||
|
CS_HREDRAW | CS_VREDRAW, 0, ::GetSysColorBrush(COLOR_BTNFACE));
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCaptionPopupWnd::Create(const CRect& rect, CWnd* pParentWnd, CWnd* pChildWnd)
|
||
|
{
|
||
|
ASSERT_VALID(pParentWnd); // must be valid.
|
||
|
if (!pParentWnd || !::IsWindow(pParentWnd->m_hWnd))
|
||
|
return FALSE;
|
||
|
|
||
|
m_pParentWnd = pParentWnd;
|
||
|
|
||
|
ASSERT_VALID(pChildWnd); // must be valid.
|
||
|
if (!pChildWnd || !::IsWindow(pChildWnd->m_hWnd))
|
||
|
return FALSE;
|
||
|
|
||
|
m_pChildWnd = pChildWnd;
|
||
|
|
||
|
// define the styles for this window.
|
||
|
DWORD dwStyleEx = WS_EX_TOOLWINDOW;
|
||
|
DWORD dwStyle = WS_VISIBLE | WS_POPUP | WS_DLGFRAME;
|
||
|
|
||
|
// call the base class for creation.
|
||
|
if (!CWnd::CreateEx(dwStyleEx, XTCAPTIONPOPUP_CLASSNAME, _T(""), dwStyle, rect.left, rect.top,
|
||
|
rect.Width(), rect.Height(), pParentWnd->GetSafeHwnd(), 0, NULL))
|
||
|
{
|
||
|
TRACE0("Failed to create caption popdown window.\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// set the child windows parent to this popup window, save
|
||
|
// the previous parent, since we need to reset this when the
|
||
|
// window is destroyed.
|
||
|
m_pChildParent = m_pChildWnd->SetParent(this);
|
||
|
ASSERT(m_pChildParent != NULL);
|
||
|
|
||
|
// Create the caption.
|
||
|
CString string;
|
||
|
CXTPResourceManager::AssertValid(XTPResourceManager()->LoadString(&string, XTP_IDS_CLICKKEEPOPEN));
|
||
|
|
||
|
if (!m_Caption.Create(this, string, CPWS_EX_RAISED_EDGE,
|
||
|
WS_VISIBLE | SS_CENTER | SS_CENTERIMAGE, CXTPEmptyRect()))
|
||
|
{
|
||
|
TRACE0("Unable to create caption.\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
m_Caption.SetAppCaption(false);
|
||
|
|
||
|
// Create the caption button.
|
||
|
if (!m_CaptionButton.Create(NULL, WS_VISIBLE | BS_ICON | BS_CENTER | BS_VCENTER,
|
||
|
CXTPEmptyRect(), this, XTP_IDC_BTN_CLOSE))
|
||
|
{
|
||
|
TRACE0("Unable to create caption button.\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
m_CaptionButton.SetCaption(&m_Caption);
|
||
|
|
||
|
CImageList imageList;
|
||
|
imageList.Create(16, 15, ILC_COLOR8 | ILC_MASK, 0, 1);
|
||
|
|
||
|
CBitmap bmp;
|
||
|
CXTPResourceManager::AssertValid(XTPResourceManager()->LoadBitmap(&bmp, XTP_IDB_BTN_OUT));
|
||
|
imageList.Add(&bmp, RGB(255, 0, 255));
|
||
|
|
||
|
// Associate the button icon
|
||
|
m_hIconOff = imageList.ExtractIcon(0);
|
||
|
m_hIconOn = imageList.ExtractIcon(1);
|
||
|
m_CaptionButton.SetIcon(CSize(16, 15), m_hIconOff, m_hIconOn);
|
||
|
imageList.DeleteImageList();
|
||
|
|
||
|
// start the timer after everything has been initialized.
|
||
|
SetTimer(1, 10, NULL);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CXTPCaptionPopupWnd::SetTheme(XTPControlTheme nTheme)
|
||
|
{
|
||
|
m_Caption.SetTheme(nTheme);
|
||
|
m_CaptionButton.SetTheme(nTheme);
|
||
|
}
|
||
|
|
||
|
void CXTPCaptionPopupWnd::RecalcLayout()
|
||
|
{
|
||
|
// define the caption and client rect.
|
||
|
CXTPClientRect rcChild(this);
|
||
|
rcChild.DeflateRect(2, 2);
|
||
|
|
||
|
// move the window to fit the client area of this window.
|
||
|
CRect rcCaption(rcChild);
|
||
|
rcChild.top += 19;
|
||
|
m_pChildWnd->MoveWindow(rcChild);
|
||
|
|
||
|
// define the size for the push pin caption.
|
||
|
rcCaption.bottom = rcCaption.top + 19;
|
||
|
m_Caption.MoveWindow(&rcCaption);
|
||
|
|
||
|
// define the size for the caption button.
|
||
|
CRect rcButton(rcCaption);
|
||
|
rcButton.DeflateRect(2, 2);
|
||
|
rcButton.left = rcButton.right - 16;
|
||
|
|
||
|
m_CaptionButton.MoveWindow(&rcButton);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCaptionPopupWnd::ResetParent()
|
||
|
{
|
||
|
if (!::IsWindow(m_pChildWnd->GetSafeHwnd()))
|
||
|
return FALSE;
|
||
|
|
||
|
if (!::IsWindow(m_pChildParent->GetSafeHwnd()))
|
||
|
return FALSE;
|
||
|
|
||
|
m_pChildWnd->SetParent(m_pChildParent);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CXTPCaptionPopupWnd::OnDestroy()
|
||
|
{
|
||
|
ResetParent();
|
||
|
CWnd::OnDestroy();
|
||
|
}
|
||
|
|
||
|
void CXTPCaptionPopupWnd::OnCaptButton()
|
||
|
{
|
||
|
// check to see if the parent is valid...
|
||
|
if (::IsWindow(m_pParentWnd->GetSafeHwnd()))
|
||
|
{
|
||
|
// notify that push pin button was pressed.
|
||
|
m_pParentWnd->SendMessage(CPN_XTP_PUSHPINBUTTON);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCaptionPopupWnd::OnPaint()
|
||
|
{
|
||
|
CPaintDC dc(this); // device context for painting
|
||
|
|
||
|
CXTPClientRect rc(this);
|
||
|
rc.DeflateRect(1, 1);
|
||
|
|
||
|
// draw a border for the client area.
|
||
|
dc.Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW),
|
||
|
GetXtremeColor(COLOR_3DHILIGHT));
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCaptionPopupWnd::SendCancelMessage()
|
||
|
{
|
||
|
// get a handle to the window which currently
|
||
|
// has the input focus...
|
||
|
HWND hWnd_HasFocus = ::GetFocus();
|
||
|
|
||
|
// caption has focus.
|
||
|
if (hWnd_HasFocus == m_Caption.GetSafeHwnd())
|
||
|
return FALSE;
|
||
|
|
||
|
// caption button has focus.
|
||
|
if (hWnd_HasFocus == m_CaptionButton.GetSafeHwnd())
|
||
|
return FALSE;
|
||
|
|
||
|
// popup window has focus.
|
||
|
if (hWnd_HasFocus == GetSafeHwnd())
|
||
|
return FALSE;
|
||
|
|
||
|
// popup window child has focus.
|
||
|
if (hWnd_HasFocus == m_pChildWnd->GetSafeHwnd())
|
||
|
return FALSE;
|
||
|
|
||
|
// check to see if the parent is valid...
|
||
|
if (::IsWindow(m_pParentWnd->GetSafeHwnd()))
|
||
|
{
|
||
|
// and send cancel message.
|
||
|
m_pParentWnd->SendMessage(CPN_XTP_PUSHPINCANCEL);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void CXTPCaptionPopupWnd::OnTimer(UINT_PTR nIDEvent)
|
||
|
{
|
||
|
if (nIDEvent == 1)
|
||
|
{
|
||
|
SendCancelMessage();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CWnd::OnTimer(nIDEvent);
|
||
|
}
|