- silverlightintroduction_src.zip
- CSSL3Animation
- CSSL3DeepZoom
- CSSL3DeepZoom.sln
- CSSL3DeepZoom.Web
- App_Code
- Bin
- DeepZoomTools.DLL
- DeepZoomTools.DLL.refresh
- ClientBin
- GeneratedImages
- Default.html
- GenerateDeepZoomService.svc
- Silverlight.js
- SourceImages
- atom.png
- background.jpg
- cell.png
- dna.png
- Molecular.png
- neutron.png
- seed.png
- wrap in bamboo.png
- Web.config
- CSSL3DeepZoom
- ReadMe.mht
- CSSL3HTMLBridge
- CSSL3Input
- CSSL3LocalMessage
- CSSL3MediaElement
- CSSL3PixelShader
- CSSL3WriteableBitmap
- VBSL3Animation
- VBSL3DeepZoom
- VBSL3DeepZoom.sln
- VBSL3DeepZoom.Web
- App_Code
- App_Data
- Bin
- DeepZoomTools.DLL
- DeepZoomTools.DLL.refresh
- ClientBin
- GeneratedImages
- Default.html
- GenerateDeepZoomService.svc
- Silverlight.js
- SourceImages
- atom.png
- background.jpg
- cell.png
- dna.png
- Molecular.png
- neutron.png
- seed.png
- wrap in bamboo.png
- Web.config
- VBSL3DeepZoom
- VBSL3HTMLBridge
- VBSL3Input
- VBSL3LocalMessage
- VBSL3MediaElement
- VBSL3PixelShader
|
/****************************** Module Header ******************************\
* Module Name: MainPage.xaml.cs
* Project: CSSL3LocalMessage
* Copyright (c) Microsoft Corporation.
*
* Local message whiteboard's code behind file.
*
* This source is subject to the Microsoft Public License.
* See http://www.microsoft.com/opensource/licenses.mspx#Ms-PL.
* All other rights reserved.
*
* History:
* * 9/22/2009 6:34 PM Mog Liang Created
\***************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Messaging;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Windows.Ink;
namespace CSSL3LocalMessage
{
public partial class MainPage : UserControl
{
// Preassign two names for LocalMessageReceiver.
readonly string[] clientnames = { "{36BF6178-53A3-4d0b-8E0D-1E7BD9FBBE62}", "{E62BF131-B5EA-4f1d-B80D-DC083C7F0851}" };
// Preassign two colors for distinguishing two applications.
readonly Color[] colors = { Colors.Red, Colors.Green };
int clientid;
LocalMessageReceiver _localreceiver;
LocalMessageSender _localsender;
DataContractJsonSerializer _jsonserializer;
public MainPage()
{
InitializeComponent();
_jsonserializer =new DataContractJsonSerializer(inkP.Strokes.GetType());
// First try.
// Create receiver with one preset name.
_localreceiver = new LocalMessageReceiver(clientnames[clientid]);
_localreceiver.MessageReceived += localreceiver_MessageReceived;
try
{
_localreceiver.Listen();
}
catch(Exception e)
{
// Second try.
// Create receiver with another preset name.
_localreceiver.MessageReceived -= localreceiver_MessageReceived;
clientid = 1;
_localreceiver = new LocalMessageReceiver(clientnames[clientid]);
_localreceiver.MessageReceived += localreceiver_MessageReceived;
try
{
_localreceiver.Listen();
}
catch (Exception e1)
{
// Already has two apllication instance.
// Pop messagebox, disable drawing area.
MessageBox.Show("Only allow 2 clients.");
disablegrid.Visibility = Visibility.Visible;
return;
}
}
// Create sender targeting to another application's receiver
_localsender = new LocalMessageSender(clientnames[(clientid + 1) % 2]);
_localsender.SendCompleted += localsender_SendCompleted;
drawbr.Background = new SolidColorBrush(colors[clientid]);
}
void localsender_SendCompleted(object sender, SendCompletedEventArgs e)
{
// If send message got error, pop messagebox.
if(e.Error!=null)
MessageBox.Show("Cannot connect to another client.");
}
void localreceiver_MessageReceived(object sender, MessageReceivedEventArgs e)
{
// Deserialize json string to stroke object.
var stream = new MemoryStream();
var streamwriter = new StreamWriter(stream);
streamwriter.Write(e.Message);
streamwriter.Flush();
var receivedstroke = _jsonserializer.ReadObject(stream) as Stroke;
stream.Close();
// Add received stroke to inkPresenter.
inkP.Strokes.Add(receivedstroke);
}
// Attaching MouseLeftButtonDown/MouseMove/MouseLeftButtonUp event
// to implement drawing functionality.
Stroke _newStroke;
private void InkPresenter_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
inkP.CaptureMouse();
_newStroke = new System.Windows.Ink.Stroke();
_newStroke.DrawingAttributes.Color = colors[clientid];
_newStroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(inkP));
inkP.Strokes.Add(_newStroke);
}
// Sending message when finishing one stroke.
private void InkPresenter_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
inkP.ReleaseMouseCapture();
// Serialize stroke object to string.
var stream = new MemoryStream();
_jsonserializer.WriteObject(stream, _newStroke);
stream.Flush();
stream.Position = 0;
var obstring = new StreamReader(stream).ReadToEnd();
stream.Close();
// Send Serialized stroke.
if (_localsender != null)
{
try
{
_localsender.SendAsync(obstring);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
_newStroke = null;
}
private void InkPresenter_MouseMove(object sender, MouseEventArgs e)
{
if (_newStroke != null)
{
_newStroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(inkP));
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Microsoft All-In-One Code Framework delineates the framework and skeleton of Microsoft development techniques through typical sample codes in three popular programming languages (Visual C#, VB.NET, Visual C++). Each sample is elaborately selected, composed, and documented to demonstrate one frequently-asked, tested or used coding scenario based on our support experience in MSDN newsgroups and forums. If you are a software developer, you can fill the skeleton with blood, muscle and soul. If you are a software tester or a support engineer like us, you may extend the sample codes a little to fit your specific test scenario or refer your customer to this project if the customer's question coincides with what we collected.
http://cfx.codeplex.com/