[8543] | 1 | /*
|
---|
| 2 | * Icontitle window class.
|
---|
| 3 | *
|
---|
| 4 | * Copyright 1997 Alex Korobka
|
---|
| 5 | *
|
---|
| 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.
|
---|
| 10 | *
|
---|
| 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.
|
---|
| 15 | *
|
---|
| 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
|
---|
| 19 | */
|
---|
| 20 |
|
---|
| 21 | #include <stdio.h>
|
---|
| 22 | #include <string.h>
|
---|
| 23 | #include <unistd.h>
|
---|
| 24 |
|
---|
| 25 | #include "windef.h"
|
---|
| 26 | #include "winbase.h"
|
---|
| 27 | #include "wingdi.h"
|
---|
| 28 | #include "winuser.h"
|
---|
| 29 | #include "wine/winuser16.h"
|
---|
| 30 | #include "wine/unicode.h"
|
---|
| 31 | #include "controls.h"
|
---|
| 32 | #include "win.h"
|
---|
| 33 |
|
---|
| 34 | static BOOL bMultiLineTitle;
|
---|
| 35 | static HFONT hIconTitleFont;
|
---|
| 36 |
|
---|
| 37 | static LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
|
---|
| 38 |
|
---|
| 39 | /*********************************************************************
|
---|
| 40 | * icon title class descriptor
|
---|
| 41 | */
|
---|
| 42 | const struct builtin_class_descr ICONTITLE_builtin_class =
|
---|
| 43 | {
|
---|
| 44 | ICONTITLE_CLASS_ATOM, /* name */
|
---|
| 45 | CS_GLOBALCLASS, /* style */
|
---|
| 46 | NULL, /* procA (winproc is Unicode only) */
|
---|
| 47 | IconTitleWndProc, /* procW */
|
---|
| 48 | 0, /* extra */
|
---|
| 49 | IDC_ARROWA, /* cursor */
|
---|
| 50 | 0 /* brush */
|
---|
| 51 | };
|
---|
| 52 |
|
---|
| 53 |
|
---|
| 54 |
|
---|
| 55 | /***********************************************************************
|
---|
| 56 | * ICONTITLE_Create
|
---|
| 57 | */
|
---|
| 58 | HWND ICONTITLE_Create( HWND owner )
|
---|
| 59 | {
|
---|
| 60 | HWND hWnd;
|
---|
| 61 | HINSTANCE instance = GetWindowLongA( owner, GWL_HINSTANCE );
|
---|
| 62 | LONG style = WS_CLIPSIBLINGS;
|
---|
| 63 |
|
---|
| 64 | if (!IsWindowEnabled(owner)) style |= WS_DISABLED;
|
---|
| 65 | if( GetWindowLongA( owner, GWL_STYLE ) & WS_CHILD )
|
---|
| 66 | hWnd = CreateWindowExA( 0, ICONTITLE_CLASS_ATOM, NULL,
|
---|
| 67 | style | WS_CHILD, 0, 0, 1, 1,
|
---|
| 68 | GetParent(owner), 0, instance, NULL );
|
---|
| 69 | else
|
---|
| 70 | hWnd = CreateWindowExA( 0, ICONTITLE_CLASS_ATOM, NULL,
|
---|
| 71 | style, 0, 0, 1, 1,
|
---|
| 72 | owner, 0, instance, NULL );
|
---|
| 73 | WIN_SetOwner( hWnd, owner ); /* MDI depends on this */
|
---|
| 74 | SetWindowLongW( hWnd, GWL_STYLE,
|
---|
| 75 | GetWindowLongW( hWnd, GWL_STYLE ) & ~(WS_CAPTION | WS_BORDER) );
|
---|
| 76 | return hWnd;
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | /***********************************************************************
|
---|
| 80 | * ICONTITLE_SetTitlePos
|
---|
| 81 | */
|
---|
| 82 | static BOOL ICONTITLE_SetTitlePos( HWND hwnd, HWND owner )
|
---|
| 83 | {
|
---|
| 84 | static WCHAR emptyTitleText[] = {'<','.','.','.','>',0};
|
---|
| 85 | WCHAR str[80];
|
---|
| 86 | HDC hDC;
|
---|
| 87 | HFONT hPrevFont;
|
---|
| 88 | RECT rect;
|
---|
| 89 | INT cx, cy;
|
---|
| 90 | POINT pt;
|
---|
| 91 |
|
---|
| 92 | int length = GetWindowTextW( owner, str, sizeof(str)/sizeof(WCHAR) );
|
---|
| 93 |
|
---|
| 94 | while (length && str[length - 1] == ' ') /* remove trailing spaces */
|
---|
| 95 | str[--length] = 0;
|
---|
| 96 |
|
---|
| 97 | if( !length )
|
---|
| 98 | {
|
---|
| 99 | strcpyW( str, emptyTitleText );
|
---|
| 100 | length = strlenW( str );
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | if (!(hDC = GetDC( hwnd ))) return FALSE;
|
---|
| 104 |
|
---|
| 105 | hPrevFont = SelectObject( hDC, hIconTitleFont );
|
---|
| 106 |
|
---|
| 107 | SetRect( &rect, 0, 0, GetSystemMetrics(SM_CXICONSPACING) -
|
---|
| 108 | GetSystemMetrics(SM_CXBORDER) * 2,
|
---|
| 109 | GetSystemMetrics(SM_CYBORDER) * 2 );
|
---|
| 110 |
|
---|
| 111 | DrawTextW( hDC, str, length, &rect, DT_CALCRECT | DT_CENTER | DT_NOPREFIX | DT_WORDBREAK |
|
---|
| 112 | (( bMultiLineTitle ) ? 0 : DT_SINGLELINE) );
|
---|
| 113 |
|
---|
| 114 | SelectObject( hDC, hPrevFont );
|
---|
| 115 | ReleaseDC( hwnd, hDC );
|
---|
| 116 |
|
---|
| 117 | cx = rect.right - rect.left + 4 * GetSystemMetrics(SM_CXBORDER);
|
---|
| 118 | cy = rect.bottom - rect.top;
|
---|
| 119 |
|
---|
| 120 | pt.x = (GetSystemMetrics(SM_CXICON) - cx) / 2;
|
---|
| 121 | pt.y = GetSystemMetrics(SM_CYICON);
|
---|
| 122 |
|
---|
| 123 | /* point is relative to owner, make it relative to parent */
|
---|
| 124 | MapWindowPoints( owner, GetParent(hwnd), &pt, 1 );
|
---|
| 125 |
|
---|
| 126 | SetWindowPos( hwnd, owner, pt.x, pt.y, cx, cy, SWP_NOACTIVATE );
|
---|
| 127 | return TRUE;
|
---|
| 128 | }
|
---|
| 129 |
|
---|
| 130 | /***********************************************************************
|
---|
| 131 | * ICONTITLE_Paint
|
---|
| 132 | */
|
---|
| 133 | static BOOL ICONTITLE_Paint( HWND hwnd, HWND owner, HDC hDC, BOOL bActive )
|
---|
| 134 | {
|
---|
| 135 | RECT rect;
|
---|
| 136 | HFONT hPrevFont;
|
---|
| 137 | HBRUSH hBrush = 0;
|
---|
| 138 | COLORREF textColor = 0;
|
---|
| 139 |
|
---|
| 140 | if( bActive )
|
---|
| 141 | {
|
---|
| 142 | hBrush = GetSysColorBrush(COLOR_ACTIVECAPTION);
|
---|
| 143 | textColor = GetSysColor(COLOR_CAPTIONTEXT);
|
---|
| 144 | }
|
---|
| 145 | else
|
---|
| 146 | {
|
---|
| 147 | if( GetWindowLongA( hwnd, GWL_STYLE ) & WS_CHILD )
|
---|
| 148 | {
|
---|
| 149 | hBrush = (HBRUSH) GetClassLongA(hwnd, GCL_HBRBACKGROUND);
|
---|
| 150 | if( hBrush )
|
---|
| 151 | {
|
---|
| 152 | INT level;
|
---|
| 153 | LOGBRUSH logBrush;
|
---|
| 154 | GetObjectA( hBrush, sizeof(logBrush), &logBrush );
|
---|
| 155 | level = GetRValue(logBrush.lbColor) +
|
---|
| 156 | GetGValue(logBrush.lbColor) +
|
---|
| 157 | GetBValue(logBrush.lbColor);
|
---|
| 158 | if( level < (0x7F * 3) )
|
---|
| 159 | textColor = RGB( 0xFF, 0xFF, 0xFF );
|
---|
| 160 | }
|
---|
| 161 | else
|
---|
| 162 | hBrush = GetStockObject( WHITE_BRUSH );
|
---|
| 163 | }
|
---|
| 164 | else
|
---|
| 165 | {
|
---|
| 166 | hBrush = GetStockObject( BLACK_BRUSH );
|
---|
| 167 | textColor = RGB( 0xFF, 0xFF, 0xFF );
|
---|
| 168 | }
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | GetClientRect( hwnd, &rect );
|
---|
| 172 | DPtoLP( hDC, (LPPOINT)&rect, 2 );
|
---|
| 173 | FillRect( hDC, &rect, hBrush );
|
---|
| 174 |
|
---|
| 175 | hPrevFont = SelectObject( hDC, hIconTitleFont );
|
---|
| 176 | if( hPrevFont )
|
---|
| 177 | {
|
---|
| 178 | WCHAR buffer[80];
|
---|
| 179 |
|
---|
| 180 | INT length = GetWindowTextW( owner, buffer, sizeof(buffer) );
|
---|
| 181 | SetTextColor( hDC, textColor );
|
---|
| 182 | SetBkMode( hDC, TRANSPARENT );
|
---|
| 183 |
|
---|
| 184 | DrawTextW( hDC, buffer, length, &rect, DT_CENTER | DT_NOPREFIX |
|
---|
| 185 | DT_WORDBREAK | ((bMultiLineTitle) ? 0 : DT_SINGLELINE) );
|
---|
| 186 |
|
---|
| 187 | SelectObject( hDC, hPrevFont );
|
---|
| 188 | }
|
---|
| 189 | return (hPrevFont != 0);
|
---|
| 190 | }
|
---|
| 191 |
|
---|
| 192 | /***********************************************************************
|
---|
| 193 | * IconTitleWndProc
|
---|
| 194 | */
|
---|
| 195 | LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg,
|
---|
| 196 | WPARAM wParam, LPARAM lParam )
|
---|
| 197 | {
|
---|
| 198 | HWND owner = GetWindow( hWnd, GW_OWNER );
|
---|
| 199 |
|
---|
| 200 | if (!IsWindow(hWnd)) return 0;
|
---|
| 201 |
|
---|
| 202 | switch( msg )
|
---|
| 203 | {
|
---|
| 204 | case WM_CREATE:
|
---|
| 205 | if (!hIconTitleFont)
|
---|
| 206 | {
|
---|
| 207 | LOGFONTA logFont;
|
---|
| 208 | SystemParametersInfoA( SPI_GETICONTITLELOGFONT, 0, &logFont, 0 );
|
---|
| 209 | SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &bMultiLineTitle, 0 );
|
---|
| 210 | hIconTitleFont = CreateFontIndirectA( &logFont );
|
---|
| 211 | }
|
---|
| 212 | return (hIconTitleFont ? 0 : -1);
|
---|
| 213 | case WM_NCHITTEST:
|
---|
| 214 | return HTCAPTION;
|
---|
| 215 | case WM_NCMOUSEMOVE:
|
---|
| 216 | case WM_NCLBUTTONDBLCLK:
|
---|
| 217 | return SendMessageW( owner, msg, wParam, lParam );
|
---|
| 218 | case WM_ACTIVATE:
|
---|
| 219 | if( wParam ) SetActiveWindow( owner );
|
---|
| 220 | return 0;
|
---|
| 221 | case WM_CLOSE:
|
---|
| 222 | return 0;
|
---|
| 223 | case WM_SHOWWINDOW:
|
---|
| 224 | if (wParam) ICONTITLE_SetTitlePos( hWnd, owner );
|
---|
| 225 | return 0;
|
---|
| 226 | case WM_ERASEBKGND:
|
---|
| 227 | if( GetWindowLongA( owner, GWL_STYLE ) & WS_CHILD )
|
---|
| 228 | lParam = SendMessageA( owner, WM_ISACTIVEICON, 0, 0 );
|
---|
| 229 | else
|
---|
| 230 | lParam = (owner == GetActiveWindow());
|
---|
| 231 | if( ICONTITLE_Paint( hWnd, owner, (HDC)wParam, (BOOL)lParam ) )
|
---|
| 232 | ValidateRect( hWnd, NULL );
|
---|
| 233 | return 1;
|
---|
| 234 | }
|
---|
| 235 | return DefWindowProcW( hWnd, msg, wParam, lParam );
|
---|
| 236 | }
|
---|
| 237 |
|
---|
| 238 |
|
---|