142 lines
3.1 KiB
C++
142 lines
3.1 KiB
C++
// Copyright (c) Iuri Apollonio 1998
|
|
// Use & modify as you want & need, and leave those 4 lines.
|
|
// Strongly based on article _T("Inplace edit control") of Mario Contestabile and _T("Editable subitems") of Zafir
|
|
// http://www.codeguru.com
|
|
|
|
// GfxGroupEdit.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "..\SmsManager.h"
|
|
#include "GfxGroupEdit.h"
|
|
#include "GfxOutBarCtrl.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CGfxGroupEdit
|
|
|
|
CGfxGroupEdit::CGfxGroupEdit()
|
|
{
|
|
bEscapeKey = FALSE;
|
|
iIndex = -1;
|
|
msgSend = NM_OB_ONGROUPENDEDIT;
|
|
bNoDown = false;
|
|
}
|
|
|
|
CGfxGroupEdit::~CGfxGroupEdit()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CGfxGroupEdit, CEdit)
|
|
//{{AFX_MSG_MAP(CGfxGroupEdit)
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_CREATE()
|
|
ON_WM_CHAR()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CGfxGroupEdit message handlers
|
|
|
|
void CGfxGroupEdit::OnKillFocus(CWnd* pNewWnd)
|
|
{
|
|
PostMessage(WM_CLOSE, 0, 0);
|
|
if (!bEscapeKey)
|
|
{
|
|
GetWindowText(text);
|
|
if (text != _T("")) GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, msgSend, (LPARAM) this);
|
|
}
|
|
}
|
|
|
|
BOOL CGfxGroupEdit::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
if (pMsg->wParam == VK_RETURN)
|
|
{
|
|
PostMessage(WM_CLOSE, 0, 0);
|
|
return TRUE;
|
|
}
|
|
else if (pMsg->wParam == VK_ESCAPE)
|
|
{
|
|
PostMessage(WM_CLOSE, 0, 0);
|
|
return bEscapeKey = TRUE;
|
|
}
|
|
|
|
return CEdit::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CGfxGroupEdit::PostNcDestroy()
|
|
{
|
|
CEdit::PostNcDestroy();
|
|
delete this;
|
|
}
|
|
|
|
int CGfxGroupEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CEdit::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
SendMessage(WM_SETFONT,(WPARAM) GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
|
|
return 0;
|
|
}
|
|
|
|
void CGfxGroupEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if (msgSend == NM_OB_ONGROUPENDEDIT)
|
|
{
|
|
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
|
return;
|
|
}
|
|
|
|
if (nChar == VK_ESCAPE || nChar == VK_RETURN)
|
|
{
|
|
if (nChar == VK_ESCAPE) bEscapeKey = TRUE;
|
|
GetParent()->SetFocus();
|
|
return;
|
|
}
|
|
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
|
CString str;
|
|
CRect rect, parentrect;
|
|
GetClientRect(&rect);
|
|
GetParent()->GetClientRect(&parentrect);
|
|
ClientToScreen(&rect);
|
|
GetParent()->ScreenToClient(&rect);
|
|
GetWindowText(str);
|
|
CWindowDC dc(this);
|
|
CFont *pFont = GetParent()->GetFont();
|
|
CFont *pFontDC = dc.SelectObject(pFont);
|
|
CRect szrc(rect);
|
|
szrc.bottom = szrc.top;
|
|
|
|
if (bNoDown == true)
|
|
{
|
|
dc.DrawText(str, szrc, DT_CALCRECT);
|
|
if (szrc.right >= parentrect.right - 1) rect.right = parentrect.right - 1;
|
|
else rect.right = szrc.right;
|
|
MoveWindow(&rect);
|
|
return;
|
|
}
|
|
|
|
dc.DrawText(str, szrc, DT_WORDBREAK|DT_CENTER|DT_CALCRECT);
|
|
dc.SelectObject(pFontDC);
|
|
CSize size = szrc.Size();
|
|
|
|
if (size.cx > rect.Width())
|
|
{
|
|
if (size.cx + rect.left < parentrect.right) rect.right = rect.left + size.cx;
|
|
else rect.right = parentrect.right;
|
|
MoveWindow(&rect);
|
|
}
|
|
else if (size.cy > rect.Height())
|
|
{
|
|
if (size.cy + rect.bottom < parentrect.bottom) rect.bottom = rect.top + size.cy;
|
|
else rect.bottom = parentrect.bottom;
|
|
MoveWindow(&rect);
|
|
}
|
|
}
|