Release 950522
[wine.git] / windows / defwnd.c
blobb1c95e65c5934d5035a111528cfc6ba6e91892d3
1 /*
2 * Default window procedure
4 * Copyright 1993 Alexandre Julliard
6 static char Copyright[] = "Copyright Alexandre Julliard, 1993";
7 */
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include "win.h"
12 #include "class.h"
13 #include "user.h"
14 #include "nonclient.h"
15 #include "winpos.h"
16 #include "syscolor.h"
17 #include "stddebug.h"
18 /* #define DEBUG_MESSAGE */
19 #include "debug.h"
21 /* Last COLOR id */
22 #define COLOR_MAX COLOR_BTNHIGHLIGHT
24 /***********************************************************************
25 * DEFWND_SetText
27 * Set the window text.
29 void DEFWND_SetText( HWND hwnd, LPSTR text )
31 LPSTR textPtr;
32 WND *wndPtr = WIN_FindWndPtr( hwnd );
34 if (wndPtr->hText) USER_HEAP_FREE( wndPtr->hText );
35 wndPtr->hText = USER_HEAP_ALLOC( strlen(text) + 1 );
36 textPtr = (LPSTR) USER_HEAP_LIN_ADDR( wndPtr->hText );
37 strcpy( textPtr, text );
40 #include <assert.h>
42 /***********************************************************************
43 * DefWindowProc (USER.107)
45 LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
47 CLASS * classPtr;
48 LPSTR textPtr;
49 int len;
50 WND * wndPtr = WIN_FindWndPtr( hwnd );
52 dprintf_message(stddeb, "DefWindowProc: %d %d %d %08lx\n",
53 hwnd, msg, wParam, lParam );
55 switch(msg)
57 case WM_NCCREATE:
59 CREATESTRUCT *createStruct = (CREATESTRUCT*)PTR_SEG_TO_LIN(lParam);
60 if (createStruct->lpszName)
61 DEFWND_SetText( hwnd,
62 (LPSTR)PTR_SEG_TO_LIN(createStruct->lpszName) );
63 return 1;
66 case WM_NCCALCSIZE:
67 return NC_HandleNCCalcSize( hwnd,
68 (NCCALCSIZE_PARAMS *)PTR_SEG_TO_LIN(lParam) );
70 case WM_PAINTICON:
71 case WM_NCPAINT:
72 return NC_HandleNCPaint( hwnd );
74 case WM_NCHITTEST:
75 return NC_HandleNCHitTest( hwnd, MAKEPOINT(lParam) );
77 case WM_NCLBUTTONDOWN:
78 return NC_HandleNCLButtonDown( hwnd, wParam, lParam );
80 case WM_LBUTTONDBLCLK:
81 case WM_NCLBUTTONDBLCLK:
82 return NC_HandleNCLButtonDblClk( hwnd, wParam, lParam );
84 case WM_NCACTIVATE:
85 return NC_HandleNCActivate( hwnd, wParam );
87 case WM_NCDESTROY:
88 if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
89 if (wndPtr->hVScroll) USER_HEAP_FREE(wndPtr->hVScroll);
90 if (wndPtr->hHScroll) USER_HEAP_FREE(wndPtr->hHScroll);
91 wndPtr->hText = wndPtr->hVScroll = wndPtr->hHScroll = 0;
92 return 0;
94 case WM_PAINT:
96 PAINTSTRUCT paintstruct;
97 BeginPaint( hwnd, &paintstruct );
98 EndPaint( hwnd, &paintstruct );
99 return 0;
102 case WM_SETREDRAW:
103 if (!wParam)
105 ValidateRect( hwnd, NULL );
106 wndPtr->flags |= WIN_NO_REDRAW;
108 else wndPtr->flags &= ~WIN_NO_REDRAW;
109 return 0;
111 case WM_CLOSE:
112 DestroyWindow( hwnd );
113 return 0;
115 case WM_MOUSEACTIVATE:
116 if (wndPtr->dwStyle & WS_CHILD)
118 LONG ret = SendMessage( wndPtr->hwndParent, WM_MOUSEACTIVATE,
119 wParam, lParam );
120 if (ret) return ret;
122 return MA_ACTIVATE;
124 case WM_ACTIVATE:
125 if (wParam) SetFocus( hwnd );
126 break;
128 case WM_WINDOWPOSCHANGING:
129 return WINPOS_HandleWindowPosChanging( (WINDOWPOS *)PTR_SEG_TO_LIN(lParam) );
131 case WM_WINDOWPOSCHANGED:
133 WINDOWPOS * winPos = (WINDOWPOS *)PTR_SEG_TO_LIN(lParam);
134 if (!(winPos->flags & SWP_NOMOVE))
135 SendMessage( hwnd, WM_MOVE, 0,
136 MAKELONG( wndPtr->rectClient.left,
137 wndPtr->rectClient.top ));
138 if (!(winPos->flags & SWP_NOSIZE))
139 SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
140 MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
141 wndPtr->rectClient.bottom-wndPtr->rectClient.top));
142 return 0;
145 case WM_ERASEBKGND:
146 case WM_ICONERASEBKGND:
148 if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 0;
149 if (!classPtr->wc.hbrBackground) return 0;
150 if (classPtr->wc.hbrBackground <= COLOR_MAX+1)
152 HBRUSH hbrush;
153 hbrush = CreateSolidBrush(
154 GetSysColor(classPtr->wc.hbrBackground-1));
155 FillWindow( GetParent(hwnd), hwnd, (HDC)wParam, hbrush);
156 DeleteObject (hbrush);
158 else
159 FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
160 classPtr->wc.hbrBackground );
161 return 1;
164 case WM_GETDLGCODE:
165 return 0;
167 case WM_CTLCOLOR:
169 if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
171 SetBkColor( (HDC)wParam, RGB(255, 255, 255) );
172 SetTextColor( (HDC)wParam, RGB(0, 0, 0) );
173 UnrealizeObject( sysColorObjects.hbrushScrollbar );
174 return sysColorObjects.hbrushScrollbar;
176 else
178 SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) );
179 SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) );
180 return sysColorObjects.hbrushWindow;
184 case WM_GETTEXT:
186 if (wParam)
188 if (wndPtr->hText)
190 textPtr = (LPSTR)USER_HEAP_LIN_ADDR(wndPtr->hText);
191 if ((int)wParam > (len = strlen(textPtr)))
193 strcpy((char *)PTR_SEG_TO_LIN(lParam), textPtr);
194 return (DWORD)len;
198 return 0;
201 case WM_GETTEXTLENGTH:
203 if (wndPtr->hText)
205 textPtr = (LPSTR)USER_HEAP_LIN_ADDR(wndPtr->hText);
206 return (DWORD)strlen(textPtr);
208 return (0L);
211 case WM_SETTEXT:
212 DEFWND_SetText( hwnd, (LPSTR)PTR_SEG_TO_LIN(lParam) );
213 NC_HandleNCPaint( hwnd ); /* Repaint caption */
214 return 0;
216 case WM_SETCURSOR:
217 if (wndPtr->dwStyle & WS_CHILD)
218 if (SendMessage(wndPtr->hwndParent, WM_SETCURSOR, wParam, lParam))
219 return TRUE;
220 return NC_HandleSetCursor( hwnd, wParam, lParam );
222 case WM_SYSCOMMAND:
223 return NC_HandleSysCommand( hwnd, wParam, MAKEPOINT(lParam) );
225 case WM_SYSKEYDOWN:
226 if (wParam == VK_MENU)
227 { /* Send to WS_OVERLAPPED parent. TODO: Handle MDI */
228 HWND top;
229 for(top=hwnd;GetParent(top)!=0;top=GetParent(top));
230 SendMessage( top, WM_SYSCOMMAND, SC_KEYMENU, 0L );
232 break;
234 case WM_SYSKEYUP:
235 break;
237 return 0;