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)
55 LPVOID
* WINAPI
CreateIRichEditOle();
57 /***********************************************************************
58 * DllMain [Internal] Initializes the internal 'RICHED32.DLL'.
61 * hinstDLL [I] handle to the DLL's instance
63 * lpvReserved [I] reserved, must be NULL
70 BOOL WINAPI
DllMain(HINSTANCE hinstDLL
, DWORD fdwReason
, LPVOID lpvReserved
)
75 case DLL_PROCESS_ATTACH
:
76 DisableThreadLibraryCalls(hinstDLL
);
77 /* create private heap */
78 RICHED32_hHeap
= HeapCreate (0, 0x10000, 0);
79 /* register the Rich Edit class */
83 case DLL_PROCESS_DETACH
:
84 /* unregister all common control classes */
85 RICHED32_Unregister ();
86 HeapDestroy (RICHED32_hHeap
);
87 RICHED32_hHeap
= NULL
;
93 /* Support routines for window procedure */
94 INT
RICHEDIT_GetTextRange(HWND hwnd
,TEXTRANGEA
*tr
);
95 INT
RICHEDIT_GetSelText(HWND hwnd
,LPSTR lpstrBuffer
);
98 const WCHAR RichEditInfoStr
[] = { '_','R','T','F','_','I','n','f','o', 0 };
100 typedef struct _RTFControl_info
111 * Window procedure of the RichEdit control.
114 static LRESULT WINAPI
RICHED32_WindowProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
,
117 int RTFToBuffer(RTF_Info
*parser
, char* pBuffer
, int nBufferSize
);
120 RTFControl_Info
*info
;
124 info
= GetPropW( hwnd
, RichEditInfoStr
);
125 TRACE("uMsg: 0x%x hwnd: %p\n",uMsg
,hwnd
);
131 TRACE_EDIT_MSG32("WM_CREATE Passed to default");
132 DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
136 TRACE_EDIT_MSG32("WM_NCCREATE");
138 info
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
,
139 sizeof (RTFControl_Info
));
140 info
->parser
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
,
142 SetPropW(hwnd
, RichEditInfoStr
, (HANDLE
)info
);
144 /* remove SCROLLBARS from the current window style */
145 info
->hwndParent
= ((LPCREATESTRUCTA
) lParam
)->hwndParent
;
147 newstyle
= style
= ((LPCREATESTRUCTA
) lParam
)->style
;
148 newstyle
&= ~WS_HSCROLL
;
149 newstyle
&= ~WS_VSCROLL
;
150 newstyle
&= ~ES_AUTOHSCROLL
;
151 newstyle
&= ~ES_AUTOVSCROLL
;
152 SetWindowLongA(hwnd
,GWL_STYLE
, newstyle
);
154 TRACE("previous hwndEdit: %p\n",info
->hwndEdit
);
155 info
->hwndEdit
= CreateWindowA ("edit", ((LPCREATESTRUCTA
) lParam
)->lpszName
,
157 hwnd
, (HMENU
) ID_EDIT
,
158 ((LPCREATESTRUCTA
) lParam
)->hInstance
, NULL
) ;
159 TRACE("hwndEdit: %p hwnd: %p\n",info
->hwndEdit
,hwnd
);
167 TRACE_EDIT_MSG32("WM_SETFOCUS");
168 SetFocus (info
->hwndEdit
) ;
172 TRACE_EDIT_MSG32("WM_SIZE");
173 MoveWindow (info
->hwndEdit
, 0, 0, LOWORD (lParam
), HIWORD (lParam
), TRUE
) ;
177 TRACE_EDIT_MSG32("WM_COMMAND");
178 switch(HIWORD(wParam
)) {
185 return SendMessageA(info
->hwndParent
, WM_COMMAND
,
186 wParam
, (LPARAM
)(hwnd
));
190 MessageBoxA (hwnd
, "RichEdit control out of space.",
191 "ERROR", MB_OK
| MB_ICONSTOP
) ;
196 TRACE_EDIT_MSG32("EM_STREAMIN");
198 /* setup the RTF parser */
199 RTFSetEditStream(info
->parser
,( EDITSTREAM
*)lParam
);
200 info
->parser
->rtfFormat
= wParam
&(SF_TEXT
|SF_RTF
);
201 WriterInit(info
->parser
);
202 RTFInit (info
->parser
);
203 BeginFile(info
->parser
);
206 RTFRead (info
->parser
);
208 rtfBufferSize
= RTFToBuffer(info
->parser
,NULL
, 0);
209 info
->rtfBuffer
= HeapAlloc(RICHED32_hHeap
, 0,rtfBufferSize
*sizeof(char));
212 RTFToBuffer(info
->parser
,info
->rtfBuffer
, rtfBufferSize
);
213 SetWindowTextA(info
->hwndEdit
,info
->rtfBuffer
);
214 HeapFree(RICHED32_hHeap
, 0,info
->rtfBuffer
);
217 WARN("Not enough memory for a allocating rtfBuffer\n");
221 /* Messages specific to Richedit controls */
223 case EM_AUTOURLDETECT
:
224 TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored");
228 TRACE_EDIT_MSG32("EM_CANPASTE Ignored");
232 TRACE_EDIT_MSG32("EM_CANREDO Ignored");
236 TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored");
240 TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL");
241 cr
= (VOID
*) lParam
;
242 if (info
->hwndEdit
) SendMessageA( info
->hwndEdit
, EM_GETSEL
, (INT
)&cr
->cpMin
, (INT
)&cr
->cpMax
);
243 TRACE("cpMin: 0x%x cpMax: 0x%x\n",(INT
)cr
->cpMin
,(INT
)cr
->cpMax
);
248 DWORD limit
= lParam
;
249 TRACE_EDIT_MSG32("EM_EXLIMITTEXT");
254 return SendMessageA(info
->hwndEdit
,EM_SETLIMITTEXT
,limit
,0);
257 case EM_EXLINEFROMCHAR
:
258 TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR");
259 if (info
->hwndEdit
) return SendMessageA( info
->hwndEdit
, EM_LINEFROMCHAR
, lParam
, wParam
);
263 TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL");
264 cr
= (VOID
*) lParam
;
265 if (info
->hwndEdit
) SendMessageA( info
->hwndEdit
, EM_SETSEL
, cr
->cpMin
, cr
->cpMax
);
269 TRACE_EDIT_MSG32("EM_FINDTEXT Ignored");
273 TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored");
277 TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored");
281 TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored");
284 case EM_FINDWORDBREAK
:
285 TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored");
289 TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored");
292 case EM_GETAUTOURLDETECT
:
293 TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored");
296 case EM_GETBIDIOPTIONS
:
297 TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored");
300 case EM_GETCHARFORMAT
:
301 TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored");
304 case EM_GETEDITSTYLE
:
305 TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored");
308 case EM_GETEVENTMASK
:
309 TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored");
313 TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored");
316 case EM_GETIMECOMPMODE
:
317 TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored");
320 case EM_GETIMEOPTIONS
:
321 TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored");
324 case EM_GETLANGOPTIONS
:
325 TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS");
328 case EM_GETOLEINTERFACE
:
329 TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored");
333 TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored");
336 case EM_GETPARAFORMAT
:
337 TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored");
340 case EM_GETPUNCTUATION
:
341 TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored");
345 TRACE_EDIT_MSG32("EM_GETREDONAME Ignored");
348 case EM_GETSCROLLPOS
:
349 TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored");
353 TRACE_EDIT_MSG32("EM_GETSELTEXT");
354 return RICHEDIT_GetSelText(info
->hwndEdit
,(void *)lParam
);
357 TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored");
360 case EM_GETTEXTLENGTHEX
:
361 TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored");
365 TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored");
368 case EM_GETTEXTRANGE
:
369 TRACE_EDIT_MSG32("EM_GETTEXTRANGE");
370 return RICHEDIT_GetTextRange(info
->hwndEdit
,(TEXTRANGEA
*)lParam
);
372 case EM_GETTYPOGRAPHYOPTIONS
:
373 TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored");
377 TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored");
380 case EM_GETWORDBREAKPROCEX
:
381 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored");
384 case EM_GETWORDWRAPMODE
:
385 TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored");
389 TRACE_EDIT_MSG32("EM_GETZOOM Ignored");
392 case EM_HIDESELECTION
:
393 TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored");
396 case EM_PASTESPECIAL
:
397 TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored");
400 case EM_RECONVERSION
:
401 TRACE_EDIT_MSG32("EM_RECONVERSION Ignored");
405 TRACE_EDIT_MSG32("EM_REDO Ignored");
408 case EM_REQUESTRESIZE
:
409 TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored");
412 case EM_SELECTIONTYPE
:
413 TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored");
416 case EM_SETBIDIOPTIONS
:
417 TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored");
420 case EM_SETBKGNDCOLOR
:
421 TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored");
424 case EM_SETCHARFORMAT
:
425 TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored");
428 case EM_SETEDITSTYLE
:
429 TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored");
432 case EM_SETEVENTMASK
:
433 TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored");
437 TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored");
441 TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored");
444 case EM_SETIMEOPTIONS
:
445 TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored");
448 case EM_SETLANGOPTIONS
:
449 TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored");
452 case EM_SETOLECALLBACK
:
453 TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored");
457 TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored");
461 TRACE_EDIT_MSG32("EM_SETPALETTE Ignored");
464 case EM_SETPARAFORMAT
:
465 TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored");
468 case EM_SETPUNCTUATION
:
469 TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored");
472 case EM_SETSCROLLPOS
:
473 TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored");
476 case EM_SETTARGETDEVICE
:
477 TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored");
481 TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored");
485 TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored");
488 case EM_SETTYPOGRAPHYOPTIONS
:
489 TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored");
492 case EM_SETUNDOLIMIT
:
493 TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored");
496 case EM_SETWORDBREAKPROCEX
:
497 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored");
500 case EM_SETWORDWRAPMODE
:
501 TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored");
505 TRACE_EDIT_MSG32("EM_SETZOOM Ignored");
508 case EM_SHOWSCROLLBAR
:
509 TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored");
512 case EM_STOPGROUPTYPING
:
513 TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored");
517 TRACE_EDIT_MSG32("EM_STREAMOUT Ignored");
520 /* Messages dispatched to the edit control */
522 TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control");
523 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
525 TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control");
526 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
527 case EM_EMPTYUNDOBUFFER
:
528 TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control");
529 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
531 TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control");
532 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
533 case EM_GETFIRSTVISIBLELINE
:
534 TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control");
535 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
537 TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control");
538 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
539 /* case EM_GETIMESTATUS:*/
540 case EM_GETLIMITTEXT
:
541 TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control");
542 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
544 TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control");
545 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
546 case EM_GETLINECOUNT
:
547 TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control");
548 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
550 TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control");
551 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
553 TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control");
554 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
555 case EM_GETPASSWORDCHAR
:
556 TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control");
557 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
559 TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control");
560 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
562 TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control");
563 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
565 TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control");
566 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
567 case EM_GETWORDBREAKPROC
:
568 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control");
569 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
570 case EM_LINEFROMCHAR
:
571 TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control");
572 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
574 TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control");
575 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
577 TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control");
578 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
580 TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control");
581 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
583 TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control");
584 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
586 TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control");
587 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
589 TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control");
590 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
592 TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control");
593 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
595 TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control");
596 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
597 /* case EM_SETIMESTATUS:*/
598 case EM_SETLIMITTEXT
:
599 TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control");
600 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
602 TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control");
603 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
605 TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control");
606 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
607 case EM_SETPASSWORDCHAR
:
608 TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control");
609 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
611 TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control");
612 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
614 TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control");
615 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
617 TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control");
618 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
620 TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control");
621 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
623 TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control");
624 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
625 case EM_SETWORDBREAKPROC
:
626 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control");
627 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
629 TRACE_EDIT_MSG32("EM_UNDO Passed to edit control");
630 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
632 case WM_STYLECHANGING
:
633 TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control");
634 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
635 case WM_STYLECHANGED
:
636 TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control");
637 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
639 TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control");
640 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
641 case WM_GETTEXTLENGTH
:
642 TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control");
643 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
645 TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control");
646 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
648 TRACE_EDIT_MSG32("WM_CUT Passed to edit control");
649 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
651 TRACE_EDIT_MSG32("WM_COPY Passed to edit control");
652 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
654 TRACE_EDIT_MSG32("WM_PASTE Passed to edit control");
655 return SendMessageA( info
->hwndEdit
, uMsg
, wParam
, lParam
);
657 /* Messages passed to default handler. */
659 /* A fundamental problem with embedding an edit control within another
660 window to emulate the richedit control, is that normally, the
661 WM_NCCALCSIZE message window would return the client area of the
664 While we could send a message to the edit control here to get that size
665 and return that value, this causes problems with the WM_SIZE message.
666 That is because the WM_SIZE message uses the returned value of
667 WM_NCCALCSIZE (via X11DRV_SetWindowSize) to determine the size to make
668 the edit control. If we return the size of the edit control client area
669 here, the result is the symptom of the edit control being inset on the
670 right and bottom by the width of any existing scrollbars.
672 The easy fix is to have WM_NCCALCSIZE return the true size of this
673 enclosing window, which is what we have done here. The more difficult
674 fix is to create a custom Richedit MoveWindow procedure for use in the
675 WM_SIZE message above. Since it is very unlikely that an app would call
676 and use the WM_NCCALCSIZE message, we stick with the easy fix for now.
678 TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default");
679 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
681 TRACE_EDIT_MSG32("WM_NCPAINT Passed to default");
682 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
684 TRACE_EDIT_MSG32("WM_PAINT Passed to default");
685 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
687 TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default");
688 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
690 TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default");
691 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
693 TRACE_EDIT_MSG32("WM_DESTROY Passed to default");
694 HeapFree( GetProcessHeap(), 0, info
->parser
);
695 HeapFree( GetProcessHeap(), 0, info
);
696 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
697 case WM_CHILDACTIVATE
:
698 TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default");
699 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
701 case WM_WINDOWPOSCHANGING
:
702 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default");
703 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
704 case WM_WINDOWPOSCHANGED
:
705 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default");
706 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
707 /* case WM_INITIALUPDATE:
708 TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default");
709 return DefWindowProcA( hwnd,uMsg,wParam,lParam); */
710 case WM_CTLCOLOREDIT
:
711 TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default");
712 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
714 TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default");
715 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
717 TRACE_EDIT_MSG32("WM_MOVE Passed to default");
718 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
720 TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default");
721 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
722 case WM_PARENTNOTIFY
:
723 TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default");
724 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
726 TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default");
727 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
729 TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default");
730 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
732 TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default");
733 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
734 case WM_CTLCOLORSTATIC
:
735 TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default");
736 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
738 TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default");
739 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
741 TRACE_EDIT_MSG32("WM_CLEAR Passed to default");
742 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
744 * used by IE in the EULA box
746 case WM_ALTTABACTIVE
:
747 TRACE_EDIT_MSG32("WM_ALTTABACTIVE");
748 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
750 TRACE_EDIT_MSG32("WM_GETDLGCODE");
751 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
753 TRACE_EDIT_MSG32("WM_SETFONT");
754 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
758 if ((uMsg
>= WM_USER
) && (uMsg
< WM_APP
)) {
759 FIXME("Unknown message 0x%x Passed to default hwnd=%p, wParam=%08x, lParam=%08x\n",
760 uMsg
, hwnd
, (UINT
)wParam
, (UINT
)lParam
);
763 return DefWindowProcA( hwnd
,uMsg
,wParam
,lParam
);
766 /***********************************************************************
767 * DllGetVersion [RICHED32.2]
769 * Retrieves version information of the 'RICHED32.DLL'
772 * pdvi [O] pointer to version information structure.
776 * Failure: E_INVALIDARG
779 * Returns version of a comctl32.dll from IE4.01 SP1.
783 RICHED32_DllGetVersion (DLLVERSIONINFO
*pdvi
)
787 if (pdvi
->cbSize
!= sizeof(DLLVERSIONINFO
)) {
792 pdvi
->dwMajorVersion
= 4;
793 pdvi
->dwMinorVersion
= 0;
794 pdvi
->dwBuildNumber
= 0;
795 pdvi
->dwPlatformID
= 0;
802 * Registers the window class.
810 VOID
RICHED32_Register(void)
816 ZeroMemory(&wndClass
, sizeof(WNDCLASSA
));
817 wndClass
.style
= CS_HREDRAW
| CS_VREDRAW
| CS_GLOBALCLASS
;
818 wndClass
.lpfnWndProc
= (WNDPROC
)RICHED32_WindowProc
;
819 wndClass
.cbClsExtra
= 0;
820 wndClass
.cbWndExtra
= 0; /*(sizeof(RICHED32_INFO *);*/
821 wndClass
.hCursor
= LoadCursorA(0, (LPSTR
)IDC_ARROW
);
822 wndClass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
823 wndClass
.lpszClassName
= RICHEDIT_CLASS10A
; /* WC_RICHED32A; */
825 RegisterClassA (&wndClass
);
830 * Unregisters the window class.
838 VOID
RICHED32_Unregister(void)
842 UnregisterClassA(RICHEDIT_CLASS10A
, NULL
);
845 INT
RICHEDIT_GetTextRange(HWND hwnd
,TEXTRANGEA
*tr
)
847 UINT alloc_size
, text_size
, range_size
;
850 TRACE("start: 0x%x stop: 0x%x\n",(INT
)tr
->chrg
.cpMin
,(INT
)tr
->chrg
.cpMax
);
852 if (!(alloc_size
= SendMessageA(hwnd
,WM_GETTEXTLENGTH
,0,0))) return FALSE
;
853 if (!(text
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (alloc_size
+1))))
855 text_size
= SendMessageA(hwnd
,WM_GETTEXT
,alloc_size
,(INT
)text
);
857 if (text_size
> tr
->chrg
.cpMin
)
859 range_size
= (text_size
> tr
->chrg
.cpMax
) ? (tr
->chrg
.cpMax
- tr
->chrg
.cpMin
) : (text_size
- tr
->chrg
.cpMin
);
860 TRACE("EditText: %.30s ...\n",text
+tr
->chrg
.cpMin
);
861 memcpy(tr
->lpstrText
,text
+tr
->chrg
.cpMin
,range_size
);
864 HeapFree(GetProcessHeap(), 0, text
);
869 INT
RICHEDIT_GetSelText(HWND hwnd
,LPSTR lpstrBuffer
)
871 TEXTRANGEA textrange
;
873 textrange
.lpstrText
= lpstrBuffer
;
874 SendMessageA(hwnd
,EM_GETSEL
,(INT
)&textrange
.chrg
.cpMin
,(INT
)&textrange
.chrg
.cpMax
);
875 return RICHEDIT_GetTextRange(hwnd
,&textrange
);