|
|
#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; }
|