home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1997 May
/
Pcwk0597.iso
/
borland
/
cb
/
setup
/
cbuilder
/
data.z
/
COLORGRD.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1997-02-28
|
14KB
|
500 lines
//---------------------------------------------------------------------------
// Borland C++Builder
// Copyright (c) 1987, 1997 Borland International Inc. All Rights Reserved.
//---------------------------------------------------------------------------
#if !defined (REGISTER_ALL_CONTROLS)
#include "colorgrd.h"
#else
#include "source\colorgrd.h"
#endif
//#pragma resource "*.res" //IDE links .res automatically for components
namespace Colorgrd {
void __fastcall Register()
{
TComponentClass classes[1] = {__classid(TColorGrid)};
RegisterComponents("Samples", classes, 0);
}
}
__fastcall TColorGrid::TColorGrid(TComponent *AOwner):
TCustomControl( AOwner )
{
ControlStyle = ControlStyle;// + [csOpaque]; // cbf
FGridOrdering = go4x4;
FNumXSquares = 4;
FNumYSquares = 4;
FForegroundEnabled = True;
FBackgroundEnabled = True;
Color = TColor(clBtnFace); // cbf assinging int to Tcolor
Canvas->Brush->Style = bsSolid;
Canvas->Pen->Color = clBlack;
SetBounds(0, 0, 100, 100);
GetPaletteEntries(GetStockObject(DEFAULT_PALETTE), 0, NumPaletteEntries,
FPaletteEntries);
}
void __fastcall TColorGrid::CreateWnd(void)
{
TCustomControl::CreateWnd();
SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) | WS_CLIPSIBLINGS);
}
//class TempRect
void __fastcall TColorGrid::DrawSquare(Integer Which, Boolean ShowSelector)
{
Integer WinTop, WinLeft;
Integer PalIndex;
TRect CellRect;
if( Which >=0 && Which <= 15 )
{
if( Which < 8 )
PalIndex = Which;
else
PalIndex = Which + 4;
WinTop = ( Which/FNumXSquares ) * FCellYSize;
WinLeft = (Which % FNumXSquares) * FCellXSize;
CellRect = Bounds(WinLeft, WinTop, FCellXSize, FCellYSize);
if( Ctl3D ) {
Canvas->Pen->Color = TColor(clBtnFace);
Canvas->Rectangle(RECT(CellRect).left,
RECT(CellRect).top,
RECT(CellRect).right,
RECT(CellRect).bottom);
InflateRect(&RECT(CellRect), -1, -1);
Extctrls::Frame3D(Canvas, CellRect, TColor(clBtnShadow), TColor(clBtnHighlight), 2);
}
else
Canvas->Pen->Color = TColor(clBlack);
TPaletteEntry temp = FPaletteEntries[PalIndex];
Canvas->Brush->Color = TColor(RGB( temp.peRed, temp.peGreen, temp.peBlue));
if( Ctl3D )
Canvas->Pen->Color = TColor(RGB(temp.peRed, temp.peGreen, temp.peBlue));
if( !ShowSelector )
Canvas->Rectangle(RECT(CellRect).left,
RECT(CellRect).top,
RECT(CellRect).right,
RECT(CellRect).bottom);
else
{
if(Ctl3D)
{
Canvas->Rectangle(RECT(CellRect).left,
RECT(CellRect).top,
RECT(CellRect).right,
RECT(CellRect).bottom);
InflateRect(&RECT(CellRect), -1, -1);
DrawFocusRect((HDC)Canvas->Handle, &RECT(CellRect));
}
else
{
Canvas->Pen->Color = clBlack;
Canvas->Pen->Mode = pmNot;
Canvas->Rectangle(RECT(CellRect).left,
RECT(CellRect).top,
RECT(CellRect).right,
RECT(CellRect).bottom);
Canvas->Pen->Mode = pmCopy;
Canvas->Rectangle(RECT(CellRect).left +2,
RECT(CellRect).top +2,
RECT(CellRect).right -2,
RECT(CellRect).bottom -2);
}
}
}
}
int TernaryOp( Boolean Test, Integer ResultTrue, Integer ResultFalse )
{
int Result;
if( Test )
Result = ResultTrue;
else
Result = ResultFalse;
return Result;
}
#pragma warn -sig
void __fastcall TColorGrid::DrawFgBg(void)
{
TPaletteEntry TextColor;
Integer PalIndex;
AnsiString TheText;
Integer OldBkMode;
TRect R;
OldBkMode = SetBkMode((HDC)Canvas->Handle, TRANSPARENT);
if( FForegroundEnabled )
{
if( (FForegroundIndex == FBackgroundIndex) && FBackgroundEnabled )
TheText = LoadStr(SFB);
else
TheText = LoadStr(SFG);
if( FForegroundIndex < 8 )
PalIndex = FForegroundIndex;
else
PalIndex = FForegroundIndex + 4;
TextColor = FPaletteEntries[PalIndex];
TextColor.peRed = TernaryOp(TextColor.peRed >= 0x80, 0, 0xFF);
TextColor.peGreen = TernaryOp(TextColor.peGreen >= 0x80, 0, 0xFF);
TextColor.peBlue = TernaryOp(TextColor.peBlue >= 0x80, 0, 0xFF);
Canvas->Font->Color = TColor(RGB(TextColor.peRed, TextColor.peGreen, TextColor.peBlue));
R.Left = (FForegroundIndex % FNumXSquares) * FCellXSize;
R.Right = R.Left + FCellXSize;
R.Top = (FForegroundIndex / FNumXSquares) * FCellYSize;
R.Bottom = R.Top + FCellYSize;
DrawText((HDC)Canvas->Handle, PChar(TheText.c_str()), -1, &RECT(R),
DT_NOCLIP | DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
if( FBackgroundEnabled )
{
if( (FForegroundIndex == FBackgroundIndex) && FForegroundEnabled )
TheText = LoadStr(SFB);
else
TheText = LoadStr(SBG);
if( FBackgroundIndex < 8 )
PalIndex = FBackgroundIndex;
else
PalIndex = FBackgroundIndex + 4;
TextColor = FPaletteEntries[PalIndex];
TextColor.peRed = TernaryOp(TextColor.peRed >= 0x80, 0, 0xFF);
TextColor.peGreen = TernaryOp(TextColor.peGreen >= 0x80, 0, 0xFF);
TextColor.peBlue = TernaryOp(TextColor.peBlue >= 0x80, 0, 0xFF);
Canvas->Font->Color = TColor(RGB(TextColor.peRed, TextColor.peGreen, TextColor.peBlue));
R.Left = (FBackgroundIndex % FNumXSquares) * FCellXSize;
R.Right = R.Left + FCellXSize;
R.Top = (FBackgroundIndex / FNumXSquares) * FCellYSize;
R.Bottom = R.Top + FCellYSize;
DrawText((HDC)Canvas->Handle, PChar(TheText.c_str()), -1, &RECT(R),
DT_NOCLIP | DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
SetBkMode((HDC)Canvas->Handle, OldBkMode);
}
#pragma warn .sig
void __fastcall TColorGrid::EnableForeground(Boolean Value)
{
if( FForegroundEnabled == Value )
return ;
FForegroundEnabled = Value;
DrawSquare(FForegroundIndex, (FForegroundIndex == FSelection) && FHasFocus);
DrawFgBg();
}
void __fastcall TColorGrid::EnableBackground(Boolean Value)
{
if( FBackgroundEnabled == Value )
return;
FBackgroundEnabled = Value;
DrawSquare(FBackgroundIndex, (FBackgroundIndex == FSelection) && FHasFocus);
DrawFgBg();
}
TColor __fastcall TColorGrid::GetForegroundColor(void)
{
Integer PalIndex;
if( FForegroundIndex < 8 )
PalIndex = FForegroundIndex;
else
PalIndex = FForegroundIndex + 4;
return TColor(RGB(FPaletteEntries[PalIndex].peRed,
FPaletteEntries[PalIndex].peGreen,
FPaletteEntries[PalIndex].peBlue) );
}
TColor __fastcall TColorGrid::GetBackgroundColor(void)
{
Integer PalIndex;
if( FBackgroundIndex < 8 )
PalIndex = FBackgroundIndex;
else PalIndex = FBackgroundIndex + 4;
return TColor( RGB(FPaletteEntries[PalIndex].peRed,
FPaletteEntries[PalIndex].peGreen,
FPaletteEntries[PalIndex].peBlue) );
}
void __fastcall TColorGrid::WMSetFocus(TWMSetFocus &Message)
{
FHasFocus = True;
DrawSquare(FSelection, True);
DrawFgBg();
}
void __fastcall TColorGrid::WMKillFocus(TWMKillFocus &Message)
{
FHasFocus = False;
DrawSquare(FSelection, False);
DrawFgBg();
}
void __fastcall TColorGrid::KeyDown(Word &Key, TShiftState Shift)
{
Integer NewSelection;
Integer Range;
TCustomControl::KeyDown(Key, Shift);
NewSelection = FSelection;
Range = FNumXSquares * FNumYSquares;
switch( Key )
{
case 0x46:
case 0x66:
if( !FForegroundEnabled && FClickEnablesColor ) {
FForegroundEnabled = True;
DrawSquare(FForegroundIndex, (FForegroundIndex == FSelection) && FHasFocus);
FForegroundIndex = -1;
}
SetForegroundIndex(NewSelection);
SetSelection(NewSelection);
Click();
break;
case 0x42:
case 0x62:
if( !FBackgroundEnabled && FClickEnablesColor ) {
FBackgroundEnabled = True;
DrawSquare(FBackgroundIndex, (FBackgroundIndex == FSelection) && FHasFocus);
FBackgroundIndex = -1;
}
SetBackgroundIndex(NewSelection);
SetSelection(NewSelection);
Click();
break;
case VK_HOME:
NewSelection = 0;
break;
case VK_UP:
if( FSelection >= FNumXSquares )
NewSelection = FSelection - FNumXSquares;
else
if( FSelection != 0 )
NewSelection = Range - FNumXSquares + FSelection - 1;
else
NewSelection = Range - 1;
break;
case VK_LEFT:
if( FSelection != 0 )
NewSelection = FSelection - 1;
else
NewSelection = Range - 1;
break;
case VK_DOWN:
if( FSelection + FNumXSquares < Range )
NewSelection = FSelection + FNumXSquares;
else
if( FSelection != Range - 1 )
NewSelection = FSelection % FNumXSquares + 1;
else
NewSelection = 0;
break;
case VK_SPACE:
case VK_RIGHT:
if( FSelection != Range - 1 )
NewSelection = FSelection + 1;
else
NewSelection = 0;
break;
case VK_END:
NewSelection = Range - 1;
break;
default:
TCustomControl::KeyDown(Key, Shift);
return;
} //end switch
Key = 0;
if( FSelection != NewSelection )
SetSelection(NewSelection);
}
void __fastcall TColorGrid::WMGetDlgCode(TWMNoParams &Message)
{
Message.Result = DLGC_WANTARROWS + DLGC_WANTCHARS;
}
void __fastcall TColorGrid::WMSize(TWMSize &Message)
{
UpdateCellSizes(False);
}
void __fastcall TColorGrid::CMCtl3DChanged(TMessage &Message)
{
Invalidate();
}
void __fastcall TColorGrid::MouseDown(TMouseButton Button, TShiftState Shift, Integer X, Integer Y)
{
Integer Square;
TCustomControl::MouseDown(Button, Shift, X, Y);
FButton = Button;
FButtonDown = True;
Square = SquareFromPos(X, Y);
if( Button == mbLeft ){
if( !FForegroundEnabled && FClickEnablesColor ){
FForegroundEnabled = True;
DrawSquare(FForegroundIndex, (FForegroundIndex == FSelection) && FHasFocus );
FForegroundIndex = -1;
}
SetForegroundIndex(Square);
}
else{
MouseCapture = True;
if( !FBackgroundEnabled && FClickEnablesColor ) {
FBackgroundEnabled = True;
DrawSquare(FBackgroundIndex, (FBackgroundIndex == FSelection) && FHasFocus);
FBackgroundIndex = -1;
}
SetBackgroundIndex(Square);
}
SetSelection(Square);
if( TabStop )
SetFocus();
}
void __fastcall TColorGrid::MouseMove( TShiftState Shift, Integer X, Integer Y)
{
Integer Square;
TCustomControl::MouseMove(Shift, X, Y);
if( FButtonDown ){
Square = SquareFromPos(X, Y);
if( FButton == mbLeft )
SetForegroundIndex(Square);
else
SetBackgroundIndex(Square);
SetSelection(Square);
}
}
void __fastcall TColorGrid::MouseUp(TMouseButton Button, TShiftState Shift, Integer X, Integer Y)
{
TCustomControl::MouseUp(Button, Shift, X, Y);
FButtonDown = False;
if( FButton == mbRight )
MouseCapture = False;
}
void __fastcall TColorGrid::Paint(void)
{
Integer Row, Col, wEntryIndex;
Canvas->Font = Font;
for( Row = 0; Row < FNumYSquares; Row++ )
for( Col = 0; Col < FNumXSquares; Col++ )
{
wEntryIndex = Row * FNumXSquares + Col;
DrawSquare(wEntryIndex, False);
}
DrawSquare(FSelection, FHasFocus);
DrawFgBg();
}
void __fastcall TColorGrid::SetBackgroundIndex(Integer Value)
{
if( (FBackgroundIndex != Value) && FBackgroundEnabled )
{
DrawSquare(FBackgroundIndex, (FBackgroundIndex == FSelection) && FHasFocus);
FBackgroundIndex = Value;
if( FBackgroundIndex == FForegroundIndex )
DrawSquare(FBackgroundIndex, (FBackgroundIndex == FSelection) && FHasFocus);
DrawFgBg();
Change();
}
}
void __fastcall TColorGrid::SetForegroundIndex(Integer Value)
{
if( (FForegroundIndex != Value) && FForegroundEnabled )
{
DrawSquare(FForegroundIndex, (FForegroundIndex == FSelection) && FHasFocus);
FForegroundIndex = Value;
if( FForegroundIndex == FBackgroundIndex )
DrawSquare(FForegroundIndex, (FForegroundIndex == FSelection) && FHasFocus );
DrawFgBg();
Change();
}
}
void __fastcall TColorGrid::SetGridOrdering(TGridOrdering Value)
{
if( FGridOrdering == Value )
return;
FGridOrdering = Value;
FNumXSquares = 16 >> FGridOrdering;
FNumYSquares = 1 << FGridOrdering;
UpdateCellSizes(True);
}
void __fastcall TColorGrid::SetSelection(Integer Value)
{
if( FSelection == Value )
return;
DrawSquare(FSelection, False);
FSelection = Value;
DrawSquare(FSelection, FHasFocus);
DrawFgBg();
}
Integer __fastcall TColorGrid::SquareFromPos(Integer X, Integer Y)
{
if( X > Width - 1 )
X = Width - 1;
else
if( X < 0 )
X = 0;
if( Y > Height - 1 )
Y = Height - 1;
else
if( Y < 0 )
Y = 0;
return( Y / FCellYSize * FNumXSquares + X / FCellXSize);
}
void __fastcall TColorGrid::UpdateCellSizes(Boolean DoRepaint)
{
Integer NewWidth, NewHeight;
NewWidth = (Width / FNumXSquares) * FNumXSquares;
NewHeight = (Height / FNumYSquares) * FNumYSquares;
BoundsRect = Bounds(Left, Top, NewWidth, NewHeight);
FCellXSize = Width / FNumXSquares;
FCellYSize = Height / FNumYSquares;
if( DoRepaint )
Invalidate();
}
void __fastcall TColorGrid::Change(void)
{
if( FOnChange != NULL )
FOnChange(this);
}