ReactOS 0.4.15-dev-6057-gd708c79
textedit.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: PAINT for ReactOS
3 * LICENSE: LGPL
4 * FILE: base/applications/mspaint/textedit.cpp
5 * PURPOSE: Text editor and font chooser for the text tool
6 * PROGRAMMERS: Benedikt Freisen
7 */
8
9#include "precomp.h"
10
11#define CXY_GRIP 3
12
14
15/* FUNCTIONS ********************************************************/
16
17CTextEditWindow::CTextEditWindow() : m_hFont(NULL), m_hFontZoomed(NULL), m_nAppIsMovingOrSizing(0)
18{
20}
21
23{
24 switch (getSizeBoxHitTest(pt, &rc))
25 {
26 case HIT_NONE: return HTNOWHERE;
27 case HIT_UPPER_LEFT: return HTTOPLEFT;
28 case HIT_UPPER_CENTER: return HTTOP;
29 case HIT_UPPER_RIGHT: return HTTOPRIGHT;
30 case HIT_MIDDLE_LEFT: return HTLEFT;
31 case HIT_MIDDLE_RIGHT: return HTRIGHT;
32 case HIT_LOWER_LEFT: return HTBOTTOMLEFT;
33 case HIT_LOWER_CENTER: return HTBOTTOM;
34 case HIT_LOWER_RIGHT: return HTBOTTOMRIGHT;
35 case HIT_BORDER: return HTCAPTION; // Enable drag move
36 case HIT_INNER: return HTCLIENT;
37 }
38 return HTNOWHERE;
39}
40
42{
43 drawSizeBoxes(hDC, &rc, TRUE, NULL);
44}
45
47{
48 CString szText;
49 GetWindowText(szText);
50
51 RECT rcParent;
52 ::GetWindowRect(m_hwndParent, &rcParent);
53
54 RECT rc, rcWnd, rcText;
55 GetWindowRect(&rcWnd);
56 rcText = rcWnd;
57
58 HDC hDC = GetDC();
59 if (hDC)
60 {
64 szText += TEXT("x"); // This is a trick to enable the last newlines
65 const UINT uFormat = DT_LEFT | DT_TOP | DT_EDITCONTROL | DT_NOPREFIX | DT_NOCLIP |
67 DrawText(hDC, szText, -1, &rcText, uFormat | DT_CALCRECT);
68 if (tm.tmDescent > 0)
69 rcText.bottom += tm.tmDescent;
71 }
72
73 UnionRect(&rc, &rcText, &rcWnd);
75
76 rcWnd = rc;
77 ::GetClientRect(m_hwndParent, &rcParent);
78 IntersectRect(&rc, &rcParent, &rcWnd);
79
81 MoveWindow(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE);
83
86
88}
89
91{
92 if (wParam == VK_TAB)
93 return 0; // FIXME: Tabs
94
95 CString szText;
96 GetWindowText(szText);
97
99 FixEditPos(szText);
100
101 return ret;
102}
103
105{
106 if (wParam == VK_ESCAPE)
107 {
109 return 0;
110 }
111
112 CString szText;
113 GetWindowText(szText);
114
116 FixEditPos(szText);
117 return ret;
118}
119
121{
125 return ret;
126}
127
129{
130 HDC hDC = (HDC)wParam;
132 {
133 RECT rc;
134 GetClientRect(&rc);
136 FillRect(hDC, &rc, hbr);
137 DeleteObject(hbr);
138 }
140 return TRUE;
141}
142
144{
145 RECT rc;
146 GetClientRect(&rc);
147
149
150 HDC hDC = GetDC();
151 if (hDC)
152 {
153 DrawGrip(hDC, rc);
154 ReleaseDC(hDC);
155 }
156
157 return 0;
158}
159
161{
162 RECT rc;
163 GetWindowRect(&rc);
164
166 if (hDC)
167 {
168 OffsetRect(&rc, -rc.left, -rc.top);
169 DrawGrip(hDC, rc);
170 ReleaseDC(hDC);
171 }
172
173 return 0;
174}
175
177{
178 return 0; // No frame.
179}
180
182{
184 RECT rc;
185 GetWindowRect(&rc);
186 return DoHitTest(rc, pt);
187}
188
190{
191 UINT nHitTest = LOWORD(lParam);
192 if (nHitTest == HTCAPTION)
193 {
194 ::SetCursor(::LoadCursor(NULL, IDC_SIZEALL)); // Enable drag move
195 return FALSE;
196 }
197 return DefWindowProc(nMsg, wParam, lParam);
198}
199
201{
203
204 if (m_nAppIsMovingOrSizing == 0)
205 {
206 Reposition();
208 }
209 return ret;
210}
211
213{
215
216 RECT rc;
217 GetClientRect(&rc);
220
221 if (m_nAppIsMovingOrSizing == 0)
222 {
223 Reposition();
225 }
226
227 return ret;
228}
229
230// Hack: Use DECLARE_WND_SUPERCLASS instead!
232{
234
237 HWND hwnd = ::CreateWindowEx(0, WC_EDIT, NULL, style, 0, 0, 0, 0,
239 if (hwnd)
240 {
241#undef SubclassWindow // Don't use this macro
243
244 UpdateFont();
245
246 PostMessage(WM_SIZE, 0, 0);
247 }
248
249 return m_hWnd;
250}
251
253{
255 return;
256
257 RECT rc;
258 SendMessage(EM_GETRECT, 0, (LPARAM)&rc);
259 MapWindowPoints(hwnd, (LPPOINT)&rc, 2);
260
262 FillRect(hDC, &rc, hbr);
263 DeleteObject(hbr);
264}
265
267{
268 UpdateFont();
269 return 0;
270}
271
273{
275 if (m_hFont)
276 {
278 m_hFont = NULL;
279 }
280 if (m_hFontZoomed)
281 {
284 }
285 return 0;
286}
287
289{
290 RECT rc;
291 GetWindowRect(&rc);
294
295 GetClientRect(&rc);
298 m_rc = rc;
299}
300
302{
303 UpdateFont();
304 return 0;
305}
306
308{
309 UpdateFont();
310 return 0;
311}
312
314{
315 UpdateFont();
317 return 0;
318}
319
321{
322 if (wParam == TOOL_TEXT)
323 {
324 UpdateFont();
325 }
326 else
327 {
329 }
330 return 0;
331}
332
334{
335 if (m_hFont)
336 {
338 m_hFont = NULL;
339 }
340 if (m_hFontZoomed)
341 {
344 }
345
346 LOGFONT lf;
347 ZeroMemory(&lf, sizeof(lf));
348 lf.lfCharSet = DEFAULT_CHARSET; // registrySettings.CharSet; // Ignore
353
354 HDC hdc = GetDC();
355 if (hdc)
356 {
357 INT nFontSize = registrySettings.PointSize;
358 lf.lfHeight = -MulDiv(nFontSize, GetDeviceCaps(hdc, LOGPIXELSY), 72);
359 ReleaseDC(hdc);
360 }
361
363
364 lf.lfHeight = Zoomed(lf.lfHeight);
366
369
371
372 Invalidate();
373}
374
376{
381 return ret;
382}
383
385{
386 *prc = m_rc;
387 return TRUE;
388}
389
391{
392 if (prc)
393 m_rc = *prc;
394
395 CRect rc = m_rc;
397
399 MoveWindow(rc.left, rc.top, rc.Width(), rc.Height(), TRUE);
401}
402
404{
405 CRect rc;
406 GetWindowRect(&rc);
409
410 CRect rcImage;
411 canvasWindow.GetImageRect(rcImage);
412
413 if (rc.bottom > rcImage.bottom)
414 ::OffsetRect(&rc, 0, rcImage.Height());
415
416 if (rc.right > rcImage.right)
417 ::OffsetRect(&rc, rcImage.Width(), 0);
418
419 if (rc.left < 0)
420 ::OffsetRect(&rc, -rc.left, 0);
421
422 if (rc.top < 0)
423 ::OffsetRect(&rc, 0, -rc.top);
424
426
428 MoveWindow(rc.left, rc.top, rc.Width(), rc.Height(), TRUE);
430}
431
433{
434 return ::SendMessage(GetParent(), nMsg, wParam, lParam);
435}
static HDC hDC
Definition: 3dtext.c:33
Arabic default style
Definition: afstyles.h:94
@ HIT_NONE
Definition: common.h:42
@ HIT_BORDER
Definition: common.h:51
@ HIT_LOWER_RIGHT
Definition: common.h:50
@ HIT_LOWER_CENTER
Definition: common.h:49
@ HIT_UPPER_LEFT
Definition: common.h:43
@ HIT_INNER
Definition: common.h:52
@ HIT_LOWER_LEFT
Definition: common.h:48
@ HIT_UPPER_CENTER
Definition: common.h:44
@ HIT_UPPER_RIGHT
Definition: common.h:45
@ HIT_MIDDLE_RIGHT
Definition: common.h:47
@ HIT_MIDDLE_LEFT
Definition: common.h:46
CCanvasWindow canvasWindow
Definition: canvas.cpp:11
VOID ImageToCanvas(POINT &pt)
Definition: canvas.cpp:45
VOID CanvasToImage(POINT &pt, BOOL bZoomed=FALSE)
Definition: canvas.cpp:62
VOID GetImageRect(RECT &rc)
Definition: canvas.cpp:83
int Width() const
Definition: atltypes.h:407
int Height() const
Definition: atltypes.h:318
LRESULT OnNCPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:160
LRESULT OnNCHitTest(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:181
LRESULT OnToolsModelZoomChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:313
HFONT m_hFontZoomed
Definition: textedit.h:73
LRESULT OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:272
LRESULT OnChar(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:90
HWND m_hwndParent
Definition: textedit.h:71
LRESULT OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:104
LRESULT OnSetSel(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:375
LRESULT OnToolsModelSettingsChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:307
BOOL GetEditRect(LPRECT prc) const
Definition: textedit.cpp:384
LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:143
LRESULT OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:266
INT DoHitTest(RECT &rc, POINT pt)
Definition: textedit.cpp:22
LRESULT OnToolsModelToolChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:320
void InvalidateEditRect()
Definition: textedit.cpp:288
LONG m_nAppIsMovingOrSizing
Definition: textedit.h:74
HWND Create(HWND hwndParent)
Definition: textedit.cpp:231
LRESULT OnEraseBkGnd(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:128
LRESULT OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:120
void Reposition()
Definition: textedit.cpp:403
LRESULT OnSetCursor(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:189
void DrawGrip(HDC hDC, RECT &rc)
Definition: textedit.cpp:41
HFONT m_hFont
Definition: textedit.h:72
LRESULT OnPaletteModelColorChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:301
LRESULT OnMouseWheel(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:432
LRESULT OnMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:200
void UpdateFont()
Definition: textedit.cpp:333
void DoFillBack(HWND hwnd, HDC hDC)
Definition: textedit.cpp:252
LRESULT OnNCCalcSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:176
void FixEditPos(LPCTSTR pszOldText)
Definition: textedit.cpp:46
LRESULT OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: textedit.cpp:212
void ValidateEditRect(LPCRECT prc OPTIONAL)
Definition: textedit.cpp:390
COLORREF GetBgColor() const
COLORREF GetFgColor() const
DWORD PointSize
Definition: registry.h:35
CString strFontName
Definition: registry.h:34
DWORD Underline
Definition: registry.h:38
BOOL IsBackgroundTransparent() const
Definition: toolsmodel.cpp:135
void OnCancelDraw()
Definition: toolsmodel.cpp:213
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static HWND hwndParent
Definition: cryptui.c:300
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define pt(x, y)
Definition: drawing.c:79
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
ToolsModel toolsModel
Definition: toolsmodel.cpp:11
RegistrySettings registrySettings
Definition: registry.cpp:15
HINSTANCE hProgInstance
Definition: main.cpp:15
PaletteModel paletteModel
#define TEXT(s)
Definition: k32.h:26
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:92
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
unsigned int UINT
Definition: ndis.h:50
_Out_ LPRECT prc
Definition: ntgdi.h:1658
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define ES_AUTOVSCROLL
Definition: pedump.c:671
#define ES_WANTRETURN
Definition: pedump.c:676
#define ES_LEFT
Definition: pedump.c:664
#define ES_MULTILINE
Definition: pedump.c:667
#define WS_THICKFRAME
Definition: pedump.c:630
#define WC_EDIT
Definition: commctrl.h:4689
#define DefWindowProc
Definition: ros2win.h:31
VOID drawSizeBoxes(HDC hdc, LPCRECT prcBase, BOOL bDrawFrame, LPCRECT prcPaint)
Definition: sizebox.cpp:104
CANVAS_HITTEST getSizeBoxHitTest(POINT pt, LPCRECT prcBase)
Definition: sizebox.cpp:81
#define _countof(array)
Definition: sndvol32.h:68
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
BYTE lfUnderline
Definition: dimm.idl:48
BYTE lfItalic
Definition: dimm.idl:47
LONG lfHeight
Definition: dimm.idl:42
BYTE lfCharSet
Definition: dimm.idl:50
LONG lfWeight
Definition: dimm.idl:46
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
Definition: time.h:68
CTextEditWindow textEditWindow
Definition: textedit.cpp:13
@ TOOL_TEXT
Definition: toolsmodel.h:22
static int Zoomed(int xy)
Definition: toolsmodel.h:126
int32_t INT
Definition: typedefs.h:58
#define MAKELONG(a, b)
Definition: typedefs.h:249
int ret
#define lstrcpyn
Definition: winbase.h:3746
#define ZeroMemory
Definition: winbase.h:1670
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define SubclassWindow(hwnd, lpfn)
Definition: windowsx.h:542
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define SetWindowFont(hwnd, hfont, fRedraw)
Definition: windowsx.h:533
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define FW_BOLD
Definition: wingdi.h:378
#define LOGPIXELSY
Definition: wingdi.h:719
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
#define DEFAULT_CHARSET
Definition: wingdi.h:384
#define FW_NORMAL
Definition: wingdi.h:373
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
#define GetTextMetrics
Definition: wingdi.h:4474
#define CreateFontIndirect
Definition: wingdi.h:4444
#define HTTOPRIGHT
Definition: winuser.h:2482
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define CreateWindowEx
Definition: winuser.h:5745
#define SW_HIDE
Definition: winuser.h:762
#define EM_GETRECT
Definition: winuser.h:1986
#define DT_NOPREFIX
Definition: winuser.h:537
#define VK_TAB
Definition: winuser.h:2189
#define WM_HSCROLL
Definition: winuser.h:1733
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define HTCAPTION
Definition: winuser.h:2466
#define DCX_WINDOW
Definition: winuser.h:2103
#define EC_RIGHTMARGIN
Definition: winuser.h:2597
#define HTTOPLEFT
Definition: winuser.h:2481
#define WM_VSCROLL
Definition: winuser.h:1734
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define HTBOTTOM
Definition: winuser.h:2483
#define WM_SIZE
Definition: winuser.h:1601
#define SB_LEFT
Definition: winuser.h:575
HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR)
#define DT_NOCLIP
Definition: winuser.h:536
HDC WINAPI GetDCEx(_In_opt_ HWND, _In_opt_ HRGN, _In_ DWORD)
#define IDC_SIZEALL
Definition: winuser.h:691
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
#define DrawText
Definition: winuser.h:5761
#define DT_LEFT
Definition: winuser.h:534
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define DT_TOP
Definition: winuser.h:542
#define DCX_PARENTCLIP
Definition: winuser.h:2105
#define EM_SETRECTNP
Definition: winuser.h:2007
#define DT_WORDBREAK
Definition: winuser.h:544
BOOL WINAPI IntersectRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT)
#define HTRIGHT
Definition: winuser.h:2479
#define HTCLIENT
Definition: winuser.h:2465
#define SendMessage
Definition: winuser.h:5833
#define LoadCursor
Definition: winuser.h:5802
#define HTBOTTOMRIGHT
Definition: winuser.h:2485
HDC WINAPI GetDC(_In_opt_ HWND)
#define HTNOWHERE
Definition: winuser.h:2464
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
#define GetWindowText
Definition: winuser.h:5788
#define PostMessage
Definition: winuser.h:5822
HWND WINAPI GetParent(_In_ HWND)
#define SB_TOP
Definition: winuser.h:578
#define HTBOTTOMLEFT
Definition: winuser.h:2484
#define HTTOP
Definition: winuser.h:2480
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define EC_LEFTMARGIN
Definition: winuser.h:2596
#define DT_EXPANDTABS
Definition: winuser.h:532
#define DT_CALCRECT
Definition: winuser.h:526
BOOL WINAPI UnionRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT)
#define HTLEFT
Definition: winuser.h:2477
#define DT_EDITCONTROL
Definition: winuser.h:528
#define EM_SETMARGINS
Definition: winuser.h:2002
#define VK_ESCAPE
Definition: winuser.h:2204
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
const CHAR * LPCTSTR
Definition: xmlstorage.h:193