3 #include <user32/class.h>
4 #include <user32/win.h>
5 #include <user32/heapdup.h>
9 ATOM STDCALL
RegisterClassA(const WNDCLASS
* wc
)
12 wcex
.cbSize
= sizeof(WNDCLASSEX
);
13 wcex
.style
= wc
->style
;
14 wcex
.lpfnWndProc
= wc
->lpfnWndProc
;
15 wcex
.cbClsExtra
= wc
->cbClsExtra
;
16 wcex
.cbWndExtra
= wc
->cbWndExtra
;
17 wcex
.hInstance
= wc
->hInstance
;
18 wcex
.hIcon
= wc
->hIcon
;
19 wcex
.hCursor
= wc
->hCursor
;
20 wcex
.hbrBackground
= wc
->hbrBackground
;
21 wcex
.lpszMenuName
= wc
->lpszMenuName
;
22 wcex
.lpszClassName
= wc
->lpszClassName
;
24 return RegisterClassExA(&wcex
);
27 ATOM STDCALL
RegisterClassW(const WNDCLASS
* wc
)
30 wcex
.cbSize
= sizeof(WNDCLASSEX
);
31 wcex
.style
= wc
->style
;
32 wcex
.lpfnWndProc
= wc
->lpfnWndProc
;
33 wcex
.cbClsExtra
= wc
->cbClsExtra
;
34 wcex
.cbWndExtra
= wc
->cbWndExtra
;
35 wcex
.hInstance
= wc
->hInstance
;
36 wcex
.hIcon
= wc
->hIcon
;
37 wcex
.hCursor
= wc
->hCursor
;
38 wcex
.hbrBackground
= wc
->hbrBackground
;
39 wcex
.lpszMenuName
= wc
->lpszMenuName
;
40 wcex
.lpszClassName
= wc
->lpszClassName
;
42 return RegisterClassExW(&wcex
);
45 ATOM STDCALL
RegisterClassExA(const WNDCLASSEX
* wc
)
49 INT classExtra
, winExtra
;
53 if ( wc
== NULL
|| wc
->cbSize
!= sizeof(WNDCLASSEX
)) {
54 SetLastError(ERROR_INVALID_DATA
);
58 atom
= GlobalAddAtomA( wc
->lpszClassName
);
61 SetLastError(ERROR_CLASS_ALREADY_EXISTS
);
65 classExtra
= wc
->cbClsExtra
;
68 else if (classExtra
> 40)
71 winExtra
= wc
->cbClsExtra
;
74 else if (winExtra
> 40)
77 classPtr
= (CLASS
*)HeapAlloc( GetProcessHeap(), 0, sizeof(CLASS
) +
78 classExtra
- sizeof(classPtr
->wExtra
) );
82 memset( classPtr
->wExtra
, 0, classExtra
);
85 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
86 GlobalDeleteAtom( atom
);
89 classPtr
->magic
= CLASS_MAGIC
;
90 classPtr
->cWindows
= 0;
91 classPtr
->style
= wc
->style
;
92 classPtr
->winproc
= wc
->lpfnWndProc
;
93 classPtr
->cbWndExtra
= winExtra
;
94 classPtr
->cbClsExtra
= classExtra
;
95 classPtr
->hInstance
= wc
->hInstance
;
96 classPtr
->atomName
= atom
;
97 classPtr
->hIcon
= (HICON
)wc
->hIcon
;
98 classPtr
->hIconSm
= (HICON
)wc
->hIconSm
;
99 classPtr
->hCursor
= (HCURSOR
)wc
->hCursor
;
100 classPtr
->hbrBackground
= (HBRUSH
)wc
->hbrBackground
;
101 classPtr
->bUnicode
= FALSE
;
103 classPtr
->dce
= (wc
->style
& CS_CLASSDC
) ?
104 CreateDC( "DISPLAY", NULL
,NULL
,NULL
) : NULL
;
107 if ( wc
->lpszMenuName
!= NULL
) {
108 len
= lstrlenA(wc
->lpszMenuName
);
109 classPtr
->menuName
= HeapAlloc(GetProcessHeap(),0,len
+1);
110 lstrcpyA(classPtr
->menuName
,wc
->lpszMenuName
);
113 classPtr
->menuName
= NULL
;
117 len
= lstrlenA(wc
->lpszClassName
);
118 classPtr
->className
= HeapAlloc(GetProcessHeap(),0,len
+1);
119 lstrcpyA(classPtr
->className
,wc
->lpszClassName
);
123 classPtr
->next
= rootClass
;
124 rootClass
= classPtr
;
130 ATOM STDCALL
RegisterClassExW( const WNDCLASSEX
* wc
)
134 INT classExtra
, winExtra
;
137 if ( wc
== NULL
|| wc
->cbSize
!= sizeof(WNDCLASSEX
)) {
138 SetLastError(ERROR_INVALID_DATA
);
142 if (!(atom
= GlobalAddAtomW( (LPWSTR
)wc
->lpszClassName
)))
144 SetLastError(ERROR_CLASS_ALREADY_EXISTS
);
148 classExtra
= wc
->cbClsExtra
;
151 else if (classExtra
> 40)
154 winExtra
= wc
->cbClsExtra
;
157 else if (winExtra
> 40)
160 classPtr
= (CLASS
*)HeapAlloc( GetProcessHeap(), 0, sizeof(CLASS
) +
161 classExtra
- sizeof(classPtr
->wExtra
) );
165 memset( classPtr
->wExtra
, 0, classExtra
);
168 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
169 GlobalDeleteAtom( atom
);
172 classPtr
->magic
= CLASS_MAGIC
;
173 classPtr
->cWindows
= 0;
174 classPtr
->style
= wc
->style
;
175 classPtr
->winproc
= wc
->lpfnWndProc
;
176 classPtr
->cbWndExtra
= winExtra
;
177 classPtr
->cbClsExtra
= classExtra
;
178 classPtr
->hInstance
= wc
->hInstance
;
179 classPtr
->atomName
= atom
;
180 classPtr
->hIcon
= (HICON
)wc
->hIcon
;
181 classPtr
->hIconSm
= (HICON
)wc
->hIconSm
;
182 classPtr
->hCursor
= (HCURSOR
)wc
->hCursor
;
183 classPtr
->hbrBackground
= (HBRUSH
)wc
->hbrBackground
;
184 classPtr
->bUnicode
= FALSE
;
186 classPtr
->dce
= (wc
->style
& CS_CLASSDC
) ?
187 CreateDC( "DISPLAY", NULL
,NULL
,NULL
) : NULL
;
189 len
= lstrlenW((LPWSTR
)wc
->lpszMenuName
);
190 classPtr
->menuName
= HeapAlloc(GetProcessHeap(),0,(len
+1)*2);
191 lstrcpyW((LPWSTR
)classPtr
->menuName
, (LPWSTR
)wc
->lpszMenuName
);
194 len
= lstrlenW((LPWSTR
)wc
->lpszClassName
);
195 classPtr
->className
= HeapAlloc(GetProcessHeap(),0,(len
+1)*2);
196 lstrcpyW((LPWSTR
)classPtr
->className
,(LPWSTR
) wc
->lpszClassName
);
198 classPtr
->next
= rootClass
;
199 rootClass
= classPtr
;
204 WINBOOL
UnregisterClassA(LPCSTR lpClassName
, HINSTANCE hInstance
)
207 classPtr
= CLASS_FindClassByAtom( STRING2ATOMA(lpClassName
), hInstance
);
208 if ( classPtr
== NULL
)
212 if ( CLASS_FreeClass(classPtr
) == TRUE
)
213 GlobalDeleteAtom( classPtr
->atomName
);
220 WINBOOL
UnregisterClassW(LPCWSTR lpClassName
, HINSTANCE hInstance
)
223 classPtr
= CLASS_FindClassByAtom( STRING2ATOMW(lpClassName
), hInstance
);
224 if ( classPtr
== NULL
)
228 if ( CLASS_FreeClass(classPtr
) == TRUE
)
229 GlobalDeleteAtom( classPtr
->atomName
);
234 WINBOOL
GetClassInfoA( HINSTANCE hInstance
, LPCSTR lpClassName
, LPWNDCLASS lpWndClass
)
241 WINBOOL
GetClassInfoW( HINSTANCE hInstance
, LPCWSTR lpClassName
, LPWNDCLASS lpWndClass
)
246 if ( HIWORD(lpClassName
) != 0 )
247 a
= FindAtomW(lpClassName
);
251 classPtr
= CLASS_FindClassByAtom( a
, hInstance
);
252 if ( classPtr
== NULL
)
256 lpWndClass
->style
= classPtr
->style
;
257 lpWndClass
->lpfnWndProc
= classPtr
->winproc
;
258 lpWndClass
->cbClsExtra
= classPtr
->cbWndExtra
;
259 lpWndClass
->cbClsExtra
= classPtr
->cbClsExtra
;
260 lpWndClass
->hInstance
= classPtr
->hInstance
;
261 lpWndClass
->hIcon
= classPtr
->hIcon
;
262 lpWndClass
->hCursor
= classPtr
->hCursor
;
263 lpWndClass
->hbrBackground
= classPtr
->hbrBackground
;
268 WINBOOL
GetClassInfoExA( HINSTANCE hInstance
, LPCSTR lpClassName
, LPWNDCLASSEX lpWndClass
)
274 WINBOOL
GetClassInfoExW( HINSTANCE hInstance
, LPCWSTR lpClassName
, LPWNDCLASSEX lpWndClassEx
)
280 if ( HIWORD(lpClassName
) != 0 )
281 a
= FindAtomW(lpClassName
);
285 classPtr
= CLASS_FindClassByAtom( a
, hInstance
);
286 if ( classPtr
== NULL
)
290 if ( lpWndClassEx
->cbSize
!= sizeof(WNDCLASSEX
) )
294 lpWndClassEx
->style
= classPtr
->style
;
295 lpWndClassEx
->lpfnWndProc
= classPtr
->winproc
;
296 lpWndClassEx
->cbClsExtra
= classPtr
->cbWndExtra
;
297 lpWndClassEx
->cbClsExtra
= classPtr
->cbClsExtra
;
298 lpWndClassEx
->hInstance
= classPtr
->hInstance
;
299 lpWndClassEx
->hIcon
= classPtr
->hIcon
;
300 lpWndClassEx
->hCursor
= classPtr
->hCursor
;
301 lpWndClassEx
->hbrBackground
= classPtr
->hbrBackground
;
307 int GetClassNameA(HWND hWnd
, LPSTR lpClassName
, int nMaxCount
)
309 WND
*wndPtr
= WIN_FindWndPtr(hWnd
);
311 if ( wndPtr
== NULL
)
314 if ( wndPtr
->class->bUnicode
== TRUE
)
317 return lpstrncpyA(lpClassName
,wndPtr
->class->className
, nMaxCount
);
321 int GetClassNameW(HWND hWnd
, LPWSTR lpClassName
, int nMaxCount
)
323 WND
*wndPtr
= WIN_FindWndPtr(hWnd
);
325 if ( wndPtr
== NULL
)
328 if ( wndPtr
->class->bUnicode
== FALSE
)
331 return lpstrncpyW(lpClassName
,wndPtr
->class->className
, nMaxCount
);
336 DWORD
GetClassLongA(HWND hWnd
, int nIndex
)
340 if (!(wndPtr
= WIN_FindWndPtr( hWnd
))) return 0;
343 if (nIndex
<= wndPtr
->class->cbClsExtra
- sizeof(LONG
))
344 return (DWORD
)((char *)wndPtr
->class->wExtra
) + nIndex
;
348 case GCL_STYLE
: return (LONG
)wndPtr
->class->style
;
349 case GCL_CBWNDEXTRA
: return (LONG
)wndPtr
->class->cbWndExtra
;
350 case GCL_CBCLSEXTRA
: return (LONG
)wndPtr
->class->cbClsExtra
;
351 case GCL_HMODULE
: return (LONG
)wndPtr
->class->hInstance
;
352 case GCL_WNDPROC
: return (LONG
)wndPtr
->class->winproc
;
353 case GCL_MENUNAME
: return (LONG
)wndPtr
->class->menuName
;
355 case GCL_HBRBACKGROUND
:
359 return GetClassWord( hWnd
, nIndex
);
367 DWORD
GetClassLongW(HWND hWnd
, int nIndex
)
371 if (!(wndPtr
= WIN_FindWndPtr( hWnd
))) return 0;
374 if (nIndex
<= wndPtr
->class->cbClsExtra
- sizeof(LONG
))
375 return (DWORD
)((char *)wndPtr
->class->wExtra
) + nIndex
;
379 case GCL_STYLE
: return (LONG
)wndPtr
->class->style
;
380 case GCL_CBWNDEXTRA
: return (LONG
)wndPtr
->class->cbWndExtra
;
381 case GCL_CBCLSEXTRA
: return (LONG
)wndPtr
->class->cbClsExtra
;
382 case GCL_HMODULE
: return (LONG
)wndPtr
->class->hInstance
;
383 case GCL_WNDPROC
: return (LONG
)wndPtr
->class->winproc
;
384 case GCL_MENUNAME
: return (LONG
)wndPtr
->class->menuName
;
386 case GCL_HBRBACKGROUND
:
390 return GetClassWord( hWnd
, nIndex
);
400 WORD STDCALL
GetClassWord( HWND hWnd
, INT nIndex
)
404 if (!(wndPtr
= WIN_FindWndPtr( hWnd
))) return 0;
407 if (nIndex
<= wndPtr
->class->cbClsExtra
- sizeof(WORD
))
408 return (WORD
)((char *)wndPtr
->class->wExtra
) + nIndex
;
412 //case GCW_HBRBACKGROUND: return wndPtr->class->hbrBackground;
413 //case GCW_HCURSOR: return wndPtr->class->hCursor;
414 //case GCW_HICON: return wndPtr->class->hIcon;
415 // case GCW_HICONSM: return wndPtr->class->hIconSm;
416 case GCW_ATOM
: return wndPtr
->class->atomName
;
418 //case GCW_CBWNDEXTRA:
419 //case GCW_CBCLSEXTRA:
421 return (WORD
)GetClassLongA( hWnd
, nIndex
);
431 CLASS
*CLASS_FindClassByAtom( ATOM classAtom
, HINSTANCE hInstance
)
433 CLASS
*p
= rootClass
;
435 if ( p
->atomName
== classAtom
)
443 WINBOOL
CLASS_FreeClass(CLASS
*classPtr
)
445 CLASS
*p
= rootClass
;
446 if( classPtr
->cWindows
> 0 )
450 DeleteDC( classPtr
->dce
);
451 if (classPtr
->hbrBackground
)
452 DeleteObject( classPtr
->hbrBackground
);
455 classPtr
->atomName
= 0;
456 HeapFree(GetProcessHeap(),0,classPtr
->className
);
458 while(p
!= NULL
&& p
->next
!= classPtr
)
462 p
->next
= classPtr
->next
;
464 HeapFree(GetProcessHeap(),0,classPtr
);