Release 940201
[wine.git] / windows / defwnd.c
blob62f9f502d711f07ed70f5bd40a5c72785459d920
1 /*
2 * Default window procedure
4 * Copyright 1993 Alexandre Julliard
5 */
7 static char Copyright[] = "Copyright Alexandre Julliard, 1993";
10 #include "windows.h"
11 #include "win.h"
12 #include "class.h"
13 #include "user.h"
15 extern LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn );
16 extern LONG NC_HandleNCActivate( HWND hwnd, WORD wParam );
17 extern LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params );
18 extern LONG NC_HandleNCHitTest( HWND hwnd, POINT pt );
19 extern LONG NC_HandleNCLButtonDown( HWND hwnd, WORD wParam, LONG lParam );
20 extern LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam );
21 extern LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt );
22 extern LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam );
23 extern void NC_TrackSysMenu( HWND hwnd ); /* menu.c */
27 /***********************************************************************
28 * DEFWND_SetText
30 * Set the window text.
32 void DEFWND_SetText( HWND hwnd, LPSTR text )
34 LPSTR textPtr;
35 WND *wndPtr = WIN_FindWndPtr( hwnd );
37 if (wndPtr->hText) USER_HEAP_FREE( wndPtr->hText );
38 wndPtr->hText = USER_HEAP_ALLOC( LMEM_MOVEABLE, strlen(text) + 2 );
39 textPtr = (LPSTR) USER_HEAP_ADDR( wndPtr->hText );
40 strcpy( textPtr, text );
41 /* for use by edit control */
42 *(textPtr + strlen(text) + 1) = '\0';
46 /***********************************************************************
47 * DefWindowProc (USER.107)
49 LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
51 CLASS * classPtr;
52 LPSTR textPtr;
53 int len;
54 WND * wndPtr = WIN_FindWndPtr( hwnd );
56 #ifdef DEBUG_MESSAGE
57 printf( "DefWindowProc: %d %d %d %08x\n", hwnd, msg, wParam, lParam );
58 #endif
60 switch(msg)
62 case WM_NCCREATE:
64 CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
65 if (createStruct->lpszName)
66 DEFWND_SetText( hwnd, createStruct->lpszName );
67 return 1;
70 case WM_NCCALCSIZE:
71 return NC_HandleNCCalcSize( hwnd, (NCCALCSIZE_PARAMS *)lParam );
73 case WM_NCPAINT:
74 return NC_HandleNCPaint( hwnd, (HRGN)wParam );
76 case WM_NCHITTEST:
77 return NC_HandleNCHitTest( hwnd, MAKEPOINT(lParam) );
79 case WM_NCLBUTTONDOWN:
80 return NC_HandleNCLButtonDown( hwnd, wParam, lParam );
82 case WM_NCLBUTTONDBLCLK:
83 return NC_HandleNCLButtonDblClk( hwnd, wParam, lParam );
85 case WM_NCACTIVATE:
86 return NC_HandleNCActivate( hwnd, wParam );
88 case WM_NCDESTROY:
90 if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
91 wndPtr->hText = 0;
92 return 0;
95 case WM_PAINT:
97 PAINTSTRUCT paintstruct;
98 BeginPaint( hwnd, &paintstruct );
99 EndPaint( hwnd, &paintstruct );
100 return 0;
103 case WM_CLOSE:
104 DestroyWindow( hwnd );
105 return 0;
107 case WM_MOUSEACTIVATE:
108 if (wndPtr->dwStyle & WS_CHILD)
110 LONG ret = SendMessage( wndPtr->hwndParent, WM_MOUSEACTIVATE,
111 wParam, lParam );
112 if (ret) return ret;
114 return MA_ACTIVATE;
116 case WM_ACTIVATE:
117 if (wParam) SetFocus( hwnd );
118 break;
120 case WM_WINDOWPOSCHANGED:
122 WINDOWPOS * winPos = (WINDOWPOS *)lParam;
123 if (!(winPos->flags & SWP_NOMOVE))
124 SendMessage( hwnd, WM_MOVE, 0,
125 MAKELONG( wndPtr->rectClient.left,
126 wndPtr->rectClient.top ));
127 if (!(winPos->flags & SWP_NOSIZE))
128 SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
129 MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
130 wndPtr->rectClient.bottom-wndPtr->rectClient.top));
131 return 0;
134 case WM_ERASEBKGND:
135 case WM_ICONERASEBKGND:
137 if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 1;
138 if (!classPtr->wc.hbrBackground) return 1;
139 FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
140 classPtr->wc.hbrBackground );
141 return 0;
144 case WM_GETDLGCODE:
145 return 0;
147 case WM_CTLCOLOR:
149 if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
151 SetBkColor( (HDC)wParam, RGB(255, 255, 255) );
152 SetTextColor( (HDC)wParam, RGB(0, 0, 0) );
153 /* hbr = sysClrObjects.hbrScrollbar;
154 UnrealizeObject(hbr); */
155 return GetStockObject(LTGRAY_BRUSH);
157 else
159 SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) );
160 SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) );
161 /* hbr = sysClrObjects.hbrWindow; */
162 return GetStockObject(WHITE_BRUSH);
166 case WM_GETTEXT:
168 if (wParam)
170 if (wndPtr->hText)
172 textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
173 if ((int)wParam > (len = strlen(textPtr)))
175 strcpy((char *)lParam, textPtr);
176 return (DWORD)len;
179 lParam = (DWORD)NULL;
181 return (0L);
184 case WM_GETTEXTLENGTH:
186 if (wndPtr->hText)
188 textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
189 return (DWORD)strlen(textPtr);
191 return (0L);
194 case WM_SETTEXT:
195 DEFWND_SetText( hwnd, (LPSTR)lParam );
196 NC_HandleNCPaint( hwnd, (HRGN)1 ); /* Repaint caption */
197 return 0;
199 case WM_SETCURSOR:
200 if (wndPtr->dwStyle & WS_CHILD)
201 if (SendMessage(wndPtr->hwndParent, WM_SETCURSOR, wParam, lParam))
202 return TRUE;
203 return NC_HandleSetCursor( hwnd, wParam, lParam );
205 case WM_SYSCOMMAND:
206 return NC_HandleSysCommand( hwnd, wParam, MAKEPOINT(lParam) );
208 case WM_SYSKEYDOWN:
209 if (wParam == VK_MENU) {
210 printf("VK_MENU Pressed // hMenu=%04X !\n", GetMenu(hwnd));
211 NC_TrackSysMenu(hwnd);
213 break;
214 case WM_SYSKEYUP:
215 if (wParam == VK_MENU) {
216 printf("VK_MENU Released // hMenu=%04X !\n", GetMenu(hwnd));
218 break;
220 return 0;