276 lines
7.2 KiB
C++
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
|