1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
// Feel free to use this code in your own applications.
// The Author does not guarantee anything about this code.
// Author : Yves Maurer
// FormattedTextDraw.h : Declaration of the CFormattedTextDraw
#ifndef __FORMATTEDTEXTDRAW_H_
#define __FORMATTEDTEXTDRAW_H_
#ifndef LY_PER_INCH
#define LY_PER_INCH 1440
#define HOST_BORDER 0
#endif
struct COOKIE
{
bool isUnicode;
union
{
char *ansi;
WCHAR *unicode;
};
size_t cbSize, cbCount;
};
extern HRESULT(WINAPI *MyCreateTextServices)(IUnknown *punkOuter, ITextHost *pITextHost, IUnknown **ppUnk);
/////////////////////////////////////////////////////////////////////////////
// IFormatttedTextDraw
interface IFormattedTextDraw
{
public:
virtual ~IFormattedTextDraw() {};
virtual HRESULT get_NaturalSize(void *hdcDraw, long *Width, long *pVal) = 0;
virtual HRESULT Create() = 0;
virtual HRESULT Draw(void *hdcDraw, RECT *prc) = 0;
virtual HRESULT putRTFTextA(char *newVal) = 0;
virtual HRESULT putRTFTextW(WCHAR *newVal) = 0;
virtual HRESULT putTextA(char *newVal) = 0;
virtual HRESULT putTextW(WCHAR *newVal) = 0;
virtual ITextServices *getTextService() = 0;
virtual ITextDocument *getTextDocument() = 0;
virtual void setParentWnd(HWND hwnd, RECT rect) = 0;
// COM-like functions
virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
virtual ULONG STDMETHODCALLTYPE Release(void) = 0;
};
/////////////////////////////////////////////////////////////////////////////
// CFormattedTextDraw
class CFormattedTextDraw :
public ITextHost,
public IFormattedTextDraw
{
public:
CFormattedTextDraw()
{
HDC hdcScreen;
hdcScreen = GetDC(NULL);
nPixelsPerInchX = GetDeviceCaps(hdcScreen, LOGPIXELSX);
nPixelsPerInchY = GetDeviceCaps(hdcScreen, LOGPIXELSY);
ReleaseDC(NULL, hdcScreen);
SetRectEmpty(&m_rcClient);
SetRectEmpty(&m_rcViewInset);
m_pCF = (CHARFORMAT2W*)malloc(sizeof(CHARFORMAT2W));
InitDefaultCharFormat();
InitDefaultParaFormat();
m_spTextServices = NULL;
m_spTextDocument = NULL;
m_dwPropertyBits = TXTBIT_RICHTEXT | TXTBIT_MULTILINE | TXTBIT_WORDWRAP | TXTBIT_USECURRENTBKG;
m_dwScrollbar = 0;
m_dwMaxLength = INFINITE;
}
~CFormattedTextDraw()
{
free(m_pCF);
if (m_spTextServices != NULL)
m_spTextServices->Release();
if (m_spTextDocument != NULL)
m_spTextDocument->Release();
}
// Minimal COM functionality
HRESULT STDMETHODCALLTYPE QueryInterface(
/* [in] */ REFIID,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{
*ppvObject = NULL;
return S_FALSE;
}
ULONG STDMETHODCALLTYPE AddRef(void)
{
return 0;
}
ULONG STDMETHODCALLTYPE Release(void)
{
return 0;
}
// IFormattedTextDraw
public:
HRESULT get_NaturalSize(void *hdcDraw, long *Width, long *pVal);
HRESULT Create();
HRESULT Draw(void *hdcDraw, RECT *prc);
HRESULT putRTFTextA(char *newVal);
HRESULT putRTFTextW(WCHAR *newVal);
HRESULT putTextA(char *newVal);
HRESULT putTextW(WCHAR *newVal);
ITextServices *getTextService() { return m_spTextServices; };
ITextDocument *getTextDocument() { return m_spTextDocument; };
virtual void setParentWnd(HWND hwnd, RECT rect) { m_hwndParent = hwnd; m_rcClient = rect; }
// ITextHost
HDC TxGetDC();
INT TxReleaseDC(HDC hdc);
BOOL TxShowScrollBar(INT fnBar, BOOL fShow);
BOOL TxEnableScrollBar(INT fuSBFlags, INT fuArrowflags);
BOOL TxSetScrollRange(INT fnBar, LONG nMinPos, INT nMaxPos, BOOL fRedraw);
BOOL TxSetScrollPos(INT fnBar, INT nPos, BOOL fRedraw);
void TxInvalidateRect(LPCRECT prc, BOOL fMode);
void TxViewChange(BOOL fUpdate);
BOOL TxCreateCaret(HBITMAP hbmp, INT xWidth, INT yHeight);
BOOL TxShowCaret(BOOL fShow);
BOOL TxSetCaretPos(INT x, INT y);
BOOL TxSetTimer(UINT idTimer, UINT uTimeout);
void TxKillTimer(UINT idTimer);
void TxScrollWindowEx(INT dx, INT dy, LPCRECT lprcScroll, LPCRECT lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate, UINT fuScroll);
void TxSetCapture(BOOL fCapture);
void TxSetFocus();
void TxSetCursor(HCURSOR hcur, BOOL fText);
BOOL TxScreenToClient(LPPOINT lppt);
BOOL TxClientToScreen(LPPOINT lppt);
HRESULT TxActivate(LONG * plOldState);
HRESULT TxDeactivate(LONG lNewState);
HRESULT TxGetClientRect(LPRECT prc);
HRESULT TxGetViewInset(LPRECT prc);
HRESULT TxGetCharFormat(const CHARFORMATW **ppCF);
HRESULT TxGetParaFormat(const PARAFORMAT **ppPF);
COLORREF TxGetSysColor(int nIndex);
HRESULT TxGetBackStyle(TXTBACKSTYLE *pstyle);
HRESULT TxGetMaxLength(DWORD *plength);
HRESULT TxGetScrollBars(DWORD *pdwScrollBar);
HRESULT TxGetPasswordChar(TCHAR *pch);
HRESULT TxGetAcceleratorPos(LONG *pcp);
HRESULT TxGetExtent(LPSIZEL lpExtent);
HRESULT OnTxCharFormatChange(const CHARFORMATW * pcf);
HRESULT OnTxParaFormatChange(const PARAFORMAT * ppf);
HRESULT TxGetPropertyBits(DWORD dwMask, DWORD *pdwBits);
HRESULT TxNotify(DWORD iNotify, void *pv);
HIMC TxImmGetContext();
void TxImmReleaseContext(HIMC himc);
HRESULT TxGetSelectionBarWidth(LONG *lSelBarWidth);
// Custom functions
HRESULT CharFormatFromHFONT(CHARFORMAT2W* pCF, HFONT hFont);
HRESULT InitDefaultCharFormat();
HRESULT InitDefaultParaFormat();
HRESULT CreateTextServicesObject();
// Variables
HWND m_hwndParent;
RECT m_rcClient; // Client Rect
RECT m_rcViewInset; // view rect inset
SIZEL m_sizelExtent; // Extent array
int nPixelsPerInchX; // Pixels per logical inch along width
int nPixelsPerInchY; // Pixels per logical inch along height
CHARFORMAT2W *m_pCF;
PARAFORMAT2 m_PF;
DWORD m_dwScrollbar; // Scroll bar style
DWORD m_dwPropertyBits; // Property bits
DWORD m_dwMaxLength;
COOKIE m_editCookie;
ITextServices *m_spTextServices;
ITextDocument *m_spTextDocument;
};
#endif //__FORMATTEDTEXTDRAW_H_
|