Files
scummvm-cursorfix/engines/bagel/mfc/edit.cpp
2026-02-02 04:50:13 +01:00

156 lines
3.9 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "common/textconsole.h"
#include "bagel/mfc/afxwin.h"
namespace Bagel {
namespace MFC {
#define TIMER_ID 1
IMPLEMENT_DYNAMIC(CEdit, CWnd)
BEGIN_MESSAGE_MAP(CEdit, CWnd)
ON_WM_PAINT()
ON_WM_KEYDOWN()
ON_WM_CHAR()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
ON_WM_TIMER()
ON_WM_GETDLGCODE()
END_MESSAGE_MAP()
bool CEdit::Create(uint32 dwStyle, const RECT &rect, CWnd *pParentWnd, unsigned int nID) {
return CWnd::Create("EDIT", nullptr, dwStyle,
rect, pParentWnd, nID);
}
void CEdit::LimitText(int nChars) {
_maxLength = nChars;
}
void CEdit::SetSel(int nStartChar, int nEndChar, bool bNoScroll) {
warning("TODO: CEdit::SetSel");
}
void CEdit::OnPaint() {
CPaintDC dc(this); // Automatically calls BeginPaint and EndPaint
// Get client area
CRect clientRect;
GetClientRect(&clientRect);
// Fill background with system window color
HBRUSH hBrush = MFC::GetSysColorBrush(COLOR_WINDOW);
CBrush *winBrush = CBrush::FromHandle(hBrush);
dc.FillRect(&clientRect, winBrush);
// Set text and background properties
dc.SetTextColor(MFC::GetSysColor(COLOR_WINDOWTEXT));
dc.SetBkMode(TRANSPARENT);
// Select the current font if one was set
HFONT hFont = (HFONT)SendMessage(WM_GETFONT);
HFONT hOldFont = nullptr;
if (hFont)
hOldFont = (HFONT)dc.SelectObject(hFont);
// Draw the stored text
dc.DrawText(_windowText.c_str(), -1, &clientRect, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX);
// If needed, draw the caret
if (_cursorVisible) {
CSize size = dc.GetTextExtent(_windowText.c_str(), -1);
CPen caretPen(PS_SOLID, 1, GetSysColor(COLOR_WINDOWTEXT));
CPen *pOldPen = dc.SelectObject(&caretPen);
// Draw the caret (as a vertical line or filled rectangle)
#if 0
CBrush *pOldBrush = static_cast<CBrush *>(dc.SelectStockObject(NULL_BRUSH));
CRect caretRect(size.cx + 2, 2, size.cx + 4, clientRect.bottom - 2);
dc.Rectangle(&caretRect);
#endif
dc.MoveTo(size.cx + 3, 2);
dc.LineTo(size.cx + 3, clientRect.bottom - 2);
// Restore old objects
dc.SelectObject(pOldPen);
// dc.SelectObject(pOldBrush);
}
// Restore font if changed
if (hFont)
dc.SelectObject(hOldFont);
}
void CEdit::OnKeyDown(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags) {
if (nChar == Common::KEYCODE_BACKSPACE ||
nChar == Common::KEYCODE_DELETE) {
if (!_windowText.empty()) {
_windowText.deleteLastChar();
}
}
Invalidate();
}
void CEdit::OnChar(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags) {
if (Common::isPrint(nChar)) {
if (_maxLength == 0 || _windowText.size() < _maxLength) {
_windowText += (char)nChar;
Invalidate();
}
}
}
void CEdit::OnSetFocus(CWnd *pOldWnd) {
SetTimer(TIMER_ID, 500);
CWnd::OnSetFocus(pOldWnd);
}
void CEdit::OnKillFocus(CWnd *pNewWnd) {
KillTimer(TIMER_ID);
CWnd::OnKillFocus(pNewWnd);
if (_cursorVisible) {
_cursorVisible = false;
OnPaint();
}
}
void CEdit::OnTimer(uintptr nTimerId) {
_cursorVisible = !_cursorVisible;
Invalidate();
}
unsigned int CEdit::OnGetDlgCode() {
uint style = GetStyle();
if (style & ES_MULTILINE)
return DLGC_WANTMESSAGE | DLGC_HASSETSEL;
return 0;
}
} // namespace MFC
} // namespace Bagel