2 * Theming - Edit control
4 * Copyright (c) 2005 by Frank Richter
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(themingedit
);
37 /* Draw themed border */
38 static void nc_paint (HTHEME theme
, HWND hwnd
, HRGN region
)
40 HRGN cliprgn
= region
;
41 DWORD exStyle
= GetWindowLongW (hwnd
, GWL_EXSTYLE
);
42 if (exStyle
& WS_EX_CLIENTEDGE
)
46 int cxEdge
= GetSystemMetrics (SM_CXEDGE
),
47 cyEdge
= GetSystemMetrics (SM_CYEDGE
);
48 int part
= EP_EDITTEXT
;
49 int state
= ETS_NORMAL
;
50 DWORD dwStyle
= GetWindowLongW (hwnd
, GWL_STYLE
);
52 if (!IsWindowEnabled (hwnd
))
54 else if (dwStyle
& ES_READONLY
)
56 else if (GetFocus() == hwnd
)
59 GetWindowRect(hwnd
, &r
);
61 /* New clipping region passed to default proc to exclude border */
62 cliprgn
= CreateRectRgn (r
.left
+ cxEdge
, r
.top
+ cyEdge
,
63 r
.right
- cxEdge
, r
.bottom
- cyEdge
);
64 if (region
!= (HRGN
)1)
65 CombineRgn (cliprgn
, cliprgn
, region
, RGN_AND
);
66 OffsetRect(&r
, -r
.left
, -r
.top
);
68 dc
= GetDCEx(hwnd
, region
, DCX_WINDOW
|DCX_INTERSECTRGN
);
69 OffsetRect(&r
, -r
.left
, -r
.top
);
71 if (IsThemeBackgroundPartiallyTransparent (theme
, part
, state
))
72 DrawThemeParentBackground(hwnd
, dc
, &r
);
73 DrawThemeBackground (theme
, dc
, part
, state
, &r
, 0);
77 /* Call default proc to get the scrollbars etc. also painted */
78 DefWindowProcW (hwnd
, WM_NCPAINT
, (WPARAM
)cliprgn
, 0);
81 /**********************************************************************
82 * The edit control subclass window proc.
84 LRESULT CALLBACK
THEMING_EditSubclassProc (HWND hwnd
, UINT msg
,
85 WPARAM wParam
, LPARAM lParam
,
88 const WCHAR
* themeClass
= WC_EDITW
;
95 result
= THEMING_CallOriginalClass (hwnd
, msg
, wParam
, lParam
);
96 OpenThemeData( hwnd
, themeClass
);
100 theme
= GetWindowTheme( hwnd
);
101 CloseThemeData ( theme
);
102 return THEMING_CallOriginalClass (hwnd
, msg
, wParam
, lParam
);
104 case WM_THEMECHANGED
:
105 theme
= GetWindowTheme( hwnd
);
106 CloseThemeData ( theme
);
107 OpenThemeData( hwnd
, themeClass
);
110 case WM_SYSCOLORCHANGE
:
111 theme
= GetWindowTheme( hwnd
);
112 if (!theme
) return THEMING_CallOriginalClass (hwnd
, msg
, wParam
, lParam
);
113 /* Do nothing. When themed, a WM_THEMECHANGED will be received, too,
114 * which will do the repaint. */
118 theme
= GetWindowTheme( hwnd
);
119 if (!theme
) return THEMING_CallOriginalClass (hwnd
, msg
, wParam
, lParam
);
120 nc_paint (theme
, hwnd
, (HRGN
)wParam
);
124 theme
= GetWindowTheme( hwnd
);
125 if (theme
) RedrawWindow (hwnd
, NULL
, NULL
,
126 RDW_FRAME
| RDW_INVALIDATE
| RDW_UPDATENOW
);
127 return THEMING_CallOriginalClass (hwnd
, msg
, wParam
, lParam
);
131 return THEMING_CallOriginalClass (hwnd
, msg
, wParam
, lParam
);