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"
24 DEFAULT_DEBUG_CHANNEL(comboex
)
26 #define ID_CB_EDIT 1001
28 #define COMBOEX_GetInfoPtr(wndPtr) ((COMBOEX_INFO *)GetWindowLongA (hwnd, 0))
31 /* << COMBOEX_DeleteItem >> */
34 __inline__
static LRESULT
35 COMBOEX_GetComboControl (HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
37 COMBOEX_INFO
*infoPtr
= COMBOEX_GetInfoPtr (hwnd
);
39 TRACE (comboex
, "\n");
41 return (LRESULT
)infoPtr
->hwndCombo
;
45 __inline__
static LRESULT
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 (comboex
, "-- 0x%x\n", GetDlgItem (infoPtr
->hwndCombo
, ID_CB_EDIT
));
55 return (LRESULT
)GetDlgItem (infoPtr
->hwndCombo
, ID_CB_EDIT
);
59 __inline__
static LRESULT
60 COMBOEX_GetExtendedStyle (HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
62 COMBOEX_INFO
*infoPtr
= COMBOEX_GetInfoPtr (hwnd
);
64 return (LRESULT
)infoPtr
->dwExtStyle
;
68 __inline__
static LRESULT
69 COMBOEX_GetImageList (HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
71 COMBOEX_INFO
*infoPtr
= COMBOEX_GetInfoPtr (hwnd
);
73 TRACE (comboex
, "(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 (comboex
, "(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 (comboex
, "(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 (comboex
, "(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 (comboex
, "(%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 (comboex
, "(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 (comboex
, "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
);
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 (comboex
, "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
);