mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
[USER32]
Partly sync static.c with wine, reduce diff between ros and wine code. The leak fix is taken care of. Also go back from Get/SetWindowLongPtr to Get/SetWindowLong for LONG values. Using the *Ptr version is wrong for LONG values! svn path=/trunk/; revision=53204
This commit is contained in:
@@ -55,15 +55,13 @@ static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style );
|
||||
static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc, DWORD style );
|
||||
static void STATIC_PaintEnhMetafn( HWND hwnd, HDC hdc, DWORD style );
|
||||
static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style );
|
||||
//static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
||||
//static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
||||
|
||||
static COLORREF color_3dshadow, color_3ddkshadow, color_3dhighlight;
|
||||
|
||||
/* offsets for GetWindowLong for static private information */
|
||||
#define HFONT_GWL_OFFSET 0
|
||||
#define HICON_GWL_OFFSET (sizeof(HFONT))
|
||||
#define UISTATE_GWL_OFFSET (HICON_GWL_OFFSET+sizeof(HICON))
|
||||
#define UISTATE_GWL_OFFSET (HICON_GWL_OFFSET+sizeof(HICON)) // ReactOS: keep in sync with STATIC_UISTATE_GWL_OFFSET
|
||||
#define STATIC_EXTRA_BYTES (UISTATE_GWL_OFFSET + sizeof(LONG))
|
||||
|
||||
typedef void (*pfPaint)( HWND hwnd, HDC hdc, DWORD style );
|
||||
@@ -107,40 +105,6 @@ const struct builtin_class_descr STATIC_builtin_class =
|
||||
0 /* brush */
|
||||
};
|
||||
|
||||
/* REACTOS ONLY */
|
||||
static __inline void set_ui_state( HWND hwnd, LONG flags )
|
||||
{
|
||||
SetWindowLongPtrW( hwnd, UISTATE_GWL_OFFSET, flags );
|
||||
}
|
||||
|
||||
static __inline LONG get_ui_state( HWND hwnd )
|
||||
{
|
||||
return GetWindowLongPtrW( hwnd, UISTATE_GWL_OFFSET );
|
||||
}
|
||||
|
||||
/* Retrieve the UI state for the control */
|
||||
static BOOL STATIC_update_uistate(HWND hwnd, BOOL unicode)
|
||||
{
|
||||
LONG flags, prevflags;
|
||||
|
||||
if (unicode)
|
||||
flags = DefWindowProcW(hwnd, WM_QUERYUISTATE, 0, 0);
|
||||
else
|
||||
flags = DefWindowProcA(hwnd, WM_QUERYUISTATE, 0, 0);
|
||||
|
||||
prevflags = get_ui_state(hwnd);
|
||||
|
||||
if (prevflags != flags)
|
||||
{
|
||||
set_ui_state(hwnd, flags);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* END REACTOS ONLY */
|
||||
|
||||
static void setup_clipping(HWND hwnd, HDC hdc, HRGN *orig)
|
||||
{
|
||||
RECT rc;
|
||||
@@ -172,28 +136,22 @@ static void restore_clipping(HDC hdc, HRGN hrgn)
|
||||
/***********************************************************************
|
||||
* STATIC_SetIcon
|
||||
*
|
||||
* Set the icon for an SS_ICON control. Modified for ReactOS
|
||||
* Set the icon for an SS_ICON control.
|
||||
*/
|
||||
static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style )
|
||||
{
|
||||
HICON prevIcon;
|
||||
ICONINFO info;
|
||||
SIZE size;
|
||||
|
||||
if ((style & SS_TYPEMASK) != SS_ICON) return 0;
|
||||
if (hicon && (!GetIconInfo(hicon, &info))) {
|
||||
WARN("hicon != 0, but info == 0\n");
|
||||
if (hicon && !get_icon_size( hicon, &size ))
|
||||
{
|
||||
WARN("hicon != 0, but invalid\n");
|
||||
return 0;
|
||||
}
|
||||
prevIcon = (HICON)SetWindowLongPtrW( hwnd, HICON_GWL_OFFSET, (LONG_PTR)hicon );
|
||||
if (hicon && !(style & SS_CENTERIMAGE) && !(style & SS_REALSIZECONTROL))
|
||||
{
|
||||
BITMAP bm;
|
||||
|
||||
if (!GetObjectW(info.hbmColor, sizeof(BITMAP), &bm))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Windows currently doesn't implement SS_RIGHTJUST */
|
||||
/*
|
||||
if ((style & SS_RIGHTJUST) != 0)
|
||||
@@ -205,12 +163,8 @@ static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style )
|
||||
}
|
||||
else */
|
||||
{
|
||||
SetWindowPos( hwnd, 0, 0, 0, bm.bmWidth, bm.bmHeight,
|
||||
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
|
||||
SetWindowPos( hwnd, 0, 0, 0, size.cx, size.cy, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
|
||||
}
|
||||
|
||||
DeleteObject(info.hbmMask);
|
||||
if (info.hbmColor) DeleteObject(info.hbmColor);
|
||||
}
|
||||
return prevIcon;
|
||||
}
|
||||
@@ -218,7 +172,7 @@ static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style )
|
||||
/***********************************************************************
|
||||
* STATIC_SetBitmap
|
||||
*
|
||||
* Set the bitmap for an SS_BITMAP control. Modified for ReactOS
|
||||
* Set the bitmap for an SS_BITMAP control.
|
||||
*/
|
||||
static HBITMAP STATIC_SetBitmap( HWND hwnd, HBITMAP hBitmap, DWORD style )
|
||||
{
|
||||
@@ -331,13 +285,13 @@ static HICON STATIC_LoadIconW( HINSTANCE hInstance, LPCWSTR name, DWORD style )
|
||||
|
||||
if (hInstance && ((ULONG_PTR)hInstance >> 16))
|
||||
{
|
||||
if ((style & SS_REALSIZEIMAGE) != 0)
|
||||
hicon = LoadImageW(hInstance, name, IMAGE_ICON, 0, 0, LR_SHARED);
|
||||
else
|
||||
{
|
||||
hicon = LoadIconW( hInstance, name );
|
||||
if (!hicon) hicon = LoadCursorW( hInstance, name );
|
||||
}
|
||||
if ((style & SS_REALSIZEIMAGE) != 0)
|
||||
hicon = LoadImageW(hInstance, name, IMAGE_ICON, 0, 0, LR_SHARED);
|
||||
else
|
||||
{
|
||||
hicon = LoadIconW( hInstance, name );
|
||||
if (!hicon) hicon = LoadCursorW( hInstance, name );
|
||||
}
|
||||
}
|
||||
if (!hicon) hicon = LoadIconW( 0, name );
|
||||
/* Windows doesn't try to load a standard cursor,
|
||||
@@ -346,7 +300,6 @@ static HICON STATIC_LoadIconW( HINSTANCE hInstance, LPCWSTR name, DWORD style )
|
||||
return hicon;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* STATIC_TryPaintFcn
|
||||
*
|
||||
@@ -362,11 +315,11 @@ static VOID STATIC_TryPaintFcn(HWND hwnd, LONG full_style)
|
||||
{
|
||||
HDC hdc;
|
||||
HRGN hOrigClipping;
|
||||
|
||||
|
||||
hdc = GetDC( hwnd );
|
||||
setup_clipping(hwnd, hdc, &hOrigClipping);
|
||||
(staticPaintFunc[style])( hwnd, hdc, full_style );
|
||||
restore_clipping(hdc, hOrigClipping);
|
||||
restore_clipping(hdc, hOrigClipping);
|
||||
ReleaseDC( hwnd, hdc );
|
||||
}
|
||||
}
|
||||
@@ -420,11 +373,10 @@ static BOOL hasTextStyle( DWORD style )
|
||||
/***********************************************************************
|
||||
* StaticWndProc_common
|
||||
*/
|
||||
LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||
LPARAM lParam, BOOL unicode )
|
||||
LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode ) // ReactOS
|
||||
{
|
||||
LRESULT lResult = 0;
|
||||
LONG full_style = GetWindowLongPtrW( hwnd, GWL_STYLE );
|
||||
LONG full_style = GetWindowLongW( hwnd, GWL_STYLE );
|
||||
LONG style = full_style & SS_TYPEMASK;
|
||||
#ifdef __REACTOS__
|
||||
PWND pWnd;
|
||||
@@ -436,8 +388,10 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||
{
|
||||
NtUserSetWindowFNID(hwnd, FNID_STATIC);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!IsWindow( hwnd )) return 0;
|
||||
|
||||
switch (uMsg)
|
||||
{
|
||||
@@ -447,7 +401,7 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||
ERR("Unknown style 0x%02lx\n", style );
|
||||
return -1;
|
||||
}
|
||||
STATIC_update_uistate(hwnd, unicode);
|
||||
STATIC_update_uistate(hwnd, unicode); // ReactOS r30727
|
||||
STATIC_InitColours();
|
||||
break;
|
||||
|
||||
@@ -470,8 +424,8 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||
DefWindowProcA(hwnd, uMsg, wParam, lParam);
|
||||
|
||||
case WM_ERASEBKGND:
|
||||
/* do all painting in WM_PAINT like Windows does */
|
||||
return 1;
|
||||
/* do all painting in WM_PAINT like Windows does */
|
||||
return 1;
|
||||
|
||||
case WM_PRINTCLIENT:
|
||||
case WM_PAINT:
|
||||
@@ -510,47 +464,31 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||
|
||||
case WM_NCCREATE:
|
||||
{
|
||||
LPCSTR textA;
|
||||
LPCWSTR textW;
|
||||
HINSTANCE hInstance;
|
||||
CREATESTRUCTW *cs = (CREATESTRUCTW *)lParam;
|
||||
|
||||
if (full_style & SS_SUNKEN)
|
||||
SetWindowLongPtrW( hwnd, GWL_EXSTYLE,
|
||||
GetWindowLongPtrW( hwnd, GWL_EXSTYLE ) | WS_EX_STATICEDGE );
|
||||
|
||||
if(unicode)
|
||||
{
|
||||
textA = NULL;
|
||||
textW = ((LPCREATESTRUCTW)lParam)->lpszName;
|
||||
}
|
||||
else
|
||||
{
|
||||
textA = ((LPCREATESTRUCTA)lParam)->lpszName;
|
||||
textW = NULL;
|
||||
|
||||
}
|
||||
|
||||
hInstance = (HINSTANCE)GetWindowLongPtrW( hwnd, GWLP_HINSTANCE );
|
||||
SetWindowLongW( hwnd, GWL_EXSTYLE,
|
||||
GetWindowLongW( hwnd, GWL_EXSTYLE ) | WS_EX_STATICEDGE );
|
||||
|
||||
switch (style) {
|
||||
case SS_ICON:
|
||||
{
|
||||
HICON hIcon;
|
||||
if(unicode )
|
||||
hIcon = STATIC_LoadIconW(hInstance, textW, full_style);
|
||||
if (unicode || IS_INTRESOURCE(cs->lpszName))
|
||||
hIcon = STATIC_LoadIconW(cs->hInstance, cs->lpszName, full_style);
|
||||
else
|
||||
hIcon = STATIC_LoadIconA(hInstance, textA, full_style);
|
||||
hIcon = STATIC_LoadIconA(cs->hInstance, (LPCSTR)cs->lpszName, full_style);
|
||||
STATIC_SetIcon(hwnd, hIcon, full_style);
|
||||
}
|
||||
break;
|
||||
case SS_BITMAP:
|
||||
if ((ULONG_PTR)hInstance >> 16)
|
||||
if ((ULONG_PTR)cs->hInstance >> 16)
|
||||
{
|
||||
HBITMAP hBitmap;
|
||||
if(unicode)
|
||||
hBitmap = LoadBitmapW(hInstance, textW);
|
||||
if (unicode || IS_INTRESOURCE(cs->lpszName))
|
||||
hBitmap = LoadBitmapW(cs->hInstance, cs->lpszName);
|
||||
else
|
||||
hBitmap = LoadBitmapA(hInstance, textA);
|
||||
hBitmap = LoadBitmapA(cs->hInstance, (LPCSTR)cs->lpszName);
|
||||
STATIC_SetBitmap(hwnd, hBitmap, full_style);
|
||||
}
|
||||
break;
|
||||
@@ -619,16 +557,16 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||
case STM_SETIMAGE:
|
||||
switch(wParam) {
|
||||
case IMAGE_BITMAP:
|
||||
if (style != SS_BITMAP) return 0;
|
||||
if (style != SS_BITMAP) return 0; // ReactOS r43158
|
||||
lResult = (LRESULT)STATIC_SetBitmap( hwnd, (HBITMAP)lParam, full_style );
|
||||
break;
|
||||
case IMAGE_ENHMETAFILE:
|
||||
if (style != SS_ENHMETAFILE) return 0;
|
||||
if (style != SS_ENHMETAFILE) return 0; // ReactOS r43158
|
||||
lResult = (LRESULT)STATIC_SetEnhMetaFile( hwnd, (HENHMETAFILE)lParam, full_style );
|
||||
break;
|
||||
case IMAGE_ICON:
|
||||
case IMAGE_CURSOR:
|
||||
if (style != SS_ICON) return 0;
|
||||
if (style != SS_ICON) return 0; // ReactOS r43158
|
||||
lResult = (LRESULT)STATIC_SetIcon( hwnd, (HICON)lParam, full_style );
|
||||
break;
|
||||
default:
|
||||
@@ -643,6 +581,7 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||
STATIC_TryPaintFcn( hwnd, full_style );
|
||||
break;
|
||||
|
||||
#ifdef __REACTOS__
|
||||
case WM_UPDATEUISTATE:
|
||||
if (unicode)
|
||||
DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
@@ -654,6 +593,7 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||
RedrawWindow( hwnd, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN );
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
return unicode ? DefWindowProcW(hwnd, uMsg, wParam, lParam) :
|
||||
@@ -745,7 +685,7 @@ static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style )
|
||||
|
||||
if (style & SS_NOPREFIX)
|
||||
wFormat |= DT_NOPREFIX;
|
||||
else if (get_ui_state(hwnd) & UISF_HIDEACCEL)
|
||||
else if (GetWindowLongW(hwnd, UISTATE_GWL_OFFSET) & UISF_HIDEACCEL) // ReactOS r30727
|
||||
wFormat |= DT_HIDEPREFIX;
|
||||
|
||||
if ((style & SS_TYPEMASK) != SS_SIMPLE)
|
||||
@@ -781,9 +721,9 @@ static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style )
|
||||
|
||||
while ((len = InternalGetWindowText( hwnd, text, buf_size )) == buf_size - 1)
|
||||
{
|
||||
buf_size *= 2;
|
||||
if (!(text = HeapReAlloc( GetProcessHeap(), 0, text, buf_size * sizeof(WCHAR) )))
|
||||
goto no_TextOut;
|
||||
buf_size *= 2;
|
||||
if (!(text = HeapReAlloc( GetProcessHeap(), 0, text, buf_size * sizeof(WCHAR) )))
|
||||
goto no_TextOut;
|
||||
}
|
||||
|
||||
if (!len) goto no_TextOut;
|
||||
@@ -851,6 +791,7 @@ static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, DWORD style )
|
||||
DeleteObject( hBrush );
|
||||
}
|
||||
|
||||
|
||||
static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style )
|
||||
{
|
||||
RECT rc, iconRect;
|
||||
@@ -969,4 +910,3 @@ static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -214,4 +214,28 @@ PVOID FASTCALL ValidateHandle(HANDLE, UINT);
|
||||
#define __EXCEPT_PAGE_FAULT else
|
||||
#define __ENDTRY
|
||||
|
||||
#define STATIC_UISTATE_GWL_OFFSET (sizeof(HFONT)+sizeof(HICON))// see UISTATE_GWL_OFFSET in static.c
|
||||
|
||||
/* Retrieve the UI state for the control */
|
||||
static __inline BOOL STATIC_update_uistate(HWND hwnd, BOOL unicode)
|
||||
{
|
||||
LONG flags, prevflags;
|
||||
|
||||
if (unicode)
|
||||
flags = DefWindowProcW(hwnd, WM_QUERYUISTATE, 0, 0);
|
||||
else
|
||||
flags = DefWindowProcA(hwnd, WM_QUERYUISTATE, 0, 0);
|
||||
|
||||
prevflags = GetWindowLongW(hwnd, STATIC_UISTATE_GWL_OFFSET);
|
||||
|
||||
if (prevflags != flags)
|
||||
{
|
||||
SetWindowLongW(hwnd, STATIC_UISTATE_GWL_OFFSET, flags);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/* EOF */
|
||||
|
||||
Reference in New Issue
Block a user