164 lines
5.7 KiB
C
164 lines
5.7 KiB
C
|
/****************************************************************************
|
||
|
*
|
||
|
* Open Watcom Project
|
||
|
*
|
||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||
|
*
|
||
|
* ========================================================================
|
||
|
*
|
||
|
* This file contains Original Code and/or Modifications of Original
|
||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||
|
* provided with the Original Code and Modifications, and is also
|
||
|
* available at www.sybase.com/developer/opensource.
|
||
|
*
|
||
|
* The Original Code and all software distributed under the License are
|
||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||
|
* governing rights and limitations under the License.
|
||
|
*
|
||
|
* ========================================================================
|
||
|
*
|
||
|
* Description: Button library for Windows.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include "button.h"
|
||
|
#include "win1632.h"
|
||
|
|
||
|
static void button_size( HWND hwnd, int id, int FAR * pwidth, int FAR * pheight )
|
||
|
{
|
||
|
HINSTANCE inst;
|
||
|
HBITMAP bmp;
|
||
|
BITMAP bitmap;
|
||
|
|
||
|
inst = GET_HINSTANCE( hwnd );
|
||
|
bmp = LoadBitmap( inst, MAKEINTRESOURCE( id ) );
|
||
|
if( !bmp ) return;
|
||
|
GetObject( bmp, sizeof(BITMAP), &bitmap );
|
||
|
*pwidth = bitmap.bmWidth +5;
|
||
|
*pheight = bitmap.bmHeight + 5;
|
||
|
DeleteObject( bmp );
|
||
|
}
|
||
|
|
||
|
void add_button(
|
||
|
HWND parent,
|
||
|
int top,
|
||
|
int left,
|
||
|
int id,
|
||
|
int FAR * pwidth,
|
||
|
int FAR * pheight )
|
||
|
{
|
||
|
HWND hbutton;
|
||
|
HINSTANCE inst;
|
||
|
|
||
|
// Note that the resource ID is the same as the control ID
|
||
|
inst = GET_HINSTANCE( parent );
|
||
|
button_size( parent, id, pwidth, pheight );
|
||
|
|
||
|
hbutton = CreateWindow(
|
||
|
"BUTTON",
|
||
|
NULL,
|
||
|
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, // Window style
|
||
|
left, // horizontal
|
||
|
top, // vertical
|
||
|
*pwidth, // width
|
||
|
*pheight, // height
|
||
|
parent, // parent window
|
||
|
(HMENU)id, // menu is really child number
|
||
|
inst, // This instance owns this window.
|
||
|
NULL // Pointer not needed.
|
||
|
);
|
||
|
}
|
||
|
|
||
|
void measure_button(HWND parent, int button_id, MEASUREITEMSTRUCT FAR * measure )
|
||
|
{
|
||
|
int width, height; // for proper typing since itemWidth and itemHeight are UNIT's
|
||
|
|
||
|
button_size( parent, button_id, &width, &height );
|
||
|
measure->itemWidth = width;
|
||
|
measure->itemHeight = height;
|
||
|
}
|
||
|
|
||
|
static void horizontal( DRAWITEMSTRUCT FAR * draw, int row )
|
||
|
{
|
||
|
MoveToEx( draw->hDC,draw->rcItem.left + 1, row, NULL );
|
||
|
LineTo( draw->hDC, draw->rcItem.right - 1, row );
|
||
|
}
|
||
|
|
||
|
static void vertical( DRAWITEMSTRUCT FAR * draw, int column )
|
||
|
{
|
||
|
MoveToEx( draw->hDC, column, draw->rcItem.top + 1, NULL );
|
||
|
LineTo( draw->hDC, column, draw->rcItem.bottom - 1 );
|
||
|
}
|
||
|
|
||
|
void draw_button( int button_id, DRAWITEMSTRUCT FAR * draw )
|
||
|
{
|
||
|
HBITMAP bmp;
|
||
|
HBITMAP oldbmp;
|
||
|
HPEN blackpen, shadowpen, brightpen, facepen;
|
||
|
HPEN oldpen;
|
||
|
BITMAP bitmap;
|
||
|
HDC memdc;
|
||
|
HINSTANCE inst;
|
||
|
int shift;
|
||
|
|
||
|
inst = GET_HINSTANCE( draw->hwndItem );
|
||
|
bmp = LoadBitmap( inst, MAKEINTRESOURCE( button_id ) );
|
||
|
if( !bmp ) return;
|
||
|
GetObject( bmp, sizeof(BITMAP), &bitmap );
|
||
|
memdc = CreateCompatibleDC( draw->hDC );
|
||
|
oldbmp = SelectObject( memdc, bmp );
|
||
|
if( draw->itemState & ODS_SELECTED ) {
|
||
|
shift = 4;
|
||
|
} else {
|
||
|
shift = 2;
|
||
|
}
|
||
|
BitBlt( draw->hDC, draw->rcItem.left + shift, draw->rcItem.top + shift,
|
||
|
bitmap.bmWidth, bitmap.bmHeight, memdc, 0, 0, SRCCOPY );
|
||
|
SelectObject( memdc, oldbmp );
|
||
|
DeleteDC( memdc );
|
||
|
DeleteObject( bmp );
|
||
|
// Draw four sides of the button except one pixel in each corner
|
||
|
blackpen = CreatePen( PS_SOLID, 0, RGB(0,0,0) );
|
||
|
brightpen = CreatePen( PS_SOLID, 0, RGB(255,255,255) );
|
||
|
shadowpen = CreatePen( PS_SOLID, 0, GetSysColor( COLOR_BTNSHADOW ) );
|
||
|
facepen = CreatePen( PS_SOLID, 0, GetSysColor( COLOR_BTNFACE ) );
|
||
|
oldpen = SelectObject( draw->hDC, blackpen );
|
||
|
horizontal( draw, draw->rcItem.top );
|
||
|
horizontal( draw, draw->rcItem.bottom - 1 );
|
||
|
vertical( draw, draw->rcItem.left );
|
||
|
vertical( draw, draw->rcItem.right - 1 );
|
||
|
// Now the shading
|
||
|
SelectObject( draw->hDC, shadowpen );
|
||
|
if( draw->itemState & ODS_SELECTED ) {
|
||
|
horizontal( draw, draw->rcItem.top + 1 );
|
||
|
vertical( draw, draw->rcItem.left + 1 );
|
||
|
SelectObject( draw->hDC, facepen );
|
||
|
horizontal( draw, draw->rcItem.top + 2 );
|
||
|
vertical( draw, draw->rcItem.left + 2 );
|
||
|
horizontal( draw, draw->rcItem.top + 3 );
|
||
|
vertical( draw, draw->rcItem.left + 3 );
|
||
|
} else {
|
||
|
horizontal( draw, draw->rcItem.bottom - 2 );
|
||
|
horizontal( draw, draw->rcItem.bottom - 3 );
|
||
|
vertical( draw, draw->rcItem.right - 2 );
|
||
|
vertical( draw, draw->rcItem.right - 3 );
|
||
|
SelectObject( draw->hDC, brightpen );
|
||
|
horizontal( draw, draw->rcItem.top + 1 );
|
||
|
vertical( draw, draw->rcItem.left + 1 );
|
||
|
}
|
||
|
SelectObject( draw->hDC, oldpen );
|
||
|
DeleteObject( blackpen );
|
||
|
DeleteObject( brightpen );
|
||
|
DeleteObject( shadowpen );
|
||
|
DeleteObject( facepen );
|
||
|
}
|