PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/Visual Studio 2008/CSSL3LocalMessage/MainPage.xaml.cs

#
C# | 159 lines | 111 code | 17 blank | 31 comment | 5 complexity | 3dbbf4582bdaee69ea84b812686db02c MD5 | raw file
  1. /****************************** Module Header ******************************\
  2. * Module Name: MainPage.xaml.cs
  3. * Project: CSSL3LocalMessage
  4. * Copyright (c) Microsoft Corporation.
  5. *
  6. * Local message whiteboard's code behind file.
  7. *
  8. * This source is subject to the Microsoft Public License.
  9. * See http://www.microsoft.com/opensource/licenses.mspx#Ms-PL.
  10. * All other rights reserved.
  11. *
  12. * History:
  13. * * 9/22/2009 6:34 PM Mog Liang Created
  14. \***************************************************************************/
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using System.Net;
  19. using System.Windows;
  20. using System.Windows.Controls;
  21. using System.Windows.Documents;
  22. using System.Windows.Input;
  23. using System.Windows.Media;
  24. using System.Windows.Media.Animation;
  25. using System.Windows.Shapes;
  26. using System.Windows.Messaging;
  27. using System.Runtime.Serialization.Json;
  28. using System.IO;
  29. using System.Windows.Ink;
  30. namespace CSSL3LocalMessage
  31. {
  32. public partial class MainPage : UserControl
  33. {
  34. // Preassign two names for LocalMessageReceiver.
  35. readonly string[] clientnames = { "{36BF6178-53A3-4d0b-8E0D-1E7BD9FBBE62}", "{E62BF131-B5EA-4f1d-B80D-DC083C7F0851}" };
  36. // Preassign two colors for distinguishing two applications.
  37. readonly Color[] colors = { Colors.Red, Colors.Green };
  38. int clientid;
  39. LocalMessageReceiver _localreceiver;
  40. LocalMessageSender _localsender;
  41. DataContractJsonSerializer _jsonserializer;
  42. public MainPage()
  43. {
  44. InitializeComponent();
  45. _jsonserializer =new DataContractJsonSerializer(inkP.Strokes.GetType());
  46. // First try.
  47. // Create receiver with one preset name.
  48. _localreceiver = new LocalMessageReceiver(clientnames[clientid]);
  49. _localreceiver.MessageReceived += localreceiver_MessageReceived;
  50. try
  51. {
  52. _localreceiver.Listen();
  53. }
  54. catch(Exception e)
  55. {
  56. // Second try.
  57. // Create receiver with another preset name.
  58. _localreceiver.MessageReceived -= localreceiver_MessageReceived;
  59. clientid = 1;
  60. _localreceiver = new LocalMessageReceiver(clientnames[clientid]);
  61. _localreceiver.MessageReceived += localreceiver_MessageReceived;
  62. try
  63. {
  64. _localreceiver.Listen();
  65. }
  66. catch (Exception e1)
  67. {
  68. // Already has two apllication instance.
  69. // Pop messagebox, disable drawing area.
  70. MessageBox.Show("Only allow 2 clients.");
  71. disablegrid.Visibility = Visibility.Visible;
  72. return;
  73. }
  74. }
  75. // Create sender targeting to another application's receiver
  76. _localsender = new LocalMessageSender(clientnames[(clientid + 1) % 2]);
  77. _localsender.SendCompleted += localsender_SendCompleted;
  78. drawbr.Background = new SolidColorBrush(colors[clientid]);
  79. }
  80. void localsender_SendCompleted(object sender, SendCompletedEventArgs e)
  81. {
  82. // If send message got error, pop messagebox.
  83. if(e.Error!=null)
  84. MessageBox.Show("Cannot connect to another client.");
  85. }
  86. void localreceiver_MessageReceived(object sender, MessageReceivedEventArgs e)
  87. {
  88. // Deserialize json string to stroke object.
  89. var stream = new MemoryStream();
  90. var streamwriter = new StreamWriter(stream);
  91. streamwriter.Write(e.Message);
  92. streamwriter.Flush();
  93. var receivedstroke = _jsonserializer.ReadObject(stream) as Stroke;
  94. stream.Close();
  95. // Add received stroke to inkPresenter.
  96. inkP.Strokes.Add(receivedstroke);
  97. }
  98. // Attaching MouseLeftButtonDown/MouseMove/MouseLeftButtonUp event
  99. // to implement drawing functionality.
  100. Stroke _newStroke;
  101. private void InkPresenter_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  102. {
  103. inkP.CaptureMouse();
  104. _newStroke = new System.Windows.Ink.Stroke();
  105. _newStroke.DrawingAttributes.Color = colors[clientid];
  106. _newStroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(inkP));
  107. inkP.Strokes.Add(_newStroke);
  108. }
  109. // Sending message when finishing one stroke.
  110. private void InkPresenter_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  111. {
  112. inkP.ReleaseMouseCapture();
  113. // Serialize stroke object to string.
  114. var stream = new MemoryStream();
  115. _jsonserializer.WriteObject(stream, _newStroke);
  116. stream.Flush();
  117. stream.Position = 0;
  118. var obstring = new StreamReader(stream).ReadToEnd();
  119. stream.Close();
  120. // Send Serialized stroke.
  121. if (_localsender != null)
  122. {
  123. try
  124. {
  125. _localsender.SendAsync(obstring);
  126. }
  127. catch (Exception ex)
  128. {
  129. MessageBox.Show(ex.Message);
  130. }
  131. }
  132. _newStroke = null;
  133. }
  134. private void InkPresenter_MouseMove(object sender, MouseEventArgs e)
  135. {
  136. if (_newStroke != null)
  137. {
  138. _newStroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(inkP));
  139. }
  140. }
  141. }
  142. }