4 * Copyright 1998, 1999 Eric Kohl
7 * This is just a dummy control. An author is needed! Any volunteers?
8 * I will only improve this control once in a while.
9 * Eric <ekohl@abo.rhein-zeitung.de>
13 * - All notifications.
16 * - should include "combo.h"
22 #include "debugtools.h"
24 DEFAULT_DEBUG_CHANNEL(comboex)
26 #define ID_CB_EDIT 1001
28 #define COMBOEX_GetInfoPtr(wndPtr) ((COMBOEX_INFO *)GetWindowLongA (hwnd, 0))
31 /* << COMBOEX_DeleteItem >> */
35 COMBOEX_GetComboControl (HWND hwnd, WPARAM wParam, LPARAM lParam)
37 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
41 return (LRESULT)infoPtr->hwndCombo;
46 COMBOEX_GetEditControl (HWND hwnd, WPARAM wParam, LPARAM lParam)
48 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
50 if ((GetWindowLongA (hwnd, GWL_STYLE) & CBS_DROPDOWNLIST) != CBS_DROPDOWN)
53 TRACE("-- 0x%x\n", GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT));
55 return (LRESULT)GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT);
60 COMBOEX_GetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
62 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
64 return (LRESULT)infoPtr->dwExtStyle;
69 COMBOEX_GetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
71 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
73 TRACE("(0x%08x 0x%08lx)\n", wParam, lParam);
75 return (LRESULT)infoPtr->himl;
82 COMBOEX_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
84 /* COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd); */
86 FIXME("(0x%08x 0x%08lx)\n", wParam, lParam);
94 COMBOEX_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
96 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
99 TRACE("(0x%08x 0x%08lx)\n", wParam, lParam);
101 dwTemp = infoPtr->dwExtStyle;
104 infoPtr->dwExtStyle = (infoPtr->dwExtStyle & ~(DWORD)wParam) | (DWORD)lParam;
107 infoPtr->dwExtStyle = (DWORD)lParam;
109 /* FIXME: repaint?? */
111 return (LRESULT)dwTemp;
115 inline static LRESULT
116 COMBOEX_SetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
118 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
121 TRACE("(0x%08x 0x%08lx)\n", wParam, lParam);
123 himlTemp = infoPtr->himl;
124 infoPtr->himl = (HIMAGELIST)lParam;
126 return (LRESULT)himlTemp;
131 COMBOEX_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
133 /* COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd); */
135 FIXME("(%p): stub\n", (LPVOID)lParam);
141 /* << COMBOEX_SetItem32W >> */
144 inline static LRESULT
145 COMBOEX_Forward (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
147 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
149 FIXME("(0x%x 0x%x 0x%lx): stub\n", uMsg, wParam, lParam);
151 if (infoPtr->hwndCombo)
152 return SendMessageA (infoPtr->hwndCombo, uMsg, wParam, lParam);
159 COMBOEX_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
161 COMBOEX_INFO *infoPtr;
164 /* allocate memory for info structure */
165 infoPtr = (COMBOEX_INFO *)COMCTL32_Alloc (sizeof(COMBOEX_INFO));
166 if (infoPtr == NULL) {
167 ERR("could not allocate info memory!\n");
171 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
174 /* initialize info structure */
177 /* create combo box */
178 dwComboStyle = GetWindowLongA (hwnd, GWL_STYLE) &
179 (CBS_SIMPLE|CBS_DROPDOWN|CBS_DROPDOWNLIST|WS_CHILD);
181 infoPtr->hwndCombo = CreateWindowA ("ComboBox", "",
182 WS_CHILD | WS_VISIBLE | CBS_OWNERDRAWFIXED | dwComboStyle,
183 0, 0, 0, 0, hwnd, (HMENU)1,
184 GetWindowLongA (hwnd, GWL_HINSTANCE), NULL);
191 COMBOEX_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
193 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
196 if (infoPtr->hwndCombo)
197 DestroyWindow (infoPtr->hwndCombo);
202 /* free comboex info data */
203 COMCTL32_Free (infoPtr);
210 COMBOEX_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)
212 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
215 GetClientRect (hwnd, &rect);
217 MoveWindow (infoPtr->hwndCombo, 0, 0, rect.right -rect.left,
218 rect.bottom - rect.top, TRUE);
224 static LRESULT WINAPI
225 COMBOEX_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
229 /* case CBEM_DELETEITEM: */
231 case CBEM_GETCOMBOCONTROL:
232 return COMBOEX_GetComboControl (hwnd, wParam, lParam);
234 case CBEM_GETEDITCONTROL:
235 return COMBOEX_GetEditControl (hwnd, wParam, lParam);
237 case CBEM_GETEXTENDEDSTYLE:
238 return COMBOEX_GetExtendedStyle (hwnd, wParam, lParam);
240 case CBEM_GETIMAGELIST:
241 return COMBOEX_GetImageList (hwnd, wParam, lParam);
243 /* case CBEM_GETITEM32A:
244 case CBEM_GETITEM32W:
245 case CBEM_GETUNICODEFORMAT:
246 case CBEM_HASEDITCHANGED:
249 case CBEM_INSERTITEMA:
250 return COMBOEX_InsertItemA (hwnd, wParam, lParam);
252 /* case CBEM_INSERTITEM32W: */
254 case CBEM_SETEXTENDEDSTYLE:
255 return COMBOEX_SetExtendedStyle (hwnd, wParam, lParam);
257 case CBEM_SETIMAGELIST:
258 return COMBOEX_SetImageList (hwnd, wParam, lParam);
261 return COMBOEX_SetItemA (hwnd, wParam, lParam);
263 /* case CBEM_SETITEM32W:
264 case CBEM_SETUNICODEFORMAT:
267 case CB_DELETESTRING:
268 case CB_FINDSTRINGEXACT:
271 case CB_GETDROPPEDCONTROLRECT:
272 case CB_GETDROPPEDSTATE:
274 case CB_GETITEMHEIGHT:
276 case CB_GETLBTEXTLEN:
277 case CB_GETEXTENDEDUI:
279 case CB_RESETCONTENT:
280 case CB_SELECTSTRING:
282 case CB_SETDROPPEDWIDTH:
283 case CB_SETEXTENDEDUI:
285 case CB_SETITEMHEIGHT:
286 case CB_SHOWDROPDOWN:
287 return COMBOEX_Forward (hwnd, uMsg, wParam, lParam);
291 return COMBOEX_Create (hwnd, wParam, lParam);
294 return COMBOEX_Destroy (hwnd, wParam, lParam);
297 return COMBOEX_Size (hwnd, wParam, lParam);
301 ERR("unknown msg %04x wp=%08x lp=%08lx\n",
302 uMsg, wParam, lParam);
303 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
310 COMBOEX_Register (void)
314 if (GlobalFindAtomA (WC_COMBOBOXEXA)) return;
316 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
317 wndClass.style = CS_GLOBALCLASS;
318 wndClass.lpfnWndProc = (WNDPROC)COMBOEX_WindowProc;
319 wndClass.cbClsExtra = 0;
320 wndClass.cbWndExtra = sizeof(COMBOEX_INFO *);
321 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);
322 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
323 wndClass.lpszClassName = WC_COMBOBOXEXA;
325 RegisterClassA (&wndClass);
330 COMBOEX_Unregister (void)
332 if (GlobalFindAtomA (WC_COMBOBOXEXA))
333 UnregisterClassA (WC_COMBOBOXEXA, (HINSTANCE)NULL);