1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu DrawTools ppt

7 312 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tài liệu DrawTools ppt
Năm xuất bản 2005
Định dạng
Số trang 7
Dung lượng 112,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• Download source code C# 2005 - 72 KbIntroduction DrawTools sample shows how to create a Windows Forms application for drawing graphic objects in a Windows client area using mouse and

Trang 1

• Download source code (C# 2005) - 72 Kb

Introduction

DrawTools sample shows how to create a Windows Forms application for drawing graphic

objects in a Windows client area using mouse and drawing tools Drawing tools

implemented in this sample are: Rectangle, Ellipse, Line, and Pencil There are well-known techniques for creating such type of applications, like: interaction with mouse, flicker-free drawing, implementing of drawing and selection tools, objects selection, managing of objects Z-order etc MFC developers may learn all this stuff from MFC sample

DRAWCLI DrawTools C# program reproduces some of DRAWCLI functionality and

uses some design decisions from this sample.

DrawTools solution contains two projects: DrawTools Windows Forms application and

DocToolkit Class Library DrawTools implements specific application stuff, and

DocToolkit contains some standard classes for file managing.

Main features of the DrawTools solution are described below.

DrawTools classes

Trang 2

• DrawArea - user control which fills main application window client area Contains instance of the GraphicsList class Draws graphic objects, handles mouse input passing commands to GraphicsList

• GraphicsList - list of graphic objects Contains ArrayList of graphic objects Talks with each graphic object by generic way using DrawObject methods

• DrawObject - abstract base class for all graphic objects

• DrawRectangle - rectangle graphic object

• DrawEllipise - ellipse graphic object

• DrawLine - line graphic object

• DrawPolygon - polygon graphic object

• Tool - abstract base class for all drawing tools

• ToolPointer - pointer tool (neutral tool) Contains implementation for selection, moving, resizing of graphic objects

• ToolObject - abstract base class for all tools which create new graphic object

• ToolRectangle - rectangle tool

• ToolEllipse - ellipse tool

• ToolLine - line tool

• ToolPolygon - polygon tool

DocToolkit Library

DocToolkit Library contains a set of classes which may be used for creation of

document-centric Windows Forms applications Instances of classes exported from the DocToolkit

Library are kept in the main form of the DrawTools project and is used for general

file-related operations.

• DocManager class: Makes file-related operations: open, new, save, updating of the form title, registering of file type for Windows Shell Built using the article

Creating Document-Centric Applications in Windows Forms by Chris Sells

• DragDropManager class: Allows to open files dropped from Windows Explorer in Windows Forms applications

Trang 3

• MruManager class: Manages Most Recently Used Files list

• PersistWindowState class: Allows to keep last window state in the Registry and restore it when form is loaded Source: Saving and Restoring the Location, Size and Windows State of a NET Form By Joel Matthias

Handling of Windows controls state at application idle time

Every Windows Forms application has a number of controls like menu items, buttons, toolbar buttons etc Depending on current situation and user commands, these controls may have different states: enabled/disabled, checked/unchecked, visible/invisible etc Every user action may change this state Setting of controls' state in every message handler may

be error-prone Instead of this, it is better to manage controls' state in some function which

is called after every user action MFC has the great ON_UPDATE_COMMAND_UI feature which allows to update toolbar buttons' state at application idle time Such a feature may be implemented also in NET programs.

Consider the situation when user clicks the Rectangle toolbar button This button should be checked, and previously active tool should be unchecked Rectangle button message

handler doesn't change form controls' state, it just keeps current selection in some variable

Idle message handler selects active tool and unselects inactive tool.

Collapse

private void Form1_Load(object sender, System.EventArgs e)

{

// Submit to Idle event to set controls state at idle time

Application.Idle += delegate(object o, EventArgs a)

{

SetStateOfControls();

};

}

public void SetStateOfControls()

{

// Select active tool

tbPointer.Pushed = (drawArea.ActiveTool ==

DrawArea.DrawToolType.Pointer);

tbRectangle.Pushed =

(drawArea.ActiveTool==DrawArea.DrawToolType.Rectangle);

tbEllipse.Pushed = (drawArea.ActiveTool ==

DrawArea.DrawToolType.Ellipse);

tbLine.Pushed = (drawArea.ActiveTool == DrawArea.DrawToolType.Line); tbPolygon.Pushed = (drawArea.ActiveTool ==

DrawArea.DrawToolType.Polygon);

menuDrawPointer.Checked =

(drawArea.ActiveTool ==

DrawArea.DrawToolType.Pointer);

Trang 4

menuDrawRectangle.Checked =

(drawArea.ActiveTool ==

DrawArea.DrawToolType.Rectangle);

menuDrawEllipse.Checked =

(drawArea.ActiveTool ==

DrawArea.DrawToolType.Ellipse);

menuDrawLine.Checked = (drawArea.ActiveTool ==

DrawArea.DrawToolType.Line);

menuDrawPolygon.Checked =

(drawArea.ActiveTool ==

DrawArea.DrawToolType.Polygon);

//

}

// Rectangle tool is selected

private void CommandRectangle()

{

drawArea.ActiveTool = DrawArea.DrawToolType.Rectangle;

}

Hit Test

DrawObject class has virtualHitTest function which detects whether a point belongs to graphic object:

Collapse

public virtual int HitTest(Point point)

{

return -1;

}

Derived classes use virtualPointInObject to make hit test This function is called from

HitTest DrawRectangle class implements this function by a simple way:

Collapse

protected override bool PointInObject(Point point)

{

return rectangle.Contains(point);

// rectangle is class member of type Rectangle

}

DrawLine implementation of this function is more complicated:

Collapse

protected override bool PointInObject(Point point)

{

GraphicsPath areaPath;

Pen areaPen;

Trang 5

Region areaRegion;

// Create path which contains wide line

// for easy mouse selection

AreaPath = new GraphicsPath();

AreaPen = new Pen(Color.Black, 7);

AreaPath.AddLine(startPoint.X, startPoint.Y, endPoint.X,

endPoint.Y);

// startPoint and EndPoint are class members of type Point AreaPath.Widen(AreaPen);

// Create region from the path

AreaRegion = new Region(AreaPath);

return AreaRegion.IsVisible(point);

}

DrawPolygon function works by the same way, but AreaPath contains all lines in the polygon.

Serialization

GraphicList class implements ISerializable interface which allows to make binary serialization of the class object DrawObject class has two virtual functions which are used for serialization:

Collapse

public virtual void SaveToStream(SerializationInfo info, int

orderNumber)

{

//

}

public virtual void LoadFromStream(SerializationInfo info, int

orderNumber)

{

//

}

These functions are implemented in every derived class Binary file has the following format:

Collapse

Number of objects

Type name

Object

Trang 6

Type name

Object

Type name

Object

This allows to write generic serialization code in the GraphicList class without knowing any details about serialized objects:

Collapse

private const string entryCount = "Count";

private const string entryType = "Type";

// Save list to stream

[SecurityPermissionAttribute(SecurityAction.Demand,

SerializationFormatter=true)]

public virtual void GetObjectData(SerializationInfo info,

StreamingContext context)

{

// number of objects

info.AddValue(entryCount, graphicsList.Count);

int i = 0;

foreach ( DrawObject o in graphicsList )

{

// object type

info.AddValue(

String.Format(CultureInfo.InvariantCulture,

"{0}{1}",

entryType, i),

o.GetType().FullName);

// object itself

o.SaveToStream(info, i);

i++;

}

}

// Load from stream

protected GraphicsList(SerializationInfo info, StreamingContext context) {

graphicsList = new ArrayList();

// number of objects

int n = info.GetInt32(entryCount);

string typeName;

Trang 7

object drawObject;

for ( int i = 0; i < n; i++ )

{

// object type

typeName = info.GetString(

String.Format(CultureInfo.InvariantCulture,

"{0}{1}",

entryType, i));

// create object by type name using Reflection

drawObject = Assembly.GetExecutingAssembly().CreateInstance( typeName);

// fill object from stream

((DrawObject)drawObject).LoadFromStream(info, i);

graphicsList.Add(drawObject);

}

}

Undo - Redo

Undo-Redo functionality is added to the program using the article The Command Pattern and MVC Architectures by David Veeneman Class Command is abstract base class for all commands representing user activity: CommandAdd, CommandChangeState,

CommandDelete, CommandDeleteAll Every Command-derived class can make two basic

operations: Undo which returns draw area to the state before executing this command, and Redo which executes this command again CommandChangeState is used for resizing, moving of objects and changing objects properties Class UndoManager keeps list of

executed commands (history) and makes operations Undo, Redo and Add command to History Undo-Redo functionality is implemented only i

ds

Ngày đăng: 12/12/2013, 19:16

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w