2 * Icontitle window class.
4 * Copyright 1997 Alex Korobka
13 #include "wine/winuser16.h"
14 #include "wine/unicode.h"
21 /***********************************************************************
24 BOOL
ICONTITLE_Init(void)
28 SystemParametersInfoA( SPI_GETICONTITLELOGFONT
, 0, &logFont
, 0 );
29 SystemParametersInfoA( SPI_GETICONTITLEWRAP
, 0, &bMultiLineTitle
, 0 );
30 hIconTitleFont
= CreateFontIndirectA( &logFont
);
31 return (hIconTitleFont
) ? TRUE
: FALSE
;
34 /***********************************************************************
37 HWND
ICONTITLE_Create( WND
* wnd
)
42 if( wnd
->dwStyle
& WS_CHILD
)
43 hWnd
= CreateWindowExA( 0, ICONTITLE_CLASS_ATOM
, NULL
,
44 WS_CHILD
| WS_CLIPSIBLINGS
, 0, 0, 1, 1,
45 wnd
->parent
->hwndSelf
, 0, wnd
->hInstance
, NULL
);
47 hWnd
= CreateWindowExA( 0, ICONTITLE_CLASS_ATOM
, NULL
,
48 WS_CLIPSIBLINGS
, 0, 0, 1, 1,
49 wnd
->hwndSelf
, 0, wnd
->hInstance
, NULL
);
50 wndPtr
= WIN_FindWndPtr( hWnd
);
53 wndPtr
->owner
= wnd
; /* MDI depends on this */
54 wndPtr
->dwStyle
&= ~(WS_CAPTION
| WS_BORDER
);
55 if( wnd
->dwStyle
& WS_DISABLED
) wndPtr
->dwStyle
|= WS_DISABLED
;
56 WIN_ReleaseWndPtr(wndPtr
);
62 /***********************************************************************
63 * ICONTITLE_GetTitlePos
65 static BOOL
ICONTITLE_GetTitlePos( WND
* wnd
, LPRECT lpRect
)
67 static WCHAR emptyTitleText
[] = {'<','.','.','.','>',0};
69 int length
= lstrlenW( wnd
->owner
->text
);
73 str
= HeapAlloc( GetProcessHeap(), 0, (length
+ 1) * sizeof(WCHAR
) );
74 strcpyW( str
, wnd
->owner
->text
);
75 while( str
[length
- 1] == ' ' ) /* remove trailing spaces */
80 HeapFree( GetProcessHeap(), 0, str
);
88 length
= lstrlenW( str
);
93 HDC hDC
= GetDC( wnd
->hwndSelf
);
96 HFONT hPrevFont
= SelectObject( hDC
, hIconTitleFont
);
98 SetRect( lpRect
, 0, 0, GetSystemMetrics(SM_CXICONSPACING
) -
99 GetSystemMetrics(SM_CXBORDER
) * 2,
100 GetSystemMetrics(SM_CYBORDER
) * 2 );
102 DrawTextW( hDC
, str
, length
, lpRect
, DT_CALCRECT
|
103 DT_CENTER
| DT_NOPREFIX
| DT_WORDBREAK
|
104 (( bMultiLineTitle
) ? 0 : DT_SINGLELINE
) );
106 SelectObject( hDC
, hPrevFont
);
107 ReleaseDC( wnd
->hwndSelf
, hDC
);
109 lpRect
->right
+= 4 * GetSystemMetrics(SM_CXBORDER
) - lpRect
->left
;
110 lpRect
->left
= wnd
->owner
->rectWindow
.left
+ GetSystemMetrics(SM_CXICON
) / 2 -
111 (lpRect
->right
- lpRect
->left
) / 2;
112 lpRect
->bottom
-= lpRect
->top
;
113 lpRect
->top
= wnd
->owner
->rectWindow
.top
+ GetSystemMetrics(SM_CYICON
);
115 if( str
!= emptyTitleText
) HeapFree( GetProcessHeap(), 0, str
);
116 return ( hDC
) ? TRUE
: FALSE
;
121 /***********************************************************************
124 static BOOL
ICONTITLE_Paint( WND
* wnd
, HDC hDC
, BOOL bActive
)
128 COLORREF textColor
= 0;
132 hBrush
= GetSysColorBrush(COLOR_ACTIVECAPTION
);
133 textColor
= GetSysColor(COLOR_CAPTIONTEXT
);
137 if( wnd
->dwStyle
& WS_CHILD
)
139 hBrush
= (HBRUSH
) GetClassLongA(wnd
->hwndSelf
, GCL_HBRBACKGROUND
);
144 GetObjectA( hBrush
, sizeof(logBrush
), &logBrush
);
145 level
= GetRValue(logBrush
.lbColor
) +
146 GetGValue(logBrush
.lbColor
) +
147 GetBValue(logBrush
.lbColor
);
148 if( level
< (0x7F * 3) )
149 textColor
= RGB( 0xFF, 0xFF, 0xFF );
152 hBrush
= GetStockObject( WHITE_BRUSH
);
156 hBrush
= GetStockObject( BLACK_BRUSH
);
157 textColor
= RGB( 0xFF, 0xFF, 0xFF );
161 FillWindow16( wnd
->parent
->hwndSelf
, wnd
->hwndSelf
, hDC
, hBrush
);
163 hPrevFont
= SelectObject( hDC
, hIconTitleFont
);
170 rect
.left
= rect
.top
= 0;
171 rect
.right
= wnd
->rectWindow
.right
- wnd
->rectWindow
.left
;
172 rect
.bottom
= wnd
->rectWindow
.bottom
- wnd
->rectWindow
.top
;
174 length
= GetWindowTextA( wnd
->owner
->hwndSelf
, buffer
, 80 );
175 SetTextColor( hDC
, textColor
);
176 SetBkMode( hDC
, TRANSPARENT
);
178 DrawTextA( hDC
, buffer
, length
, &rect
, DT_CENTER
| DT_NOPREFIX
|
179 DT_WORDBREAK
| ((bMultiLineTitle
) ? 0 : DT_SINGLELINE
) );
181 SelectObject( hDC
, hPrevFont
);
183 return ( hPrevFont
) ? TRUE
: FALSE
;
186 /***********************************************************************
189 LRESULT WINAPI
IconTitleWndProc( HWND hWnd
, UINT msg
,
190 WPARAM wParam
, LPARAM lParam
)
193 WND
*wnd
= WIN_FindWndPtr( hWnd
);
198 retvalue
= HTCAPTION
;
201 case WM_NCLBUTTONDBLCLK
:
202 retvalue
= SendMessageA( wnd
->owner
->hwndSelf
, msg
, wParam
, lParam
);
205 if( wParam
) SetActiveWindow( wnd
->owner
->hwndSelf
);
216 ICONTITLE_GetTitlePos( wnd
, &titleRect
);
217 if( wnd
->owner
->next
!= wnd
) /* keep icon title behind the owner */
218 SetWindowPos( hWnd
, wnd
->owner
->hwndSelf
,
219 titleRect
.left
, titleRect
.top
,
220 titleRect
.right
, titleRect
.bottom
, SWP_NOACTIVATE
);
222 SetWindowPos( hWnd
, 0, titleRect
.left
, titleRect
.top
,
223 titleRect
.right
, titleRect
.bottom
,
224 SWP_NOACTIVATE
| SWP_NOZORDER
);
231 WND
* iconWnd
= WIN_LockWndPtr(wnd
->owner
);
233 if( iconWnd
->dwStyle
& WS_CHILD
)
234 lParam
= SendMessageA( iconWnd
->hwndSelf
, WM_ISACTIVEICON
, 0, 0 );
236 lParam
= (iconWnd
->hwndSelf
== GetActiveWindow16());
238 WIN_ReleaseWndPtr(iconWnd
);
239 if( ICONTITLE_Paint( wnd
, (HDC
)wParam
, (BOOL
)lParam
) )
240 ValidateRect( hWnd
, NULL
);
246 retvalue
= DefWindowProcA( hWnd
, msg
, wParam
, lParam
);
248 WIN_ReleaseWndPtr(wnd
);