Sun Oct 1 15:48:34 1995 Alexandre Julliard <julliard@sunsite.unc> * [controls/menu.c] Fixed GetMenuString() for non-string items. * [debugger/*.c] First attempt to check validity of pointers before memory accesses. For now only segmented pointers are checked. * [debugger/dbg.y] [memory/ldt.c] Added possibility to dump only one segment with 'info segment'. * [include/bitmaps/ocr_*] Added all OEM cursors as XPM bitmaps. * [include/cursoricon.h] [objects/cursoricon.c] Rewrote all cursor and icon management to use the same memory layout as Windows, and to factor common code between icons and cursors. Implemented icon directory lookup to find the best matching icon (i.e. the color one). Implemented CopyCursor() and DumpIcon(). * [loader/module.c] For disabled built-in modules, we now try to load the Windows DLL first, and if this fails we fall back to using the built-in module anyway. * [memory/global.c] Fixed GlobalHandle() to return the correct selector in the high word even if we are passed a handle in the first place. * [miscemu/instr.c] Take into account the size of the operand and of the stack segment when incrementing the stack pointer. Avoid referencing FS_reg and GS_reg on *BSD. * [objects/dib.c] All DIB functions now accept a BITMAPCOREHEADER format bitmap. Monochrome DIBs are created as monochrome bitmap iff they are black and white. * [objects/oembitmap.c] Added support for OEM cursors, changed OBM_LoadIcon to use the new icon memory layout. * [rc/sysres_Fr.rc] Added French [Fr] language support. * [win32/environment.c] Fixed GetCommandLineA() to use current PDB. * [windows/event.c] [windows/winpos.c] Simulate a mouse motion event upon SetWindowPos() to force the cursor to be set correctly. Sat Sep 30 17:49:32 Cameron Heide (heide@ee.ualberta.ca) * [win32/*] New Win32 kernel functions: GetACP, GetCPInfo, GetEnvironmentVariableA, GetFileType, GetLastError, GetOEMCP, GetStartupInfoA, GetTimeZoneInformation, SetEnvironmentVariable, SetFilePointer, SetLastError, VirtualAlloc, VirtualFree, WriteFile. Completed implementations of GetCommandLineA. * [include/kernel32.h] New file. * [loader/main.c] Call initialization function for Win32 data (doesn't currently do anything). * [misc/main.c] Implemented GetEnvironmentVariableA, SetEnvironmentVariableA. Sat Sep 30 00:26:56 1995 Niels de Carpentier <niels@cindy.et.tudelft.nl> * [windows/winpos.c][miscemu/emulate.c][loader/module.c] [misc/commdlg.c] Misc. bug fixes Fri Sep 29 16:16:13 1995 Jim Peterson <jspeter@birch.ee.vt.edu> * [*/*] For Winelib, explicit casts have been placed where warnings were usually generated. printf formats which give the format for printing a handle as "%04x" or something similar have been changed to use the NPFMT macro defined in include/wintypes.h. Some times, explicit casts were also necessary. Parameter, field, and variable declarations have been made more exact, such as converting 'WORD wParam' to 'WPARAM wParam' or 'WORD hFont' to 'HFONT hFont'. Any call of the form GetWindowWord(hwnd,GWW_HINSTANCE) has been replaced with a call to WIN_GetWindowInstance(hwnd). * [controls/combo.c] Added WINELIB32 support in CLBoxGetCombo(). * [include/dialog.h] Commented out the '#ifndef WINELIB' around the '#pragma pack(1)'. winelib needs the packing as well (e.g. when accessing resources like sysres_DIALOG_SHELL_ABOUT_MSGBOX). * [include/windows.h] Got rid of the F[a-k] macros, which were cluttering up the global namespace. * [include/windows.h] [windows/defwnd.c] Added Win32 messages WM_CTLCOLOR*. * [include/wintypes.h] Put in preprocessor '#define WINELIB32' if appropriate and changed the types of some typedefs (WPARAM, HANDLE) based on this. * [loader/module.c] [toolkit/miscstubs.c] Added #ifdef'd portion in LoadModule to handle loading a WINElib module (already loaded, just init values). '#ifdef'ed out the definition for GetWndProcEntry16 and added a new version to toolkit/miscstubs.c. * [misc/shell.c] Adjusted the lengths of AppName and AppMisc from 512,512 to 128,906. Same amount of total storage, but much more reasonable. Also, changed calls to strcpy() in ShellAbout() to calls to strncpy() instead. This was a difficult bug to track down, but the AppMisc field was being initialized with the contributers text, which was much larger than 512 characters. * [toolkit/atom.c] New file for atom-handling functions. Copied from memory/atom.c and then heavily modified. Right now, it's just a linked list of atoms. Consider it as a hash table with just one entry. It's easily changed later. * [toolkit/heap.c] Commented out the heap functions with a "#ifdef WINELIB16" and put in a Win32 version (which is basically a modified copy). * [toolkit/sup.c] [toolkit/miscstubs.c] Moved the stuff I put in toolkit/sup.c into toolkit/miscstubs.c and added quite a few more stubs. * [toolkit/winmain.c] Rearranged startup code in _WinMain. I think this will work. * [toolkit/Makefile.in] Added targets for 'hello' and 'hello2' in case anyone cares to try out the sample programs. Wed Sep 27 23:13:43 1995 Anand Kumria <akumria@ozemail.com.au> * [miscemu/int2f.c] [miscemu/vxd.c] [if1632/winprocs.spec] First attempt at support for some VxDs. Comm, Shell and Pagefile. Tue Sep 26 21:34:45 1995 Hans de Graaff <graaff@twi72.twi.tudelft.nl> * [misc/dos_fs.c] DOS_SimplifyPath: Also remove "/./" from path. (Happens when starting applications like 'wine ./excel.exe') Sat Sep 23 23:32:40 1995 Morten Welinder <terra@diku.dk> * [configure.in] Avoid relative path for wine.ini. * [rc/sysres_Da.rc] Support for Danish [Da] language. * [misc/main.c] [miscemu/cpu.c] Return the processor we're running on correctly. * [miscemu/int2f.c] Minor stuff in int 0x2f, function 0x16. Sat Sep 23 1995 17:58:04 Marcus Meissner <msmeissn@faui01.informatik.uni-erlangen.de> * [misc/shell.c] [misc/main.c] Implement saving and loading of the registry database (needed for OLE). Very experimental. Fixed ShellExecute(). * [miscemu/int21.c] EEXIST is not a critical error condition for mkdir(). Fri Sep 22 01:33:34 1995 Alex Korobka <alex@phm6.pharm.sunysb.edu> * [include/shell.h] [misc/shell.c] Implemented 4 drag/drop functions with documented functionality. * [multimedia/time.c] "Fixed" MMSysTimeCallback kludge so Excel5 loads up without crashing. * [*/*] Added new files, more message definitions, structures, debug info, etc. Rewrote message logging functions to produce output similar to WinSight. Check out -debugmsg +message option. * [misc/file.c] Fixed GetDriveType return value. * [windows/message.c] Hooks are invoked in normal order. * [miscemu/*] Added some functions and interrupts. * [misc/shell.c] Implemented Drag... functions. Thu Sep 21 23:50:12 1995 Jukka Iivonen <iivonen@cc.helsinki.fi> * [rc/sysres_Fi.rc] [rc/sysres.rc] First attempt at Finnish [Fi] language support.
520 lines
16 KiB
C
520 lines
16 KiB
C
/* File: button.c -- Button type widgets
|
|
*
|
|
* Copyright (C) 1993 Johannes Ruscheinski
|
|
* Copyright (C) 1993 David Metcalfe
|
|
* Copyright (C) 1994 Alexandre Julliard
|
|
*/
|
|
|
|
#include "win.h"
|
|
#include "user.h"
|
|
#include "syscolor.h"
|
|
#include "graphics.h"
|
|
#include "button.h"
|
|
#include "stackframe.h"
|
|
|
|
extern void DEFWND_SetText( HWND hwnd, LPSTR text ); /* windows/defwnd.c */
|
|
|
|
static void PB_Paint( HWND hWnd, HDC hDC, WORD action );
|
|
static void CB_Paint( HWND hWnd, HDC hDC, WORD action );
|
|
static void GB_Paint( HWND hWnd, HDC hDC, WORD action );
|
|
static void UB_Paint( HWND hWnd, HDC hDC, WORD action );
|
|
static void OB_Paint( HWND hWnd, HDC hDC, WORD action );
|
|
static void BUTTON_CheckAutoRadioButton(HWND hWnd);
|
|
|
|
|
|
#define MAX_BTN_TYPE 12
|
|
|
|
static WORD maxCheckState[MAX_BTN_TYPE] =
|
|
{
|
|
BUTTON_UNCHECKED, /* BS_PUSHBUTTON */
|
|
BUTTON_UNCHECKED, /* BS_DEFPUSHBUTTON */
|
|
BUTTON_CHECKED, /* BS_CHECKBOX */
|
|
BUTTON_CHECKED, /* BS_AUTOCHECKBOX */
|
|
BUTTON_CHECKED, /* BS_RADIOBUTTON */
|
|
BUTTON_3STATE, /* BS_3STATE */
|
|
BUTTON_3STATE, /* BS_AUTO3STATE */
|
|
BUTTON_UNCHECKED, /* BS_GROUPBOX */
|
|
BUTTON_UNCHECKED, /* BS_USERBUTTON */
|
|
BUTTON_CHECKED, /* BS_AUTORADIOBUTTON */
|
|
BUTTON_UNCHECKED, /* Not defined */
|
|
BUTTON_UNCHECKED /* BS_OWNERDRAW */
|
|
};
|
|
|
|
typedef void (*pfPaint)(HWND,HDC,WORD);
|
|
|
|
static pfPaint btnPaintFunc[MAX_BTN_TYPE] =
|
|
{
|
|
PB_Paint, /* BS_PUSHBUTTON */
|
|
PB_Paint, /* BS_DEFPUSHBUTTON */
|
|
CB_Paint, /* BS_CHECKBOX */
|
|
CB_Paint, /* BS_AUTOCHECKBOX */
|
|
CB_Paint, /* BS_RADIOBUTTON */
|
|
CB_Paint, /* BS_3STATE */
|
|
CB_Paint, /* BS_AUTO3STATE */
|
|
GB_Paint, /* BS_GROUPBOX */
|
|
UB_Paint, /* BS_USERBUTTON */
|
|
CB_Paint, /* BS_AUTORADIOBUTTON */
|
|
NULL, /* Not defined */
|
|
OB_Paint /* BS_OWNERDRAW */
|
|
};
|
|
|
|
#define PAINT_BUTTON(hwnd,style,action) \
|
|
if (btnPaintFunc[style]) { \
|
|
HDC hdc = GetDC( hwnd ); \
|
|
(btnPaintFunc[style])(hwnd,hdc,action); \
|
|
ReleaseDC( hwnd, hdc ); }
|
|
|
|
static HBITMAP hbitmapCheckBoxes = 0;
|
|
static WORD checkBoxWidth = 0, checkBoxHeight = 0;
|
|
|
|
|
|
LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
RECT rect;
|
|
LONG lResult = 0;
|
|
WND *wndPtr = WIN_FindWndPtr(hWnd);
|
|
LONG style = wndPtr->dwStyle & 0x0000000F;
|
|
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
|
|
|
|
switch (uMsg) {
|
|
case WM_GETDLGCODE:
|
|
switch(style)
|
|
{
|
|
case BS_PUSHBUTTON:
|
|
return DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON;
|
|
case BS_DEFPUSHBUTTON:
|
|
return DLGC_BUTTON | DLGC_DEFPUSHBUTTON;
|
|
case BS_RADIOBUTTON:
|
|
case BS_AUTORADIOBUTTON:
|
|
return DLGC_BUTTON | DLGC_RADIOBUTTON;
|
|
default:
|
|
return DLGC_BUTTON;
|
|
}
|
|
|
|
case WM_ENABLE:
|
|
PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE );
|
|
break;
|
|
|
|
case WM_CREATE:
|
|
if (!hbitmapCheckBoxes)
|
|
{
|
|
BITMAP bmp;
|
|
hbitmapCheckBoxes = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CHECKBOXES) );
|
|
GetObject( hbitmapCheckBoxes, sizeof(bmp), (LPSTR)&bmp );
|
|
checkBoxWidth = bmp.bmWidth / 4;
|
|
checkBoxHeight = bmp.bmHeight / 3;
|
|
}
|
|
|
|
if (style < 0L || style >= MAX_BTN_TYPE)
|
|
lResult = -1L;
|
|
else
|
|
{
|
|
infoPtr->state = BUTTON_UNCHECKED;
|
|
infoPtr->hFont = 0;
|
|
lResult = 0L;
|
|
}
|
|
break;
|
|
|
|
case WM_ERASEBKGND:
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
if (btnPaintFunc[style])
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HDC hdc = BeginPaint( hWnd, &ps );
|
|
(btnPaintFunc[style])( hWnd, hdc, ODA_DRAWENTIRE );
|
|
ReleaseDC( hWnd, hdc );
|
|
}
|
|
break;
|
|
|
|
case WM_LBUTTONDOWN:
|
|
SendMessage( hWnd, BM_SETSTATE, TRUE, 0 );
|
|
SetFocus( hWnd );
|
|
SetCapture( hWnd );
|
|
break;
|
|
|
|
case WM_LBUTTONUP:
|
|
ReleaseCapture();
|
|
if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) break;
|
|
SendMessage( hWnd, BM_SETSTATE, FALSE, 0 );
|
|
GetClientRect( hWnd, &rect );
|
|
if (PtInRect( &rect, MAKEPOINT(lParam) ))
|
|
{
|
|
switch(style)
|
|
{
|
|
case BS_AUTOCHECKBOX:
|
|
SendMessage( hWnd, BM_SETCHECK,
|
|
!(infoPtr->state & BUTTON_CHECKED), 0 );
|
|
break;
|
|
case BS_AUTORADIOBUTTON:
|
|
SendMessage( hWnd, BM_SETCHECK, TRUE, 0 );
|
|
break;
|
|
case BS_AUTO3STATE:
|
|
SendMessage( hWnd, BM_SETCHECK,
|
|
(infoPtr->state & BUTTON_3STATE) ? 0 :
|
|
((infoPtr->state & 3) + 1), 0 );
|
|
break;
|
|
}
|
|
#ifdef WINELIB32
|
|
SendMessage( GetParent(hWnd), WM_COMMAND,
|
|
MAKEWPARAM(wndPtr->wIDmenu,BN_CLICKED),
|
|
(LPARAM) hWnd );
|
|
#else
|
|
SendMessage( GetParent(hWnd), WM_COMMAND,
|
|
wndPtr->wIDmenu, MAKELPARAM(hWnd,BN_CLICKED));
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
case WM_MOUSEMOVE:
|
|
if (GetCapture() == hWnd)
|
|
{
|
|
GetClientRect( hWnd, &rect );
|
|
if (PtInRect( &rect, MAKEPOINT(lParam)) )
|
|
SendMessage( hWnd, BM_SETSTATE, TRUE, 0 );
|
|
else SendMessage( hWnd, BM_SETSTATE, FALSE, 0 );
|
|
}
|
|
break;
|
|
|
|
case WM_NCHITTEST:
|
|
if(style == BS_GROUPBOX) return HTTRANSPARENT;
|
|
lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_SETTEXT:
|
|
DEFWND_SetText( hWnd, (LPSTR)PTR_SEG_TO_LIN(lParam) );
|
|
PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE );
|
|
return 0;
|
|
|
|
case WM_SETFONT:
|
|
infoPtr->hFont = (HFONT) wParam;
|
|
if (lParam)
|
|
PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE );
|
|
break;
|
|
|
|
case WM_GETFONT:
|
|
return (LONG) infoPtr->hFont;
|
|
|
|
case WM_SETFOCUS:
|
|
infoPtr->state |= BUTTON_HASFOCUS;
|
|
PAINT_BUTTON( hWnd, style, ODA_FOCUS );
|
|
break;
|
|
|
|
case WM_KILLFOCUS:
|
|
infoPtr->state &= ~BUTTON_HASFOCUS;
|
|
PAINT_BUTTON( hWnd, style, ODA_FOCUS );
|
|
break;
|
|
|
|
case WM_SYSCOLORCHANGE:
|
|
InvalidateRect(hWnd, NULL, FALSE);
|
|
break;
|
|
|
|
case BM_SETSTYLE:
|
|
if ((wParam & 0x0f) >= MAX_BTN_TYPE) break;
|
|
wndPtr->dwStyle = (wndPtr->dwStyle & 0xfffffff0)
|
|
| (wParam & 0x0000000f);
|
|
style = wndPtr->dwStyle & 0x0000000f;
|
|
PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE );
|
|
break;
|
|
|
|
case BM_GETCHECK:
|
|
lResult = infoPtr->state & 3;
|
|
break;
|
|
|
|
case BM_SETCHECK:
|
|
if (wParam > maxCheckState[style])
|
|
wParam = maxCheckState[style];
|
|
if ((infoPtr->state & 3) != wParam)
|
|
{
|
|
infoPtr->state = (infoPtr->state & ~3) | wParam;
|
|
PAINT_BUTTON( hWnd, style, ODA_SELECT );
|
|
}
|
|
if(style == BS_AUTORADIOBUTTON && wParam==BUTTON_CHECKED)
|
|
BUTTON_CheckAutoRadioButton(hWnd);
|
|
break;
|
|
|
|
case BM_GETSTATE:
|
|
lResult = infoPtr->state;
|
|
break;
|
|
|
|
case BM_SETSTATE:
|
|
if (!wParam != !(infoPtr->state & BUTTON_HIGHLIGHTED))
|
|
{
|
|
if (wParam) infoPtr->state |= BUTTON_HIGHLIGHTED;
|
|
else infoPtr->state &= ~BUTTON_HIGHLIGHTED;
|
|
PAINT_BUTTON( hWnd, style, ODA_SELECT );
|
|
}
|
|
break;
|
|
|
|
default:
|
|
lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
break;
|
|
}
|
|
|
|
return lResult;
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* Push Button Functions
|
|
*/
|
|
|
|
static void PB_Paint( HWND hButton, HDC hDC, WORD action )
|
|
{
|
|
RECT rc;
|
|
HPEN hOldPen;
|
|
HBRUSH hOldBrush;
|
|
char *text;
|
|
DWORD dwTextSize;
|
|
TEXTMETRIC tm;
|
|
WND *wndPtr = WIN_FindWndPtr( hButton );
|
|
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
|
|
|
|
GetClientRect(hButton, &rc);
|
|
|
|
/* Send WM_CTLCOLOR to allow changing the font (the colors are fixed) */
|
|
if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
|
|
#ifdef WINELIB32
|
|
SendMessage( GetParent(hButton), WM_CTLCOLORBTN,
|
|
(WPARAM)hDC, (LPARAM)hButton );
|
|
#else
|
|
SendMessage( GetParent(hButton), WM_CTLCOLOR, (WORD)hDC,
|
|
MAKELPARAM(hButton, CTLCOLOR_BTN) );
|
|
#endif
|
|
hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame);
|
|
hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace);
|
|
SetBkMode(hDC, TRANSPARENT);
|
|
Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
|
|
if (action == ODA_DRAWENTIRE)
|
|
{
|
|
SetPixel( hDC, rc.left, rc.top, GetSysColor(COLOR_WINDOW) );
|
|
SetPixel( hDC, rc.left, rc.bottom-1, GetSysColor(COLOR_WINDOW) );
|
|
SetPixel( hDC, rc.right-1, rc.top, GetSysColor(COLOR_WINDOW) );
|
|
SetPixel( hDC, rc.right-1, rc.bottom-1, GetSysColor(COLOR_WINDOW) );
|
|
}
|
|
InflateRect( &rc, -1, -1 );
|
|
|
|
if ((wndPtr->dwStyle & 0x000f) == BS_DEFPUSHBUTTON)
|
|
{
|
|
Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
|
|
InflateRect( &rc, -1, -1 );
|
|
}
|
|
|
|
if (infoPtr->state & BUTTON_HIGHLIGHTED)
|
|
{
|
|
/* draw button shadow: */
|
|
SelectObject(hDC, sysColorObjects.hbrushBtnShadow );
|
|
PatBlt(hDC, rc.left, rc.top, 1, rc.bottom-rc.top, PATCOPY );
|
|
PatBlt(hDC, rc.left, rc.top, rc.right-rc.left, 1, PATCOPY );
|
|
rc.left += 2; /* To position the text down and right */
|
|
rc.top += 2;
|
|
}
|
|
else GRAPH_DrawReliefRect( hDC, &rc, 2, 2, FALSE );
|
|
|
|
/* draw button label, if any: */
|
|
text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
|
|
if (text[0])
|
|
{
|
|
SetTextColor( hDC, (wndPtr->dwStyle & WS_DISABLED) ?
|
|
GetSysColor(COLOR_GRAYTEXT) : GetSysColor(COLOR_BTNTEXT));
|
|
DrawText(hDC, text, -1, &rc,
|
|
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
|
|
/* do we have the focus? */
|
|
if (infoPtr->state & BUTTON_HASFOCUS)
|
|
{
|
|
short xdelta, ydelta;
|
|
dwTextSize = GetTextExtent( hDC, text, strlen(text) );
|
|
GetTextMetrics( hDC, &tm );
|
|
xdelta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) / 2;
|
|
ydelta = ((rc.bottom - rc.top) - tm.tmHeight - 1) / 2;
|
|
if (xdelta < 0) xdelta = 0;
|
|
if (ydelta < 0) ydelta = 0;
|
|
InflateRect( &rc, -xdelta, -ydelta );
|
|
DrawFocusRect( hDC, &rc );
|
|
}
|
|
}
|
|
|
|
SelectObject(hDC, (HANDLE)hOldPen);
|
|
SelectObject(hDC, (HANDLE)hOldBrush);
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* Check Box & Radio Button Functions
|
|
*/
|
|
|
|
static void CB_Paint( HWND hWnd, HDC hDC, WORD action )
|
|
{
|
|
RECT rc;
|
|
HBRUSH hBrush;
|
|
int textlen, delta, x, y;
|
|
char *text;
|
|
TEXTMETRIC tm;
|
|
SIZE size;
|
|
WND *wndPtr = WIN_FindWndPtr(hWnd);
|
|
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
|
|
|
|
GetClientRect(hWnd, &rc);
|
|
|
|
if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
|
|
#ifdef WINELIB32 /* JBP: Different in Win32 */
|
|
hBrush = (HBRUSH) SendMessage(GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC,
|
|
(LPARAM)hWnd);
|
|
#else
|
|
hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
|
|
MAKELPARAM(hWnd, CTLCOLOR_BTN));
|
|
#endif
|
|
if (action == ODA_DRAWENTIRE) FillRect(hDC, &rc, hBrush);
|
|
|
|
GetTextMetrics(hDC, &tm);
|
|
delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
|
|
text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
|
|
textlen = strlen( text );
|
|
|
|
/* Draw the check-box bitmap */
|
|
x = y = 0;
|
|
if (infoPtr->state & BUTTON_HIGHLIGHTED) x += 2 * checkBoxWidth;
|
|
if (infoPtr->state & (BUTTON_CHECKED | BUTTON_3STATE)) x += checkBoxWidth;
|
|
if (((wndPtr->dwStyle & 0x0f) == BS_RADIOBUTTON) ||
|
|
((wndPtr->dwStyle & 0x0f) == BS_AUTORADIOBUTTON)) y += checkBoxHeight;
|
|
else if (infoPtr->state & BUTTON_3STATE) y += 2 * checkBoxHeight;
|
|
GRAPH_DrawBitmap( hDC, hbitmapCheckBoxes, rc.left, rc.top + delta,
|
|
x, y, checkBoxWidth, checkBoxHeight );
|
|
rc.left += checkBoxWidth + tm.tmAveCharWidth / 2;
|
|
|
|
if (action == ODA_DRAWENTIRE)
|
|
{
|
|
if (wndPtr->dwStyle & WS_DISABLED)
|
|
SetTextColor( hDC, GetSysColor(COLOR_GRAYTEXT) );
|
|
DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER);
|
|
}
|
|
|
|
if ((action == ODA_FOCUS) ||
|
|
((action == ODA_DRAWENTIRE) && (infoPtr->state & BUTTON_HASFOCUS)))
|
|
{
|
|
GetTextExtentPoint(hDC, text, textlen, &size);
|
|
if (delta > 1)
|
|
{
|
|
rc.top += delta - 1;
|
|
rc.bottom -= delta + 1;
|
|
}
|
|
rc.left--;
|
|
rc.right = min( rc.left + size.cx + 2, rc.right );
|
|
DrawFocusRect(hDC, &rc);
|
|
}
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* BUTTON_CheckAutoRadioButton
|
|
*
|
|
* hWnd is checked, uncheck everything else in group
|
|
*/
|
|
static void BUTTON_CheckAutoRadioButton(HWND hWnd)
|
|
{
|
|
HWND parent = GetParent(hWnd);
|
|
HWND sibling;
|
|
for(sibling = GetNextDlgGroupItem(parent,hWnd,FALSE);
|
|
sibling != hWnd;
|
|
sibling = GetNextDlgGroupItem(parent,sibling,FALSE))
|
|
SendMessage(sibling,BM_SETCHECK,BUTTON_UNCHECKED,0);
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* Group Box Functions
|
|
*/
|
|
|
|
static void GB_Paint( HWND hWnd, HDC hDC, WORD action )
|
|
{
|
|
RECT rc;
|
|
char *text;
|
|
SIZE size;
|
|
WND *wndPtr = WIN_FindWndPtr( hWnd );
|
|
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
|
|
|
|
if (action != ODA_DRAWENTIRE) return;
|
|
|
|
if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
|
|
#ifdef WINELIB32
|
|
SendMessage( GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hWnd );
|
|
#else
|
|
SendMessage( GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
|
|
MAKELPARAM(hWnd, CTLCOLOR_BTN));
|
|
#endif
|
|
SelectObject( hDC, sysColorObjects.hpenWindowFrame );
|
|
|
|
GetClientRect(hWnd, &rc);
|
|
|
|
MoveTo( hDC, rc.left, rc.top+2 );
|
|
LineTo( hDC, rc.right-1, rc.top+2 );
|
|
LineTo( hDC, rc.right-1, rc.bottom-1 );
|
|
LineTo( hDC, rc.left, rc.bottom-1 );
|
|
LineTo( hDC, rc.left, rc.top+2 );
|
|
|
|
text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
|
|
GetTextExtentPoint(hDC, text, strlen(text), &size);
|
|
rc.left += 10;
|
|
rc.right = rc.left + size.cx + 1;
|
|
rc.bottom = size.cy;
|
|
if (wndPtr->dwStyle & WS_DISABLED)
|
|
SetTextColor( hDC, GetSysColor(COLOR_GRAYTEXT) );
|
|
DrawText(hDC, text, -1, &rc, DT_SINGLELINE );
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* User Button Functions
|
|
*/
|
|
|
|
static void UB_Paint( HWND hWnd, HDC hDC, WORD action )
|
|
{
|
|
RECT rc;
|
|
HBRUSH hBrush;
|
|
WND *wndPtr = WIN_FindWndPtr( hWnd );
|
|
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
|
|
|
|
if (action == ODA_SELECT) return;
|
|
|
|
GetClientRect(hWnd, &rc);
|
|
|
|
if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
|
|
#ifdef WINELIB32
|
|
hBrush = (HBRUSH) SendMessage(GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC,
|
|
(LPARAM)hWnd);
|
|
#else
|
|
hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
|
|
MAKELPARAM(hWnd, CTLCOLOR_BTN));
|
|
#endif
|
|
FillRect(hDC, &rc, hBrush);
|
|
|
|
if ((action == ODA_FOCUS) ||
|
|
((action == ODA_DRAWENTIRE) && (infoPtr->state & BUTTON_HASFOCUS)))
|
|
DrawFocusRect(hDC, &rc);
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* Ownerdrawn Button Functions
|
|
*/
|
|
|
|
static void OB_Paint( HWND hWnd, HDC hDC, WORD action )
|
|
{
|
|
DRAWITEMSTRUCT dis;
|
|
WND *wndPtr = WIN_FindWndPtr( hWnd );
|
|
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
|
|
|
|
dis.CtlType = ODT_BUTTON;
|
|
dis.CtlID = wndPtr->wIDmenu;
|
|
dis.itemID = 0;
|
|
dis.itemAction = action;
|
|
dis.itemState = (infoPtr->state & BUTTON_HASFOCUS) ? ODS_FOCUS : 0 |
|
|
(infoPtr->state & BUTTON_HIGHLIGHTED) ? ODS_SELECTED : 0 |
|
|
(wndPtr->dwStyle & WS_DISABLED) ? ODS_DISABLED : 0;
|
|
dis.hwndItem = hWnd;
|
|
dis.hDC = hDC;
|
|
GetClientRect( hWnd, &dis.rcItem );
|
|
dis.itemData = 0;
|
|
SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM) MAKE_SEGPTR(&dis) );
|
|
}
|