Release 971101

Thu Oct 30 21:52:23 1997  Martin Boehme <boehme@informatik.mu-luebeck.de>

	* [windows/nonclient.c]
	Changed NC_TrackSysMenu to give the same behaviour as MS-Windows,
	i.e. system menu already appears when mouse button is depressed.
	Changed NC_HandleNCLButtonDblClk so that double clicks on scroll
	bar arrows are handled the same way as single clicks.

	* [windows/winpos.c]
	Fixed SetWindowPos32 to clear WIN_NO_REDRAW when SWP_SHOWWINDOW is
	set; this is the way MS-Windows behaves.

Thu Oct 30 21:08:57 1997  Morten Welinder  <terra@diku.dk>

	* [controls/status.c]
	In SW_SetText, fix condition, I hope.

	* [controls/menu.c]
 	(GetMenuState32): Don't mask return value. Print more debug info.
	(MENU_MenuBarCalcSize): Be more careful when printing debug
	information.
	(MENU_SetItemData): Empty strings are separators.

	* [graphics/x11drv/text.c]
	Don't prototype CLIPPING_IntersectClipRect.

	* [include/dc.h]
	Prototype CLIPPING_IntersectClipRect.

	* [objects/font.c]
	Remove non-portable (and faulty) smartness in FONT_TextMetric*to*.
	In CreateFont32W and CreateFont16, handle null font name.

	* [objects/text.c]
 	(TEXT_NextLine): Fix end-of-line bug.

	* [if1632/shell32.spec]
	Activate existing implementation of ExtractIconA.

	* [misc/shell.c]
	For Control_RunDLL, add types for parameters.

Thu Oct 30 14:54:11 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [controls/static.c] [include/windows.h] [misc/spy.c]
	Added some win32 defines to static controls, basic SS_BITMAP style
	handling implemented. [please add more, I am lacking knowledge and
	time]

	* [controls/status.c]
	part_num 255 seems to indicate whole statusline (win95 cdplayer.exe)

	* [if1632/thunk.c] [tools/build.c]
	Support lret and 0x66 lret calls for CallTo16_regs
	(needed for KERNEL32_45)
	Fixed KERNEL32_45, QT_Thunk (should work now).

	* [if1632/relay.c][if1632/builtin.c][tools/build.c][if1632/*32.spec]
	Added string dumping to relay debugging for win32 apifuncs.

	* [misc/ver.c]
	Fixed and cleaned up VerQueryValue*.

	* [multimedia/*.c][include/mmsystem.h][if1632/mmsystem.spec]
	  [if1632/winmm.spec]
	Win32 support for lowlevel multimedia functions.
	Added some mixer* lowlevel functions.
	Some small fixes in the audio lowlevel queue handling, code
	reformatting/cleanups.

	* [debugger/hash.c]
	Don't show difference between 16bit symbols if they are in
	different segments.

	* [objects/cursoricon.c]
	Added GetIconInfo (partial) and CreateIconIndirect.

	* [windows/mdi.c]
	Fixed some "bad class" problems and crashes in MDICreateChild,
	which happen in Win32 (jwp32.exe).

Wed Oct 29 00:57:27 1997  Bruce Milner  <Bruce.Milner@genetics.utah.edu>

	* [if1632/winaspi.spec] [misc/aspi.c] [include/aspi.c]
	  [documentation/aspi] [include/callback.h]
	Added support for 16 bit ASPI calls to linux generic SCSI.
	The support is not complete, but appears to run my Mustek
	scanner from within ipplus.exe.

Mon Oct 27 00:59:41 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [windows/dce.c]
	DC reuse framework.

Sun Oct 26 18:41:21 1997  Huw D M Davies <h.davies1@physics.oxford.ac.uk>

	* [graphics/x11drv/xfont.c]
	Substituted fonts are removed from the alias table. References to
	the old name are also updated.

	* [controls/combo.c]
	LB_SELECTSTRING32 not CB_SELECTSTRING32 should be sent to
	ComboLBox.

Sun Oct 26 14:25:00 1997  Nikita V. Youshchenko <yoush@cs.msu.su>

	* [include/drive.h] [files/drive.c] [msdos/int21.c]
	Partially implemented DOS drive mapping (int21 AX=440F).

Sat Oct 25 13:03:29 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [debugger/debug.l]
	Support '.' in identifiers. Use "x . y" to access structure
	fields.

	* [debugger/hash.c] [loader/pe_image.c]
	Load entry points of Win32 modules only when entering the
	debugger.

	* [debugger/break.c]
	New function DEBUG_AddModuleBreakpoint() to set a breakpoint at
	the start of every module.

	* [files/file.c]
	FILE_mmap() can now fake mmap() for unaligned offsets or broken
	filesystems.

	* [include/callback.h] [misc/callback.c] [if1632/thunk.c]
	Use a table of callbacks instead of macros to differentiate
	between emulator and Winelib.

	* [loader/task.c]
	Initialize current directory from cwd, not from module path.

	* [tools/build.c]
	Read CallTo16 prototypes directly from thunk.c source file.

	* [windows/winproc.c] [windows/mdi.c]
	Added translation for WM_MDIACTIVATE and WM_MDIGETACTIVE.

Fri Oct 24 21:41:25 1997  Uwe Bonnes  <bon@elektron.ikp.tu-darmstadt.de>

	* [files/drive.c]
	Allow arguments like "a" for the drive related apis.

	* [memory/global.c]
	Keep the calculation for dwMemoryLoad in range.

	* [misc/crtdll.c]
	Make CRTDLL_getcwd use GetCurrentDirectory32A and alloc
	its memory if requested.
	Implemented CRTDLL_rename and CRTDLL_stat needed for
	lcc-win32:wedit.exe.
	Implemented CRTDLL__fullpath.

	* [misc/comm.c]
	High speed modes for the 16-bit mode Comm functions.

	* [misc/cpu.c]
	As applications may treat lpMaximumApplicationAddress as long,
	use a valid long number.

	* [misc/main.c]
	In SystemParametersInfo16 ignore SPI_GETHIGHCONTRAST too.

	* [misc/ole2nls.c]
	Implement LCMAP_UPPERCASE for LCMapString32.

	* [misc/wsprintf]
	Made WPRINTF_ParseFormatA understand %ws.

	* [win32/file.c]
	Ignore FILE_ATTRIBUTE_NORMAL.
	Stub for ReadFileEx.

Fri Oct 24 15:36:02 1997  Doug Ridgway <ridgway@routh.ucsd.edu>

	* [memory/local.c]
	Local heap exhaustion message now prints which builtin heap filled.

Fri Oct 24 00:46:34 1997  Huw D M Davies <h.davies1@physics.oxford.ac.uk>

	* [windows/dialog.c]
	Reversed CreateFont16/32W typo.

Thu Oct 23 23:44:20 1997  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [if1632/user.spec]
	Fixed argument list for ChangeClipboardChain.

	* [windows/mdi.c]
	Pass correct hInstance to CreateWindow16() in MDICreateChild().

Mon Oct 20 11:51:24 1997  Carsten Fallesen <cf@it.dtu.dk>

	* [objects/metafile.c]
	Added support for META_SETTEXTCHAREXTRA.

	* [objects/region.c]
	Fixed crash in XPolygonRegion if there is only one point in 
	in the region.

	* [if1632/gdi32.spec][include/gdi.h][include/windows.h]
	  [objects/gdiobj.c]
	Completed OBJ_XXX defines in gdi.h, removed OBJ_XXX in gdiobj.c 
	and included gdi.h instead. Implemented GetObjectType32().

Thu Oct 16 17:21:32 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [documentation/wine.texinfo]
	Fixed WIN32 and Makefiles entries of Reference manual node, that
	made makeinfo dump core.

Mon Oct 13 17:15:57 1997  Robert Wilhelm  <robert@physiol.med.tu-muenchen.de>

	* [if1632/crtdll.spec]
	Added missing math functions y0(), y1(), y2(), floor(), frexp(),
	ldexp(), modf().
diff --git a/controls/button.c b/controls/button.c
index 312282d..27e73c4 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -170,12 +170,14 @@
 
     case WM_SETTEXT:
         DEFWND_SetText( wndPtr, (LPSTR)lParam );
-        PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
+	if( wndPtr->dwStyle & WS_VISIBLE )
+            PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
         return 0;
 
     case WM_SETFONT:
         infoPtr->hFont = (HFONT16)wParam;
-        if (lParam) PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
+        if (lParam && (wndPtr->dwStyle & WS_VISIBLE)) 
+	    PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
         break;
 
     case WM_GETFONT:
diff --git a/controls/combo.c b/controls/combo.c
index 26903fa..b66173c 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -1128,7 +1128,7 @@
  */
 static LRESULT COMBO_SelectString( LPHEADCOMBO lphc, INT32 start, LPCSTR pText )
 {
-   INT32 index = SendMessage32A( lphc->hWndLBox, CB_SELECTSTRING32, 
+   INT32 index = SendMessage32A( lphc->hWndLBox, LB_SELECTSTRING32, 
 				 (WPARAM32)start, (LPARAM)pText );
    if( index >= 0 )
         if( lphc->wState & CBF_EDIT )
diff --git a/controls/edit.c b/controls/edit.c
index 7e32b57..c6bcafe 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -978,7 +978,7 @@
 	if (es->word_break_proc16) {
 		HLOCAL16 hloc16 = EDIT_EM_GetHandle16(wnd, es);
 		SEGPTR segptr = LocalLock16(hloc16);
-		INT32 ret = (INT32)CallWordBreakProc16((FARPROC16)es->word_break_proc16,
+		INT32 ret = (INT32)Callbacks->CallWordBreakProc(es->word_break_proc16,
 						segptr + start, index, count, action);
 		LocalUnlock16(hloc16);
 		return ret;
diff --git a/controls/menu.c b/controls/menu.c
index 682423f..a31b2f1 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -754,10 +754,10 @@
 	    if ((i != start) &&
 		(lpitem->fType & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
 
-
-	    dprintf_menu( stddeb, "MENU_MenuBarCalcSize: calling "
-			  "MENU_CalcItemSize on item '%s', org=(%d, %d)\n",
-			  lpitem->text, orgX, orgY );
+	    dprintf_menu( stddeb,
+			  "MENU_MenuBarCalcSize: calling MENU_CalcItemSize"
+			  " org=(%d, %d)\n", orgX, orgY );
+	    debug_print_menuitem ("  item: ", lpitem, "\n");
 	    MENU_CalcItemSize( hdc, lpitem, hwndOwner, orgX, orgY, TRUE );
 	    if (lpitem->rect.right > lprect->right)
 	    {
@@ -1396,7 +1396,7 @@
 
     if (IS_STRING_ITEM(flags))
     {
-        if (!str)
+        if (!str || !*str)
         {
             flags |= MF_SEPARATOR;
             item->text = NULL;
@@ -1904,7 +1904,7 @@
         else
             item = MENU_FindItemByCoords( ptmenu, pmt->pt, &id );
 
-	if( ptmenu->FocusedItem == id )
+	if( item && (ptmenu->FocusedItem == id ))
 	{
 	    if( !(item->fType & MF_POPUP) )
 		return MENU_ExecFocusedItem( pmt, hPtMenu );
@@ -2861,6 +2861,7 @@
     dprintf_menu(stddeb,"GetMenuState(%04x, %04x, %04x);\n", 
 		 hMenu, wItemID, wFlags);
     if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
+    debug_print_menuitem ("  item: ", item, "\n");
     if (item->fType & MF_POPUP)
     {
 	POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( item->hSubMenu );
@@ -2868,9 +2869,12 @@
 	else return (menu->nItems << 8) | (menu->wFlags & 0xff);
     }
     else
-        /* Non POPUP Menus only return flags in the lower byte */
-        /* XXX ??? */
-	return ((item->fType | item->fState) & 0x00ff);
+    {
+	 /* We used to (from way back then) mask the result to 0xff.  */
+	 /* I don't know why and it seems wrong as the documented */
+	 /* return flag MF_SEPARATOR is outside that mask.  */
+	 return (item->fType | item->fState);
+    }
 }
 
 
diff --git a/controls/scroll.c b/controls/scroll.c
index b8a3d4e..4b7867e 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -410,18 +410,20 @@
     r = *rect;
     if (vertical)
     {
-        r.top    += arrowSize;
+        r.top    += arrowSize - 1;
         r.bottom -= arrowSize;
+	r.right--;
     }
     else
     {
-        r.left  += arrowSize;
+        r.left  += arrowSize - 1;
         r.right -= arrowSize;
+	r.bottom--;
     }
 
       /* Draw the scroll bar frame */
 
-    GRAPH_DrawRectangle( hdc, r.left, r.top, r.right - 1, r.bottom - 1, 0);
+    GRAPH_DrawRectangle( hdc, r.left, r.top, r.right - r.left, r.bottom - r.top, 0);
 
       /* Draw the scroll rectangles and thumb */
 
@@ -443,7 +445,7 @@
                   r.right - r.left - 2,
                   r.bottom - r.top - thumbSize - 2,
                   bottom_selected ? 0x0f0000 : PATCOPY );
-        r.bottom = r.top + thumbSize + 1;
+        r.bottom = r.top + thumbSize + 2;
     }
     else  /* horizontal */
     {
@@ -456,7 +458,7 @@
                   r.right - r.left - thumbSize - 2,
                   r.bottom - r.top - 2,
                   bottom_selected ? 0x0f0000 : PATCOPY );
-        r.right = r.left + thumbSize + 1;
+        r.right = r.left + thumbSize + 2;
     }
 
       /* Draw the thumb */
diff --git a/controls/static.c b/controls/static.c
index ecd4a02..0e565f2 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -8,12 +8,15 @@
 #include <stdio.h>
 #include "windows.h"
 #include "win.h"
+#include "bitmap.h"
+#include "cursoricon.h"
 #include "static.h"
 #include "heap.h"
 
 static void STATIC_PaintTextfn( WND *wndPtr, HDC32 hdc );
 static void STATIC_PaintRectfn( WND *wndPtr, HDC32 hdc );
 static void STATIC_PaintIconfn( WND *wndPtr, HDC32 hdc );
+static void STATIC_PaintBitmapfn( WND *wndPtr, HDC32 hdc );
 
 
 static COLORREF color_windowframe, color_background, color_window;
@@ -21,9 +24,7 @@
 
 typedef void (*pfPaint)( WND *, HDC32 );
 
-#define LAST_STATIC_TYPE  SS_LEFTNOWORDWRAP
-
-static pfPaint staticPaintFunc[LAST_STATIC_TYPE+1] =
+static pfPaint staticPaintFunc[SS_TYPEMASK+1] =
 {
     STATIC_PaintTextfn,      /* SS_LEFT */
     STATIC_PaintTextfn,      /* SS_CENTER */
@@ -37,7 +38,13 @@
     STATIC_PaintRectfn,      /* SS_WHITEFRAME */
     NULL,                    /* Not defined */
     STATIC_PaintTextfn,      /* SS_SIMPLE */
-    STATIC_PaintTextfn       /* SS_LEFTNOWORDWRAP */
+    STATIC_PaintTextfn,      /* SS_LEFTNOWORDWRAP */
+    NULL,                    /* SS_OWNERDRAW */
+    STATIC_PaintBitmapfn,    /* SS_BITMAP */
+    NULL,                    /* SS_ENHMETAFILE */
+    NULL,                    /* SS_ETCHEDHORIZ */
+    NULL,                    /* SS_ETCHEDVERT */
+    NULL,                    /* SS_ETCHEDFRAME */
 };
 
 
@@ -52,7 +59,7 @@
     STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
     CURSORICONINFO *info = hicon?(CURSORICONINFO *) GlobalLock16( hicon ):NULL;
 
-    if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return 0;
+    if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_ICON) return 0;
     if (hicon && !info) {
 	fprintf(stderr,"STATIC_SetIcon: huh? hicon!=0, but info=0???\n");
     	return 0;
@@ -68,6 +75,33 @@
     return prevIcon;
 }
 
+/***********************************************************************
+ *           STATIC_SetBitmap
+ *
+ * Set the bitmap for an SS_BITMAP control.
+ */
+static HICON16 STATIC_SetBitmap( WND *wndPtr, HICON16 hicon )
+{
+    HICON16 prevIcon;
+    STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
+    BITMAPOBJ *info = GDI_HEAP_LOCK(hicon);
+
+    if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_BITMAP) return 0;
+    if (hicon && !info) {
+	fprintf(stderr,"STATIC_SetBitmap: huh? hicon!=0, but info=0???\n");
+    	return 0;
+    }
+    prevIcon = infoPtr->hIcon;
+    infoPtr->hIcon = hicon;
+    if (hicon)
+    {
+        SetWindowPos32( wndPtr->hwndSelf, 0, 0, 0, info->bitmap.bmWidth, info->bitmap.bmHeight,
+                        SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
+    }
+    GDI_HEAP_UNLOCK( hicon );
+    return prevIcon;
+}
+
 
 /***********************************************************************
  *           STATIC_LoadIcon
@@ -95,6 +129,32 @@
     return hicon;
 }
 
+/***********************************************************************
+ *           STATIC_LoadBitmap
+ *
+ * Load the bitmap for an SS_BITMAP control.
+ */
+static HBITMAP16 STATIC_LoadBitmap( WND *wndPtr, LPCSTR name )
+{
+    HBITMAP16 hbitmap;
+
+    if (wndPtr->flags & WIN_ISWIN32)
+    {
+        hbitmap = LoadBitmap32A( wndPtr->hInstance, name );
+        if (!hbitmap)  /* Try OEM icon (FIXME: is this right?) */
+            hbitmap = LoadBitmap32A( 0, name );
+    }
+    else
+    {
+        LPSTR segname = SEGPTR_STRDUP(name);
+        hbitmap = LoadBitmap16( wndPtr->hInstance, SEGPTR_GET(segname) );
+        if (!hbitmap)  /* Try OEM icon (FIXME: is this right?) */
+            hbitmap = LoadBitmap32A( 0, segname );
+        SEGPTR_FREE(segname);
+    }
+    return hbitmap;
+}
+
 
 /***********************************************************************
  *           StaticWndProc
@@ -104,7 +164,7 @@
 {
     LRESULT lResult = 0;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
-    LONG style = wndPtr->dwStyle & 0x0000000F;
+    LONG style = wndPtr->dwStyle & SS_TYPEMASK;
     STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
 
     switch (uMsg)
@@ -118,10 +178,19 @@
                                 STATIC_LoadIcon( wndPtr, cs->lpszName ));
             return 1;
         }
+	if (style == SS_BITMAP)
+	{
+            CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam;
+            if (cs->lpszName)
+                STATIC_SetBitmap( wndPtr,
+                                STATIC_LoadBitmap( wndPtr, cs->lpszName ));
+	    fprintf(stderr,"STATIC:style SS_BITMAP, dwStyle is 0x%08lx\n",wndPtr->dwStyle);
+            return 1;
+	}
         return DefWindowProc32A( hWnd, uMsg, wParam, lParam );
 
     case WM_CREATE:
-        if (style < 0L || style > LAST_STATIC_TYPE)
+        if (style < 0L || style > SS_TYPEMASK)
         {
             fprintf( stderr, "STATIC: Unknown style 0x%02lx\n", style );
             lResult = -1L;
@@ -136,7 +205,7 @@
     case WM_NCDESTROY:
         if (style == SS_ICON)
             DestroyIcon32( STATIC_SetIcon( wndPtr, 0 ) );
-        else 
+        else
             lResult = DefWindowProc32A( hWnd, uMsg, wParam, lParam );
         break;
 
@@ -165,7 +234,9 @@
         if (style == SS_ICON)
             /* FIXME : should we also return the previous hIcon here ??? */
             STATIC_SetIcon( wndPtr, STATIC_LoadIcon( wndPtr, (LPCSTR)lParam ));
-        else
+        else if (style == SS_BITMAP) 
+            STATIC_SetBitmap(wndPtr,STATIC_LoadBitmap(wndPtr,(LPCSTR)lParam ));
+	else
             DEFWND_SetText( wndPtr, (LPCSTR)lParam );
         InvalidateRect32( hWnd, NULL, FALSE );
         UpdateWindow32( hWnd );
@@ -173,6 +244,7 @@
 
     case WM_SETFONT:
         if (style == SS_ICON) return 0;
+        if (style == SS_BITMAP) return 0;
         infoPtr->hFont = (HFONT16)wParam;
         if (LOWORD(lParam))
         {
@@ -190,10 +262,20 @@
     case WM_GETDLGCODE:
         return DLGC_STATIC;
 
-    case STM_GETICON:
+    	return infoPtr->hIcon;
+    case STM_GETIMAGE:
+    case STM_GETICON16:
+    case STM_GETICON32:
         return infoPtr->hIcon;
 
-    case STM_SETICON:
+    case STM_SETIMAGE:
+    	/* FIXME: handle wParam */
+        lResult = STATIC_SetBitmap( wndPtr, (HBITMAP32)lParam );
+        InvalidateRect32( hWnd, NULL, FALSE );
+        UpdateWindow32( hWnd );
+	break;
+    case STM_SETICON16:
+    case STM_SETICON32:
         lResult = STATIC_SetIcon( wndPtr, (HICON16)wParam );
         InvalidateRect32( hWnd, NULL, FALSE );
         UpdateWindow32( hWnd );
@@ -219,7 +301,7 @@
 
     GetClientRect32( wndPtr->hwndSelf, &rc);
 
-    switch (style & 0x0000000F)
+    switch (style & SS_TYPEMASK)
     {
     case SS_LEFT:
 	wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
@@ -263,7 +345,7 @@
 
     GetClientRect32( wndPtr->hwndSelf, &rc);
     
-    switch (wndPtr->dwStyle & 0x0f)
+    switch (wndPtr->dwStyle & SS_TYPEMASK)
     {
     case SS_BLACKRECT:
 	hBrush = CreateSolidBrush32(color_windowframe);
@@ -308,3 +390,28 @@
     FillRect32( hdc, &rc, hbrush );
     if (infoPtr->hIcon) DrawIcon32( hdc, rc.left, rc.top, infoPtr->hIcon );
 }
+
+static void STATIC_PaintBitmapfn(WND *wndPtr, HDC32 hdc ) 
+{
+    RECT32 rc;
+    HBRUSH32 hbrush;
+    STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
+    HDC32 hMemDC;
+    HBITMAP32 oldbitmap;
+
+    GetClientRect32( wndPtr->hwndSelf, &rc );
+    hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC,
+                             hdc, wndPtr->hwndSelf );
+    FillRect32( hdc, &rc, hbrush );
+    if (infoPtr->hIcon) {
+        BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_HEAP_LOCK( infoPtr->hIcon );
+
+	if (!bmp) return;
+        if (!(hMemDC = CreateCompatibleDC32( hdc ))) return;
+
+	oldbitmap = SelectObject32(hMemDC,infoPtr->hIcon);
+	BitBlt32(hdc,bmp->size.cx,bmp->size.cy,bmp->bitmap.bmWidth,bmp->bitmap.bmHeight,hMemDC,0,0,SRCCOPY);
+	DeleteDC32(hMemDC);
+        GDI_HEAP_UNLOCK(infoPtr->hIcon);
+    }
+}
diff --git a/controls/status.c b/controls/status.c
index 3fae2d9..d05aa6d 100644
--- a/controls/status.c
+++ b/controls/status.c
@@ -118,10 +118,10 @@
     part_num = ((INT32) wParam) & 0x00ff;
     style = ((INT32) wParam) & 0xff00;
 
-    if (part_num > 255)
+    if (part_num >= 255)
 	return FALSE;
 
-    if (self->simple)
+    if ((self->simple) || (part_num==255))
 	part = &self->part0;
     else
 	part = &self->parts[part_num];