|
// XEdit.cpp : implementation file
//
#include "stdafx.h"
#include "XEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
UINT WM_XEDIT_KILL_FOCUS = ::RegisterWindowMessage(_T("WM_XEDIT_KILL_FOCUS"));
UINT WM_XEDIT_VK_ESCAPE = ::RegisterWindowMessage(_T("WM_XEDIT_VK_ESCAPE"));
///////////////////////////////////////////////////////////////////////////////
// message map
BEGIN_MESSAGE_MAP(CXEdit, CEdit)
//{{AFX_MSG_MAP(CXEdit)
ON_WM_CHAR()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_KILLFOCUS()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////////
// ctor
CXEdit::CXEdit(CWnd *pParent, LPCTSTR lpszText) :
m_pParent(pParent),
m_strText(lpszText),
m_bMessageSent(FALSE)
{
XLISTCTRL_TRACE(_T("in CXEdit::CXEdit\n"));
}
///////////////////////////////////////////////////////////////////////////////
// dtor
CXEdit::~CXEdit()
{
XLISTCTRL_TRACE(_T("in CXEdit::~CXEdit\n"));
}
///////////////////////////////////////////////////////////////////////////////
// SendRegisteredMessage
void CXEdit::SendRegisteredMessage(UINT nMsg, WPARAM wParam /*= 0*/, LPARAM lParam /*= 0*/)
{
BOOL bMessageSent = m_bMessageSent;
m_bMessageSent = TRUE;
if (m_pParent && ::IsWindow(m_pParent->m_hWnd) && !bMessageSent)
m_pParent->SendMessage(nMsg, wParam, lParam);
}
///////////////////////////////////////////////////////////////////////////////
// OnCreate
int CXEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
XLISTCTRL_TRACE(_T("in CXEdit::OnCreate\n"));
if (CEdit::OnCreate(lpCreateStruct) == -1)
return -1;
// set the proper font
if (!m_pParent)
{
m_pParent = GetParent();
}
if (m_pParent && ::IsWindow(m_pParent->m_hWnd))
{
CFont * pFont = m_pParent->GetFont();
if (pFont)
SetFont(pFont);
}
else
{
m_pParent = NULL;
}
SetWindowText(m_strText);
SetSel(0, -1);
SetFocus();
SetCapture();
return 0;
}
///////////////////////////////////////////////////////////////////////////////
// OnPaint
void CXEdit::OnPaint()
{
CRect rect;
GetClientRect(&rect);
rect.right += 2;
CDC * pDC = GetDC();
pDC->FillSolidRect(&rect, ::GetSysColor(COLOR_WINDOW));
ReleaseDC(pDC);
CEdit::OnPaint(); // let CEdit draw the text
//rect.right -= 2;
rect.left -= 1;
rect.top -= 1;
rect.bottom -=1;
pDC = GetDC();
// don't erase the text that CEdit has just drawn
CBrush * pOldBrush = (CBrush *) pDC->SelectStockObject(NULL_BRUSH);
//CPen pen(PS_SOLID, 1, ::GetSysColor(COLOR_BTNSHADOW));
CPen pen(PS_SOLID, 1, ::GetSysColor(COLOR_INACTIVECAPTION)); // same as combobox
CPen *pOldPen = pDC->SelectObject(&pen);
pDC->Rectangle(&rect);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
ReleaseDC(pDC);
}
///////////////////////////////////////////////////////////////////////////////
// PreTranslateMessage
BOOL CXEdit::PreTranslateMessage(MSG* pMsg)
{
// handle WM_KEYDOWN in case the edit has focus - otherwise
// it will be sent to parent, bypassing WM_CHAR
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_RETURN)
{
SendRegisteredMessage(WM_XEDIT_KILL_FOCUS);
return TRUE;
}
else if (pMsg->wParam == VK_ESCAPE)
{
SendRegisteredMessage(WM_XEDIT_VK_ESCAPE);
return TRUE;
}
}
return CEdit::PreTranslateMessage(pMsg);
}
///////////////////////////////////////////////////////////////////////////////
// OnChar
void CXEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// handle escape and return, in case edit does NOT have focus
if (m_pParent)
{
if (nChar == VK_ESCAPE)
{
SendRegisteredMessage(WM_XEDIT_VK_ESCAPE);
return;
}
else if (nChar == VK_RETURN)
{
SendRegisteredMessage(WM_XEDIT_KILL_FOCUS);
return;
}
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
///////////////////////////////////////////////////////////////////////////////
// OnKillFocus
void CXEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
SendRegisteredMessage(WM_XEDIT_KILL_FOCUS);
}
///////////////////////////////////////////////////////////////////////////////
// OnDestroy
void CXEdit::OnDestroy()
{
XLISTCTRL_TRACE(_T("in CXEdit::OnDestroy\n"));
ReleaseCapture();
CEdit::OnDestroy();
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
I attended St. Michael's College of the University of Toronto, with the intention of becoming a priest. A friend in the University's Computer Science Department got me interested in programming, and I have been hooked ever since.
Recently, I have moved to Los Angeles where I am doing consulting and development work.
For consulting and custom software development, please see
www.hdsoft.org.