/**************************************************************************\ * * Copyright (c) 1998-2001, Microsoft Corp. All Rights Reserved. * * Module Name: * * GdiplusStringFormat.h * * Abstract: * * GDI+ StringFormat class * \**************************************************************************/ #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(); 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; } 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 )); } 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; } Status SetTrimming(IN StringTrimming trimming) { return SetStatus(DllExports::GdipSetStringFormatTrimming( nativeFormat, trimming )); } StringTrimming StringFormat::GetTrimming() const { StringTrimming trimming; SetStatus(DllExports::GdipGetStringFormatTrimming( nativeFormat, &trimming )); return trimming; } 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; } 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; } } 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; } StringFormat(GpStringFormat * clonedStringFormat, Status status) { lastError = status; nativeFormat = clonedStringFormat; } GpStringFormat *nativeFormat; mutable Status lastError; }; static BYTE GenericTypographicStringFormatBuffer[sizeof(StringFormat)] = {0}; static BYTE GenericDefaultStringFormatBuffer[sizeof(StringFormat)] = {0}; inline const StringFormat *StringFormat::GenericDefault() { StringFormat * genericDefaultStringFormat = (StringFormat*)GenericDefaultStringFormatBuffer; genericDefaultStringFormat->lastError = DllExports::GdipStringFormatGetGenericDefault( &(genericDefaultStringFormat->nativeFormat) ); return genericDefaultStringFormat; } inline const StringFormat *StringFormat::GenericTypographic() { StringFormat * genericTypographicStringFormat = (StringFormat*)GenericTypographicStringFormatBuffer; genericTypographicStringFormat->lastError = DllExports::GdipStringFormatGetGenericTypographic( &genericTypographicStringFormat->nativeFormat ); return genericTypographicStringFormat; } #endif // !_GDIPLUSSTRINGFORMAT_H