Form1.cs
上传用户:lxycoco
上传日期:2022-07-21
资源大小:38457k
文件大小:10k
源码类别:

C#编程

开发平台:

Others

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.IO;
  8. namespace Wrox.ProCSharp.GdiPlus.CapsEditor
  9. {
  10. /// <summary>
  11. /// Summary description for Form1.
  12. /// </summary>
  13. public class Form1 : System.Windows.Forms.Form
  14. {
  15. /// <summary>
  16. /// Required designer variable.
  17. /// </summary>
  18. private System.ComponentModel.Container components = null;
  19.   #region constant fields
  20. private const string standardTitle = "CapsEditor";
  21. // default text in titlebar
  22. private const uint margin = 10;
  23. // horizontal and vertical margin in client area
  24.       #endregion
  25.       #region Member fields
  26. private ArrayList documentLines = new ArrayList();   // the 'document'
  27. private uint lineHeight;        // height in pixels of one line
  28. private Size documentSize;      // how big a client area is needed to 
  29. // display document
  30. private uint nLines;            // number of lines in document
  31. private Font mainFont;          // font used to display all lines
  32. private Font emptyDocumentFont; // font used to display empty message
  33. private Brush mainBrush = Brushes.Blue; 
  34. // brush used to display document text
  35. private Brush emptyDocumentBrush = Brushes.Red;
  36. // brush used to display empty document message
  37. private Point mouseDoubleClickPosition;   
  38. // location mouse is pointing to when double-clicked
  39. private OpenFileDialog fileOpenDialog = new OpenFileDialog();
  40. private System.Windows.Forms.MainMenu mainMenu1;
  41. private System.Windows.Forms.MenuItem menuFile;
  42. private System.Windows.Forms.MenuItem menuOpen;
  43. private System.Windows.Forms.MenuItem menuExit; 
  44. // standard open file dialog
  45. private bool documentHasData = false; 
  46. // set to true if document has some data in it
  47.       #endregion
  48. public Form1()
  49. {
  50. //
  51. // Required for Windows Form Designer support
  52. //
  53. InitializeComponent();
  54. this.BackColor = Color.White; 
  55. this.Text = "Caps Editor";
  56. CreateFonts();
  57. fileOpenDialog.FileOk += new 
  58. System.ComponentModel.CancelEventHandler(
  59. this.OpenFileDialog_FileOk);
  60. fileOpenDialog.Filter =
  61. "Text files (*.txt)|*.txt|C# source files (*.cs)|*.cs";
  62.  
  63. //
  64. // TODO: Add any constructor code after InitializeComponent call
  65. //
  66. }
  67. /// <summary>
  68. /// Clean up any resources being used.
  69. /// </summary>
  70. protected override void Dispose( bool disposing )
  71. {
  72. if( disposing )
  73. {
  74. if (components != null) 
  75. {
  76. components.Dispose();
  77. }
  78. }
  79. base.Dispose( disposing );
  80. }
  81. private void CreateFonts()
  82. {
  83. mainFont = new Font("Arial", 10);
  84. lineHeight = (uint)mainFont.Height;
  85. emptyDocumentFont = new Font("Verdana", 13, FontStyle.Bold);
  86. }
  87. class TextLineInformation
  88. {
  89. public string Text;
  90. public uint Width;
  91. }
  92. protected void OpenFileDialog_FileOk(object Sender, CancelEventArgs e)
  93. {
  94. this.LoadFile(fileOpenDialog.FileName);
  95. }
  96. protected void menuFileOpen_Click(object sender, EventArgs e)
  97. {
  98. fileOpenDialog.ShowDialog();
  99. }      
  100.       
  101. protected void menuFileExit_Click(object sender, EventArgs e)
  102. {
  103. this.Close();
  104. }
  105. private void LoadFile(string FileName)
  106. {
  107. StreamReader sr = new StreamReader(FileName);
  108. string nextLine;
  109. documentLines.Clear();
  110. nLines = 0;
  111. TextLineInformation nextLineInfo;
  112. while ( (nextLine = sr.ReadLine()) != null)
  113. {
  114. nextLineInfo = new TextLineInformation();
  115. nextLineInfo.Text = nextLine;
  116. documentLines.Add(nextLineInfo);
  117. ++nLines;
  118. }
  119. sr.Close();
  120. documentHasData = (nLines>0) ? true : false;
  121. CalculateLineWidths();
  122. CalculateDocumentSize();
  123. this.Text = standardTitle + " - " + FileName;
  124. this.Invalidate();
  125. }
  126. private void CalculateLineWidths()
  127. {
  128. Graphics dc = this.CreateGraphics();
  129. foreach (TextLineInformation nextLine in documentLines)
  130. {
  131. nextLine.Width = (uint)dc.MeasureString(nextLine.Text, 
  132. mainFont).Width;
  133. }
  134. }
  135. private void CalculateDocumentSize()
  136. {
  137. if (!documentHasData)
  138. {
  139. documentSize = new Size(100, 200);
  140. }
  141. else
  142. {
  143. documentSize.Height = (int)(nLines*lineHeight) + 2*(int)margin;
  144. uint maxLineLength = 0;
  145. foreach (TextLineInformation nextWord in documentLines)
  146. {
  147. uint tempLineLength = nextWord.Width + 2*margin;
  148. if (tempLineLength > maxLineLength)
  149. maxLineLength = tempLineLength;
  150. }
  151. documentSize.Width = (int)maxLineLength;
  152. }
  153. this.AutoScrollMinSize = documentSize;
  154. }
  155. protected override void OnPaint(PaintEventArgs e)
  156. {
  157. base.OnPaint(e);
  158. Graphics dc = e.Graphics;
  159. int scrollPositionX = this.AutoScrollPosition.X;
  160. int scrollPositionY = this.AutoScrollPosition.Y;
  161. dc.TranslateTransform(scrollPositionX, scrollPositionY);
  162. if (!documentHasData)
  163. {
  164. dc.DrawString("<Empty document>", emptyDocumentFont, 
  165. emptyDocumentBrush, new Point(20,20));
  166. base.OnPaint(e);
  167. return;
  168. }
  169. // work out which lines are in clipping rectangle
  170. int minLineInClipRegion = 
  171. WorldYCoordinateToLineIndex(e.ClipRectangle.Top - 
  172. scrollPositionY);
  173. if (minLineInClipRegion == -1)
  174. minLineInClipRegion = 0;
  175. int maxLineInClipRegion = 
  176. WorldYCoordinateToLineIndex(e.ClipRectangle.Bottom - 
  177. scrollPositionY);
  178. if (maxLineInClipRegion >= this.documentLines.Count ||
  179. maxLineInClipRegion == -1)
  180. maxLineInClipRegion = this.documentLines.Count-1;
  181. TextLineInformation nextLine;
  182. for (int i=minLineInClipRegion; i<=maxLineInClipRegion ; i++)
  183. {
  184. nextLine = (TextLineInformation)documentLines[i];
  185. dc.DrawString(nextLine.Text, mainFont, mainBrush, 
  186. this.LineIndexToWorldCoordinates(i));
  187. }
  188. }
  189. private Point LineIndexToWorldCoordinates(int index)
  190. {
  191. Point TopLeftCorner = new Point(
  192. (int)margin, (int)(lineHeight*index + margin));
  193. return TopLeftCorner;
  194. }
  195. private int WorldYCoordinateToLineIndex(int y)
  196. {
  197. if (y < margin)
  198. return -1;
  199. return (int)((y-margin)/lineHeight);
  200. }
  201. private int WorldCoordinatesToLineIndex(Point position)
  202. {
  203. if (!documentHasData)
  204. return -1;
  205. if (position.Y < margin || position.X < margin)
  206. return -1;
  207. int index = (int)(position.Y-margin)/(int)this.lineHeight;
  208. // check position isn't below document
  209. if (index >= documentLines.Count)
  210. return -1;
  211. // now check that horizontal position is within this line
  212. TextLineInformation theLine = 
  213. (TextLineInformation)documentLines[index];
  214. if (position.X > margin + theLine.Width)
  215. return -1;
  216. // all is OK. We can return answer
  217. return index;
  218. }
  219. private Point LineIndexToPageCoordinates(int index)
  220. {
  221. return LineIndexToWorldCoordinates(index) + 
  222. new Size(AutoScrollPosition);
  223. }
  224. private int PageCoordinatesToLineIndex(Point position)
  225. {
  226. return WorldCoordinatesToLineIndex(position - new 
  227. Size(AutoScrollPosition));
  228. }
  229. protected override void OnMouseDown(MouseEventArgs e)
  230. {
  231. base.OnMouseDown(e);
  232. this.mouseDoubleClickPosition = new Point(e.X, e.Y);
  233. }
  234. protected override void OnDoubleClick(EventArgs e)
  235. {
  236. int i = PageCoordinatesToLineIndex(this.mouseDoubleClickPosition);
  237. if (i >= 0)
  238. {
  239. TextLineInformation lineToBeChanged = 
  240. (TextLineInformation)documentLines[i];
  241. lineToBeChanged.Text = lineToBeChanged.Text.ToUpper();
  242. Graphics dc = this.CreateGraphics();
  243. uint newWidth =(uint)dc.MeasureString(lineToBeChanged.Text, 
  244. mainFont).Width;
  245. if (newWidth > lineToBeChanged.Width)
  246. lineToBeChanged.Width = newWidth;
  247. if (newWidth+2*margin > this.documentSize.Width)
  248. {
  249. this.documentSize.Width = (int)newWidth;
  250. this.AutoScrollMinSize = this.documentSize;
  251. }
  252. Rectangle changedRectangle = new Rectangle(
  253. LineIndexToPageCoordinates(i), 
  254. new Size((int)newWidth, 
  255. (int)this.lineHeight));
  256. this.Invalidate(changedRectangle);
  257. }
  258. base.OnDoubleClick(e);
  259. }
  260. #region Windows Form Designer generated code
  261. /// <summary>
  262. /// Required method for Designer support - do not modify
  263. /// the contents of this method with the code editor.
  264. /// </summary>
  265. private void InitializeComponent()
  266. {
  267. this.mainMenu1 = new System.Windows.Forms.MainMenu();
  268. this.menuFile = new System.Windows.Forms.MenuItem();
  269. this.menuOpen = new System.Windows.Forms.MenuItem();
  270. this.menuExit = new System.Windows.Forms.MenuItem();
  271. // 
  272. // mainMenu1
  273. // 
  274. this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  275.   this.menuFile});
  276. // 
  277. // menuFile
  278. // 
  279. this.menuFile.Index = 0;
  280. this.menuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  281.  this.menuOpen,
  282.  this.menuExit});
  283. this.menuFile.Text = "File";
  284. // 
  285. // menuOpen
  286. // 
  287. this.menuOpen.Index = 0;
  288. this.menuOpen.Text = "Open";
  289. this.menuOpen.Click += new System.EventHandler(this.menuFileOpen_Click);
  290. // 
  291. // menuExit
  292. // 
  293. this.menuExit.Index = 1;
  294. this.menuExit.Text = "Exit";
  295. this.menuExit.Click += new System.EventHandler(this.menuFileExit_Click);
  296. // 
  297. // Form1
  298. // 
  299. this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
  300. this.ClientSize = new System.Drawing.Size(292, 273);
  301. this.Menu = this.mainMenu1;
  302. this.Name = "Form1";
  303. this.Text = "Form1";
  304. }
  305. #endregion
  306. /// <summary>
  307. /// The main entry point for the application.
  308. /// </summary>
  309. [STAThread]
  310. static void Main() 
  311. {
  312. Application.Run(new Form1());
  313. }
  314. }
  315. }