Release 950706

Wed Jul  5 19:06:35 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>

	* [controls/scroll.c]
	Fixed drawing bug that caused part of a non-client scroll bar
	to be painted even when the scroll-bar was hidden.

	* [debugger/break.c] [debugger/dbg.y]
	Rewrote breakpoint handling to work in 16-bit mode.
	Implemented single-stepping ('step' and 'next' instructions).

	* [debugger/debug.l]
	Format specifier is now a separate token.
	Entering an empty line at the debugger prompt causes the previous
	command to be repeated, like under gdb.
	
	* [debugger/debug.l] [debugger/registers.c]
	Differentiate 16-bit and 32-bit registers without taking current
	mode into account ($eax is always 32-bit, $ax always 16-bit).

	* [debugger/stack.c]
	Fixed stack information routines to differentiate between 16-bit
	and 32-bit stacks.

	* [loader/task.c]
	Option -debug now sets a breakpoint at the first instruction of
	every loaded task.

	* [miscemu/instr.c]
	Added handling of lock, repe and repne prefixes.

	* [objects/dib.c]
	Changed StretchDIBits() to do the correct thing, even if it's still
	not really optimal.

	* [windows/graphics.c]
	Fixes in RoundRect(), thanks to Babak Masalehdan.

	* [windows/message.c]
	Tried to fix mouse event handling with respect to disabled
	windows.

	* [windows/painting.c]
	Clear WIN_NEEDS_NCPAINT flag before sending WM_NCPAINT to avoid
	infinite loops.

	* [windows/win.c]
	Fixed IsWindowVisible() to return FALSE when one of the parent
	windows is hidden.

Sat Jul  1 22:08:21 1995   Martin von Loewis <loewis@informatik.hu-berlin.de>

	* [if1632/compobj.spec][misc/compobj.c]
	CoGetMalloc: New function
	Added relay entries for COMPOBJ ordinals above 100
	CoInitialize: Changed parameter to DWORD

	* [if1632/ole2.spec]
	Exported implementation of OleBuildVersion

	* [if1632/ole2disp.spec][misc/ole2disp.c][misc/Imakefile]
	ole2disp.c: New file
	SysAllocString, SysReallocString, SysAllocStringLen,
	SysReAllocStringLen, SysFreeString, SysStringLen: new functions

	* [if1632/ole2nls.spec][include/winnls.h][misc/ole2nls.c]
	CompareStringA: New function

Thu Jun 29 19:42:02 1995  Marcus Meissner  <msmeissn@faui01.informatik.uni-erlangen.de>
	* [objects/font.c] [if1632/gdi.spec]
	New stubs for CreateScalableFontResource, GetGlyphOutline.

Thu Jun 29 13:47:08 GMT 1995  Göran Thyni  (goran@norrsken.bildbasen.se)

	* [misc/commdlg.c]
	Extensive changes and bug fixes to FileDialog handling,
        behaves more like native Windows.

Wed Jun 28 13:04:44 1995   Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>

        * [controls/listbox.c] [controls/combo.c]
	Some minor optimizations.
	
	* [memory/local.c]
	LOCAL_FindFreeBlock(): Never use the last one.
	
	* [memory/global.c]
	GlobalReAlloc(): GMEM_MODIFY must not be ignored when size==0.
	
	* [misc/file.c]
	read() returns an error when length==0. This is not what Windows
	programs expect, so pay attention to this in _lread(). Changed this
	in _lwrite(), _hread(), _hwrite(), too.

	* [loader/resource.c]
	LoadIcon(): Ignore bih->biSizeImage, some icons have wrong values in
	there.
	
	* [if1632/shell.spec] [misc/shell.c]
	Wrong spec file entries caused havoc: HKEY has 32 bit, not 16.
	Accept some more combinations of parameters in the Reg..() functions.
	
	* [if1632/toolhelp.spec]
	Make InterruptRegister() and InterruptUnregister() return false.

	* [windows/hook.c]
	CallNextHookEx() used to crash when called with a null hhook. Fixed.

Wed Jun 28 10:14:34 1995  Martin von Loewis  <martin@informatik.hu-berlin.de>

	* [include/neexe.h][loader/ne_image.c]
	NE_LoadSegment: Detect iterated segments

	* [misc/ole2nls.c]
	LOCALE_SLONGDATE: fixed typo

	* [miscemu/int5c.c]
	Reordered include files to avoid conflicts with Linux libc.5.1

	* [rc/winerc.c]
	Added -b option to process binary resource files into C arrays

	* [include/callback.h]
	CallWndProc: Added dummy ds parameter for libwine

	* [include/gdi.h][include/user.h]
	USER_HEAP_ALLOC, GDI_HEAP_ALLOC: dropped flags parameter

	* [include/ldt.h][include/stackframe.h]
	defined segment conversion macros for libwine

	* [misc/atom.c]
	Defined USER_HeapSel for libwine

	* [misc/main.c]
	Disable -dll option for libwine

	* [misc/user.c]
	removed GetFreeSystemResources, SystemHeapInfo from libwine for now

	* [toolkit/heap.c]
	fixed LocalLock prototype

	* [toolkit/sup.c]
	sync'ed load_mz_header, load_ne_header with structures

	* [toolkit/winmain.c]
	Disabled resource DLLs for libwine for now

Mon Jun 26 19:30:24 1995  Hans de Graaff  (graaff@twi72.twi.tudelft.nl)

	* [misc/main.c]
	Fixed -enhanced option to report a 386 CPU instead of a 286.

Fri Jun 23 23:18:25 1995  Marcus Meissner  <msmeissn@faui01.informatik.uni-erlangen.de>

	* [misc/dos_fs.c]
	Remove maximum open dosdirent limit (fixing the winfile.exe
 	problem) by using telldir()/seekdir().
	
Fri Jun 23 13:42:25 1995  Hans de Graaff  (graaff@twi72.twi.tudelft.nl)

	* [misc/profile.c]
	Fixed problem parsing empty lines within sections in .ini files.
diff --git a/controls/combo.c b/controls/combo.c
index abf7abb..1967926 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -29,100 +29,6 @@
   * I hope no programs rely on the implementation of combos.
   */
 
-static LONG CBNCCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBDestroy( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBChar( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBSetFont( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBSetRedraw( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBSetFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBResetContent( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBDir( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBAddString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBGetLBText( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBInsertString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBDeleteString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBFindString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBGetCount( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBGetCurSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBGetItemData( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBGetItemHeight( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBGetLBTextLen( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBSelectString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBSetItemData( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBSetCurSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBSetItemHeight( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBShowDropDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-
-static LONG CBLCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLChar( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLActivate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLLButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLMouseMove( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG CBLVScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-
-typedef struct {
-  WORD   message;
-  LONG  (*handler)(HWND, WORD, WPARAM, LPARAM);
-} msg_tbl;
-
-static msg_tbl combo_tbl[] = {
-  {WM_NCCREATE, CBNCCreate},
-  {WM_CREATE, CBCreate},
-  {WM_DESTROY, CBDestroy},
-  {WM_GETDLGCODE, CBGetDlgCode},
-  {WM_KEYDOWN, CBKeyDown},
-  {WM_CHAR, CBChar},
-  {WM_SETFONT, CBSetFont},
-  {WM_SETREDRAW, CBSetRedraw},
-  {WM_PAINT, CBPaint},
-  {WM_LBUTTONDOWN, CBLButtonDown},
-  {WM_SETFOCUS, CBSetFocus},
-  {WM_KILLFOCUS, CBKillFocus},
-  {CB_RESETCONTENT, CBResetContent},
-  {CB_DIR, CBDir},
-  {CB_ADDSTRING, CBAddString},
-  {CB_INSERTSTRING, CBInsertString},
-  {CB_DELETESTRING, CBDeleteString},
-  {CB_FINDSTRING, CBFindString},
-  {CB_GETCOUNT, CBGetCount},
-  {CB_GETCURSEL, CBGetCurSel},
-  {CB_GETITEMDATA, CBGetItemData},
-  {CB_GETITEMHEIGHT, CBGetItemHeight},
-  {CB_GETLBTEXT, CBGetLBText},
-  {CB_GETLBTEXTLEN, CBGetLBTextLen},
-  {CB_SELECTSTRING, CBSelectString},
-  {CB_SETITEMDATA, CBSetItemData},
-  {CB_SETCURSEL, CBSetCurSel},
-  {CB_SETITEMHEIGHT, CBSetItemHeight},
-  {CB_SHOWDROPDOWN, CBShowDropDown}
-    
-};
-
-static msg_tbl clbox_tbl[] = {
-  {WM_CREATE, CBLCreate},
-  {WM_GETDLGCODE, CBLGetDlgCode},
-  {WM_KEYDOWN, CBLKeyDown},
-  {WM_CHAR, CBLChar},
-  {WM_PAINT, CBLPaint},
-  {WM_KILLFOCUS, CBLKillFocus},
-  {WM_ACTIVATE, CBLActivate},
-  {WM_LBUTTONDOWN, CBLLButtonDown},
-  {WM_LBUTTONUP, CBLLButtonUp},
-  {WM_MOUSEMOVE, CBLMouseMove},
-  {WM_VSCROLL, CBLVScroll}
-};
-
 static HBITMAP hComboBit = 0;
 static WORD CBitHeight, CBitWidth;
 
@@ -174,7 +80,7 @@
 /***********************************************************************
  *           CBNCCreate
  */
-static LONG CBNCCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBNCCreate(HWND hwnd, WORD wParam, LONG lParam)
 {
   CREATESTRUCT *createStruct;
 
@@ -185,14 +91,14 @@
   SetWindowLong(hwnd, GWL_STYLE, createStruct->style);
 
   dprintf_combo(stddeb,"ComboBox WM_NCCREATE!\n");
-  return DefWindowProc(hwnd, message, wParam, lParam);
+  return DefWindowProc(hwnd, WM_NCCREATE, wParam, lParam);
 
 }
 
 /***********************************************************************
  *           CBCreate
  */
-static LONG CBCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBCreate(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl;
   LPHEADCOMBO  lphc;
@@ -268,7 +174,7 @@
 /***********************************************************************
  *           CBDestroy
  */
-static LONG CBDestroy(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBDestroy(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
 
@@ -281,7 +187,7 @@
 /***********************************************************************
  *           CBPaint
  */
-static LONG CBPaint(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBPaint(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@@ -324,7 +230,7 @@
     height = lpls->mis.itemHeight;
     rect.bottom = rect.top + height;
 
-    if (OWNER_DRAWN(lphl)) {
+    if (lphl->OwnerDrawn) {
       ListBoxDrawItem (hwnd, lphl, hdc, lpls, &rect, ODA_DRAWENTIRE, 0);
     } else {
       ListBoxDrawItem (hwnd, lphl, hdc, lpls, &rect, ODA_DRAWENTIRE, 0);
@@ -340,7 +246,7 @@
 /***********************************************************************
  *           CBGetDlgCode
  */
-static LONG CBGetDlgCode(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBGetDlgCode(HWND hwnd, WORD wParam, LONG lParam)
 {
   return DLGC_WANTARROWS | DLGC_WANTCHARS;
 }
@@ -348,7 +254,7 @@
 /***********************************************************************
  *           CBLButtonDown
  */
-static LONG CBLButtonDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
   SendMessage(hwnd,CB_SHOWDROPDOWN,!lphc->DropDownVisible,0);
@@ -358,7 +264,7 @@
 /***********************************************************************
  *           CBKeyDown
  */
-static LONG CBKeyDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   WORD       newFocused = lphl->ItemFocused;
@@ -397,7 +303,7 @@
 /***********************************************************************
  *           CBChar
  */
-static LONG CBChar(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBChar(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   WORD       newFocused;
@@ -422,7 +328,7 @@
 /***********************************************************************
  *           CBKillFocus
  */
-static LONG CBKillFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
 {
   return 0;
 }
@@ -430,7 +336,7 @@
 /***********************************************************************
  *           CBSetFocus
  */
-static LONG CBSetFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
 {
   return 0;
 }
@@ -438,7 +344,7 @@
 /***********************************************************************
  *           CBResetContent
  */
-static LONG CBResetContent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBResetContent(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@@ -451,7 +357,7 @@
 /***********************************************************************
  *           CBDir
  */
-static LONG CBDir(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBDir(HWND hwnd, WORD wParam, LONG lParam)
 {
   WORD wRet;
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
@@ -465,13 +371,13 @@
 /***********************************************************************
  *           CBInsertString
  */
-static LONG CBInsertString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBInsertString(HWND hwnd, WORD wParam, LONG lParam)
 {
   WORD  wRet;
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
 
-  if (HasStrings(lphl))
+  if (lphl->HasStrings)
     wRet = ListBoxInsertString(lphl, wParam, (LPSTR)PTR_SEG_TO_LIN(lParam));
   else
     wRet = ListBoxInsertString(lphl, wParam, (LPSTR)lParam);
@@ -483,13 +389,13 @@
 /***********************************************************************
  *           CBAddString
  */
-static LONG CBAddString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBAddString(HWND hwnd, WORD wParam, LONG lParam)
 {
   WORD  wRet;
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
 
-  if (HasStrings(lphl))
+  if (lphl->HasStrings)
     wRet = ListBoxAddString(lphl, (LPSTR)PTR_SEG_TO_LIN(lParam));
   else
     wRet = ListBoxAddString(lphl, (LPSTR)lParam);
@@ -501,7 +407,7 @@
 /***********************************************************************
  *           CBDeleteString
  */
-static LONG CBDeleteString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBDeleteString(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@@ -514,7 +420,7 @@
 /***********************************************************************
  *           CBSelectString
  */
-static LONG CBSelectString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBSelectString(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   WORD  wRet;
@@ -529,7 +435,7 @@
 /***********************************************************************
  *           CBFindString
  */
-static LONG CBFindString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBFindString(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxFindString(lphl, wParam, lParam);
@@ -538,7 +444,7 @@
 /***********************************************************************
  *           CBGetCount
  */
-static LONG CBGetCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBGetCount(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return lphl->ItemsCount;
@@ -547,7 +453,7 @@
 /***********************************************************************
  *           CBSetCurSel
  */
-static LONG CBSetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBSetCurSel(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   WORD  wRet;
@@ -563,7 +469,7 @@
 /***********************************************************************
  *           CBGetCurSel
  */
-static LONG CBGetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBGetCurSel(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return lphl->ItemFocused;
@@ -572,7 +478,7 @@
 /***********************************************************************
  *           CBGetItemHeight
  */
-static LONG CBGetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBGetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPLISTSTRUCT lpls = ListBoxGetItem (lphl, wParam);
@@ -584,7 +490,7 @@
 /***********************************************************************
  *           CBSetItemHeight
  */
-static LONG CBSetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBSetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxSetItemHeight(lphl, wParam, lParam);
@@ -593,7 +499,7 @@
 /***********************************************************************
  *           CBSetRedraw
  */
-static LONG CBSetRedraw(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   lphl->bRedrawFlag = wParam;
@@ -603,7 +509,7 @@
 /***********************************************************************
  *           CBSetFont
  */
-static LONG CBSetFont(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBSetFont(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST  lphl = ComboGetListHeader(hwnd);
 
@@ -618,19 +524,19 @@
 /***********************************************************************
  *           CBGetLBTextLen
  */
-static LONG CBGetLBTextLen(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBGetLBTextLen(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl = ComboGetListHeader(hwnd);
   LPLISTSTRUCT lpls = ListBoxGetItem(lphl,wParam);
 
-  if (lpls == NULL || !HasStrings(lphl)) return LB_ERR;
+  if (lpls == NULL || !lphl->HasStrings) return LB_ERR;
   return strlen(lpls->itemText);
 }
 
 /***********************************************************************
  *           CBGetLBText
  */
-static LONG CBGetLBText(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBGetLBText(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxGetText(lphl, wParam, (LPSTR)PTR_SEG_TO_LIN(lParam));
@@ -639,7 +545,7 @@
 /***********************************************************************
  *           CBGetItemData
  */
-static LONG CBGetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBGetItemData(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxGetItemData(lphl, wParam);
@@ -648,7 +554,7 @@
 /***********************************************************************
  *           CBSetItemData
  */
-static LONG CBSetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBSetItemData(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxSetItemData(lphl, wParam, lParam);
@@ -657,7 +563,7 @@
 /***********************************************************************
  *           CBShowDropDown
  */
-static LONG CBShowDropDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG CBShowDropDown(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
   RECT rect;
@@ -681,16 +587,38 @@
  */
 LONG ComboBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
 {
-  int idx = 0;
-  int table_size = sizeof (combo_tbl) / sizeof (msg_tbl);
-
-  while (idx < table_size) {
-    if (message == combo_tbl[idx].message) {
-      return (*(combo_tbl[idx].handler))(hwnd, message, wParam, lParam);
+    switch(message) {	
+     case WM_NCCREATE: return CBNCCreate(hwnd, wParam, lParam);
+     case WM_CREATE: return CBCreate(hwnd, wParam, lParam);
+     case WM_DESTROY: return CBDestroy(hwnd, wParam, lParam);
+     case WM_GETDLGCODE: return CBGetDlgCode(hwnd, wParam, lParam);
+     case WM_KEYDOWN: return CBKeyDown(hwnd, wParam, lParam);
+     case WM_CHAR: return CBChar(hwnd, wParam, lParam);
+     case WM_SETFONT: return CBSetFont(hwnd, wParam, lParam);
+     case WM_SETREDRAW: return CBSetRedraw(hwnd, wParam, lParam);
+     case WM_PAINT: return CBPaint(hwnd, wParam, lParam);
+     case WM_LBUTTONDOWN: return CBLButtonDown(hwnd, wParam, lParam);
+     case WM_SETFOCUS: return CBSetFocus(hwnd, wParam, lParam);
+     case WM_KILLFOCUS: return CBKillFocus(hwnd, wParam, lParam);
+     case CB_RESETCONTENT: return CBResetContent(hwnd, wParam, lParam);
+     case CB_DIR: return CBDir(hwnd, wParam, lParam);
+     case CB_ADDSTRING: return CBAddString(hwnd, wParam, lParam);
+     case CB_INSERTSTRING: return CBInsertString(hwnd, wParam, lParam);
+     case CB_DELETESTRING: return CBDeleteString(hwnd, wParam, lParam);
+     case CB_FINDSTRING: return CBFindString(hwnd, wParam, lParam);
+     case CB_GETCOUNT: return CBGetCount(hwnd, wParam, lParam);
+     case CB_GETCURSEL: return CBGetCurSel(hwnd, wParam, lParam);
+     case CB_GETITEMDATA: return CBGetItemData(hwnd, wParam, lParam);
+     case CB_GETITEMHEIGHT: return CBGetItemHeight(hwnd, wParam, lParam);
+     case CB_GETLBTEXT: return CBGetLBText(hwnd, wParam, lParam);
+     case CB_GETLBTEXTLEN: return CBGetLBTextLen(hwnd, wParam, lParam);
+     case CB_SELECTSTRING: return CBSelectString(hwnd, wParam, lParam);
+     case CB_SETITEMDATA: return CBSetItemData(hwnd, wParam, lParam);
+     case CB_SETCURSEL: return CBSetCurSel(hwnd, wParam, lParam);
+     case CB_SETITEMHEIGHT: return CBSetItemHeight(hwnd, wParam, lParam);
+     case CB_SHOWDROPDOWN: return CBShowDropDown(hwnd, wParam, lParam);
     }
-    idx++;
-  }
-  return DefWindowProc (hwnd, message, wParam, lParam);
+    return DefWindowProc(hwnd, message, wParam, lParam);
 }
 
 /*--------------------------------------------------------------------*/
@@ -709,7 +637,7 @@
 /***********************************************************************
  *           CBLCreate
  */
-static LONG CBLCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLCreate( HWND hwnd, WORD wParam, LONG lParam )
 {
   CREATESTRUCT *createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
   SetWindowWord(hwnd,0,LOWORD(createStruct->lpCreateParams));
@@ -719,7 +647,7 @@
 /***********************************************************************
  *           CBLGetDlgCode
  */
-static LONG CBLGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLGetDlgCode( HWND hwnd, WORD wParam, LONG lParam )
 {
   return DLGC_WANTARROWS | DLGC_WANTCHARS;
 }
@@ -727,7 +655,7 @@
 /***********************************************************************
  *           CBLKeyDown
  */
-static LONG CBLKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam ) 
+static LONG CBLKeyDown( HWND hwnd, WORD wParam, LONG lParam ) 
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
   WORD newFocused = lphl->ItemFocused;
@@ -775,7 +703,7 @@
 /***********************************************************************
  *           CBLChar
  */
-static LONG CBLChar( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLChar( HWND hwnd, WORD wParam, LONG lParam )
 {
   return 0;
 }
@@ -783,7 +711,7 @@
 /***********************************************************************
  *           CBLPaint
  */
-static LONG CBLPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLPaint( HWND hwnd, WORD wParam, LONG lParam )
 {
   LPHEADLIST   lphl = CLBoxGetListHeader(hwnd);
   LPLISTSTRUCT lpls;
@@ -828,7 +756,7 @@
       lpls->itemRect.right  = rect.right;
 
       dprintf_listbox(stddeb,"drawing item: %d %d %d %d %d\n",rect.left,top,rect.right,top+height,lpls->itemState);
-      if (OWNER_DRAWN(lphl)) {
+      if (lphl->OwnerDrawn) {
 	ListBoxDrawItem (combohwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0);
 	if (lpls->itemState)
 	  ListBoxDrawItem (combohwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_SELECT, ODS_SELECTED);
@@ -854,7 +782,7 @@
 /***********************************************************************
  *           CBLKillFocus
  */
-static LONG CBLKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLKillFocus( HWND hwnd, WORD wParam, LONG lParam )
 {
 /*  SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);*/
   return 0;
@@ -863,7 +791,7 @@
 /***********************************************************************
  *           CBLActivate
  */
-static LONG CBLActivate( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLActivate( HWND hwnd, WORD wParam, LONG lParam )
 {
   if (wParam == WA_INACTIVE)
     SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
@@ -873,7 +801,7 @@
 /***********************************************************************
  *           CBLLButtonDown
  */
-static LONG CBLLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLLButtonDown( HWND hwnd, WORD wParam, LONG lParam )
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
   int        y;
@@ -898,7 +826,7 @@
 /***********************************************************************
  *           CBLLButtonUp
  */
-static LONG CBLLButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLLButtonUp( HWND hwnd, WORD wParam, LONG lParam )
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
 
@@ -916,7 +844,7 @@
 /***********************************************************************
  *           CBLMouseMove
  */
-static LONG CBLMouseMove( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLMouseMove( HWND hwnd, WORD wParam, LONG lParam )
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
   int  y;
@@ -959,7 +887,7 @@
 /***********************************************************************
  *           CBLVScroll
  */
-static LONG CBLVScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+static LONG CBLVScroll( HWND hwnd, WORD wParam, LONG lParam )
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
   int  y;
@@ -1009,16 +937,20 @@
  */
 LONG ComboLBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
 {
-  int idx = 0;
-  int table_size = sizeof (clbox_tbl) / sizeof (msg_tbl);
-
-  while (idx < table_size) {
-    if (message == clbox_tbl[idx].message) {
-      return (*(clbox_tbl[idx].handler))(hwnd, message, wParam, lParam);
+    switch(message) {	
+     case WM_CREATE: return CBLCreate(hwnd, wParam, lParam);
+     case WM_GETDLGCODE: return CBLGetDlgCode(hwnd, wParam, lParam);
+     case WM_KEYDOWN: return CBLKeyDown(hwnd, wParam, lParam);
+     case WM_CHAR: return CBLChar(hwnd, wParam, lParam);
+     case WM_PAINT: return CBLPaint(hwnd, wParam, lParam);
+     case WM_KILLFOCUS: return CBLKillFocus(hwnd, wParam, lParam);
+     case WM_ACTIVATE: return CBLActivate(hwnd, wParam, lParam);
+     case WM_LBUTTONDOWN: return CBLLButtonDown(hwnd, wParam, lParam);
+     case WM_LBUTTONUP: return CBLLButtonUp(hwnd, wParam, lParam);
+     case WM_MOUSEMOVE: return CBLMouseMove(hwnd, wParam, lParam);
+     case WM_VSCROLL: return CBLVScroll(hwnd, wParam, lParam);
     }
-    idx++;
-  }
-  return DefWindowProc (hwnd, message, wParam, lParam);
+    return DefWindowProc(hwnd, message, wParam, lParam);
 }
 
 /************************************************************************
diff --git a/controls/listbox.c b/controls/listbox.c
index a2518b6..d1fc9ac 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -40,120 +40,6 @@
 
 #define LIST_HEAP_SIZE 0x10000
 
-/* Design notes go here */
-
-static LONG LBCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBDestroy( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBVScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBHScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBLButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBRButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBMouseMove( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBChar( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetFont( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetRedraw( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBResetContent( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBDir( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBAddString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetText( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBInsertString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBDeleteString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBFindString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetCaretIndex( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetCount( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetCurSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetItemData( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetItemHeight( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetItemRect( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetSelCount( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetSelItems( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetTextLen( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBGetTopIndex( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSelectString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSelItemRange( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetCaretIndex( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetColumnWidth( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetItemData( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetTabStops( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetCurSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetTopIndex( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-static LONG LBSetItemHeight( HWND hwnd, WORD message, WORD wParam, LONG lParam );
-
-typedef struct {
-  WORD   message;
-  LONG  (*handler)(HWND, WORD, WPARAM, LPARAM);
-} msg_tbl;
-
-static msg_tbl methods[] = {
-  {WM_CREATE, LBCreate},
-  {WM_DESTROY, LBDestroy},
-  {WM_GETDLGCODE, LBGetDlgCode},
-  {WM_VSCROLL, LBVScroll},
-  {WM_HSCROLL, LBHScroll},
-  {WM_LBUTTONDOWN, LBLButtonDown},
-  {WM_LBUTTONUP, LBLButtonUp},
-  {WM_RBUTTONUP, LBRButtonUp},
-  {WM_LBUTTONDBLCLK, LBRButtonUp},
-  {WM_MOUSEMOVE, LBMouseMove},
-  {WM_KEYDOWN, LBKeyDown},
-  {WM_CHAR, LBChar},
-  {WM_SETFONT, LBSetFont},
-  {WM_SETREDRAW, LBSetRedraw},
-  {WM_PAINT, LBPaint},
-  {WM_SETFOCUS, LBSetFocus},
-  {WM_KILLFOCUS, LBKillFocus},
-  {LB_RESETCONTENT, LBResetContent},
-  {LB_DIR, LBDir},
-  {LB_ADDSTRING, LBAddString},
-  {LB_INSERTSTRING, LBInsertString},
-  {LB_DELETESTRING, LBDeleteString},
-  {LB_FINDSTRING, LBFindString},
-  {LB_GETCARETINDEX, LBGetCaretIndex},
-  {LB_GETCOUNT, LBGetCount},
-  {LB_GETCURSEL, LBGetCurSel},
-  {LB_GETHORIZONTALEXTENT, LBGetHorizontalExtent},
-  {LB_GETITEMDATA, LBGetItemData},
-  {LB_GETITEMHEIGHT, LBGetItemHeight},
-  {LB_GETITEMRECT, LBGetItemRect},
-  {LB_GETSEL, LBGetSel},
-  {LB_GETSELCOUNT, LBGetSelCount},
-  {LB_GETSELITEMS, LBGetSelItems},
-  {LB_GETTEXT, LBGetText},
-  {LB_GETTEXTLEN, LBGetTextLen},
-  {LB_GETTOPINDEX, LBGetTopIndex},
-  {LB_SELECTSTRING, LBSelectString},
-  {LB_SELITEMRANGE, LBSelItemRange},
-  {LB_SETCARETINDEX, LBSetCaretIndex},
-  {LB_SETCOLUMNWIDTH, LBSetColumnWidth},
-  {LB_SETHORIZONTALEXTENT, LBSetHorizontalExtent},
-  {LB_SETITEMDATA, LBSetItemData},
-  {LB_SETTABSTOPS, LBSetTabStops},
-  {LB_SETCURSEL, LBSetCurSel},
-  {LB_SETSEL, LBSetSel},
-  {LB_SETTOPINDEX, LBSetTopIndex},
-  {LB_SETITEMHEIGHT, LBSetItemHeight}
-};
-
-BOOL OWNER_DRAWN(LPHEADLIST lphl)
-{
-  return lphl->dwStyle & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
-}
-
-BOOL HasStrings(LPHEADLIST lphl)
-{
-  return (lphl->dwStyle & LBS_HASSTRINGS) || !OWNER_DRAWN(lphl);
-}
-
 static void ListBoxInitialize(LPHEADLIST lphl)
 {
   lphl->lpFirst        = NULL;
@@ -187,8 +73,10 @@
   lphl->hParent        = parent;
   lphl->StdItemHeight  = 15; /* FIXME: should get the font height */
   lphl->dwStyle        = styles;
+  lphl->OwnerDrawn     = styles & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
+  lphl->HasStrings     = (styles & LBS_HASSTRINGS) || !lphl->OwnerDrawn;
 
-  if (OWNER_DRAWN(lphl)) {
+  if (lphl->OwnerDrawn) {
     LISTSTRUCT dummyls;
     
     lphl->hDrawItemStruct = USER_HEAP_ALLOC(sizeof(DRAWITEMSTRUCT));
@@ -302,7 +190,7 @@
 void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls, 
 		      RECT *rect, WORD itemAction, WORD itemState)
 {
-  if (OWNER_DRAWN(lphl)) {
+  if (lphl->OwnerDrawn) {
     DRAWITEMSTRUCT   *dis = USER_HEAP_LIN_ADDR(lphl->hDrawItemStruct);
 
     dis->CtlID    = lpls->mis.CtlID;
@@ -446,7 +334,8 @@
   lphl->ItemsCount++;
   
   hStr = 0;
-  if (HasStrings(lphl)) {
+  if (lphl->HasStrings) {
+    dprintf_listbox(stddeb,"  string: %s\n", newstr);
     hStr = LIST_HEAP_ALLOC(lphl, LMEM_MOVEABLE, strlen(newstr) + 1);
     str = (LPSTR)LIST_HEAP_ADDR(lphl, hStr);
     if (str == NULL) return LB_ERRSPACE;
@@ -480,7 +369,7 @@
 {
     UINT pos = (UINT) -1;
     
-    if (HasStrings(lphl) && (lphl->dwStyle & LBS_SORT)) {
+    if (lphl->HasStrings && (lphl->dwStyle & LBS_SORT)) {
 	LPLISTSTRUCT lpls = lphl->lpFirst;
 	for (pos = 0; lpls != NULL; lpls = lpls->lpNext, pos++)
 	    if (strcmp(lpls->itemText, newstr) >= 0)
@@ -502,7 +391,7 @@
   lpls = ListBoxGetItem (lphl, uIndex);
   if (lpls == NULL) return LB_ERR;
 
-  if (!HasStrings(lphl)) {
+  if (!lphl->HasStrings) {
     *((long *)OutStr) = lpls->mis.itemData;
     return 4;
   }
@@ -578,12 +467,12 @@
 
   if (First > lphl->ItemsCount) return LB_ERR;
 
-  if (HasStrings(lphl)) lpMatchStr = PTR_SEG_TO_LIN(MatchStr);
+  if (lphl->HasStrings) lpMatchStr = PTR_SEG_TO_LIN(MatchStr);
   
   lpls = ListBoxGetItem(lphl, First);
   Count = 0;
   while(lpls != NULL) {
-    if (HasStrings(lphl)) {
+    if (lphl->HasStrings) {
       if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
     } else if (lphl->dwStyle & LBS_SORT) {
       /* XXX Do a compare item */
@@ -600,7 +489,7 @@
   lpls = lphl->lpFirst;
 
   while (Count < First) {
-    if (HasStrings(lphl)) {
+    if (lphl->HasStrings) {
       if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
     } else if (lphl->dwStyle & LBS_SORT) {
       /* XXX Do a compare item */
@@ -794,7 +683,7 @@
   UINT	       count,first;
 
   if ((char)wChar < ' ') return LB_ERR;
-  if (!HasStrings(lphl)) return LB_ERR;
+  if (!lphl->HasStrings) return LB_ERR;
 
   lpls = lphl->lpFirst;
   
@@ -815,7 +704,7 @@
 /***********************************************************************
  *           LBCreate
  */
-static LONG LBCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBCreate(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl;
   RECT rect;
@@ -836,7 +725,7 @@
 /***********************************************************************
  *           LBDestroy
  */
-static LONG LBDestroy(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBDestroy(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -850,7 +739,7 @@
 /***********************************************************************
  *           LBVScroll
  */
-static LONG LBVScroll(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBVScroll(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   int  y;
@@ -899,7 +788,7 @@
 /***********************************************************************
  *           LBHScroll
  */
-static LONG LBHScroll(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBHScroll(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl;
   int        y;
@@ -956,7 +845,7 @@
 /***********************************************************************
  *           LBLButtonDown
  */
-static LONG LBLButtonDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   WORD       wRet;
@@ -992,7 +881,7 @@
 /***********************************************************************
  *           LBLButtonUp
  */
-static LONG LBLButtonUp(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBLButtonUp(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -1007,7 +896,7 @@
 /***********************************************************************
  *           LBRButtonUp
  */
-static LONG LBRButtonUp(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBRButtonUp(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -1020,7 +909,7 @@
 /***********************************************************************
  *           LBMouseMove
  */
-static LONG LBMouseMove(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   int  y;
@@ -1071,7 +960,7 @@
 /***********************************************************************
  *           LBKeyDown
  */
-static LONG LBKeyDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   WORD       newFocused = lphl->ItemFocused;
@@ -1143,7 +1032,7 @@
 /***********************************************************************
  *           LBChar
  */
-static LONG LBChar(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBChar(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   WORD       newFocused;
@@ -1169,7 +1058,7 @@
 /***********************************************************************
  *           LBSetRedraw
  */
-static LONG LBSetRedraw(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST  lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -1182,7 +1071,7 @@
 /***********************************************************************
  *           LBSetFont
  */
-static LONG LBSetFont(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetFont(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST  lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -1197,7 +1086,7 @@
 /***********************************************************************
  *           LBPaint
  */
-static LONG LBPaint(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl = ListBoxGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls;
@@ -1260,7 +1149,7 @@
       lpls->itemRect.right  = rect.right;
 
       dprintf_listbox(stddeb,"drawing item: %d %d %d %d %d\n",rect.left,top,rect.right,top+height,lpls->itemState);
-      if (OWNER_DRAWN(lphl)) {
+      if (lphl->OwnerDrawn) {
 	ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0);
 	if (lpls->itemState)
 	  ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_SELECT, ODS_SELECTED);
@@ -1286,7 +1175,7 @@
 /***********************************************************************
  *           LBSetFocus
  */
-static LONG LBSetFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
 {
   dprintf_listbox(stddeb,"ListBox WM_SETFOCUS !\n");
 
@@ -1296,7 +1185,7 @@
 /***********************************************************************
  *           LBKillFocus
  */
-static LONG LBKillFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
 {
   dprintf_listbox(stddeb,"ListBox WM_KILLFOCUS !\n");
 
@@ -1308,7 +1197,7 @@
 /***********************************************************************
  *           LBResetContent
  */
-static LONG LBResetContent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBResetContent(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -1321,7 +1210,7 @@
 /***********************************************************************
  *           LBDir
  */
-static LONG LBDir(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBDir(HWND hwnd, WORD wParam, LONG lParam)
 {
   WORD   wRet;
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@@ -1335,12 +1224,12 @@
 /***********************************************************************
  *           LBAddString
  */
-static LONG LBAddString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBAddString(HWND hwnd, WORD wParam, LONG lParam)
 {
   WORD  wRet;
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
-  if (HasStrings(lphl))
+  if (lphl->HasStrings)
     wRet = ListBoxAddString(lphl, (LPSTR)PTR_SEG_TO_LIN(lParam));
   else
     wRet = ListBoxAddString(lphl, (LPSTR)lParam);
@@ -1352,7 +1241,7 @@
 /***********************************************************************
  *           LBGetText
  */
-static LONG LBGetText(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetText(HWND hwnd, WORD wParam, LONG lParam)
 {
   LONG   wRet;
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@@ -1366,12 +1255,12 @@
 /***********************************************************************
  *           LBInsertString
  */
-static LONG LBInsertString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBInsertString(HWND hwnd, WORD wParam, LONG lParam)
 {
   WORD  wRet;
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
-  if (HasStrings(lphl))
+  if (lphl->HasStrings)
     wRet = ListBoxInsertString(lphl, wParam, (LPSTR)PTR_SEG_TO_LIN(lParam));
   else
     wRet = ListBoxInsertString(lphl, wParam, (LPSTR)lParam);
@@ -1383,7 +1272,7 @@
 /***********************************************************************
  *           LBDeleteString
  */
-static LONG LBDeleteString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBDeleteString(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   LONG lRet = ListBoxDeleteString(lphl,wParam);
@@ -1395,7 +1284,7 @@
 /***********************************************************************
  *           LBFindString
  */
-static LONG LBFindString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBFindString(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   return ListBoxFindString(lphl, wParam, lParam);
@@ -1404,7 +1293,7 @@
 /***********************************************************************
  *           LBGetCaretIndex
  */
-static LONG LBGetCaretIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetCaretIndex(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   return lphl->ItemFocused;
@@ -1413,7 +1302,7 @@
 /***********************************************************************
  *           LBGetCount
  */
-static LONG LBGetCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetCount(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST  lphl;
 
@@ -1424,7 +1313,7 @@
 /***********************************************************************
  *           LBGetCurSel
  */
-static LONG LBGetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetCurSel(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST  lphl;
 
@@ -1437,7 +1326,7 @@
 /***********************************************************************
  *           LBGetHorizontalExtent
  */
-static LONG LBGetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetHorizontalExtent(HWND hwnd, WORD wParam, LONG lParam)
 {    
   return 0;
 }
@@ -1445,7 +1334,7 @@
 /***********************************************************************
  *           LBGetItemHeight
  */
-static LONG LBGetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls = ListBoxGetItem (lphl, wParam);
@@ -1457,7 +1346,7 @@
 /***********************************************************************
  *           LBGetItemRect
  */
-static LONG LBGetItemRect(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetItemRect(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   return ListBoxGetItemRect(lphl, wParam, PTR_SEG_TO_LIN(lParam));
@@ -1466,7 +1355,7 @@
 /***********************************************************************
  *           LBGetSel
  */
-static LONG LBGetSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetSel(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   return ListBoxGetSel(lphl, wParam);
@@ -1475,7 +1364,7 @@
 /***********************************************************************
  *           LBGetSelCount
  */
-static LONG LBGetSelCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetSelCount(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls;
@@ -1497,7 +1386,7 @@
 /***********************************************************************
  *           LBGetSelItems
  */
-static LONG LBGetSelItems(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetSelItems(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST  lphl = ListBoxGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls;
@@ -1525,19 +1414,19 @@
 /***********************************************************************
  *           LBGetTextLen
  */
-static LONG LBGetTextLen(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetTextLen(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl = ListBoxGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls = ListBoxGetItem(lphl,wParam);
 
-  if (lpls == NULL || !HasStrings(lphl)) return LB_ERR;
+  if (lpls == NULL || !lphl->HasStrings) return LB_ERR;
   return strlen(lpls->itemText);
 }
 
 /***********************************************************************
  *           LBGetDlgCode
  */
-static LONG LBGetDlgCode(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetDlgCode(HWND hwnd, WORD wParam, LONG lParam)
 {
   return DLGC_WANTARROWS | DLGC_WANTCHARS;
 }
@@ -1545,7 +1434,7 @@
 /***********************************************************************
  *           LBGetTopIndex
  */
-static LONG LBGetTopIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetTopIndex(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -1556,7 +1445,7 @@
 /***********************************************************************
  *           LBSelectString
  */
-static LONG LBSelectString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSelectString(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   WORD  wRet;
@@ -1571,7 +1460,7 @@
 /***********************************************************************
  *           LBSelItemRange
  */
-static LONG LBSelItemRange(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSelItemRange(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl = ListBoxGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls;
@@ -1604,7 +1493,7 @@
 /***********************************************************************
  *           LBSetCaretIndex
  */
-static LONG LBSetCaretIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetCaretIndex(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -1622,7 +1511,7 @@
 /***********************************************************************
  *           LBSetColumnWidth
  */
-static LONG LBSetColumnWidth(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetColumnWidth(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   lphl->ColumnsWidth = wParam;
@@ -1633,7 +1522,7 @@
 /***********************************************************************
  *           LBSetHorizontalExtent
  */
-static LONG LBSetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetHorizontalExtent(HWND hwnd, WORD wParam, LONG lParam)
 {
   return 0;
 }
@@ -1641,7 +1530,7 @@
 /***********************************************************************
  *           LBGetItemData
  */
-static LONG LBGetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBGetItemData(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   dprintf_listbox(stddeb, "LB_GETITEMDATA wParam=%x\n", wParam);
@@ -1651,7 +1540,7 @@
 /***********************************************************************
  *           LBSetItemData
  */
-static LONG LBSetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetItemData(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   dprintf_listbox(stddeb, "LB_SETITEMDATA  wParam=%x  lParam=%lx\n", wParam, lParam);
@@ -1661,7 +1550,7 @@
 /***********************************************************************
  *           LBSetTabStops
  */
-static LONG LBSetTabStops(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetTabStops(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST  lphl;
 
@@ -1685,7 +1574,7 @@
 /***********************************************************************
  *           LBSetCurSel
  */
-static LONG LBSetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetCurSel(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   WORD  wRet;
@@ -1704,7 +1593,7 @@
 /***********************************************************************
  *           LBSetSel
  */
-static LONG LBSetSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetSel(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   WORD wRet;
@@ -1720,7 +1609,7 @@
 /***********************************************************************
  *           LBSetTopIndex
  */
-static LONG LBSetTopIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetTopIndex(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
@@ -1737,7 +1626,7 @@
 /***********************************************************************
  *           LBSetItemHeight
  */
-static LONG LBSetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+static LONG LBSetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   WORD wRet;
@@ -1753,16 +1642,57 @@
  */
 LONG ListBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
 { 
-  int idx = 0;
-  int table_size = sizeof (methods) / sizeof (msg_tbl);
-
-  while (idx < table_size) {
-    if (message == methods[idx].message) {
-      return (*(methods[idx].handler))(hwnd, message, wParam, lParam);
+    switch (message) {
+     case WM_CREATE: return LBCreate(hwnd, wParam, lParam);
+     case WM_DESTROY: return LBDestroy(hwnd, wParam, lParam);
+     case WM_GETDLGCODE: return LBGetDlgCode(hwnd, wParam, lParam);
+     case WM_VSCROLL: return LBVScroll(hwnd, wParam, lParam);
+     case WM_HSCROLL: return LBHScroll(hwnd, wParam, lParam);
+     case WM_LBUTTONDOWN: return LBLButtonDown(hwnd, wParam, lParam);
+     case WM_LBUTTONUP: return LBLButtonUp(hwnd, wParam, lParam);
+     case WM_RBUTTONUP: return LBRButtonUp(hwnd, wParam, lParam);
+     case WM_LBUTTONDBLCLK: return LBRButtonUp(hwnd, wParam, lParam);
+     case WM_MOUSEMOVE: return LBMouseMove(hwnd, wParam, lParam);
+     case WM_KEYDOWN: return LBKeyDown(hwnd, wParam, lParam);
+     case WM_CHAR: return LBChar(hwnd, wParam, lParam);
+     case WM_SETFONT: return LBSetFont(hwnd, wParam, lParam);
+     case WM_SETREDRAW: return LBSetRedraw(hwnd, wParam, lParam);
+     case WM_PAINT: return LBPaint(hwnd, wParam, lParam);
+     case WM_SETFOCUS: return LBSetFocus(hwnd, wParam, lParam);
+     case WM_KILLFOCUS: return LBKillFocus(hwnd, wParam, lParam);
+     case LB_RESETCONTENT: return LBResetContent(hwnd, wParam, lParam);
+     case LB_DIR: return LBDir(hwnd, wParam, lParam);
+     case LB_ADDSTRING: return LBAddString(hwnd, wParam, lParam);
+     case LB_INSERTSTRING: return LBInsertString(hwnd, wParam, lParam);
+     case LB_DELETESTRING: return LBDeleteString(hwnd, wParam, lParam);
+     case LB_FINDSTRING: return LBFindString(hwnd, wParam, lParam);
+     case LB_GETCARETINDEX: return LBGetCaretIndex(hwnd, wParam, lParam);
+     case LB_GETCOUNT: return LBGetCount(hwnd, wParam, lParam);
+     case LB_GETCURSEL: return LBGetCurSel(hwnd, wParam, lParam);
+     case LB_GETHORIZONTALEXTENT: return LBGetHorizontalExtent(hwnd, wParam, lParam);
+     case LB_GETITEMDATA: return LBGetItemData(hwnd, wParam, lParam);
+     case LB_GETITEMHEIGHT: return LBGetItemHeight(hwnd, wParam, lParam);
+     case LB_GETITEMRECT: return LBGetItemRect(hwnd, wParam, lParam);
+     case LB_GETSEL: return LBGetSel(hwnd, wParam, lParam);
+     case LB_GETSELCOUNT: return LBGetSelCount(hwnd, wParam, lParam);
+     case LB_GETSELITEMS: return LBGetSelItems(hwnd, wParam, lParam);
+     case LB_GETTEXT: return LBGetText(hwnd, wParam, lParam);
+     case LB_GETTEXTLEN: return LBGetTextLen(hwnd, wParam, lParam);
+     case LB_GETTOPINDEX: return LBGetTopIndex(hwnd, wParam, lParam);
+     case LB_SELECTSTRING: return LBSelectString(hwnd, wParam, lParam);
+     case LB_SELITEMRANGE: return LBSelItemRange(hwnd, wParam, lParam);
+     case LB_SETCARETINDEX: return LBSetCaretIndex(hwnd, wParam, lParam);
+     case LB_SETCOLUMNWIDTH: return LBSetColumnWidth(hwnd, wParam, lParam);
+     case LB_SETHORIZONTALEXTENT: return LBSetHorizontalExtent(hwnd, wParam, lParam);
+     case LB_SETITEMDATA: return LBSetItemData(hwnd, wParam, lParam);
+     case LB_SETTABSTOPS: return LBSetTabStops(hwnd, wParam, lParam);
+     case LB_SETCURSEL: return LBSetCurSel(hwnd, wParam, lParam);
+     case LB_SETSEL: return LBSetSel(hwnd, wParam, lParam);
+     case LB_SETTOPINDEX: return LBSetTopIndex(hwnd, wParam, lParam);
+     case LB_SETITEMHEIGHT: return LBSetItemHeight(hwnd, wParam, lParam);
     }
-    idx++;
-  }
-  return DefWindowProc (hwnd, message, wParam, lParam);
+    
+    return DefWindowProc(hwnd, message, wParam, lParam);
 }
 
 /************************************************************************
diff --git a/controls/scroll.c b/controls/scroll.c
index 1f30bee..11b8e20 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -340,9 +340,6 @@
                                  BOOL bottom_selected )
 {
     RECT r;
-    WND *wndPtr = WIN_FindWndPtr( hwnd );
-    if (((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL))
-        || ((nBar == SB_HORZ) && (!wndPtr->dwStyle & WS_HSCROLL))) return;
 
       /* Select the correct brush and pen */
 
@@ -440,9 +437,13 @@
     WORD arrowSize, thumbPos;
     RECT rect;
     BOOL vertical;
-
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
     SCROLLINFO *infoPtr = SCROLL_GetScrollInfo( hwnd, nBar );
-    if (!infoPtr) return;
+
+    if (!wndPtr || !infoPtr ||
+        ((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL)) ||
+        ((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) return;
+
     vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
                                         &arrowSize, &thumbPos );
       /* Draw the arrows */
@@ -467,9 +468,13 @@
     RECT rect;
     BOOL vertical;
     HDC hdc;
-
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
     SCROLLINFO *infoPtr = SCROLL_GetScrollInfo( hwnd, nBar );
-    if (!infoPtr) return;
+
+    if (!wndPtr || !infoPtr ||
+        ((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL)) ||
+        ((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) return;
+
     vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
                                         &arrowSize, &thumbPos );
     hdc = (nBar == SB_CTL) ? GetDC(hwnd) : GetWindowDC(hwnd);