📄 tomfmt.cpp
字号:
if(Value > 15) // Illegal underline type
return E_INVALIDARG;
_CF.bUnderlineType = (BYTE)Value;
_CF.dwEffects &= ~CFM_UNDERLINE; // Default underlining is off
if(Value)
_CF.dwEffects |= CFM_UNDERLINE; // It's on
return FormatSetter(CFM_UNDERLINETYPE + CFM_UNDERLINE);
}
/*
* ITextFont::SetWeight(long Value)
*
* @mfunc
* Property put method that sets the font weight for
* the characters in a range.
*
* @rdesc
* HRESULT = (if success) ? NOERROR :
* (protected) ? E_ACCESSDENIED : E_OUTOFMEMORY
*/
STDMETHODIMP CTxtFont::SetWeight (
long Value) //@parm New character style handle
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtFont::SetWeight");
if(Value == tomUndefined) // NINCH
return NOERROR;
if((unsigned)Value > 900) // Valid values satisfy:
return E_INVALIDARG; // 0 <= Value <= 900
return SetParameter((long *)&_CF.wWeight, CFM_WEIGHT, 2, Value);
}
//------------------------------- CTxtPara ------------------------------------
/*
* CTxtPara::CTxtPara(prg)
*
* @mfunc
* Constructor
*/
CTxtPara::CTxtPara(CTxtRange *prg) : CTxtFormat(prg)
{
_PF.dwMask = 0; // Private CCharFormat is initially undefined
_PF.dwBorderColor = 0; // Not used, but will upset _PF.Delta()
}
//------------------------- CTxtPara IUnknown Methods -------------------------------------
/* CTxtPara::IUnknown methods
*
* See tomdoc.cpp for comments
*/
STDMETHODIMP CTxtPara::QueryInterface (REFIID riid, void **ppv)
{
#ifndef PEGASUS
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::QueryInterface");
return ::QueryInterface(riid, IID_ITextPara, this, ppv, IsZombie());
#else
return 0;
#endif
}
STDMETHODIMP_(ULONG) CTxtPara::AddRef()
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::AddRef");
return ++_cRefs;
}
STDMETHODIMP_(ULONG) CTxtPara::Release()
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::Release");
_cRefs--;
if(!_cRefs)
{
delete this;
return 0;
}
return _cRefs;
}
//------------------------- CTxtPara IDispatch Methods -------------------------------------
/*
* CTxtPara::GetTypeInfoCount(pcTypeInfo)
*
* @mfunc
* Get the number of TYPEINFO elements (1)
*
* @rdesc
* HRESULT = (pcTypeInfo) ? NOERROR : E_INVALIDARG;
*/
STDMETHODIMP CTxtPara::GetTypeInfoCount (
UINT * pcTypeInfo) //@parm Out parm to receive type-info count
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetTypeInfoCount");
if(!pcTypeInfo)
return E_INVALIDARG;
*pcTypeInfo = 1;
return NOERROR;
}
/*
* CTxtPara::GetTypeInfo(iTypeInfo, lcid, ppTypeInfo)
*
* @mfunc
* Return ptr to type information object for ITextPara interface
*
* @rdesc
* HRESULT
*/
STDMETHODIMP CTxtPara::GetTypeInfo (
UINT iTypeInfo, //@parm Index of type info to return
LCID lcid, //@parm Local ID of type info
ITypeInfo **ppTypeInfo) //@parm Out parm to receive type info
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetTypeInfo");
return ::GetTypeInfo(iTypeInfo, g_pTypeInfoPara, ppTypeInfo);
}
/*
* CTxtPara::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid)
*
* @mfunc
* Get DISPIDs for ITextPara methods and properties
*
* @rdesc
* HRESULT
*/
STDMETHODIMP CTxtPara::GetIDsOfNames (
REFIID riid, //@parm Interface ID to interpret names for
OLECHAR ** rgszNames, //@parm Array of names to be mapped
UINT cNames, //@parm Count of names to be mapped
LCID lcid, //@parm Local ID to use for interpretation
DISPID * rgdispid) //@parm Out parm to receive name mappings
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetIDsOfNames");
HRESULT hr = GetTypeInfoPtrs(); // Ensure TypeInfo ptrs are OK
if(hr != NOERROR)
return hr;
return g_pTypeInfoPara->GetIDsOfNames(rgszNames, cNames, rgdispid);
}
/*
* CTxtPara::Invoke(dispidMember, riid, lcid, wFlags, pdispparams,
* pvarResult, pexcepinfo, puArgError)
* @mfunc
* Invoke methods for the ITextPara interface
*
* @rdesc
* HRESULT
*/
STDMETHODIMP CTxtPara::Invoke (
DISPID dispidMember, //@parm Identifies member function
REFIID riid, //@parm Pointer to interface ID
LCID lcid, //@parm Locale ID for interpretation
USHORT wFlags, //@parm Flags describing context of call
DISPPARAMS *pdispparams, //@parm Ptr to method arguments
VARIANT * pvarResult, //@parm Out parm for result (if not NULL)
EXCEPINFO * pexcepinfo, //@parm Out parm for exception info
UINT * puArgError) //@parm Out parm for error
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::Invoke");
HRESULT hr = GetTypeInfoPtrs(); // Ensure TypeInfo ptrs are OK
if(hr != NOERROR)
return hr;
if(IsZombie())
return CO_E_RELEASED;
return g_pTypeInfoPara->Invoke(this, dispidMember, wFlags,
pdispparams, pvarResult, pexcepinfo, puArgError);
}
//------------------------ CTxtPara ITextPara Methods -------------------------------------
/*
* ITextPara::AddTab(float tbPos, long tbAlign, long tbLeader)
*
* @mfunc
* Method that adds a tab at the displacement tbPos, with type
* tbAlign, and leader style tbLeader. The displacement is given in
* floating-point points.
*
* @rdesc
* HRESULT = (if success) ? NOERROR :
* (protected) ? E_ACCESSDENIED : E_OUTOFMEMORY
*/
STDMETHODIMP CTxtPara::AddTab (
float tbPos, //@parm New tab displacement
long tbAlign, //@parm New tab type
long tbLeader) //@parm New tab style
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::AddTab");
HRESULT hr = UpdateFormat(); // If live Para object, update
// _PF to current _prg values
if(hr != NOERROR)
return hr; // Must be a zombie
hr = _PF.AddTab(FPPTS_TO_TWIPS(tbPos), tbAlign, tbLeader, FALSE);
return hr == NOERROR ? FormatSetter(PFM_TABSTOPS) : hr;
}
/*
* ITextPara::CanChange(long * pbCanChange)
*
* @mfunc
* Method that sets *pbCanChange = tomTrue if and only if the
* paragraph formatting can be changed.
*
* @rdesc
* HRESULT = (can change char format) ? NOERROR : S_FALSE
*/
STDMETHODIMP CTxtPara::CanChange (
long *pbCanChange) //@parm Out parm to receive boolean value
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::CanChange");
return CTxtFormat::CanChange(pbCanChange);
}
/*
* ITextPara::ClearAllTabs()
*
* @mfunc
* Method that clears all tabs, reverting to equally spaced
* tabs with the default tab spacing.
*
* @rdesc
* HRESULT = (if success) ? NOERROR :
* (protected) ? E_ACCESSDENIED : E_OUTOFMEMORY
*/
STDMETHODIMP CTxtPara::ClearAllTabs()
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::ClearAllTabs");
_PF.cTabCount = 0; // Signal to use default tab
return FormatSetter(PFM_TABSTOPS);
}
/*
* ITextPara::DeleteTab(float tbPos)
*
* @mfunc
* Delete any tab at the displacement tbPos. This displacement is
* given in floating-point points.
*
* @rdesc
* HRESULT = (if success) ? NOERROR :
* (protected) ? E_ACCESSDENIED : E_OUTOFMEMORY
*/
STDMETHODIMP CTxtPara::DeleteTab (
float tbPos) //@parm Displacement at which tab should be deleted
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::DeleteTab");
HRESULT hr = UpdateFormat(); // If live Para object, update
// _PF to current _prg values
if(hr != NOERROR)
return hr; // Must be a zombie
hr = _PF.DeleteTab(FPPTS_TO_TWIPS(tbPos));
return hr == NOERROR ? FormatSetter(PFM_TABSTOPS) : hr;
}
/*
* ITextPara::GetAlignment(long * pValue)
*
* @mfunc
* Property get method that gets the current paragraph
* alignment value
*
* @rdesc
* HRESULT = (!pValue) ? E_INVALIDARG : NOERROR;
*/
STDMETHODIMP CTxtPara::GetAlignment (
long *pValue) //@parm Out parm to receive paragraph alignment
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetAlignment");
if(!pValue)
return E_INVALIDARG;
HRESULT hr = UpdateFormat(); // If live Para object, update
// _PF to current _prg values
if(_PF.wAlignment > 4) // value. Fix bogus value since
_PF.wAlignment = 0; // array lookup can't use it
*pValue = (_PF.dwMask & PFM_ALIGNMENT)
? (LONG)g_rgREtoTOMAlign[_PF.wAlignment] : tomUndefined;
return hr;
}
/*
* ITextPara::GetHyphenation(long *pValue)
*
* @mfunc
* Property get method that gets the tomBool for whether to
* suppress hyphenation for the paragraph in a range.
*
* @rdesc
* HRESULT = (!pValue) ? E_INVALIDARG : NOERROR;
*/
STDMETHODIMP CTxtPara::GetHyphenation (
long *pValue) //@parm Out parm to receive tomBool
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetHyphenation");
if(!pValue)
return E_INVALIDARG;
HRESULT hr = EffectGetter(pValue, PFM_DONOTHYPHEN);
//Oh well, Word inverted meaning after we shipped...
if(*pValue == tomTrue)
*pValue = tomFalse;
else if(*pValue == tomFalse)
*pValue = tomTrue;
return hr;
}
/*
* ITextPara::GetDuplicate(ITextPara **ppPara)
*
* @mfunc
* Property get method that gets a clone of this text paragraph
* format object.
*
* @rdesc
* HRESULT = (!ppPara) ? E_INVALIDARG :
* (if success) ? NOERROR : S_FALSE
*/
STDMETHODIMP CTxtPara::GetDuplicate (
ITextPara **ppPara) //@parm Out parm to receive ITextPara clone
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetDuplicate");
if(!ppPara)
return E_INVALIDARG;
*ppPara = NULL;
if(IsZombie())
return CO_E_RELEASED;
CTxtPara *pPara = new CTxtPara(NULL); // NULL creates a clone
if(!pPara) // (its _prg is NULL)
return E_OUTOFMEMORY;
if(_prg) // If this is a live para object,
_prg->GetParaFormat(&pPara->_PF); // clone directly from range
else
pPara->_PF = _PF; // Copy value of this object
*ppPara = pPara; // Return ptr to clone
return NOERROR;
}
/*
* ITextPara::GetFirstLineIndent(float * pValue)
*
* @mfunc
* Property get method that gets the amount used to indent the
* first line of a paragraph relative to the left indent, which is used
* for subsequent lines. The amount is given in floating-point points.
*
* @rdesc
* HRESULT = (!pValue) ? E_INVALIDARG : NOERROR;
*/
STDMETHODIMP CTxtPara::GetFirstLineIndent (
float *pValue) //@parm Out parm to receive first-line indent
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetFirstLineIndent");
HRESULT hr = GetParameter(&_PF.dxOffset, PFM_OFFSET, -4, (long *)pValue);
if(hr == NOERROR && *pValue != tomFloatUndefined)
*pValue = -*pValue; // Defined as negative of
return hr; // RichEdit dxOffset
}
/*
* ITextPara::GetKeepTogether(long * pValue)
*
* @mfunc
* Property get method that gets the tomBool for whether to
* keep the lines in a range together.
*
* @rdesc
* HRESULT = (!pValue) ? E_INVALIDARG : NOERROR;
*/
STDMETHODIMP CTxtPara::GetKeepTogether (
long *pValue) //@parm Out parm to receive tomBool
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetKeepTogether");
return EffectGetter(pValue, PFM_KEEP);
}
/*
* ITextPara::GetKeepWithNext(long * pValue)
*
* @mfunc
* Property get method that gets the tomBool for whether to
* keep the paragraphs in this range together.
*
* @rdesc
* HRESULT = (!pValue) ? E_INVALIDARG : NOERROR;
*/
STDMETHODIMP CTxtPara::GetKeepWithNext (
long *pValue) //@parm Out parm to receive tomBool
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetKeepWithNext");
return EffectGetter(pValue, PFM_KEEPNEXT);
}
#define PFM_LEFTINDENT (PFM_STARTINDENT + PFM_OFFSET)
/*
* ITextPara::GetLeftIndent(float * pValue)
*
* @mfunc
* Property get method that gets the amount used to indent all
* but the first line of a paragraph. The amount is given in
* floating-point points and is relative to the left margin.
*
* @rdesc
* HRESULT = (!pValue) ? E_INVALIDARG : NOERROR;
*
* @devnote
* For the TOM left indent to be defined, both the RichEdit start
* indent and the offset must be defined (see XOR and AND in *pValue
* code).
*/
STDMETHODIMP CTxtPara::GetLeftIndent (
float *pValue) //@parm Out parm to receive left indent
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetLeftIndent");
if(!pValue)
return E_INVALIDARG;
HRESULT hr = UpdateFormat(); // If live Para object, update
// _PF to current _prg values
*pValue = ((_PF.dwMask ^ PFM_LEFTINDENT) & PFM_LEFTINDENT)
? tomFloatUndefined
: TWIPS_TO_FPPTS(_PF.dxStartIndent + _PF.dxOffset);
return hr;
}
/*
* ITextPara::GetLineSpacing(float * pValue)
*
* @mfunc
* Property get method that gets the line spacing value, which
* is given in floating-point points.
*
* @rdesc
* HRESULT = (!pValue) ? E_INVALIDARG : NOERROR;
*/
STDMETHODIMP CTxtPara::GetLineSpacing (
float *pValue) //@parm Out parm to receive line spacing
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtPara::GetLineSpacing");
return GetParameter(&_PF.dyLineSpacing, PFM_LINESPACING, -4,
(long *)pValue);
}
/*
* ITextPara::GetLineSpacingRule(long * pValue)
*
* @mfunc
* Property get method that gets the line-spacing rule for this range
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -