2025-04-27 07:49:33 -04:00

276 lines
7.2 KiB
C++

#include "stdafx.h"
#include "Ctrl.h"
#include "SmText.h"
#if ENABLE_MSGTABLE_API
/***************************************************************************\
*****************************************************************************
*
* class SmText
*
*****************************************************************************
\***************************************************************************/
//------------------------------------------------------------------------------
SmText::~SmText()
{
EmptyText();
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiOnEvent(EventMsg * pmsg)
{
if (GET_EVENT_DEST(pmsg) == GMF_DIRECT) {
switch (pmsg->nMsg)
{
case GM_PAINT:
{
GMSG_PAINT * pmsgPaint = (GMSG_PAINT *) pmsg;
if (pmsgPaint->nCmd == GPAINT_RENDER) {
switch (pmsgPaint->nSurfaceType)
{
case GSURFACE_HDC:
{
GMSG_PAINTRENDERI * pmsgR = (GMSG_PAINTRENDERI *) pmsgPaint;
OnDraw(pmsgR->hdc, pmsgR);
}
break;
case GSURFACE_GPGRAPHICS:
{
GMSG_PAINTRENDERF * pmsgR = (GMSG_PAINTRENDERF *) pmsgPaint;
OnDraw(pmsgR->pgpgr, pmsgR);
}
break;
default:
Trace("WARNING: Unknown surface type\n");
}
return DU_S_PARTIAL;
}
}
break;
case GM_QUERY:
{
GMSG_QUERY * pmsgQ = (GMSG_QUERY *) pmsg;
switch (pmsgQ->nCode)
{
case GQUERY_RECT:
QueryRect((GMSG_QUERYRECT *) pmsg);
return DU_S_COMPLETE;
case GQUERY_DESCRIPTION:
{
GMSG_QUERYDESC * pmsgQD = (GMSG_QUERYDESC *) pmsg;
CopyString(pmsgQD->szName, m_pszText, _countof(pmsgQD->szName));
CopyString(pmsgQD->szType, L"SmText", _countof(pmsgQD->szType));
return DU_S_COMPLETE;
}
}
}
break;
}
}
return SVisual::ApiOnEvent(pmsg);
}
//------------------------------------------------------------------------------
void
SmText::OnDraw(HDC hdc, GMSG_PAINTRENDERI * pmsgR)
{
if ((m_pszText == NULL) || (m_hfnt == NULL)) {
return;
}
HFONT hfntOld = (HFONT) SelectObject(hdc, m_hfnt);
COLORREF crOld = SetTextColor(hdc, m_crText);
int nOldMode = SetBkMode(hdc, TRANSPARENT);
OS()->TextOut(hdc, pmsgR->prcGadgetPxl->left, pmsgR->prcGadgetPxl->top, m_pszText, m_cch);
SetBkMode(hdc, nOldMode);
SetTextColor(hdc, crOld);
SelectObject(hdc, hfntOld);
}
//------------------------------------------------------------------------------
void
SmText::OnDraw(Gdiplus::Graphics * pgpgr, GMSG_PAINTRENDERF * pmsgR)
{
if (m_pszText == NULL) {
return;
}
Gdiplus::Color cr(GetRValue(m_crText), GetGValue(m_crText), GetBValue(m_crText));
Gdiplus::SolidBrush br(cr);
Gdiplus::Font fnt(L"Tahoma", 12.0f, Gdiplus::FontStyleRegular, Gdiplus::UnitPoint);
pgpgr->DrawString(m_pszText, m_cch, &fnt, *pmsgR->prcGadgetPxl, 0, &br);
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiGetFont(TextGadget::GetFontMsg * pmsg)
{
pmsg->hfnt = m_hfnt;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiSetFont(TextGadget::SetFontMsg * pmsg)
{
m_hfnt = pmsg->hfnt;
AutoSize();
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiGetText(TextGadget::GetTextMsg * pmsg)
{
pmsg->pszText = m_pszText;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiSetText(TextGadget::SetTextMsg * pmsg)
{
EmptyText();
int cch = lstrlenW(pmsg->pszText);
int cbAlloc = (cch + 1) * sizeof(WCHAR);
m_pszText = (WCHAR *) ClientAlloc(cbAlloc);
if (m_pszText == NULL) {
return E_OUTOFMEMORY;
}
CopyMemory(m_pszText, pmsg->pszText, cbAlloc);
m_cch = cch;
AutoSize();
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiGetColor(TextGadget::GetColorMsg * pmsg)
{
pmsg->crText = m_crText;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiSetColor(TextGadget::SetColorMsg * pmsg)
{
m_crText = pmsg->crText;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiGetAutoSize(TextGadget::GetAutoSizeMsg * pmsg)
{
pmsg->fAutoSize = m_fAutoSize;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmText::ApiSetAutoSize(TextGadget::SetAutoSizeMsg * pmsg)
{
m_fAutoSize = pmsg->fAutoSize;
AutoSize();
return S_OK;
}
//------------------------------------------------------------------------------
void
SmText::QueryRect(GMSG_QUERYRECT * pmsg)
{
ComputeIdealSize(pmsg->sizeBound, pmsg->sizeResult);
}
//------------------------------------------------------------------------------
void
SmText::EmptyText()
{
if (m_pszText != NULL) {
ClientFree(m_pszText);
m_pszText = NULL;
}
m_cch = 0;
}
//------------------------------------------------------------------------------
void
SmText::ComputeIdealSize(const SIZE & sizeBoundPxl, SIZE & sizeResultPxl)
{
if ((m_pszText != NULL) && (sizeBoundPxl.cx != 0) && (sizeBoundPxl.cy != 0)) {
HDC hdc = GetGdiCache()->GetTempDC();
HFONT hfntOld = NULL;
if (m_hfnt != NULL) {
hfntOld = (HFONT) SelectObject(hdc, m_hfnt);
}
OS()->GetTextExtentPoint32(hdc, m_pszText, m_cch, &sizeResultPxl);
sizeResultPxl.cx = min(sizeResultPxl.cx, sizeBoundPxl.cx);
sizeResultPxl.cy = min(sizeResultPxl.cy, sizeBoundPxl.cy);
if (m_hfnt != NULL) {
SelectObject(hdc, hfntOld);
}
GetGdiCache()->ReleaseTempDC(hdc);
} else {
sizeResultPxl.cx = 0;
sizeResultPxl.cy = 0;
}
}
//------------------------------------------------------------------------------
void
SmText::AutoSize()
{
if (m_fAutoSize) {
SIZE sizeBoundPxl, sizeResultPxl;
GetStub()->GetSize(&sizeBoundPxl);
ComputeIdealSize(sizeBoundPxl, sizeResultPxl);
RECT rc = { 0, 0, sizeResultPxl.cx, sizeResultPxl.cy };
GetStub()->SetRect(SGR_SIZE, &rc);
}
}
#endif // ENABLE_MSGTABLE_API