实例介绍
【实例简介】
【实例截图】
【核心代码】
// 2017.7.24
// gc_2299
// MainForm位主窗口类,主要的工作是初始化各类管理类实例,初始化绘图板实例等工作
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization;
using System.Diagnostics;
using System.Security;
using Microsoft.Win32;
using DocToolkit;
namespace DrawTools
{
partial class MainForm : Form
{
#region Members
private DrawArea drawArea;
private DocManager docManager;
private DragDropManager dragDropManager;
private MruManager mruManager;
/// <summary>
/// 保存主窗口的位置和状态
/// </summary>
private PersistWindowState persistState;
private string argumentFile = ""; // file name from command line
const string registryPath = "Software\\AlexF\\DrawTools";
#endregion
#region Properties
/// <summary>
/// File name from the command line
/// </summary>
public string ArgumentFile
{
get
{
return argumentFile;
}
set
{
argumentFile = value;
}
}
/// <summary>
/// Get reference to Edit menu item.
/// Used to show context menu in DrawArea class.
/// </summary>
/// <value></value>
public ToolStripMenuItem ContextParent
{
get
{
return editToolStripMenuItem;
}
}
#endregion
#region Constructor
public MainForm()
{
InitializeComponent();
persistState = new PersistWindowState(registryPath, this);
}
#endregion
#region Toolbar Event Handlers
private void toolStripButtonNew_Click(object sender, EventArgs e)
{
CommandNew();
}
private void toolStripButtonOpen_Click(object sender, EventArgs e)
{
CommandOpen();
}
private void toolStripButtonSave_Click(object sender, EventArgs e)
{
CommandSave();
}
private void toolStripButtonPointer_Click(object sender, EventArgs e)
{
CommandPointer();
}
private void toolStripButtonRectangle_Click(object sender, EventArgs e)
{
CommandRectangle();
}
private void toolStripButtonEllipse_Click(object sender, EventArgs e)
{
CommandEllipse();
}
private void toolStripButtonLine_Click(object sender, EventArgs e)
{
CommandLine();
}
private void toolStripButtonPencil_Click(object sender, EventArgs e)
{
CommandPolygon();
}
private void toolStripButtonAbout_Click(object sender, EventArgs e)
{
CommandAbout();
}
private void toolStripButtonUndo_Click(object sender, EventArgs e)
{
CommandUndo();
}
private void toolStripButtonRedo_Click(object sender, EventArgs e)
{
CommandRedo();
}
#endregion Toolbar Event Handlers
#region Menu Event Handlers
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandNew();
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandOpen();
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandSave();
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandSaveAs();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
drawArea.GraphicsList.SelectAll();
drawArea.Refresh();
}
private void unselectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
drawArea.GraphicsList.UnselectAll();
drawArea.Refresh();
}
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandDelete command = new CommandDelete(drawArea.GraphicsList);
if (drawArea.GraphicsList.DeleteSelection())
{
drawArea.SetDirty();
drawArea.Refresh();
drawArea.AddCommandToHistory(command);
}
}
private void deleteAllToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandDeleteAll command = new CommandDeleteAll(drawArea.GraphicsList);
if (drawArea.GraphicsList.Clear())
{
drawArea.SetDirty();
drawArea.Refresh();
drawArea.AddCommandToHistory(command);
}
}
private void moveToFrontToolStripMenuItem_Click(object sender, EventArgs e)
{
if (drawArea.GraphicsList.MoveSelectionToFront())
{
drawArea.SetDirty();
drawArea.Refresh();
}
}
private void moveToBackToolStripMenuItem_Click(object sender, EventArgs e)
{
if (drawArea.GraphicsList.MoveSelectionToBack())
{
drawArea.SetDirty();
drawArea.Refresh();
}
}
private void propertiesToolStripMenuItem_Click(object sender, EventArgs e)
{
if (drawArea.GraphicsList.ShowPropertiesDialog(drawArea))
{
drawArea.SetDirty();
drawArea.Refresh();
}
}
private void pointerToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandPointer();
}
private void rectangleToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandRectangle();
}
private void ellipseToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandEllipse();
}
private void lineToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandLine();
}
private void pencilToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandPolygon();
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandAbout();
}
private void undoToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandUndo();
}
private void redoToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandRedo();
}
#endregion Menu Event Handlers
#region DocManager Event Handlers
/// <summary>
/// Load document from the stream supplied by DocManager
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void docManager_LoadEvent(object sender, SerializationEventArgs e)
{
// DocManager asks to load document from supplied stream
try
{
drawArea.GraphicsList = (GraphicsList)e.Formatter.Deserialize(e.SerializationStream);
}
catch (ArgumentNullException ex)
{
HandleLoadException(ex, e);
}
catch (SerializationException ex)
{
HandleLoadException(ex, e);
}
catch (SecurityException ex)
{
HandleLoadException(ex, e);
}
}
/// <summary>
/// Save document to stream supplied by DocManager
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void docManager_SaveEvent(object sender, SerializationEventArgs e)
{
// DocManager asks to save document to supplied stream
try
{
e.Formatter.Serialize(e.SerializationStream, drawArea.GraphicsList);
}
catch (ArgumentNullException ex)
{
HandleSaveException(ex, e);
}
catch (SerializationException ex)
{
HandleSaveException(ex, e);
}
catch (SecurityException ex)
{
HandleSaveException(ex, e);
}
}
#endregion
#region Event Handlers
private void MainForm_Load(object sender, EventArgs e)
{
// Create draw area
drawArea = new DrawArea();
drawArea.Location = new System.Drawing.Point(0, 0);
drawArea.Size = new System.Drawing.Size(10, 10);
drawArea.Owner = this;
this.Controls.Add(drawArea);
// Helper objects (DocManager and others)
InitializeHelperObjects();
drawArea.Initialize(this, docManager);
ResizeDrawArea();
LoadSettingsFromRegistry();
// Submit to Idle event to set controls state at idle time
Application.Idle = delegate(object o, EventArgs a)
{
SetStateOfControls();
};
// Open file passed in the command line
if (ArgumentFile.Length > 0)
OpenDocument(ArgumentFile);
// Subscribe to DropDownOpened event for each popup menu
// (see details in MainForm_DropDownOpened)
foreach (ToolStripItem item in menuStrip1.Items)
{
if (item.GetType() == typeof(ToolStripMenuItem))
{
((ToolStripMenuItem)item).DropDownOpened = MainForm_DropDownOpened;
}
}
}
/// <summary>
/// Resize draw area when form is resized
/// </summary>
private void MainForm_Resize(object sender, EventArgs e)
{
if (this.WindowState != FormWindowState.Minimized &&
drawArea != null )
{
ResizeDrawArea();
}
}
/// <summary>
/// Form is closing
/// </summary>
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if ( e.CloseReason == CloseReason.UserClosing )
{
if (!docManager.CloseDocument())
e.Cancel = true;
}
SaveSettingsToRegistry();
}
/// <summary>
/// Popup menu item (File, Edit ...) is opened.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void MainForm_DropDownOpened(object sender, EventArgs e)
{
// Reset active tool to pointer.
// This prevents bug in rare case when non-pointer tool is active, user opens
// main main menu and after this clicks in the drawArea. MouseDown event is not
// raised in this case (why ??), and MouseMove event works incorrectly.
drawArea.ActiveTool = DrawArea.DrawToolType.Pointer;
}
#endregion Event Handlers
#region Other Functions
/// <summary>
/// Set state of controls.
/// Function is called at idle time.
/// </summary>
public void SetStateOfControls()
{
// Select active tool
toolStripButtonPointer.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer);
toolStripButtonRectangle.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle);
toolStripButtonEllipse.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse);
toolStripButtonLine.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Line);
toolStripButtonPencil.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon);
pointerToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer);
rectangleToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle);
ellipseToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse);
lineToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Line);
pencilToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon);
bool objects = (drawArea.GraphicsList.Count > 0);
bool selectedObjects = (drawArea.GraphicsList.SelectionCount > 0);
// File operations
saveToolStripMenuItem.Enabled = objects;
toolStripButtonSave.Enabled = objects;
saveAsToolStripMenuItem.Enabled = objects;
// Edit operations
deleteToolStripMenuItem.Enabled = selectedObjects;
deleteAllToolStripMenuItem.Enabled = objects;
selectAllToolStripMenuItem.Enabled = objects;
unselectAllToolStripMenuItem.Enabled = objects;
moveToFrontToolStripMenuItem.Enabled = selectedObjects;
moveToBackToolStripMenuItem.Enabled = selectedObjects;
propertiesToolStripMenuItem.Enabled = selectedObjects;
// Undo, Redo
undoToolStripMenuItem.Enabled = drawArea.CanUndo;
toolStripButtonUndo.Enabled = drawArea.CanUndo;
redoToolStripMenuItem.Enabled = drawArea.CanRedo;
toolStripButtonRedo.Enabled = drawArea.CanRedo;
}
/// <summary>
/// Set draw area to all form client space except toolbar
/// 将控件布满窗口
/// </summary>
private void ResizeDrawArea()
{
Rectangle rect = this.ClientRectangle;
drawArea.Left = rect.Left;
drawArea.Top = rect.Top menuStrip1.Height toolStrip1.Height;
drawArea.Width = rect.Width;
drawArea.Height = rect.Height - menuStrip1.Height - toolStrip1.Height; ;
}
/// <summary>
/// Initialize helper objects from the DocToolkit Library.
///
/// Called from Form1_Load. Initialized all objects except
/// PersistWindowState wich must be initialized in the
/// form constructor.
/// 初始化各类管理类的对象和事件处理函数
/// </summary>
private void InitializeHelperObjects()
{
// DocManager
DocManagerData data = new DocManagerData();
data.FormOwner = this;
data.UpdateTitle = true;
data.FileDialogFilter = "DrawTools files (*.dtl)|*.dtl|All Files (*.*)|*.*";
data.NewDocName = "Untitled.dtl";
data.RegistryPath = registryPath;
docManager = new DocManager(data);
docManager.RegisterFileType("dtl", "dtlfile", "DrawTools File");
// Subscribe to DocManager events.
docManager.SaveEvent = docManager_SaveEvent;
docManager.LoadEvent = docManager_LoadEvent;
// Make "inline subscription" using anonymous methods.
docManager.OpenEvent = delegate(object sender, OpenFileEventArgs e)
{
// Update MRU List
if (e.Succeeded)
mruManager.Add(e.FileName);
else
mruManager.Remove(e.FileName);
};
docManager.DocChangedEvent = delegate(object o, EventArgs e)
{
drawArea.Refresh();
drawArea.ClearHistory();
};
docManager.ClearEvent = delegate(object o, EventArgs e)
{
if (drawArea.GraphicsList != null)
{
drawArea.GraphicsList.Clear();
drawArea.ClearHistory();
drawArea.Refresh();
}
};
docManager.NewDocument();
// DragDropManager
dragDropManager = new DragDropManager(this);
dragDropManager.FileDroppedEvent = delegate(object sender, FileDroppedEventArgs e)
{
OpenDocument(e.FileArray.GetValue(0).ToString());
};
// MruManager
mruManager = new MruManager();
mruManager.Initialize(
this, // owner form
recentFilesToolStripMenuItem, // Recent Files menu item
fileToolStripMenuItem, // parent
registryPath); // Registry path to keep MRU list
mruManager.MruOpenEvent = delegate(object sender, MruFileOpenEventArgs e)
{
OpenDocument(e.FileName);
};
}
/// <summary>
/// Handle exception from docManager_LoadEvent function
/// </summary>
/// <param name="ex"></param>
/// <param name="fileName"></param>
private void HandleLoadException(Exception ex, SerializationEventArgs e)
{
MessageBox.Show(this,
"Open File operation failed. File name: " e.FileName "\n"
"Reason: " ex.Message,
Application.ProductName);
e.Error = true;
}
/// <summary>
/// Handle exception from docManager_SaveEvent function
/// </summary>
/// <param name="ex"></param>
/// <param name="fileName"></param>
private void HandleSaveException(Exception ex, SerializationEventArgs e)
{
MessageBox.Show(this,
"Save File operation failed. File name: " e.FileName "\n"
"Reason: " ex.Message,
Application.ProductName);
e.Error = true;
}
/// <summary>
/// Open document.
/// Used to open file passed in command line or dropped into the window
/// </summary>
/// <param name="file"></param>
public void OpenDocument(string file)
{
docManager.OpenDocument(file);
}
/// <summary>
/// Load application settings from the Registry
/// 获取上次使用的线条颜色和宽度
/// </summary>
void LoadSettingsFromRegistry()
{
try
{
RegistryKey key = Registry.CurrentUser.CreateSubKey(registryPath);
DrawObject.LastUsedColor = Color.FromArgb((int)key.GetValue(
"Color",
Color.Black.ToArgb()));
DrawObject.LastUsedPenWidth = (int)key.GetValue(
"Width",
1);
}
catch (ArgumentNullException ex)
{
HandleRegistryException(ex);
}
catch (SecurityException ex)
{
HandleRegistryException(ex);
}
catch (ArgumentException ex)
{
HandleRegistryException(ex);
}
catch (ObjectDisposedException ex)
{
HandleRegistryException(ex);
}
catch (UnauthorizedAccessException ex)
{
HandleRegistryException(ex);
}
}
/// <summary>
/// Save application settings to the Registry
/// </summary>
void SaveSettingsToRegistry()
{
try
{
RegistryKey key = Registry.CurrentUser.CreateSubKey(registryPath);
key.SetValue("Color", DrawObject.LastUsedColor.ToArgb());
key.SetValue("Width", DrawObject.LastUsedPenWidth);
}
catch (SecurityException ex)
{
HandleRegistryException(ex);
}
catch (ArgumentException ex)
{
HandleRegistryException(ex);
}
catch (ObjectDisposedException ex)
{
HandleRegistryException(ex);
}
catch (UnauthorizedAccessException ex)
{
HandleRegistryException(ex);
}
}
private void HandleRegistryException(Exception ex)
{
Trace.WriteLine("Registry operation failed: " ex.Message);
}
/// <summary>
/// Set Pointer draw tool
/// </summary>
private void CommandPointer()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Pointer;
}
/// <summary>
/// Set Rectangle draw tool
/// </summary>
private void CommandRectangle()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Rectangle;
}
/// <summary>
/// Set Ellipse draw tool
/// </summary>
private void CommandEllipse()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Ellipse;
}
/// <summary>
/// Set Line draw tool
/// </summary>
private void CommandLine()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Line;
}
/// <summary>
/// Set Polygon draw tool
/// </summary>
private void CommandPolygon()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Polygon;
}
/// <summary>
/// Show About dialog
/// </summary>
private void CommandAbout()
{
FrmAbout frm = new FrmAbout();
frm.ShowDialog(this);
}
/// <summary>
/// Open new file
/// </summary>
private void CommandNew()
{
docManager.NewDocument();
}
/// <summary>
/// Open file
/// </summary>
private void CommandOpen()
{
docManager.OpenDocument("");
}
/// <summary>
/// Save file
/// </summary>
private void CommandSave()
{
docManager.SaveDocument(DocManager.SaveType.Save);
}
/// <summary>
/// Save As
/// </summary>
private void CommandSaveAs()
{
docManager.SaveDocument(DocManager.SaveType.SaveAs);
}
/// <summary>
/// Undo
/// </summary>
private void CommandUndo()
{
drawArea.Undo();
}
/// <summary>
/// Redo
/// </summary>
private void CommandRedo()
{
drawArea.Redo();
}
#endregion
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论