4 * This module is a simple wrapper for the edit controls.
5 * At the point, it is good only for application who use the RICHEDIT
6 * control to display RTF text.
8 * Copyright 2000 by Jean-Claude Batista
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35 #define NO_SHLWAPI_STREAM
40 #include "wine/debug.h"
44 WINE_DEFAULT_DEBUG_CHANNEL(richedit
);
46 HANDLE RICHED32_hHeap
= NULL
;
47 /* LPSTR RICHED32_aSubclass = NULL; */
49 #define TRACE_EDIT_MSG32(str) \
51 "32 bit : " str ": hwnd=%p, wParam=%08x, lParam=%08x\n"\
53 hwnd, (UINT)wParam, (UINT)lParam)
56 /***********************************************************************
57 * DllMain [Internal] Initializes the internal 'RICHED32.DLL'.
60 * hinstDLL [I] handle to the DLL's instance
62 * lpvReserved [I] reserved, must be NULL
69 BOOL WINAPI
DllMain(HINSTANCE hinstDLL
, DWORD fdwReason
, LPVOID lpvReserved
)
74 case DLL_PROCESS_ATTACH
:
75 DisableThreadLibraryCalls(hinstDLL
);
76 /* create private heap */
77 RICHED32_hHeap
= HeapCreate (0, 0x10000, 0);
78 /* register the Rich Edit class */
82 case DLL_PROCESS_DETACH
:
83 /* unregister all common control classes */
84 RICHED32_Unregister ();
85 HeapDestroy (RICHED32_hHeap
);
86 RICHED32_hHeap
= NULL
;
92 /* Support routines for window procedure */
93 INT
RICHEDIT_GetTextRange(HWND hwnd
,TEXTRANGEA
*tr
);
94 INT
RICHEDIT_GetSelText(HWND hwnd
,LPSTR lpstrBuffer
);
100 * Window procedure of the RichEdit control.
103 static LRESULT WINAPI
RICHED32_WindowProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
,
106 int RTFToBuffer(char* pBuffer
, int nBufferSize
);
110 static HWND hwndEdit
;
111 static HWND hwndParent
;
112 static char* rtfBuffer
;
116 TRACE("previous hwndEdit: %p hwndParent %p\n",hwndEdit
,hwndParent
);
117 hwndEdit
= GetWindow(hwnd
,GW_CHILD
);
118 TRACE("uMsg: 0x%x hwnd: %p hwndEdit: %p\n",uMsg
,hwnd
,hwndEdit
);
124 TRACE_EDIT_MSG32("WM_CREATE Passed to default");
125 DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
129 TRACE_EDIT_MSG32("WM_NCCREATE");
131 /* remove SCROLLBARS from the current window style */
132 hwndParent
= ((LPCREATESTRUCTA
) lParam
)->hwndParent
;
134 newstyle
= style
= ((LPCREATESTRUCTA
) lParam
)->style
;
135 newstyle
&= ~WS_HSCROLL
;
136 newstyle
&= ~WS_VSCROLL
;
137 newstyle
&= ~ES_AUTOHSCROLL
;
138 newstyle
&= ~ES_AUTOVSCROLL
;
139 SetWindowLongA(hwnd
,GWL_STYLE
, newstyle
);
141 TRACE("previous hwndEdit: %p\n",hwndEdit
);
142 hwndEdit
= CreateWindowA ("edit", ((LPCREATESTRUCTA
) lParam
)->lpszName
,
144 hwnd
, (HMENU
) ID_EDIT
,
145 ((LPCREATESTRUCTA
) lParam
)->hInstance
, NULL
) ;
146 TRACE("hwndEdit: %p hwnd: %p\n",hwndEdit
,hwnd
);
154 TRACE_EDIT_MSG32("WM_SETFOCUS");
155 SetFocus (hwndEdit
) ;
159 TRACE_EDIT_MSG32("WM_SIZE");
160 MoveWindow (hwndEdit
, 0, 0, LOWORD (lParam
), HIWORD (lParam
), TRUE
) ;
164 TRACE_EDIT_MSG32("WM_COMMAND");
165 switch(HIWORD(wParam
)) {
172 return SendMessageA(hwndParent
, WM_COMMAND
,
173 wParam
, (LPARAM
)(hwnd
));
177 MessageBoxA (hwnd
, "RichEdit control out of space.",
178 "ERROR", MB_OK
| MB_ICONSTOP
) ;
183 TRACE_EDIT_MSG32("EM_STREAMIN");
185 /* setup the RTF parser */
186 RTFSetEditStream(( EDITSTREAM
*)lParam
);
187 rtfFormat
= wParam
&(SF_TEXT
|SF_RTF
);
195 rtfBufferSize
= RTFToBuffer(NULL
, 0);
196 rtfBuffer
= HeapAlloc(RICHED32_hHeap
, 0,rtfBufferSize
*sizeof(char));
199 RTFToBuffer(rtfBuffer
, rtfBufferSize
);
200 SetWindowTextA(hwndEdit
,rtfBuffer
);
201 HeapFree(RICHED32_hHeap
, 0,rtfBuffer
);
204 WARN("Not enough memory for a allocating rtfBuffer\n");
208 /* Messages specific to Richedit controls */
210 case EM_AUTOURLDETECT
:
211 TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored");
215 TRACE_EDIT_MSG32("EM_CANPASTE Ignored");
219 TRACE_EDIT_MSG32("EM_CANREDO Ignored");
223 TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored");
227 TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL");
228 cr
= (VOID
*) lParam
;
229 if (hwndEdit
) SendMessageA( hwndEdit
, EM_GETSEL
, (INT
)&cr
->cpMin
, (INT
)&cr
->cpMax
);
230 TRACE("cpMin: 0x%x cpMax: 0x%x\n",(INT
)cr
->cpMin
,(INT
)cr
->cpMax
);
235 DWORD limit
= lParam
;
236 TRACE_EDIT_MSG32("EM_EXLIMITTEXT");
241 return SendMessageA(hwndEdit
,EM_SETLIMITTEXT
,limit
,0);
244 case EM_EXLINEFROMCHAR
:
245 TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR");
246 if (hwndEdit
) return SendMessageA( hwndEdit
, EM_LINEFROMCHAR
, lParam
, wParam
);
250 TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL");
251 cr
= (VOID
*) lParam
;
252 if (hwndEdit
) SendMessageA( hwndEdit
, EM_SETSEL
, cr
->cpMin
, cr
->cpMax
);
256 TRACE_EDIT_MSG32("EM_FINDTEXT Ignored");
260 TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored");
264 TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored");
268 TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored");
271 case EM_FINDWORDBREAK
:
272 TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored");
276 TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored");
279 case EM_GETAUTOURLDETECT
:
280 TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored");
283 case EM_GETBIDIOPTIONS
:
284 TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored");
287 case EM_GETCHARFORMAT
:
288 TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored");
291 case EM_GETEDITSTYLE
:
292 TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored");
295 case EM_GETEVENTMASK
:
296 TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored");
300 TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored");
303 case EM_GETIMECOMPMODE
:
304 TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored");
307 case EM_GETIMEOPTIONS
:
308 TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored");
311 case EM_GETLANGOPTIONS
:
312 TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS");
315 case EM_GETOLEINTERFACE
:
316 TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored");
320 TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored");
323 case EM_GETPARAFORMAT
:
324 TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored");
327 case EM_GETPUNCTUATION
:
328 TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored");
332 TRACE_EDIT_MSG32("EM_GETREDONAME Ignored");
335 case EM_GETSCROLLPOS
:
336 TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored");
340 TRACE_EDIT_MSG32("EM_GETSELTEXT");
341 return RICHEDIT_GetSelText(hwndEdit
,(void *)lParam
);
344 TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored");
347 case EM_GETTEXTLENGTHEX
:
348 TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored");
352 TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored");
355 case EM_GETTEXTRANGE
:
356 TRACE_EDIT_MSG32("EM_GETTEXTRANGE");
357 return RICHEDIT_GetTextRange(hwndEdit
,(TEXTRANGEA
*)lParam
);
359 case EM_GETTYPOGRAPHYOPTIONS
:
360 TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored");
364 TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored");
367 case EM_GETWORDBREAKPROCEX
:
368 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored");
371 case EM_GETWORDWRAPMODE
:
372 TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored");
376 TRACE_EDIT_MSG32("EM_GETZOOM Ignored");
379 case EM_HIDESELECTION
:
380 TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored");
383 case EM_PASTESPECIAL
:
384 TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored");
387 case EM_RECONVERSION
:
388 TRACE_EDIT_MSG32("EM_RECONVERSION Ignored");
392 TRACE_EDIT_MSG32("EM_REDO Ignored");
395 case EM_REQUESTRESIZE
:
396 TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored");
399 case EM_SELECTIONTYPE
:
400 TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored");
403 case EM_SETBIDIOPTIONS
:
404 TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored");
407 case EM_SETBKGNDCOLOR
:
408 TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored");
411 case EM_SETCHARFORMAT
:
412 TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored");
415 case EM_SETEDITSTYLE
:
416 TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored");
419 case EM_SETEVENTMASK
:
420 TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored");
424 TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored");
428 TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored");
431 case EM_SETIMEOPTIONS
:
432 TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored");
435 case EM_SETLANGOPTIONS
:
436 TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored");
439 case EM_SETOLECALLBACK
:
440 TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored");
444 TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored");
448 TRACE_EDIT_MSG32("EM_SETPALETTE Ignored");
451 case EM_SETPARAFORMAT
:
452 TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored");
455 case EM_SETPUNCTUATION
:
456 TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored");
459 case EM_SETSCROLLPOS
:
460 TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored");
463 case EM_SETTARGETDEVICE
:
464 TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored");
468 TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored");
472 TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored");
475 case EM_SETTYPOGRAPHYOPTIONS
:
476 TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored");
479 case EM_SETUNDOLIMIT
:
480 TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored");
483 case EM_SETWORDBREAKPROCEX
:
484 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored");
487 case EM_SETWORDWRAPMODE
:
488 TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored");
492 TRACE_EDIT_MSG32("EM_SETZOOM Ignored");
495 case EM_SHOWSCROLLBAR
:
496 TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored");
499 case EM_STOPGROUPTYPING
:
500 TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored");
504 TRACE_EDIT_MSG32("EM_STREAMOUT Ignored");
507 /* Messages dispatched to the edit control */
509 TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control");
510 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
512 TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control");
513 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
514 case EM_EMPTYUNDOBUFFER
:
515 TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control");
516 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
518 TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control");
519 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
520 case EM_GETFIRSTVISIBLELINE
:
521 TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control");
522 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
524 TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control");
525 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
526 /* case EM_GETIMESTATUS:*/
527 case EM_GETLIMITTEXT
:
528 TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control");
529 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
531 TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control");
532 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
533 case EM_GETLINECOUNT
:
534 TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control");
535 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
537 TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control");
538 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
540 TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control");
541 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
542 case EM_GETPASSWORDCHAR
:
543 TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control");
544 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
546 TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control");
547 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
549 TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control");
550 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
552 TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control");
553 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
554 case EM_GETWORDBREAKPROC
:
555 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control");
556 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
557 case EM_LINEFROMCHAR
:
558 TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control");
559 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
561 TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control");
562 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
564 TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control");
565 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
567 TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control");
568 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
570 TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control");
571 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
573 TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control");
574 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
576 TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control");
577 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
579 TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control");
580 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
582 TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control");
583 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
584 /* case EM_SETIMESTATUS:*/
585 case EM_SETLIMITTEXT
:
586 TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control");
587 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
589 TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control");
590 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
592 TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control");
593 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
594 case EM_SETPASSWORDCHAR
:
595 TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control");
596 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
598 TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control");
599 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
601 TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control");
602 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
604 TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control");
605 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
607 TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control");
608 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
610 TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control");
611 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
612 case EM_SETWORDBREAKPROC
:
613 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control");
614 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
616 TRACE_EDIT_MSG32("EM_UNDO Passed to edit control");
617 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
619 case WM_STYLECHANGING
:
620 TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control");
621 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
622 case WM_STYLECHANGED
:
623 TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control");
624 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
626 TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control");
627 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
628 case WM_GETTEXTLENGTH
:
629 TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control");
630 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
632 TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control");
633 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
635 TRACE_EDIT_MSG32("WM_CUT Passed to edit control");
636 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
638 TRACE_EDIT_MSG32("WM_COPY Passed to edit control");
639 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
641 TRACE_EDIT_MSG32("WM_PASTE Passed to edit control");
642 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
644 /* Messages passed to default handler. */
646 /* A fundamental problem with embedding an edit control within another
647 window to emulate the richedit control, is that normally, the
648 WM_NCCALCSIZE message window would return the client area of the
651 While we could send a message to the edit control here to get that size
652 and return that value, this causes problems with the WM_SIZE message.
653 That is because the WM_SIZE message uses the returned value of
654 WM_NCCALCSIZE (via X11DRV_SetWindowSize) to determine the size to make
655 the edit control. If we return the size of the edit control client area
656 here, the result is the symptom of the edit control being inset on the
657 right and bottom by the width of any existing scrollbars.
659 The easy fix is to have WM_NCCALCSIZE return the true size of this
660 enclosing window, which is what we have done here. The more difficult
661 fix is to create a custom Richedit MoveWindow procedure for use in the
662 WM_SIZE message above. Since it is very unlikely that an app would call
663 and use the WM_NCCALCSIZE message, we stick with the easy fix for now.
665 TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default");
666 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
668 TRACE_EDIT_MSG32("WM_NCPAINT Passed to default");
669 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
671 TRACE_EDIT_MSG32("WM_PAINT Passed to default");
672 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
674 TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default");
675 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
677 TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default");
678 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
680 TRACE_EDIT_MSG32("WM_DESTROY Passed to default");
681 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
682 case WM_CHILDACTIVATE
:
683 TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default");
684 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
686 case WM_WINDOWPOSCHANGING
:
687 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default");
688 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
689 case WM_WINDOWPOSCHANGED
:
690 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default");
691 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
692 /* case WM_INITIALUPDATE:
693 TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default");
694 return DefWindowProcA( hwnd,uMsg,wParam,lParam); */
695 case WM_CTLCOLOREDIT
:
696 TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default");
697 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
699 TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default");
700 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
702 TRACE_EDIT_MSG32("WM_MOVE Passed to default");
703 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
705 TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default");
706 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
707 case WM_PARENTNOTIFY
:
708 TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default");
709 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
711 TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default");
712 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
714 TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default");
715 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
717 TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default");
718 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
719 case WM_CTLCOLORSTATIC
:
720 TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default");
721 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
723 TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default");
724 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
726 TRACE_EDIT_MSG32("WM_CLEAR Passed to default");
727 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
729 * used by IE in the EULA box
731 case WM_ALTTABACTIVE
:
732 TRACE_EDIT_MSG32("WM_ALTTABACTIVE");
733 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
735 TRACE_EDIT_MSG32("WM_GETDLGCODE");
736 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
738 TRACE_EDIT_MSG32("WM_SETFONT");
739 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
743 if ((uMsg
>= WM_USER
) && (uMsg
< WM_APP
)) {
744 FIXME("Unknown message 0x%x Passed to default hwnd=%p, wParam=%08x, lParam=%08x\n",
745 uMsg
, hwnd
, (UINT
)wParam
, (UINT
)lParam
);
748 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
751 /***********************************************************************
752 * DllGetVersion [RICHED32.2]
754 * Retrieves version information of the 'RICHED32.DLL'
757 * pdvi [O] pointer to version information structure.
761 * Failure: E_INVALIDARG
764 * Returns version of a comctl32.dll from IE4.01 SP1.
768 RICHED32_DllGetVersion (DLLVERSIONINFO
*pdvi
)
772 if (pdvi
->cbSize
!= sizeof(DLLVERSIONINFO
)) {
777 pdvi
->dwMajorVersion
= 4;
778 pdvi
->dwMinorVersion
= 0;
779 pdvi
->dwBuildNumber
= 0;
780 pdvi
->dwPlatformID
= 0;
787 * Registers the window class.
795 VOID
RICHED32_Register(void)
801 ZeroMemory(&wndClass
, sizeof(WNDCLASSA
));
802 wndClass
.style
= CS_HREDRAW
| CS_VREDRAW
| CS_GLOBALCLASS
;
803 wndClass
.lpfnWndProc
= (WNDPROC
)RICHED32_WindowProc
;
804 wndClass
.cbClsExtra
= 0;
805 wndClass
.cbWndExtra
= 0; /*(sizeof(RICHED32_INFO *);*/
806 wndClass
.hCursor
= LoadCursorA(0, (LPSTR
)IDC_ARROW
);
807 wndClass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
808 wndClass
.lpszClassName
= RICHEDIT_CLASS10A
; /* WC_RICHED32A; */
810 RegisterClassA (&wndClass
);
815 * Unregisters the window class.
823 VOID
RICHED32_Unregister(void)
827 UnregisterClassA(RICHEDIT_CLASS10A
, NULL
);
830 INT
RICHEDIT_GetTextRange(HWND hwnd
,TEXTRANGEA
*tr
)
832 UINT alloc_size
, text_size
, range_size
;
835 TRACE("start: 0x%x stop: 0x%x\n",(INT
)tr
->chrg
.cpMin
,(INT
)tr
->chrg
.cpMax
);
837 if (!(alloc_size
= SendMessageA(hwnd
,WM_GETTEXTLENGTH
,0,0))) return FALSE
;
838 if (!(text
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (alloc_size
+1))))
840 text_size
= SendMessageA(hwnd
,WM_GETTEXT
,alloc_size
,(INT
)text
);
842 if (text_size
> tr
->chrg
.cpMin
)
844 range_size
= (text_size
> tr
->chrg
.cpMax
) ? (tr
->chrg
.cpMax
- tr
->chrg
.cpMin
) : (text_size
- tr
->chrg
.cpMin
);
845 TRACE("EditText: %.30s ...\n",text
+tr
->chrg
.cpMin
);
846 memcpy(tr
->lpstrText
,text
+tr
->chrg
.cpMin
,range_size
);
849 HeapFree(GetProcessHeap(), 0, text
);
854 INT
RICHEDIT_GetSelText(HWND hwnd
,LPSTR lpstrBuffer
)
856 TEXTRANGEA textrange
;
858 textrange
.lpstrText
= lpstrBuffer
;
859 SendMessageA(hwnd
,EM_GETSEL
,(INT
)&textrange
.chrg
.cpMin
,(INT
)&textrange
.chrg
.cpMax
);
860 return RICHEDIT_GetTextRange(hwnd
,&textrange
);