You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
408 lines
8.6 KiB
408 lines
8.6 KiB
#include "gdiptest.h"
|
|
|
|
//*******************************************************************
|
|
//
|
|
// TestPen
|
|
//
|
|
//
|
|
//
|
|
//*******************************************************************
|
|
|
|
BOOL TestPen :: ChangeSettings(HWND hwndParent)
|
|
{
|
|
BOOL ok = DialogBoxParam(hInst,
|
|
MAKEINTRESOURCE(IDD_PEN_DLG),
|
|
hwndParent,
|
|
AllDialogBox,
|
|
(LPARAM)(static_cast<TestDialogInterface*>(this)));
|
|
|
|
// customize brush && then cancel
|
|
if (tempBrush)
|
|
{
|
|
delete tempBrush;
|
|
tempBrush = NULL;
|
|
}
|
|
|
|
if (ok)
|
|
{
|
|
delete pen;
|
|
|
|
if (useBrush)
|
|
{
|
|
ASSERT(brush);
|
|
|
|
pen = new Pen(brush->GetBrush(), width);
|
|
}
|
|
else
|
|
{
|
|
Color color(argb);
|
|
|
|
pen = new Pen(color, width);
|
|
}
|
|
|
|
pen->SetLineCap(capValue[startCap],
|
|
capValue[endCap],
|
|
dashCapValue[dashCap]);
|
|
pen->SetLineJoin(joinValue[lineJoin]);
|
|
pen->SetMiterLimit(miterLimit);
|
|
pen->SetDashStyle(dashValue[dashStyle]);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
};
|
|
|
|
VOID TestPen :: Initialize()
|
|
{
|
|
delete brush;
|
|
brush = NULL;
|
|
delete tempBrush;
|
|
tempBrush = NULL;
|
|
brushSelect = tempBrushSelect = 0;
|
|
useBrush = FALSE;
|
|
|
|
argb = 0x80808080; // grayish, alpha = 0x80
|
|
|
|
width = 5.0f;
|
|
startCap = SquareCap;
|
|
endCap = SquareCap;
|
|
dashCap = FlatCap;
|
|
lineJoin = RoundJoin;
|
|
miterLimit = 0;
|
|
dashStyle = Solid;
|
|
|
|
Color color(argb);
|
|
|
|
pen = new Pen(color, width);
|
|
|
|
pen->SetLineCap(capValue[startCap],
|
|
capValue[endCap],
|
|
dashCapValue[dashCap]);
|
|
pen->SetLineJoin(joinValue[lineJoin]);
|
|
pen->SetMiterLimit(miterLimit);
|
|
pen->SetDashStyle(dashValue[dashStyle]);
|
|
}
|
|
|
|
VOID TestPen :: AddToFile(OutputFile* outfile, INT id)
|
|
{
|
|
TCHAR penStr[MAX_PATH];
|
|
TCHAR brushStr[MAX_PATH];
|
|
TCHAR colorStr[MAX_PATH];
|
|
|
|
if (id)
|
|
{
|
|
_stprintf(&penStr[0], _T("pen%dp"), id);
|
|
_stprintf(&colorStr[0], _T("color%dp"), id);
|
|
}
|
|
else
|
|
{
|
|
_tcscpy(&penStr[0], _T("pen"));
|
|
_tcscpy(&colorStr[0], _T("color"));
|
|
}
|
|
|
|
if (useBrush)
|
|
{
|
|
_stprintf(&brushStr[0], "brush%d", 2);
|
|
|
|
brush->AddToFile(outfile, 2);
|
|
outfile->Declaration(_T("Pen"),
|
|
&penStr[0],
|
|
_T("%s, %e"),
|
|
outfile->Ref(&brushStr[0]),
|
|
width);
|
|
}
|
|
else
|
|
{
|
|
outfile->ColorDeclaration(&colorStr[0],
|
|
&argb);
|
|
outfile->Declaration(_T("Pen"),
|
|
&penStr[0],
|
|
_T("%s, %e"),
|
|
&colorStr[0],
|
|
width);
|
|
}
|
|
|
|
outfile->ObjectCommand(&penStr[0],
|
|
_T("SetLineCap"),
|
|
_T("%s, %s, %s"),
|
|
capStr[startCap],
|
|
capStr[endCap],
|
|
dashCapStr[dashCap]);
|
|
|
|
outfile->ObjectCommand(&penStr[0],
|
|
_T("SetLineJoin"),
|
|
joinStr[lineJoin]);
|
|
|
|
if (joinValue[lineJoin] == MiterJoin)
|
|
outfile->ObjectCommand(&penStr[0],
|
|
_T("SetMiterLimit"),
|
|
_T("%e"),
|
|
miterLimit);
|
|
|
|
outfile->ObjectCommand(&penStr[0],
|
|
_T("SetDashStyle"),
|
|
dashStr[dashStyle]);
|
|
}
|
|
|
|
VOID TestPen :: EnableBrushFields(HWND hwnd, BOOL enable)
|
|
{
|
|
HWND hwdAlpha = GetDlgItem(hwnd, IDC_PEN_ALPHA);
|
|
HWND hwdColorB = GetDlgItem(hwnd, IDC_PEN_COLORBUTTON);
|
|
HWND hwdColorP = GetDlgItem(hwnd, IDC_PEN_COLORPIC);
|
|
HWND hwdBrushB = GetDlgItem(hwnd, IDC_PEN_BRUSHBUTTON);
|
|
HWND hwdList = GetDlgItem(hwnd, IDC_PEN_BRUSHLIST);
|
|
|
|
SetDialogCheck(hwnd, IDC_PEN_BRUSH, enable);
|
|
SetDialogCheck(hwnd, IDC_PEN_COLOR, !enable);
|
|
|
|
EnableWindow(hwdBrushB, enable);
|
|
EnableWindow(hwdList, enable);
|
|
|
|
EnableWindow(hwdAlpha, !enable);
|
|
EnableWindow(hwdColorP, !enable);
|
|
EnableWindow(hwdColorB, !enable);
|
|
|
|
DeleteObject(hwdAlpha);
|
|
DeleteObject(hwdColorP);
|
|
DeleteObject(hwdColorB);
|
|
DeleteObject(hwdBrushB);
|
|
DeleteObject(hwdList);
|
|
}
|
|
|
|
VOID TestPen :: InitDialog(HWND hwnd)
|
|
{
|
|
INT i,j;
|
|
|
|
// Color/Brush button
|
|
|
|
SetDialogCheck(hwnd, IDC_PEN_BRUSH, useBrush);
|
|
SetDialogCheck(hwnd, IDC_PEN_COLOR, !useBrush);
|
|
|
|
HWND hwndBrushList = GetDlgItem(hwnd, IDC_PEN_BRUSHLIST);
|
|
EnableWindow(hwndBrushList, useBrush);
|
|
|
|
// Store pointer to underlying Brush object in Brush Button
|
|
if (tempBrush)
|
|
{
|
|
// we had a warning, keep the temp Brush until we really save.
|
|
}
|
|
else if (brush)
|
|
{
|
|
// first pop-up occurrence
|
|
tempBrush = brush->Clone();
|
|
tempBrushSelect = brushSelect;
|
|
SetDialogCombo(hwnd, IDC_PEN_BRUSHLIST, brushList, numBrushes, brushSelect);
|
|
}
|
|
else
|
|
{
|
|
tempBrush = NULL;
|
|
tempBrushSelect = 0;
|
|
SetDialogCombo(hwnd, IDC_PEN_BRUSHLIST, brushList, numBrushes, 0);
|
|
}
|
|
|
|
DeleteObject(hwndBrushList);
|
|
|
|
// Color values
|
|
SetDialogLong(hwnd, IDC_PEN_ALPHA, argb >> Color::AlphaShift);
|
|
|
|
EnableBrushFields(hwnd, useBrush);
|
|
|
|
// Start/End/Dash Cap
|
|
SetDialogCombo(hwnd, IDC_PEN_STARTCAP, capList, numCaps, startCap);
|
|
SetDialogCombo(hwnd, IDC_PEN_ENDCAP, capList, numCaps, endCap);
|
|
SetDialogCombo(hwnd, IDC_PEN_DASHCAP, dashCapList, numDashCaps, dashCap);
|
|
|
|
// Line Join
|
|
SetDialogCombo(hwnd, IDC_PEN_JOIN, joinList, numJoin, lineJoin);
|
|
|
|
// Dash Style
|
|
SetDialogCombo(hwnd, IDC_PEN_DASHSTYLE, dashList, numDash, dashStyle);
|
|
|
|
// Width
|
|
SetDialogReal(hwnd, IDC_PEN_WIDTH, width);
|
|
|
|
}
|
|
|
|
BOOL TestPen :: SaveValues(HWND hwnd)
|
|
{
|
|
BOOL warning = FALSE;
|
|
|
|
// Solid color values
|
|
argb = (argb & ~Color::AlphaMask) |
|
|
(GetDialogLong(hwnd, IDC_PEN_ALPHA)
|
|
<< Color::AlphaShift);
|
|
|
|
startCap = GetDialogCombo(hwnd, IDC_PEN_STARTCAP);
|
|
endCap = GetDialogCombo(hwnd, IDC_PEN_ENDCAP);
|
|
dashCap = GetDialogCombo(hwnd, IDC_PEN_DASHCAP);
|
|
|
|
// Width
|
|
width = GetDialogReal(hwnd, IDC_PEN_WIDTH);
|
|
if (width < 0.01f)
|
|
{
|
|
width = 0.01f;
|
|
warning = TRUE;
|
|
}
|
|
else if (width > 100)
|
|
{
|
|
width = 100.0f;
|
|
warning = TRUE;
|
|
}
|
|
|
|
dashStyle = GetDialogCombo(hwnd, IDC_PEN_DASHSTYLE);
|
|
lineJoin = GetDialogCombo(hwnd, IDC_PEN_JOIN);
|
|
|
|
// !! miter limit not currently supported
|
|
miterLimit = 0;
|
|
|
|
BOOL tempUse = GetDialogCheck(hwnd, IDC_PEN_BRUSH);
|
|
if (tempUse)
|
|
{
|
|
tempBrushSelect = GetDialogCombo(hwnd, IDC_PEN_BRUSHLIST);
|
|
|
|
if (!tempBrush ||
|
|
(tempBrush->GetType() != brushValue[tempBrushSelect]))
|
|
{
|
|
WarningBox("Must customize Brush or select Color.");
|
|
warning = TRUE;
|
|
}
|
|
else
|
|
{
|
|
// we are saving, copy tempBrush to real Brush
|
|
// no reason to clone
|
|
if (!warning)
|
|
{
|
|
delete brush;
|
|
brush = tempBrush;
|
|
brushSelect = tempBrushSelect;
|
|
tempBrush = NULL;
|
|
tempBrushSelect = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// no warnings and not using temp brush, delete it.
|
|
if (!warning)
|
|
{
|
|
delete tempBrush;
|
|
tempBrush = NULL;
|
|
}
|
|
}
|
|
|
|
if (warning)
|
|
InitDialog(hwnd);
|
|
|
|
return warning;
|
|
}
|
|
|
|
BOOL TestPen :: ProcessDialog(HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
if (msg == WM_COMMAND)
|
|
{
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDC_OK:
|
|
if (SaveValues(hwnd))
|
|
WarningBeep();
|
|
else
|
|
::EndDialog(hwnd, TRUE);
|
|
break;
|
|
|
|
case IDC_CANCEL:
|
|
::EndDialog(hwnd, FALSE);
|
|
break;
|
|
|
|
// pop-up brush customization window
|
|
case IDC_PEN_BRUSHBUTTON:
|
|
{
|
|
ASSERT(useBrush);
|
|
|
|
// get selected brush type
|
|
tempBrushSelect = GetDialogCombo(hwnd, IDC_PEN_BRUSHLIST);
|
|
|
|
if (tempBrush)
|
|
{
|
|
// change in brush type, create new temp brush
|
|
if (tempBrush->GetType() != brushValue[tempBrushSelect])
|
|
{
|
|
// we've changed type,
|
|
delete tempBrush;
|
|
tempBrush = NULL;
|
|
|
|
tempBrush = TestBrush::CreateNewBrush(brushValue[tempBrushSelect]);
|
|
tempBrush->Initialize();
|
|
|
|
if (!tempBrush->ChangeSettings(hwnd))
|
|
{
|
|
delete tempBrush;
|
|
tempBrush = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// change settings on temp brush
|
|
tempBrush->ChangeSettings(hwnd);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// no brush type previously selected.
|
|
tempBrush = TestBrush::CreateNewBrush(brushValue[tempBrushSelect]);
|
|
tempBrush->Initialize();
|
|
|
|
if (!tempBrush->ChangeSettings(hwnd))
|
|
{
|
|
delete tempBrush;
|
|
tempBrush = NULL;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_REFRESH_PIC:
|
|
UpdateColorPicture(hwnd, IDC_PEN_COLORPIC, argb);
|
|
break;
|
|
|
|
case IDC_PEN_COLORBUTTON:
|
|
UpdateRGBColor(hwnd, IDC_PEN_COLORPIC, argb);
|
|
break;
|
|
|
|
// enable/disable appropriate fields
|
|
case IDC_PEN_BRUSH:
|
|
EnableBrushFields(hwnd, TRUE);
|
|
useBrush = TRUE;
|
|
break;
|
|
|
|
case IDC_PEN_COLOR:
|
|
EnableBrushFields(hwnd,FALSE);
|
|
useBrush = FALSE;
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
/*
|
|
if (HIWORD(wParam) == CBN_DROPDOWN)
|
|
{
|
|
// list box about to be displayed
|
|
DebugBreak();
|
|
}
|
|
|
|
if (HIWORD(wParam) == CBN_CLOSEUP)
|
|
{
|
|
// about to close list-box
|
|
DebugBreak();
|
|
}
|
|
|
|
*/
|
|
return FALSE;
|
|
}
|
|
|