2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS User32
4 * PURPOSE: Built-in control registration
5 * FILE: win32ss/user/user32/controls/regcontrol.c
6 * PROGRAMER: Ge van Geldorp (ge@gse.nl)
7 * REVISION HISTORY: 2003/06/16 GvG Created
8 * NOTES: Adapted from Wine
13 DWORD RegisterDefaultClasses
= FALSE
;
15 static PFNCLIENT pfnClientA
;
16 static PFNCLIENT pfnClientW
;
17 static PFNCLIENTWORKER pfnClientWorker
;
20 /***********************************************************************
21 * set_control_clipping
23 * Set clipping for a builtin control that uses CS_PARENTDC.
24 * Return the previous clip region if any.
26 HRGN
set_control_clipping( HDC hdc
, const RECT
*rect
)
29 HRGN hrgn
= CreateRectRgn( 0, 0, 0, 0 );
31 if (GetClipRgn( hdc
, hrgn
) != 1)
36 DPtoLP( hdc
, (POINT
*)&rc
, 2 );
37 if (GetLayout( hdc
) & LAYOUT_RTL
) /* compensate for the shifting done by IntersectClipRect */
42 IntersectClipRect( hdc
, rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
48 const struct builtin_class_descr
*desc
;
53 { &DIALOG_builtin_class
, FNID_DIALOG
, ICLS_DIALOG
},
54 /* { &POPUPMENU_builtin_class, FNID_MENU, ICLS_MENU}, // moved to win32k */
55 { &COMBO_builtin_class
, FNID_COMBOBOX
, ICLS_COMBOBOX
},
56 { &COMBOLBOX_builtin_class
, FNID_COMBOLBOX
, ICLS_COMBOLBOX
},
57 { &MDICLIENT_builtin_class
, FNID_MDICLIENT
, ICLS_MDICLIENT
},
59 { &MENU_builtin_class
, FNID_MENU
, ICLS_MENU
},
61 /* { &SCROLL_builtin_class, FNID_SCROLLBAR, ICLS_SCROLLBAR}, // moved to win32k */
62 { &BUTTON_builtin_class
, FNID_BUTTON
, ICLS_BUTTON
},
63 { &LISTBOX_builtin_class
, FNID_LISTBOX
, ICLS_LISTBOX
},
64 { &EDIT_builtin_class
, FNID_EDIT
, ICLS_EDIT
},
65 /* { &ICONTITLE_builtin_class, FNID_ICONTITLE, ICLS_ICONTITLE}, // moved to win32k */
66 { &STATIC_builtin_class
, FNID_STATIC
, ICLS_STATIC
},
67 { &GHOST_builtin_class
, FNID_GHOST
, ICLS_GHOST
},
70 BOOL WINAPI
RegisterSystemControls(VOID
)
76 if (RegisterDefaultClasses
) return TRUE
;
78 ZeroMemory(&WndClass
, sizeof(WndClass
));
80 WndClass
.cbSize
= sizeof(WndClass
);
82 for (i
= 0; i
!= sizeof(g_SysClasses
) / sizeof(g_SysClasses
[0]); i
++)
84 WndClass
.lpszClassName
= g_SysClasses
[i
].desc
->name
;
87 WndClass
.style
= g_SysClasses
[i
].desc
->style
|CS_GLOBALCLASS
;
88 WndClass
.lpfnWndProc
= g_SysClasses
[i
].desc
->procW
;
89 WndClass
.cbWndExtra
= g_SysClasses
[i
].desc
->extra
;
90 WndClass
.hCursor
= LoadCursorW(NULL
, g_SysClasses
[i
].desc
->cursor
);
91 WndClass
.hbrBackground
= g_SysClasses
[i
].desc
->brush
;
93 atom
= RegisterClassExWOWW( &WndClass
,
99 RegisterDefaultClasses
|= ICLASS_TO_MASK(g_SysClasses
[i
].ClsId
);
102 if ( //gpsi->dwSRVIFlags & SRVINFO_IMM32 && Not supported yet, need NlsMbCodePageTag working in Win32k.
103 !(RegisterDefaultClasses
& ICLASS_TO_MASK(ICLS_IME
))) // So, work like XP.
113 MsgWindowProc( HWND hwnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
117 pWnd
= ValidateHwnd(hwnd
);
122 NtUserSetWindowFNID(hwnd
, FNID_MESSAGEWND
);
126 if (message
== WM_NCCREATE
) return TRUE
;
128 if (message
== WM_DESTROY
)
129 NtUserSetWindowFNID(hwnd
, FNID_DESTROY
);
131 return DefWindowProc(hwnd
, message
, wParam
, lParam
);
136 DialogWndProc_common( HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL unicode
)
139 return DefDlgProcW( hwnd
, uMsg
, wParam
, lParam
);
140 return DefDlgProcA( hwnd
, uMsg
, wParam
, lParam
);
143 BOOL WINAPI
RegisterClientPFN(VOID
)
147 pfnClientA
.pfnScrollBarWndProc
= ScrollBarWndProcA
;
148 pfnClientW
.pfnScrollBarWndProc
= ScrollBarWndProcW
;
149 pfnClientA
.pfnTitleWndProc
= IconTitleWndProc
;
150 pfnClientW
.pfnTitleWndProc
= IconTitleWndProc
;
151 pfnClientA
.pfnMenuWndProc
= PopupMenuWndProcA
;
152 pfnClientW
.pfnMenuWndProc
= PopupMenuWndProcW
;
153 pfnClientA
.pfnDesktopWndProc
= DesktopWndProcA
;
154 pfnClientW
.pfnDesktopWndProc
= DesktopWndProcW
;
155 pfnClientA
.pfnDefWindowProc
= DefWindowProcA
;
156 pfnClientW
.pfnDefWindowProc
= DefWindowProcW
;
157 pfnClientA
.pfnMessageWindowProc
= MsgWindowProc
;
158 pfnClientW
.pfnMessageWindowProc
= MsgWindowProc
;
159 pfnClientA
.pfnSwitchWindowProc
= SwitchWndProcA
;
160 pfnClientW
.pfnSwitchWindowProc
= SwitchWndProcW
;
161 pfnClientA
.pfnButtonWndProc
= ButtonWndProcA
;
162 pfnClientW
.pfnButtonWndProc
= ButtonWndProcW
;
163 pfnClientA
.pfnComboBoxWndProc
= ComboWndProcA
;
164 pfnClientW
.pfnComboBoxWndProc
= ComboWndProcW
;
165 pfnClientA
.pfnComboListBoxProc
= ListBoxWndProcA
;
166 pfnClientW
.pfnComboListBoxProc
= ListBoxWndProcW
;
167 pfnClientA
.pfnDialogWndProc
= DefDlgProcA
;
168 pfnClientW
.pfnDialogWndProc
= DefDlgProcW
;
169 pfnClientA
.pfnEditWndProc
= EditWndProcA
;
170 pfnClientW
.pfnEditWndProc
= EditWndProcW
;
171 pfnClientA
.pfnListBoxWndProc
= ListBoxWndProcA
;
172 pfnClientW
.pfnListBoxWndProc
= ListBoxWndProcW
;
173 pfnClientA
.pfnMDIClientWndProc
= MDIClientWndProcA
;
174 pfnClientW
.pfnMDIClientWndProc
= MDIClientWndProcW
;
175 pfnClientA
.pfnStaticWndProc
= StaticWndProcA
;
176 pfnClientW
.pfnStaticWndProc
= StaticWndProcW
;
177 pfnClientA
.pfnImeWndProc
= ImeWndProcA
;
178 pfnClientW
.pfnImeWndProc
= ImeWndProcW
;
179 pfnClientA
.pfnGhostWndProc
= GhostWndProcA
;
180 pfnClientW
.pfnGhostWndProc
= GhostWndProcW
;
181 pfnClientA
.pfnHkINLPCWPSTRUCT
= DefWindowProcA
;
182 pfnClientW
.pfnHkINLPCWPSTRUCT
= DefWindowProcW
;
183 pfnClientA
.pfnHkINLPCWPRETSTRUCT
= DefWindowProcA
;
184 pfnClientW
.pfnHkINLPCWPRETSTRUCT
= DefWindowProcW
;
185 pfnClientA
.pfnDispatchHook
= DefWindowProcA
;
186 pfnClientW
.pfnDispatchHook
= DefWindowProcW
;
187 pfnClientA
.pfnDispatchDefWindowProc
= DefWindowProcA
;
188 pfnClientW
.pfnDispatchDefWindowProc
= DefWindowProcW
;
189 pfnClientA
.pfnDispatchMessage
= DefWindowProcA
;
190 pfnClientW
.pfnDispatchMessage
= DefWindowProcW
;
191 pfnClientA
.pfnMDIActivateDlgProc
= DefWindowProcA
;
192 pfnClientW
.pfnMDIActivateDlgProc
= DefWindowProcW
;
194 pfnClientWorker
.pfnButtonWndProc
= ButtonWndProc_common
;
195 pfnClientWorker
.pfnComboBoxWndProc
= ComboWndProc_common
;
196 pfnClientWorker
.pfnComboListBoxProc
= ListBoxWndProc_common
;
197 pfnClientWorker
.pfnDialogWndProc
= DialogWndProc_common
;
198 pfnClientWorker
.pfnEditWndProc
= EditWndProc_common
;
199 pfnClientWorker
.pfnListBoxWndProc
= ListBoxWndProc_common
;
200 pfnClientWorker
.pfnMDIClientWndProc
= MDIClientWndProc_common
;
201 pfnClientWorker
.pfnStaticWndProc
= StaticWndProc_common
;
202 pfnClientWorker
.pfnImeWndProc
= ImeWndProc_common
;
203 pfnClientWorker
.pfnGhostWndProc
= GhostWndProc_common
;
204 pfnClientWorker
.pfnCtfHookProc
= User32DefWindowProc
;
206 Status
= NtUserInitializeClientPfnArrays( &pfnClientA
,
211 return NT_SUCCESS(Status
) ? TRUE
: FALSE
;