/**************************************************************************\ | |
* | |
* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. | |
* | |
* Module Name: | |
* | |
* GdiplusStringFormat.h | |
* | |
* Abstract: | |
* | |
* String format specification for DrawString and text APIs | |
* | |
\**************************************************************************/ | |
#ifndef _GDIPLUSSTRINGFORMAT_H | |
#define _GDIPLUSSTRINGFORMAT_H | |
class StringFormat : public GdiplusBase | |
{ | |
public: | |
friend class Graphics; | |
friend class GraphicsPath; | |
StringFormat( | |
IN INT formatFlags = 0, | |
IN LANGID language = LANG_NEUTRAL | |
) | |
{ | |
nativeFormat = NULL; | |
lastError = DllExports::GdipCreateStringFormat( | |
formatFlags, | |
language, | |
&nativeFormat | |
); | |
} | |
static const StringFormat *GenericDefault(); | |
static const StringFormat *GenericTypographic(); | |
// Constructor based on existing string format | |
StringFormat( | |
IN const StringFormat *format | |
) | |
{ | |
nativeFormat = NULL; | |
lastError = DllExports::GdipCloneStringFormat( | |
format ? format->nativeFormat : NULL, | |
&nativeFormat | |
); | |
} | |
StringFormat *Clone() const | |
{ | |
GpStringFormat *clonedStringFormat = NULL; | |
lastError = DllExports::GdipCloneStringFormat( | |
nativeFormat, | |
&clonedStringFormat | |
); | |
if (lastError == Ok) | |
return new StringFormat(clonedStringFormat, lastError); | |
else | |
return NULL; | |
} | |
~StringFormat() | |
{ | |
DllExports::GdipDeleteStringFormat(nativeFormat); | |
} | |
Status SetFormatFlags(IN INT flags) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatFlags( | |
nativeFormat, | |
flags | |
)); | |
} | |
INT GetFormatFlags() const | |
{ | |
INT flags; | |
SetStatus(DllExports::GdipGetStringFormatFlags(nativeFormat, &flags)); | |
return flags; | |
} | |
#ifndef DCR_USE_NEW_152154 | |
Status SetLineSpacing( | |
IN REAL amount = 1.0f, | |
IN LineSpacing method = LineSpacingRecommended | |
) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatLineSpacing( | |
nativeFormat, | |
amount, | |
method | |
)); | |
} | |
#endif | |
Status SetAlignment(IN StringAlignment align) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatAlign( | |
nativeFormat, | |
align | |
)); | |
} | |
StringAlignment GetAlignment() const | |
{ | |
StringAlignment alignment; | |
SetStatus(DllExports::GdipGetStringFormatAlign( | |
nativeFormat, | |
&alignment | |
)); | |
return alignment; | |
} | |
Status SetLineAlignment(IN StringAlignment align) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatLineAlign( | |
nativeFormat, | |
align | |
)); | |
} | |
StringAlignment GetLineAlignment() const | |
{ | |
StringAlignment alignment; | |
SetStatus(DllExports::GdipGetStringFormatLineAlign( | |
nativeFormat, | |
&alignment | |
)); | |
return alignment; | |
} | |
Status SetHotkeyPrefix(IN HotkeyPrefix hotkeyPrefix) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatHotkeyPrefix( | |
nativeFormat, | |
(INT)hotkeyPrefix | |
)); | |
} | |
HotkeyPrefix GetHotkeyPrefix() const | |
{ | |
HotkeyPrefix hotkeyPrefix; | |
SetStatus(DllExports::GdipGetStringFormatHotkeyPrefix( | |
nativeFormat, | |
(INT*)&hotkeyPrefix | |
)); | |
return hotkeyPrefix; | |
} | |
Status SetTabStops( | |
IN REAL firstTabOffset, | |
IN INT count, | |
IN const REAL *tabStops | |
) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatTabStops( | |
nativeFormat, | |
firstTabOffset, | |
count, | |
tabStops | |
)); | |
} | |
INT GetTabStopCount() const | |
{ | |
INT count; | |
SetStatus(DllExports::GdipGetStringFormatTabStopCount(nativeFormat, &count)); | |
return count; | |
} | |
Status GetTabStops( | |
IN INT count, | |
OUT REAL *firstTabOffset, | |
OUT REAL *tabStops | |
) const | |
{ | |
return SetStatus(DllExports::GdipGetStringFormatTabStops( | |
nativeFormat, | |
count, | |
firstTabOffset, | |
tabStops | |
)); | |
} | |
#ifdef DCR_USE_NEW_146933 | |
Status SetDigitSubstitution( | |
IN LANGID language, | |
IN StringDigitSubstitute substitute | |
) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatDigitSubstitution( | |
nativeFormat, | |
language, | |
substitute | |
)); | |
} | |
LANGID GetDigitSubstitutionLanguage( | |
) const | |
{ | |
LANGID language; | |
SetStatus(DllExports::GdipGetStringFormatDigitSubstitution( | |
nativeFormat, | |
&language, | |
NULL | |
)); | |
return language; | |
} | |
StringDigitSubstitute GetDigitSubstitutionMethod( | |
) const | |
{ | |
StringDigitSubstitute substitute; | |
SetStatus(DllExports::GdipGetStringFormatDigitSubstitution( | |
nativeFormat, | |
NULL, | |
&substitute | |
)); | |
return substitute; | |
} | |
#endif // DCR_USE_NEW_146933 | |
// String trimming. How to handle more text than can be displayed | |
// in the limits available. | |
Status SetTrimming(IN StringTrimming trimming) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatTrimming( | |
nativeFormat, | |
trimming | |
)); | |
} | |
StringTrimming StringFormat::GetTrimming() const | |
{ | |
StringTrimming trimming; | |
SetStatus(DllExports::GdipGetStringFormatTrimming( | |
nativeFormat, | |
&trimming | |
)); | |
return trimming; | |
} | |
#ifdef DCR_USE_NEW_174340 | |
Status SetMeasurableCharacterRanges( | |
IN INT rangeCount, | |
IN const CharacterRange *ranges | |
) | |
{ | |
return SetStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges( | |
nativeFormat, | |
rangeCount, | |
ranges | |
)); | |
} | |
INT GetMeasurableCharacterRangeCount() | |
{ | |
INT count; | |
SetStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount( | |
nativeFormat, | |
&count | |
)); | |
return count; | |
} | |
#endif | |
// GetLastStatus - return last error code and clear error code | |
Status GetLastStatus() const | |
{ | |
Status lastStatus = lastError; | |
lastError = Ok; | |
return lastStatus; | |
} | |
protected: | |
Status SetStatus(GpStatus newStatus) const | |
{ | |
if (newStatus == Ok) | |
{ | |
return Ok; | |
} | |
else | |
{ | |
return lastError = newStatus; | |
} | |
} | |
// Not allowed and move to private | |
StringFormat(const StringFormat &source) | |
{ | |
nativeFormat = NULL; | |
lastError = DllExports::GdipCloneStringFormat( | |
source.nativeFormat, | |
&nativeFormat | |
); | |
} | |
StringFormat& operator=(const StringFormat &source) | |
{ | |
DllExports::GdipDeleteStringFormat(nativeFormat); | |
lastError = DllExports::GdipCloneStringFormat( | |
source.nativeFormat, | |
&nativeFormat | |
); | |
return *this; | |
} | |
// private constructor for copy | |
StringFormat(GpStringFormat * clonedStringFormat, Status status) | |
{ | |
lastError = status; | |
nativeFormat = clonedStringFormat; | |
} | |
GpStringFormat *nativeFormat; | |
mutable Status lastError; | |
}; | |
// Generic constant string formats. | |
static BYTE GenericTypographicStringFormatBuffer[sizeof(StringFormat)] = {0}; | |
static BYTE GenericDefaultStringFormatBuffer[sizeof(StringFormat)] = {0}; | |
static StringFormat *GenericTypographicStringFormat = NULL; | |
static StringFormat *GenericDefaultStringFormat = NULL; | |
// Define the generic string formats | |
inline const StringFormat *StringFormat::GenericDefault() | |
{ | |
if (GenericDefaultStringFormat != NULL) | |
{ | |
return GenericDefaultStringFormat; | |
} | |
GenericDefaultStringFormat = | |
(StringFormat*)GenericDefaultStringFormatBuffer; | |
GenericDefaultStringFormat->lastError = | |
DllExports::GdipStringFormatGetGenericDefault( | |
&(GenericDefaultStringFormat->nativeFormat) | |
); | |
return GenericDefaultStringFormat; | |
} | |
inline const StringFormat *StringFormat::GenericTypographic() | |
{ | |
if (GenericTypographicStringFormat != NULL) | |
{ | |
return GenericTypographicStringFormat; | |
} | |
GenericTypographicStringFormat = | |
(StringFormat*)GenericTypographicStringFormatBuffer; | |
GenericTypographicStringFormat->lastError = | |
DllExports::GdipStringFormatGetGenericTypographic( | |
&GenericTypographicStringFormat->nativeFormat | |
); | |
return GenericTypographicStringFormat; | |
} | |
#endif // !_GDIPLUSSTRINGFORMAT_H |