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
34 #define NO_SHLWAPI_STREAM
39 #include "wine/debug.h"
43 WINE_DEFAULT_DEBUG_CHANNEL(richedit
);
45 HANDLE RICHED32_hHeap
= NULL
;
46 /* LPSTR RICHED32_aSubclass = NULL; */
48 #define TRACE_EDIT_MSG32(str) \
50 "32 bit : " str ": hwnd=%p, wParam=%08x, lParam=%08x\n"\
52 hwnd, (UINT)wParam, (UINT)lParam)
55 /***********************************************************************
56 * DllMain [Internal] Initializes the internal 'RICHED32.DLL'.
59 * hinstDLL [I] handle to the DLL's instance
61 * lpvReserved [I] reserved, must be NULL
68 BOOL WINAPI
DllMain(HINSTANCE hinstDLL
, DWORD fdwReason
, LPVOID lpvReserved
)
73 case DLL_PROCESS_ATTACH
:
74 DisableThreadLibraryCalls(hinstDLL
);
75 /* create private heap */
76 RICHED32_hHeap
= HeapCreate (0, 0x10000, 0);
77 /* register the Rich Edit class */
81 case DLL_PROCESS_DETACH
:
82 /* unregister all common control classes */
83 RICHED32_Unregister ();
84 HeapDestroy (RICHED32_hHeap
);
85 RICHED32_hHeap
= NULL
;
91 /* Support routines for window procedure */
92 INT
RICHEDIT_GetTextRange(HWND hwnd
,TEXTRANGEA
*tr
);
93 INT
RICHEDIT_GetSelText(HWND hwnd
,LPSTR lpstrBuffer
);
99 * Window procedure of the RichEdit control.
102 static LRESULT WINAPI
RICHED32_WindowProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
,
105 int RTFToBuffer(char* pBuffer
, int nBufferSize
);
109 static HWND hwndEdit
;
110 static HWND hwndParent
;
111 static char* rtfBuffer
;
115 TRACE("previous hwndEdit: %p hwndParent %p\n",hwndEdit
,hwndParent
);
116 hwndEdit
= GetWindow(hwnd
,GW_CHILD
);
117 TRACE("uMsg: 0x%x hwnd: %p hwndEdit: %p\n",uMsg
,hwnd
,hwndEdit
);
123 TRACE_EDIT_MSG32("WM_CREATE Passed to default");
124 DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
128 TRACE_EDIT_MSG32("WM_NCCREATE");
130 /* remove SCROLLBARS from the current window style */
131 hwndParent
= ((LPCREATESTRUCTA
) lParam
)->hwndParent
;
133 newstyle
= style
= ((LPCREATESTRUCTA
) lParam
)->style
;
134 newstyle
&= ~WS_HSCROLL
;
135 newstyle
&= ~WS_VSCROLL
;
136 newstyle
&= ~ES_AUTOHSCROLL
;
137 newstyle
&= ~ES_AUTOVSCROLL
;
138 SetWindowLongA(hwnd
,GWL_STYLE
, newstyle
);
140 TRACE("previous hwndEdit: %p\n",hwndEdit
);
141 hwndEdit
= CreateWindowA ("edit", ((LPCREATESTRUCTA
) lParam
)->lpszName
,
143 hwnd
, (HMENU
) ID_EDIT
,
144 ((LPCREATESTRUCTA
) lParam
)->hInstance
, NULL
) ;
145 TRACE("hwndEdit: %p hwnd: %p\n",hwndEdit
,hwnd
);
153 TRACE_EDIT_MSG32("WM_SETFOCUS");
154 SetFocus (hwndEdit
) ;
158 TRACE_EDIT_MSG32("WM_SIZE");
159 MoveWindow (hwndEdit
, 0, 0, LOWORD (lParam
), HIWORD (lParam
), TRUE
) ;
163 TRACE_EDIT_MSG32("WM_COMMAND");
164 switch(HIWORD(wParam
)) {
171 return SendMessageA(hwndParent
, WM_COMMAND
,
172 wParam
, (LPARAM
)(hwnd
));
176 MessageBoxA (hwnd
, "RichEdit control out of space.",
177 "ERROR", MB_OK
| MB_ICONSTOP
) ;
182 TRACE_EDIT_MSG32("EM_STREAMIN");
184 /* setup the RTF parser */
185 RTFSetEditStream(( EDITSTREAM
*)lParam
);
186 rtfFormat
= wParam
&(SF_TEXT
|SF_RTF
);
194 rtfBufferSize
= RTFToBuffer(NULL
, 0);
195 rtfBuffer
= HeapAlloc(RICHED32_hHeap
, 0,rtfBufferSize
*sizeof(char));
198 RTFToBuffer(rtfBuffer
, rtfBufferSize
);
199 SetWindowTextA(hwndEdit
,rtfBuffer
);
200 HeapFree(RICHED32_hHeap
, 0,rtfBuffer
);
203 WARN("Not enough memory for a allocating rtfBuffer\n");
207 /* Messages specific to Richedit controls */
209 case EM_AUTOURLDETECT
:
210 TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored");
214 TRACE_EDIT_MSG32("EM_CANPASTE Ignored");
218 TRACE_EDIT_MSG32("EM_CANREDO Ignored");
222 TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored");
226 TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL");
227 cr
= (VOID
*) lParam
;
228 if (hwndEdit
) SendMessageA( hwndEdit
, EM_GETSEL
, (INT
)&cr
->cpMin
, (INT
)&cr
->cpMax
);
229 TRACE("cpMin: 0x%x cpMax: 0x%x\n",(INT
)cr
->cpMin
,(INT
)cr
->cpMax
);
234 DWORD limit
= lParam
;
235 TRACE_EDIT_MSG32("EM_EXLIMITTEXT");
240 return SendMessageA(hwndEdit
,EM_SETLIMITTEXT
,limit
,0);
243 case EM_EXLINEFROMCHAR
:
244 TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR");
245 if (hwndEdit
) return SendMessageA( hwndEdit
, EM_LINEFROMCHAR
, lParam
, wParam
);
249 TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL");
250 cr
= (VOID
*) lParam
;
251 if (hwndEdit
) SendMessageA( hwndEdit
, EM_SETSEL
, cr
->cpMin
, cr
->cpMax
);
255 TRACE_EDIT_MSG32("EM_FINDTEXT Ignored");
259 TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored");
263 TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored");
267 TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored");
270 case EM_FINDWORDBREAK
:
271 TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored");
275 TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored");
278 case EM_GETAUTOURLDETECT
:
279 TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored");
282 case EM_GETBIDIOPTIONS
:
283 TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored");
286 case EM_GETCHARFORMAT
:
287 TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored");
290 case EM_GETEDITSTYLE
:
291 TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored");
294 case EM_GETEVENTMASK
:
295 TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored");
299 TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored");
302 case EM_GETIMECOMPMODE
:
303 TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored");
306 case EM_GETIMEOPTIONS
:
307 TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored");
310 case EM_GETLANGOPTIONS
:
311 TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS");
314 case EM_GETOLEINTERFACE
:
315 TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored");
319 TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored");
322 case EM_GETPARAFORMAT
:
323 TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored");
326 case EM_GETPUNCTUATION
:
327 TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored");
331 TRACE_EDIT_MSG32("EM_GETREDONAME Ignored");
334 case EM_GETSCROLLPOS
:
335 TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored");
339 TRACE_EDIT_MSG32("EM_GETSELTEXT");
340 return RICHEDIT_GetSelText(hwndEdit
,(void *)lParam
);
343 TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored");
346 case EM_GETTEXTLENGTHEX
:
347 TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored");
351 TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored");
354 case EM_GETTEXTRANGE
:
355 TRACE_EDIT_MSG32("EM_GETTEXTRANGE");
356 return RICHEDIT_GetTextRange(hwndEdit
,(TEXTRANGEA
*)lParam
);
358 case EM_GETTYPOGRAPHYOPTIONS
:
359 TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored");
363 TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored");
366 case EM_GETWORDBREAKPROCEX
:
367 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored");
370 case EM_GETWORDWRAPMODE
:
371 TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored");
375 TRACE_EDIT_MSG32("EM_GETZOOM Ignored");
378 case EM_HIDESELECTION
:
379 TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored");
382 case EM_PASTESPECIAL
:
383 TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored");
386 case EM_RECONVERSION
:
387 TRACE_EDIT_MSG32("EM_RECONVERSION Ignored");
391 TRACE_EDIT_MSG32("EM_REDO Ignored");
394 case EM_REQUESTRESIZE
:
395 TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored");
398 case EM_SELECTIONTYPE
:
399 TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored");
402 case EM_SETBIDIOPTIONS
:
403 TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored");
406 case EM_SETBKGNDCOLOR
:
407 TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored");
410 case EM_SETCHARFORMAT
:
411 TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored");
414 case EM_SETEDITSTYLE
:
415 TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored");
418 case EM_SETEVENTMASK
:
419 TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored");
423 TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored");
427 TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored");
430 case EM_SETIMEOPTIONS
:
431 TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored");
434 case EM_SETLANGOPTIONS
:
435 TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored");
438 case EM_SETOLECALLBACK
:
439 TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored");
443 TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored");
447 TRACE_EDIT_MSG32("EM_SETPALETTE Ignored");
450 case EM_SETPARAFORMAT
:
451 TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored");
454 case EM_SETPUNCTUATION
:
455 TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored");
458 case EM_SETSCROLLPOS
:
459 TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored");
462 case EM_SETTARGETDEVICE
:
463 TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored");
467 TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored");
471 TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored");
474 case EM_SETTYPOGRAPHYOPTIONS
:
475 TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored");
478 case EM_SETUNDOLIMIT
:
479 TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored");
482 case EM_SETWORDBREAKPROCEX
:
483 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored");
486 case EM_SETWORDWRAPMODE
:
487 TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored");
491 TRACE_EDIT_MSG32("EM_SETZOOM Ignored");
494 case EM_SHOWSCROLLBAR
:
495 TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored");
498 case EM_STOPGROUPTYPING
:
499 TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored");
503 TRACE_EDIT_MSG32("EM_STREAMOUT Ignored");
506 /* Messages dispatched to the edit control */
508 TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control");
509 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
511 TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control");
512 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
513 case EM_EMPTYUNDOBUFFER
:
514 TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control");
515 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
517 TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control");
518 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
519 case EM_GETFIRSTVISIBLELINE
:
520 TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control");
521 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
523 TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control");
524 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
525 /* case EM_GETIMESTATUS:*/
526 case EM_GETLIMITTEXT
:
527 TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control");
528 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
530 TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control");
531 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
532 case EM_GETLINECOUNT
:
533 TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control");
534 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
536 TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control");
537 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
539 TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control");
540 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
541 case EM_GETPASSWORDCHAR
:
542 TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control");
543 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
545 TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control");
546 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
548 TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control");
549 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
551 TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control");
552 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
553 case EM_GETWORDBREAKPROC
:
554 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control");
555 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
556 case EM_LINEFROMCHAR
:
557 TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control");
558 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
560 TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control");
561 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
563 TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control");
564 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
566 TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control");
567 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
569 TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control");
570 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
572 TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control");
573 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
575 TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control");
576 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
578 TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control");
579 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
581 TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control");
582 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
583 /* case EM_SETIMESTATUS:*/
584 case EM_SETLIMITTEXT
:
585 TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control");
586 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
588 TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control");
589 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
591 TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control");
592 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
593 case EM_SETPASSWORDCHAR
:
594 TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control");
595 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
597 TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control");
598 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
600 TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control");
601 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
603 TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control");
604 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
606 TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control");
607 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
609 TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control");
610 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
611 case EM_SETWORDBREAKPROC
:
612 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control");
613 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
615 TRACE_EDIT_MSG32("EM_UNDO Passed to edit control");
616 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
618 case WM_STYLECHANGING
:
619 TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control");
620 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
621 case WM_STYLECHANGED
:
622 TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control");
623 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
625 TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control");
626 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
627 case WM_GETTEXTLENGTH
:
628 TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control");
629 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
631 TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control");
632 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
634 TRACE_EDIT_MSG32("WM_CUT Passed to edit control");
635 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
637 TRACE_EDIT_MSG32("WM_COPY Passed to edit control");
638 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
640 TRACE_EDIT_MSG32("WM_PASTE Passed to edit control");
641 return SendMessageA( hwndEdit
, uMsg
, wParam
, lParam
);
643 /* Messages passed to default handler. */
645 /* A fundamental problem with embedding an edit control within another
646 window to emulate the richedit control, is that normally, the
647 WM_NCCALCSIZE message window would return the client area of the
650 While we could send a message to the edit control here to get that size
651 and return that value, this causes problems with the WM_SIZE message.
652 That is because the WM_SIZE message uses the returned value of
653 WM_NCCALCSIZE (via X11DRV_SetWindowSize) to determine the size to make
654 the edit control. If we return the size of the edit control client area
655 here, the result is the symptom of the edit control being inset on the
656 right and bottom by the width of any existing scrollbars.
658 The easy fix is to have WM_NCCALCSIZE return the true size of this
659 enclosing window, which is what we have done here. The more difficult
660 fix is to create a custom Richedit MoveWindow procedure for use in the
661 WM_SIZE message above. Since it is very unlikely that an app would call
662 and use the WM_NCCALCSIZE message, we stick with the easy fix for now.
664 TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default");
665 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
667 TRACE_EDIT_MSG32("WM_NCPAINT Passed to default");
668 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
670 TRACE_EDIT_MSG32("WM_PAINT Passed to default");
671 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
673 TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default");
674 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
676 TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default");
677 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
679 TRACE_EDIT_MSG32("WM_DESTROY Passed to default");
680 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
681 case WM_CHILDACTIVATE
:
682 TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default");
683 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
685 case WM_WINDOWPOSCHANGING
:
686 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default");
687 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
688 case WM_WINDOWPOSCHANGED
:
689 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default");
690 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
691 /* case WM_INITIALUPDATE:
692 TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default");
693 return DefWindowProcA( hwnd,uMsg,wParam,lParam); */
694 case WM_CTLCOLOREDIT
:
695 TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default");
696 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
698 TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default");
699 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
701 TRACE_EDIT_MSG32("WM_MOVE Passed to default");
702 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
704 TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default");
705 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
706 case WM_PARENTNOTIFY
:
707 TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default");
708 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
710 TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default");
711 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
713 TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default");
714 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
716 TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default");
717 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
718 case WM_CTLCOLORSTATIC
:
719 TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default");
720 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
722 TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default");
723 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
725 TRACE_EDIT_MSG32("WM_CLEAR Passed to default");
726 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
728 * used by IE in the EULA box
730 case WM_ALTTABACTIVE
:
731 TRACE_EDIT_MSG32("WM_ALTTABACTIVE");
732 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
734 TRACE_EDIT_MSG32("WM_GETDLGCODE");
735 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
737 TRACE_EDIT_MSG32("WM_SETFONT");
738 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
742 if ((uMsg
>= WM_USER
) && (uMsg
< WM_APP
)) {
743 FIXME("Unknown message 0x%x Passed to default hwnd=%p, wParam=%08x, lParam=%08x\n",
744 uMsg
, hwnd
, (UINT
)wParam
, (UINT
)lParam
);
747 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
750 /***********************************************************************
751 * DllGetVersion [RICHED32.2]
753 * Retrieves version information of the 'RICHED32.DLL'
756 * pdvi [O] pointer to version information structure.
760 * Failure: E_INVALIDARG
763 * Returns version of a comctl32.dll from IE4.01 SP1.
767 RICHED32_DllGetVersion (DLLVERSIONINFO
*pdvi
)
771 if (pdvi
->cbSize
!= sizeof(DLLVERSIONINFO
)) {
776 pdvi
->dwMajorVersion
= 4;
777 pdvi
->dwMinorVersion
= 0;
778 pdvi
->dwBuildNumber
= 0;
779 pdvi
->dwPlatformID
= 0;
786 * Registers the window class.
794 VOID
RICHED32_Register(void)
800 ZeroMemory(&wndClass
, sizeof(WNDCLASSA
));
801 wndClass
.style
= CS_HREDRAW
| CS_VREDRAW
| CS_GLOBALCLASS
;
802 wndClass
.lpfnWndProc
= (WNDPROC
)RICHED32_WindowProc
;
803 wndClass
.cbClsExtra
= 0;
804 wndClass
.cbWndExtra
= 0; /*(sizeof(RICHED32_INFO *);*/
805 wndClass
.hCursor
= LoadCursorA(0, IDC_ARROWA
);
806 wndClass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
807 wndClass
.lpszClassName
= RICHEDIT_CLASS10A
; /* WC_RICHED32A; */
809 RegisterClassA (&wndClass
);
814 * Unregisters the window class.
822 VOID
RICHED32_Unregister(void)
826 UnregisterClassA(RICHEDIT_CLASS10A
, NULL
);
829 INT
RICHEDIT_GetTextRange(HWND hwnd
,TEXTRANGEA
*tr
)
831 UINT alloc_size
, text_size
, range_size
;
834 TRACE("start: 0x%x stop: 0x%x\n",(INT
)tr
->chrg
.cpMin
,(INT
)tr
->chrg
.cpMax
);
836 if (!(alloc_size
= SendMessageA(hwnd
,WM_GETTEXTLENGTH
,0,0))) return FALSE
;
837 if (!(text
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (alloc_size
+1))))
839 text_size
= SendMessageA(hwnd
,WM_GETTEXT
,alloc_size
,(INT
)text
);
841 if (text_size
> tr
->chrg
.cpMin
)
843 range_size
= (text_size
> tr
->chrg
.cpMax
) ? (tr
->chrg
.cpMax
- tr
->chrg
.cpMin
) : (text_size
- tr
->chrg
.cpMin
);
844 TRACE("EditText: %.30s ...\n",text
+tr
->chrg
.cpMin
);
845 memcpy(tr
->lpstrText
,text
+tr
->chrg
.cpMin
,range_size
);
848 HeapFree(GetProcessHeap(), 0, text
);
853 INT
RICHEDIT_GetSelText(HWND hwnd
,LPSTR lpstrBuffer
)
855 TEXTRANGEA textrange
;
857 textrange
.lpstrText
= lpstrBuffer
;
858 SendMessageA(hwnd
,EM_GETSEL
,(INT
)&textrange
.chrg
.cpMin
,(INT
)&textrange
.chrg
.cpMax
);
859 return RICHEDIT_GetTextRange(hwnd
,&textrange
);