Leaked source code of windows server 2003
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.
|
|
//
// TOOL.CPP
// Drawing Tools
//
// Copyright Microsoft 1998-
//
// PRECOMP
#include "precomp.h"
//
//
// Function: WbTool
//
// Purpose: Constructors for tools
//
//
WbTool::WbTool(int toolType) { COLORREF defColor; UINT defWidth; int iIndex;
MLZ_EntryOut(ZONE_FUNCTION, "WbTool::WbTool");
// Save the tool type
m_toolType = toolType; m_selectedTool = TOOLTYPE_MAX;
m_uiWidthIndexCur = 0;
// Read the colors of the pen
if (toolType == TOOLTYPE_HIGHLIGHT) defColor = DEF_HIGHLIGHTCOLOR; else defColor = DEF_PENCOLOR; m_clrCur = defColor;
for (iIndex = 0; iIndex < NUM_OF_WIDTHS; iIndex++) { defWidth = (toolType == TOOLTYPE_HIGHLIGHT) ? g_HighlightWidths[iIndex] : g_PenWidths[iIndex];
m_uiWidths[iIndex] = defWidth; }
// Read the font details
LOGFONT lfont;
::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lfont); lfont.lfClipPrecision |= CLIP_DFA_OVERRIDE; lfont.lfCharSet = DEFAULT_CHARSET; m_hFont = ::CreateFontIndirect(&lfont); }
//
// WbTool::~WbTool
// Destructor
//
WbTool::~WbTool() { if (m_hFont != NULL) { ::DeleteFont(m_hFont); m_hFont = NULL; } }
//
//
// Function: HasColor
//
// Purpose: Return TRUE if the tool supports colors
//
//
BOOL WbTool::HasColor(void) const { BOOL bResult = TRUE;
switch (m_toolType) { case TOOLTYPE_ERASER: bResult = FALSE; break; }
return bResult; }
//
//
// Function: HasWidth
//
// Purpose: Return TRUE if the tool supports widths
//
//
BOOL WbTool::HasWidth(void) const { BOOL bResult = FALSE;
switch (m_toolType) { case TOOLTYPE_PEN: case TOOLTYPE_HIGHLIGHT: case TOOLTYPE_LINE: case TOOLTYPE_BOX: case TOOLTYPE_ELLIPSE: bResult = TRUE; break;
// For the selector tool, it depends on the selected object type
case TOOLTYPE_SELECT: switch (m_selectedTool) { case TOOLTYPE_PEN: { DCWbGraphic * pGraphic;
ASSERT(g_pDraw); pGraphic = g_pDraw->GetSelection(); if ((pGraphic != NULL) && !(pGraphic->IsGraphicTool() == enumGraphicFilledRectangle) && !(pGraphic->IsGraphicTool() == enumGraphicFilledEllipse)) { bResult = TRUE; } break; } } break;
default: // The rest don't support widths, including filled tools
break; }
return bResult; }
//
//
// Function: HasFont
//
// Purpose: Return TRUE if the tool supports fonts
//
//
BOOL WbTool::HasFont(void) const { BOOL bResult = FALSE;
switch (m_toolType) { case TOOLTYPE_TEXT: bResult = TRUE; break;
// For the selector tool, it depends on the selected object type
case TOOLTYPE_SELECT: switch (m_selectedTool) { case TOOLTYPE_TEXT: bResult = TRUE; break;
default: break; } break;
default: // The other tools do not support fonts
break; }
return bResult; }
//
//
// Function: GetROP
//
// Purpose: Return the ROP for this tool
//
//
int WbTool::GetROP(void) const { // If this is a highlight tool we use MASKPEN, else we use the standard
if (m_toolType == TOOLTYPE_HIGHLIGHT) return(R2_MASKPEN); else return(R2_COPYPEN); }
//
//
// Function: GetCursorForTool
//
// Purpose: Return the handle to the cursor for the tool
//
//
HCURSOR WbTool::GetCursorForTool(void) const { int nName = -1;
switch(m_toolType) { case TOOLTYPE_SELECT: break; // use default arrow for select cursor (bug 439)
case TOOLTYPE_PEN: nName = PENFREEHANDCURSOR; break;
case TOOLTYPE_LINE: case TOOLTYPE_BOX: case TOOLTYPE_FILLEDBOX: case TOOLTYPE_ELLIPSE: case TOOLTYPE_FILLEDELLIPSE: nName = PENCURSOR; break;
case TOOLTYPE_HIGHLIGHT: nName = HIGHLIGHTFREEHANDCURSOR; break;
case TOOLTYPE_TEXT: nName = TEXTCURSOR; break; case TOOLTYPE_ERASER: nName = DELETECURSOR; break;
default: // Do nothing - the name pointer is NULL
break; }
HCURSOR hcursorResult = NULL;
if (nName == -1) { // Return the standard arrow cursor as a default
hcursorResult = ::LoadCursor(NULL, IDC_ARROW); } else { // Return the cursor for the tool
hcursorResult = ::LoadCursor(g_hInstance, MAKEINTRESOURCE( nName ) ); }
return hcursorResult; }
//
//
// Function: SetFont
//
// Purpose: Set the current font of the tool
//
//
void WbTool::SetFont(HFONT hFont) { MLZ_EntryOut(ZONE_FUNCTION, "WbTool::SetFont");
// Get the font details
LOGFONT lfont;
::GetObject(hFont, sizeof(LOGFONT), &lfont); //zap FontAssociation mode (bug 3258)
lfont.lfClipPrecision |= CLIP_DFA_OVERRIDE;
// Set the local font
if (m_hFont != NULL) { ::DeleteFont(m_hFont); } m_hFont = ::CreateFontIndirect(&lfont); }
//
//
// Function: SelectGraphic
//
// Purpose: Set the current selected graphic type, and copy the colors,
// widths and font into this tool's attributes.
//
//
void WbTool::SelectGraphic(DCWbGraphic* pGraphic) { UINT uiIndex;
// Save the selected tool type
m_selectedTool = pGraphic->GraphicTool();
// Get the tool object for the selected tool type
WbTool* pTool = g_pMain->m_ToolArray[m_selectedTool];
if (HasColor()) { m_clrCur = pGraphic->GetColor(); }
if (HasWidth()) { for (uiIndex = 0; uiIndex < NUM_OF_WIDTHS; uiIndex++) { SetWidthAtIndex(uiIndex, pTool->GetWidthAtIndex(uiIndex)); }
// See if the object's width matches any of the available colors
// for this tool type
for (uiIndex = 0; uiIndex < NUM_OF_WIDTHS; uiIndex++) { if (pGraphic->GetPenWidth() == m_uiWidths[uiIndex]) { break; } }
SetWidthIndex(uiIndex); }
if (HasFont()) { // only text objects have a font, so cast to a DCWbGraphicText
if (pGraphic->IsGraphicTool() == enumGraphicText) { SetFont((((DCWbGraphicText*)pGraphic)->GetFont())); } } }
//
// InitToolArray
// Create the array of WB tools
//
//
BOOL InitToolArray(void) { int tool; WbTool * pTool;
for (tool = TOOLTYPE_FIRST; tool < TOOLTYPE_MAX; tool++) { // Add the new tool to the array
pTool = new WbTool(tool); if (!pTool) { ERROR_OUT(("Can't create tool %d", tool)); return(FALSE); }
g_pMain->m_ToolArray[tool] = pTool;
}
return(TRUE); }
//
// DestroyToolAray()
//
// Free the array of WB tools
//
void DestroyToolArray(void) { int tool; WbTool * pTool;
for (tool = TOOLTYPE_FIRST; tool < TOOLTYPE_MAX; tool++) { pTool = g_pMain->m_ToolArray[tool]; if (pTool != NULL) { g_pMain->m_ToolArray[tool] = NULL; delete pTool; } } }
|