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

C#编程

开发平台:

Others

  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Printing;
  4. using System.Collections;
  5. using System.ComponentModel;
  6. using System.Windows.Forms;
  7. using System.Data;
  8. using System.IO;
  9. namespace Wrox.ProCSharp.GDIPlus
  10. {
  11. class TextLineInformation
  12. {
  13. public string Text;
  14. public uint Width;
  15. }
  16. /// <summary>
  17. /// Summary description for Form1.
  18. /// </summary>
  19. public class Form1 : System.Windows.Forms.Form
  20. {
  21. #region constant fields
  22. private const string standardTitle = "CapsEditor";
  23. // default text in titlebar
  24. private const uint margin = 10;
  25. // horizontal and vertical margin in client area
  26. #endregion
  27. private int printingPageNo = 0;
  28.       #region Member fields
  29. private ArrayList documentLines = new ArrayList();   // the 'document'
  30. private uint lineHeight;        // height in pixels of one line
  31. private Size documentSize;      // how big a client area is needed to 
  32. // display document
  33. private uint nLines;            // number of lines in document
  34. private Font mainFont;          // font used to display all lines
  35. private Font emptyDocumentFont; // font used to display empty message
  36. private Brush mainBrush = Brushes.Blue; 
  37. // brush used to display document text
  38. private Brush emptyDocumentBrush = Brushes.Red;
  39. // brush used to display empty document message
  40. private Point mouseDoubleClickPosition;   
  41. // location mouse is pointing to when double-clicked
  42. private OpenFileDialog fileOpenDialog = new OpenFileDialog(); 
  43. // standard open file dialog
  44. private bool documentHasData = false;
  45. private System.Windows.Forms.MainMenu mainMenu1;
  46. private System.Windows.Forms.MenuItem menuFile;
  47. private System.Windows.Forms.MenuItem menuFileOpen;
  48. private System.Windows.Forms.MenuItem menuFileExit;
  49. private System.Windows.Forms.MenuItem menuFilePrint;
  50. private System.Windows.Forms.MenuItem menuFilePrintPreview;
  51. private System.Windows.Forms.MenuItem menuItem4;
  52. private System.Windows.Forms.MenuItem menuItem5; 
  53. // set to true if document has some data in it
  54.       #endregion
  55. /// <summary>
  56. /// Required designer variable.
  57. /// </summary>
  58. private System.ComponentModel.Container components = null;
  59. public Form1()
  60. {
  61. InitializeComponent();
  62. CreateFonts();
  63. fileOpenDialog.FileOk += new 
  64. System.ComponentModel.CancelEventHandler(
  65. this.OpenFileDialog_FileOk);
  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. #region Windows Form Designer generated code
  82. /// <summary>
  83. /// Required method for Designer support - do not modify
  84. /// the contents of this method with the code editor.
  85. /// </summary>
  86. private void InitializeComponent()
  87. {
  88. this.mainMenu1 = new System.Windows.Forms.MainMenu();
  89. this.menuFile = new System.Windows.Forms.MenuItem();
  90. this.menuFileOpen = new System.Windows.Forms.MenuItem();
  91. this.menuItem5 = new System.Windows.Forms.MenuItem();
  92. this.menuFilePrint = new System.Windows.Forms.MenuItem();
  93. this.menuFilePrintPreview = new System.Windows.Forms.MenuItem();
  94. this.menuItem4 = new System.Windows.Forms.MenuItem();
  95. this.menuFileExit = new System.Windows.Forms.MenuItem();
  96. // 
  97. // mainMenu1
  98. // 
  99. this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  100.   this.menuFile});
  101. // 
  102. // menuFile
  103. // 
  104. this.menuFile.Index = 0;
  105. this.menuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  106.  this.menuFileOpen,
  107.  this.menuItem5,
  108.  this.menuFilePrint,
  109.  this.menuFilePrintPreview,
  110.  this.menuItem4,
  111.  this.menuFileExit});
  112. this.menuFile.Text = "&File";
  113. // 
  114. // menuFileOpen
  115. // 
  116. this.menuFileOpen.Index = 0;
  117. this.menuFileOpen.Text = "&Open";
  118. this.menuFileOpen.Click += new System.EventHandler(this.menuFileOpen_Click);
  119. // 
  120. // menuItem5
  121. // 
  122. this.menuItem5.Index = 1;
  123. this.menuItem5.Text = "-";
  124. // 
  125. // menuFilePrint
  126. // 
  127. this.menuFilePrint.Enabled = false;
  128. this.menuFilePrint.Index = 2;
  129. this.menuFilePrint.Text = "&Print";
  130. this.menuFilePrint.Click += new System.EventHandler(this.menuFilePrint_Click);
  131. // 
  132. // menuFilePrintPreview
  133. // 
  134. this.menuFilePrintPreview.Enabled = false;
  135. this.menuFilePrintPreview.Index = 3;
  136. this.menuFilePrintPreview.Text = "Print Pre&view";
  137. this.menuFilePrintPreview.Click += new System.EventHandler(this.menuFilePrintPreview_Click);
  138. // 
  139. // menuItem4
  140. // 
  141. this.menuItem4.Index = 4;
  142. this.menuItem4.Text = "-";
  143. // 
  144. // menuFileExit
  145. // 
  146. this.menuFileExit.Index = 5;
  147. this.menuFileExit.Text = "E&xit";
  148. this.menuFileExit.Click += new System.EventHandler(this.menuFileExit_Click);
  149. // 
  150. // Form1
  151. // 
  152. this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
  153. this.BackColor = System.Drawing.Color.White;
  154. this.ClientSize = new System.Drawing.Size(492, 448);
  155. this.Menu = this.mainMenu1;
  156. this.Name = "Form1";
  157. this.Text = "CapsEditor";
  158. this.Load += new System.EventHandler(this.Form1_Load);
  159. }
  160. #endregion
  161. /// <summary>
  162. /// The main entry point for the application.
  163. /// </summary>
  164. [STAThread]
  165. static void Main() 
  166. {
  167. Application.Run(new Form1());
  168. }
  169. private void Form1_Load(object sender, System.EventArgs e)
  170. {
  171. }
  172. protected void OpenFileDialog_FileOk(object Sender, CancelEventArgs e)
  173. {
  174. this.LoadFile(fileOpenDialog.FileName);
  175. }
  176. private void menuFileOpen_Click(object sender, System.EventArgs e)
  177. {
  178. fileOpenDialog.ShowDialog();
  179. }
  180. private void menuFileExit_Click(object sender, System.EventArgs e)
  181. {
  182. this.Close();
  183. }
  184. private void CreateFonts()
  185. {
  186. mainFont = new Font("Arial", 10);
  187. lineHeight = (uint)mainFont.Height;
  188. emptyDocumentFont = new Font("Verdana", 13, FontStyle.Bold);
  189. }
  190. private void LoadFile(string FileName)
  191. {
  192. StreamReader sr = new StreamReader(FileName);
  193. string nextLine;
  194. documentLines.Clear();
  195. nLines = 0;
  196. TextLineInformation nextLineInfo;
  197. while ( (nextLine = sr.ReadLine()) != null)
  198. {
  199. nextLineInfo = new TextLineInformation();
  200. nextLineInfo.Text = nextLine;
  201. documentLines.Add(nextLineInfo);
  202. ++nLines;
  203. }
  204. sr.Close();
  205. if (nLines > 0)
  206. {
  207. documentHasData = true;
  208. menuFilePrint.Enabled = true;
  209. menuFilePrintPreview.Enabled = true;
  210. }
  211. else
  212. {
  213. documentHasData = false;
  214. menuFilePrint.Enabled = false;
  215. menuFilePrintPreview.Enabled = false;
  216. }
  217. CalculateLineWidths();
  218. CalculateDocumentSize();
  219. this.Text = standardTitle + " - " + FileName;
  220. this.Invalidate();
  221. }
  222. private void CalculateLineWidths()
  223. {
  224. Graphics dc = this.CreateGraphics();
  225. foreach (TextLineInformation nextLine in documentLines)
  226. {
  227. nextLine.Width = (uint)dc.MeasureString(nextLine.Text, 
  228. mainFont).Width;
  229. }
  230. }
  231. private void CalculateDocumentSize()
  232. {
  233. if (!documentHasData)
  234. {
  235. documentSize = new Size(100, 200);
  236. }
  237. else
  238. {
  239. documentSize.Height = (int)(nLines*lineHeight) + 2*(int)margin;
  240. uint maxLineLength = 0;
  241. foreach (TextLineInformation nextWord in documentLines)
  242. {
  243. uint tempLineLength = nextWord.Width + 2*margin;
  244. if (tempLineLength > maxLineLength)
  245. maxLineLength = tempLineLength;
  246. }
  247. documentSize.Width = (int)maxLineLength;
  248. }
  249. this.AutoScrollMinSize = documentSize;
  250. }
  251. protected override void OnPaint(PaintEventArgs e)
  252. {
  253. Graphics dc = e.Graphics;
  254. int scrollPositionX = this.AutoScrollPosition.X;
  255. int scrollPositionY = this.AutoScrollPosition.Y;
  256. dc.TranslateTransform(scrollPositionX, scrollPositionY);
  257. if (!documentHasData)
  258. {
  259. dc.DrawString("<Empty document>", emptyDocumentFont, 
  260. emptyDocumentBrush, new Point(20,20));
  261. base.OnPaint(e);
  262. return;
  263. }
  264. // work out which lines are in clipping rectangle
  265. int minLineInClipRegion = 
  266. WorldYCoordinateToLineIndex(e.ClipRectangle.Top - scrollPositionY);
  267. if (minLineInClipRegion == -1)
  268. minLineInClipRegion = 0;
  269. int maxLineInClipRegion = 
  270. WorldYCoordinateToLineIndex(e.ClipRectangle.Bottom - 
  271. scrollPositionY);
  272. if (maxLineInClipRegion >= this.documentLines.Count ||
  273.  
  274. maxLineInClipRegion == -1)
  275. maxLineInClipRegion = this.documentLines.Count-1;
  276. TextLineInformation nextLine;
  277. for (int i=minLineInClipRegion; i<=maxLineInClipRegion ; i++)
  278. {
  279. nextLine = (TextLineInformation)documentLines[i];
  280. dc.DrawString(nextLine.Text, mainFont, mainBrush, 
  281. this.LineIndexToWorldCoordinates(i));
  282. }
  283. base.OnPaint(e);
  284. }
  285. private Point LineIndexToWorldCoordinates(int index)
  286. {
  287. Point TopLeftCorner = new Point(
  288. (int)margin, (int)(lineHeight*index + margin));
  289. return TopLeftCorner;
  290. }
  291. private int WorldYCoordinateToLineIndex(int y)
  292. {
  293. if (y < margin)
  294. return -1;
  295. return (int)((y-margin)/lineHeight);
  296. }
  297. private int WorldCoordinatesToLineIndex(Point position)
  298. {
  299. if (!documentHasData)
  300. return -1;
  301. if (position.Y < margin || position.X < margin)
  302. return -1;
  303. int index = (int)(position.Y-margin)/(int)this.lineHeight;
  304. // check position isn't below document
  305. if (index >= documentLines.Count)
  306. return -1;
  307. // now check that horizontal position is within this line
  308. TextLineInformation theLine = 
  309. (TextLineInformation)documentLines[index];
  310. if (position.X > margin + theLine.Width)
  311. return -1;
  312. // all is OK. We can return answer
  313. return index;
  314. }
  315. private Point LineIndexToPageCoordinates(int index)
  316. {
  317. return LineIndexToWorldCoordinates(index) + 
  318. new Size(AutoScrollPosition);
  319. }
  320. private int PageCoordinatesToLineIndex(Point position)
  321. {
  322. return WorldCoordinatesToLineIndex(position - new 
  323. Size(AutoScrollPosition));
  324. }
  325. protected override void OnMouseDown(MouseEventArgs e)
  326. {
  327. base.OnMouseDown(e);
  328. this.mouseDoubleClickPosition = new Point(e.X, e.Y);
  329. }
  330. protected override void OnDoubleClick(EventArgs e)
  331. {
  332. int i = PageCoordinatesToLineIndex(this.mouseDoubleClickPosition);
  333. if (i >= 0)
  334. {
  335. TextLineInformation lineToBeChanged = 
  336. (TextLineInformation)documentLines[i];
  337. lineToBeChanged.Text = lineToBeChanged.Text.ToUpper();
  338. Graphics dc = this.CreateGraphics();
  339. uint newWidth =(uint)dc.MeasureString(lineToBeChanged.Text, 
  340. mainFont).Width;
  341. if (newWidth > lineToBeChanged.Width)
  342. lineToBeChanged.Width = newWidth;
  343. if (newWidth+2*margin > this.documentSize.Width)
  344. {
  345. this.documentSize.Width = (int)newWidth;
  346. this.AutoScrollMinSize = this.documentSize;
  347. }
  348. Rectangle changedRectangle = new Rectangle(
  349. LineIndexToPageCoordinates(i), 
  350. new Size((int)newWidth, 
  351. (int)this.lineHeight));
  352. this.Invalidate(changedRectangle);
  353. }
  354. base.OnDoubleClick(e);
  355. }
  356. private void menuFilePrintPreview_Click(object sender, System.EventArgs e)
  357. {
  358. PrintPreviewDialog ppd = new PrintPreviewDialog();
  359. PrintDocument pd = new PrintDocument();
  360. pd.PrintPage += new PrintPageEventHandler
  361. (this.pd_PrintPage);
  362. ppd.Document = pd;
  363. ppd.ShowDialog();
  364. }
  365. private void menuFilePrint_Click(object sender, System.EventArgs e)
  366. {
  367. PrintDocument pd = new PrintDocument();
  368. pd.PrintPage += new PrintPageEventHandler
  369. (this.pd_PrintPage);
  370. pd.Print();
  371. MessageBox.Show(pd.PrinterSettings.PrinterName);
  372. }
  373. private void pd_PrintPage(object sender, PrintPageEventArgs e) 
  374. {
  375. float yPos = 0;
  376. float leftMargin = e.MarginBounds.Left;
  377. float topMargin = e.MarginBounds.Top;
  378. string line = null;
  379. // Calculate the number of lines per page.
  380. int linesPerPage = (int)(e.MarginBounds.Height / 
  381. mainFont.GetHeight(e.Graphics));
  382. // linesPerPage = 10;
  383. int lineNo = this.printingPageNo * linesPerPage;
  384. // Print each line of the file.
  385. int count = 0;
  386. while(count < linesPerPage && lineNo < this.nLines) 
  387. {
  388. line = ((TextLineInformation)this.documentLines[lineNo]).Text;
  389. yPos = topMargin + (count * mainFont.GetHeight(e.Graphics));
  390. e.Graphics.DrawString(line, mainFont, Brushes.Blue, 
  391. leftMargin, yPos, new StringFormat());
  392. lineNo++;
  393. count++;
  394. }
  395. // If more lines exist, print another page.
  396. if(this.nLines > lineNo)
  397. e.HasMorePages = true;
  398. else
  399. e.HasMorePages = false;
  400. printingPageNo++;
  401. }
  402. }
  403. }