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
42 #include "wine/debug.h"
44 WINE_DEFAULT_DEBUG_CHANNEL(richedit);
51 HANDLE RICHED32_hHeap = NULL;
52 /* LPSTR RICHED32_aSubclass = NULL; */
56 #define TRACE_EDIT_MSG32(str) \
58 "32 bit : " str ": hwnd=%p, wParam=%08x, lParam=%08x\n"\
60 hwnd, (UINT)wParam, (UINT)lParam)
63 /***********************************************************************
64 * DllMain [Internal] Initializes the internal 'RICHED32.DLL'.
67 * hinstDLL [I] handle to the DLL's instance
69 * lpvReserved [I] reserved, must be NULL
76 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
81 case DLL_PROCESS_ATTACH:
82 DisableThreadLibraryCalls(hinstDLL);
83 /* create private heap */
84 RICHED32_hHeap = HeapCreate (0, 0x10000, 0);
85 /* register the Rich Edit class */
89 case DLL_PROCESS_DETACH:
90 /* unregister all common control classes */
91 RICHED32_Unregister ();
92 HeapDestroy (RICHED32_hHeap);
93 RICHED32_hHeap = NULL;
99 /* Support routines for window procedure */
100 INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr);
101 INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer);
107 * Window procedure of the RichEdit control.
110 static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
113 int RTFToBuffer(char* pBuffer, int nBufferSize);
117 static HWND hwndEdit;
118 static HWND hwndParent;
119 static char* rtfBuffer;
123 TRACE("previous hwndEdit: %p hwndParent %p\n",hwndEdit,hwndParent);
124 hwndEdit = GetWindow(hwnd,GW_CHILD);
125 TRACE("uMsg: 0x%x hwnd: %p hwndEdit: %p\n",uMsg,hwnd,hwndEdit);
131 TRACE_EDIT_MSG32("WM_CREATE Passed to default");
132 DefWindowProcA( hwnd,uMsg,wParam,lParam);
136 TRACE_EDIT_MSG32("WM_NCCREATE");
138 /* remove SCROLLBARS from the current window style */
139 hwndParent = ((LPCREATESTRUCTA) lParam)->hwndParent;
141 newstyle = style = ((LPCREATESTRUCTA) lParam)->style;
142 newstyle &= ~WS_HSCROLL;
143 newstyle &= ~WS_VSCROLL;
144 newstyle &= ~ES_AUTOHSCROLL;
145 newstyle &= ~ES_AUTOVSCROLL;
146 SetWindowLongA(hwnd,GWL_STYLE, newstyle);
148 TRACE("previous hwndEdit: %p\n",hwndEdit);
149 hwndEdit = CreateWindowA ("edit", ((LPCREATESTRUCTA) lParam)->lpszName,
151 hwnd, (HMENU) ID_EDIT,
152 ((LPCREATESTRUCTA) lParam)->hInstance, NULL) ;
153 TRACE("hwndEdit: %p hwnd: %p\n",hwndEdit,hwnd);
161 TRACE_EDIT_MSG32("WM_SETFOCUS");
162 SetFocus (hwndEdit) ;
166 TRACE_EDIT_MSG32("WM_SIZE");
167 MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE) ;
171 TRACE_EDIT_MSG32("WM_COMMAND");
172 switch(HIWORD(wParam)) {
179 return SendMessageA(hwndParent, WM_COMMAND,
180 wParam, (LPARAM)(hwnd));
184 MessageBoxA (hwnd, "RichEdit control out of space.",
185 "ERROR", MB_OK | MB_ICONSTOP) ;
190 TRACE_EDIT_MSG32("EM_STREAMIN");
192 /* setup the RTF parser */
193 RTFSetEditStream(( EDITSTREAM*)lParam);
194 rtfFormat = wParam&(SF_TEXT|SF_RTF);
202 rtfBufferSize = RTFToBuffer(NULL, 0);
203 rtfBuffer = HeapAlloc(RICHED32_hHeap, 0,rtfBufferSize*sizeof(char));
206 RTFToBuffer(rtfBuffer, rtfBufferSize);
207 SetWindowTextA(hwndEdit,rtfBuffer);
208 HeapFree(RICHED32_hHeap, 0,rtfBuffer);
211 WARN("Not enough memory for a allocating rtfBuffer\n");
215 /* Messages specific to Richedit controls */
217 case EM_AUTOURLDETECT:
218 TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored");
222 TRACE_EDIT_MSG32("EM_CANPASTE Ignored");
226 TRACE_EDIT_MSG32("EM_CANREDO Ignored");
230 TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored");
234 TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL");
235 cr = (VOID *) lParam;
236 if (hwndEdit) SendMessageA( hwndEdit, EM_GETSEL, (INT)&cr->cpMin, (INT)&cr->cpMax);
237 TRACE("cpMin: 0x%x cpMax: 0x%x\n",(INT)cr->cpMin,(INT)cr->cpMax);
242 DWORD limit = lParam;
243 TRACE_EDIT_MSG32("EM_EXLIMITTEXT");
248 return SendMessageA(hwndEdit,EM_SETLIMITTEXT,limit,0);
251 case EM_EXLINEFROMCHAR:
252 TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR");
253 if (hwndEdit) return SendMessageA( hwndEdit, EM_LINEFROMCHAR, lParam, wParam);
257 TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL");
258 cr = (VOID *) lParam;
259 if (hwndEdit) SendMessageA( hwndEdit, EM_SETSEL, cr->cpMin, cr->cpMax);
263 TRACE_EDIT_MSG32("EM_FINDTEXT Ignored");
267 TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored");
271 TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored");
275 TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored");
278 case EM_FINDWORDBREAK:
279 TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored");
283 TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored");
286 case EM_GETAUTOURLDETECT:
287 TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored");
290 case EM_GETBIDIOPTIONS:
291 TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored");
294 case EM_GETCHARFORMAT:
295 TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored");
298 case EM_GETEDITSTYLE:
299 TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored");
302 case EM_GETEVENTMASK:
303 TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored");
307 TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored");
310 case EM_GETIMECOMPMODE:
311 TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored");
314 case EM_GETIMEOPTIONS:
315 TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored");
318 case EM_GETLANGOPTIONS:
319 TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS");
322 case EM_GETOLEINTERFACE:
323 TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored");
327 TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored");
330 case EM_GETPARAFORMAT:
331 TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored");
334 case EM_GETPUNCTUATION:
335 TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored");
339 TRACE_EDIT_MSG32("EM_GETREDONAME Ignored");
342 case EM_GETSCROLLPOS:
343 TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored");
347 TRACE_EDIT_MSG32("EM_GETSELTEXT");
348 return RICHEDIT_GetSelText(hwndEdit,(void *)lParam);
351 TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored");
354 case EM_GETTEXTLENGTHEX:
355 TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored");
359 TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored");
362 case EM_GETTEXTRANGE:
363 TRACE_EDIT_MSG32("EM_GETTEXTRANGE");
364 return RICHEDIT_GetTextRange(hwndEdit,(TEXTRANGEA *)lParam);
366 case EM_GETTYPOGRAPHYOPTIONS:
367 TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored");
371 TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored");
374 case EM_GETWORDBREAKPROCEX:
375 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored");
378 case EM_GETWORDWRAPMODE:
379 TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored");
383 TRACE_EDIT_MSG32("EM_GETZOOM Ignored");
386 case EM_HIDESELECTION:
387 TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored");
390 case EM_PASTESPECIAL:
391 TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored");
394 case EM_RECONVERSION:
395 TRACE_EDIT_MSG32("EM_RECONVERSION Ignored");
399 TRACE_EDIT_MSG32("EM_REDO Ignored");
402 case EM_REQUESTRESIZE:
403 TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored");
406 case EM_SELECTIONTYPE:
407 TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored");
410 case EM_SETBIDIOPTIONS:
411 TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored");
414 case EM_SETBKGNDCOLOR:
415 TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored");
418 case EM_SETCHARFORMAT:
419 TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored");
422 case EM_SETEDITSTYLE:
423 TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored");
426 case EM_SETEVENTMASK:
427 TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored");
431 TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored");
435 TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored");
438 case EM_SETIMEOPTIONS:
439 TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored");
442 case EM_SETLANGOPTIONS:
443 TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored");
446 case EM_SETOLECALLBACK:
447 TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored");
451 TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored");
455 TRACE_EDIT_MSG32("EM_SETPALETTE Ignored");
458 case EM_SETPARAFORMAT:
459 TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored");
462 case EM_SETPUNCTUATION:
463 TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored");
466 case EM_SETSCROLLPOS:
467 TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored");
470 case EM_SETTARGETDEVICE:
471 TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored");
475 TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored");
479 TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored");
482 case EM_SETTYPOGRAPHYOPTIONS:
483 TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored");
486 case EM_SETUNDOLIMIT:
487 TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored");
490 case EM_SETWORDBREAKPROCEX:
491 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored");
494 case EM_SETWORDWRAPMODE:
495 TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored");
499 TRACE_EDIT_MSG32("EM_SETZOOM Ignored");
502 case EM_SHOWSCROLLBAR:
503 TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored");
506 case EM_STOPGROUPTYPING:
507 TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored");
511 TRACE_EDIT_MSG32("EM_STREAMOUT Ignored");
514 /* Messages dispatched to the edit control */
516 TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control");
517 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
519 TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control");
520 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
521 case EM_EMPTYUNDOBUFFER:
522 TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control");
523 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
525 TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control");
526 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
527 case EM_GETFIRSTVISIBLELINE:
528 TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control");
529 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
531 TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control");
532 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
533 /* case EM_GETIMESTATUS:*/
534 case EM_GETLIMITTEXT:
535 TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control");
536 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
538 TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control");
539 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
540 case EM_GETLINECOUNT:
541 TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control");
542 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
544 TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control");
545 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
547 TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control");
548 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
549 case EM_GETPASSWORDCHAR:
550 TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control");
551 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
553 TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control");
554 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
556 TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control");
557 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
559 TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control");
560 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
561 case EM_GETWORDBREAKPROC:
562 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control");
563 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
564 case EM_LINEFROMCHAR:
565 TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control");
566 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
568 TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control");
569 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
571 TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control");
572 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
574 TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control");
575 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
577 TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control");
578 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
580 TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control");
581 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
583 TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control");
584 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
586 TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control");
587 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
589 TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control");
590 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
591 /* case EM_SETIMESTATUS:*/
592 case EM_SETLIMITTEXT:
593 TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control");
594 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
596 TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control");
597 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
599 TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control");
600 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
601 case EM_SETPASSWORDCHAR:
602 TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control");
603 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
605 TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control");
606 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
608 TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control");
609 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
611 TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control");
612 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
614 TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control");
615 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
617 TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control");
618 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
619 case EM_SETWORDBREAKPROC:
620 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control");
621 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
623 TRACE_EDIT_MSG32("EM_UNDO Passed to edit control");
624 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
626 case WM_STYLECHANGING:
627 TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control");
628 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
629 case WM_STYLECHANGED:
630 TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control");
631 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
633 TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control");
634 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
635 case WM_GETTEXTLENGTH:
636 TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control");
637 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
639 TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control");
640 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
642 TRACE_EDIT_MSG32("WM_CUT Passed to edit control");
643 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
645 TRACE_EDIT_MSG32("WM_COPY Passed to edit control");
646 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
648 TRACE_EDIT_MSG32("WM_PASTE Passed to edit control");
649 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
651 /* Messages passed to default handler. */
653 /* A fundamental problem with embedding an edit control within another
654 window to emulate the richedit control, is that normally, the
655 WM_NCCALCSIZE message window would return the client area of the
658 While we could send a message to the edit control here to get that size
659 and return that value, this causes problems with the WM_SIZE message.
660 That is because the WM_SIZE message uses the returned value of
661 WM_NCCALCSIZE (via X11DRV_SetWindowSize) to determine the size to make
662 the edit control. If we return the size of the edit control client area
663 here, the result is the symptom of the edit control being inset on the
664 right and bottom by the width of any existing scrollbars.
666 The easy fix is to have WM_NCCALCSIZE return the true size of this
667 enclosing window, which is what we have done here. The more difficult
668 fix is to create a custom Richedit MoveWindow procedure for use in the
669 WM_SIZE message above. Since it is very unlikely that an app would call
670 and use the WM_NCCALCSIZE message, we stick with the easy fix for now.
672 TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default");
673 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
675 TRACE_EDIT_MSG32("WM_NCPAINT Passed to default");
676 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
678 TRACE_EDIT_MSG32("WM_PAINT Passed to default");
679 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
681 TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default");
682 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
684 TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default");
685 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
687 TRACE_EDIT_MSG32("WM_DESTROY Passed to default");
688 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
689 case WM_CHILDACTIVATE:
690 TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default");
691 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
693 case WM_WINDOWPOSCHANGING:
694 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default");
695 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
696 case WM_WINDOWPOSCHANGED:
697 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default");
698 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
699 /* case WM_INITIALUPDATE:
700 TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default");
701 return DefWindowProcA( hwnd,uMsg,wParam,lParam); */
702 case WM_CTLCOLOREDIT:
703 TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default");
704 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
706 TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default");
707 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
709 TRACE_EDIT_MSG32("WM_MOVE Passed to default");
710 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
712 TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default");
713 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
714 case WM_PARENTNOTIFY:
715 TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default");
716 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
718 TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default");
719 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
721 TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default");
722 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
724 TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default");
725 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
726 case WM_CTLCOLORSTATIC:
727 TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default");
728 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
730 TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default");
731 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
733 TRACE_EDIT_MSG32("WM_CLEAR Passed to default");
734 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
736 * used by IE in the EULA box
738 case WM_ALTTABACTIVE:
739 TRACE_EDIT_MSG32("WM_ALTTABACTIVE");
740 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
742 TRACE_EDIT_MSG32("WM_GETDLGCODE");
743 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
745 TRACE_EDIT_MSG32("WM_SETFONT");
746 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
750 if ((uMsg >= WM_USER) && (uMsg < WM_APP)) {
751 FIXME("Unknown message 0x%x Passed to default hwnd=%p, wParam=%08x, lParam=%08x\n",
752 uMsg, hwnd, (UINT)wParam, (UINT)lParam);
755 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
758 /***********************************************************************
759 * DllGetVersion [RICHED32.2]
761 * Retrieves version information of the 'RICHED32.DLL'
764 * pdvi [O] pointer to version information structure.
768 * Failure: E_INVALIDARG
771 * Returns version of a comctl32.dll from IE4.01 SP1.
775 RICHED32_DllGetVersion (DLLVERSIONINFO *pdvi)
779 if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) {
784 pdvi->dwMajorVersion = 4;
785 pdvi->dwMinorVersion = 0;
786 pdvi->dwBuildNumber = 0;
787 pdvi->dwPlatformID = 0;
794 * Registers the window class.
802 VOID RICHED32_Register(void)
808 ZeroMemory(&wndClass, sizeof(WNDCLASSA));
809 wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
810 wndClass.lpfnWndProc = (WNDPROC)RICHED32_WindowProc;
811 wndClass.cbClsExtra = 0;
812 wndClass.cbWndExtra = 0; /*(sizeof(RICHED32_INFO *);*/
813 wndClass.hCursor = LoadCursorA(0, IDC_ARROWA);
814 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
815 wndClass.lpszClassName = RICHEDIT_CLASS10A; /* WC_RICHED32A; */
817 RegisterClassA (&wndClass);
822 * Unregisters the window class.
830 VOID RICHED32_Unregister(void)
834 UnregisterClassA(RICHEDIT_CLASS10A, NULL);
837 INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr)
839 UINT alloc_size, text_size, range_size;
842 TRACE("start: 0x%x stop: 0x%x\n",(INT)tr->chrg.cpMin,(INT)tr->chrg.cpMax);
844 if (!(alloc_size = SendMessageA(hwnd,WM_GETTEXTLENGTH,0,0))) return FALSE;
845 if (!(text = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (alloc_size+1))))
847 text_size = SendMessageA(hwnd,WM_GETTEXT,alloc_size,(INT)text);
849 if (text_size > tr->chrg.cpMin)
851 range_size = (text_size> tr->chrg.cpMax) ? (tr->chrg.cpMax - tr->chrg.cpMin) : (text_size - tr->chrg.cpMin);
852 TRACE("EditText: %.30s ...\n",text+tr->chrg.cpMin);
853 memcpy(tr->lpstrText,text+tr->chrg.cpMin,range_size);
856 HeapFree(GetProcessHeap(), 0, text);
861 INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer)
863 TEXTRANGEA textrange;
865 textrange.lpstrText = lpstrBuffer;
866 SendMessageA(hwnd,EM_GETSEL,(INT)&textrange.chrg.cpMin,(INT)&textrange.chrg.cpMax);
867 return RICHEDIT_GetTextRange(hwnd,&textrange);