iPhone gets Unofficial Zunepass support
This is interesting. The article states:
[...] is set up Orb on a Windows machine to transcode, on the fly, your already downloaded Zune songs. This way you can listen to your music (your entire music library, not just 16GB or 32GB worth) wherever you have an internet connection [...]
I have used Orb before and it’s a pretty nifty way of streaming subscription media to many media servers that aren’t supported first party. Anyways, I’m not surprised Microsoft isn’t offering this first party as they undoubtedly want to sell their devices, but this may be a blessing in disguise. However, this is a pretty clever hack and might tempt some Apple users over to the Zune service. The question I’m asking now is whether Microsoft will block Orb in an attempt to protect the device ecosystem they have created with the Zune and, in the future, with other rumored devices.
Server Side Recognition in Windows Server 2008 R2
Overview
Windows Server 2008 R2 supports server-side recognition. Server-side recognition lets a server recognize content from pen input on web pages. This is particularly useful when users on a network will be specifying terms that are interpreted using a custom dictionary. For example, if you had a medical application that queried a server database for patient names, those names could be added to another database that would be cross-referenced when performing searches from a handwritten Silverlight™ form.
Set up your Server for Server-Side Recognition
The following steps should be followed to set up server-side recognition:
1. Install Ink and Handwriting Services.
2. Install support for Web Server (IIS) and Application Server.
3. Enable the Desktop Experience Role
4. Start the Tablet PC Input Service
Install Ink and Handwriting Services
To install Ink and Handwriting services, open the server manager by clicking the server manager icon from the Quick Launch tray. Select the Features menu and then click “Add Features”. Make sure that you check the “Ink and Handwriting Services” feature. The following image shows the features dialog with “Ink and Handwriting Services” enabled.

Install Support for Web Server (IIS) and Application Server
Open the server manager as you did for the first step. Next, you will need to add the Web Server (IIS) and Application Server roles by clicking the Roles menu and then clicking “Add Roles”. After clicking “Add Roles”, you will be presented with the “Add Roles” wizard. Click Next and then make sure “Application Server” and “Web Server (IIS)” are checked. The following image shows the Select Server Roles dialog with the Web Server (IIS) and “Application Server” roles checked.

When you check “Application Server”, you will be asked to install the ASP.NET framework. Click the “Add the Required Features” button on dialog. After you click Next, you will be presented with an overview dialog; click Next. The “Select Role Services” dialog should now be available. Make sure that “Web Server (IIS)” is checked. The following image shows the “Select Role Services” dialog with “Web Server (IIS)” enabled.

Click next and you will be presented with an overview dialog; click Next. You will now be presented with a page offering you options for roles for Web Server (IIS), click Next. On the next page, the Install button will become active. Click Install and you will install support for Web Server (IIS) and Application Server.
Enable the Desktop Experience Role
To enable the desktop experience, open the Server Manager from the Administrative Tools Start Menu item. Select add services and check the Desktop Experience service. The following image shows the Select Features dialog with the Desktop Experience item installed.

Clicking past the Install menu will install the Desktop Experience.
Start the Tablet Service
After you have installed the Desktop Experience role, the Tablet PC Input service will appear in the Services menu. To access the Services menu, click the start menu and then open the Services menu from the Administrative Tools menu item. Right clicking on the Tablet PC Input Service and clicking Start will start the service. The following image shows the Services menu with the Tablet PC Input Service started.

Performing Server Side Recognition Using Silverlight
For the next steps, you will be creating a Web application that uses Silverlight to capture handwriting input. The following steps:
· Install and Update Visual Studio 2008 and Silverlight
· Create a new Silverlight Project
· Add the necessary references
· Create an Ink Recognition WCF service
· Add the service reference for your WCF service
· Add the InkCollector class
· Update the XAML and code behind for the recognizer page
· Remove security directives from the client configuration
Install and Update Visual Studio 2008 to Add Support for Silverlight
Before you begin, you must perform the following steps on your Windows Server 2008 R2 server.
· Install Visual Studio 2008
· Install Service Pack 1 for Visual Studio 2008. This update is available from here.
· Install Silverlight tools for Visual Studio. This is available from here.
Once you have installed these applications and updates, you are ready to create your server side recognition Web application.
Create a new Silverlight Web Project in Visual Studio 2008
From the file menu, select New Project. Select the “Silverlight Application” template from the Visual C# project list. Name your project InkRecognition and click OK. The following image shows the C# Silverlight project selected and named InkRecognition.

After you click OK, a dialog box will pop up prompting you to add a Silverlight application to your project. Select “Add a new ASP.NET Web project” to the solution to host Silverlight and click OK. The following image shows how the example project is set up before clicking OK.

Add the Necessary References to your Project
Now you have your generic Silverlight client project (InkRecognition) with a Web project (InkRecognition.Web) set up in your solution. The project will open with Page.xaml and Default.aspx open. Close these windows and add the System.Runtime.Serialization and System.ServiceModel references to the InkRecognition project by right clicking on the references folder in the InkRecognition project and selecting “Add Reference”. The following image shows the dialog with the requisite references selected.

Next, you need to add the System.ServiceModel and Microsoft.Ink references to the InkRecognition.Web project. The Microsoft.Ink reference will not appear in the .Net references by default, so search your Windows folder for Microsoft.Ink.dll. Once you have located the DLL, add the assembly to the project references by selecting the browse tab, changing to the folder containing Microsoft.Ink.dll, selecting Microsoft.Ink.dll, and clicking OK. The following image shows the project’s solution explorer view with all of the reference assemblies added.

Create a Silverlight WCF Service for Ink Recognition
Next, you will add a WCF service for Ink Recognition to the project. Right click on your InkRecognition.Web project and select Add -> New Item. Select the WCF Silverlight Service template, change the name to InkRecogitionService, and click Add. The following image shows the “Add New Item” dialog with the Silverlight WCF service selected and named.

After you add the WCF Silverlight service, the service code behind, InkRecognitionService.cs, will open. Replace the service code with the following code.
using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Collections.Generic;
using System.Text;
using Microsoft.Ink;
namespace InkRecognition.Web
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class InkRecognitionService
{
[OperationContract]
public string[] Recognize(int[][] packets)
{
// deserialize ink
Ink ink = new Ink();
Tablet tablet = new Tablets().DefaultTablet;
TabletPropertyDescriptionCollection desc = new TabletPropertyDescriptionCollection();
desc.Add(new TabletPropertyDescription(PacketProperty.X, tablet.GetPropertyMetrics(PacketProperty.X)));
desc.Add(new TabletPropertyDescription(PacketProperty.Y, tablet.GetPropertyMetrics(PacketProperty.Y)));
int numOfStrokes = packets.GetUpperBound(0) + 1;
for (int i = 0; i < numOfStrokes; i++)
{
ink.CreateStroke(packets[i], desc);
}
// recognize ink
RecognitionStatus recoStatus;
RecognizerContext recoContext = new RecognizerContext();
recoContext.RecognitionFlags = RecognitionModes.LineMode | RecognitionModes.TopInkBreaksOnly;
recoContext.Strokes = ink.Strokes;
RecognitionResult recoResult = recoContext.Recognize(out recoStatus);
RecognitionAlternates alternates = recoResult.GetAlternatesFromSelection();
string[] results = new string[alternates.Count];
for (int i = 0; i < alternates.Count; i++)
{
results[i] = alternates[i].ToString();
}
// send results to client
return results;
}
}
}
Add the Service Reference to your Client Project
Now that you have your Silverlight WCF service for InkRecognition, you will consume the service from your client application. Right click on the InkRecognition project, select “Add Service Reference”; the Add Service Reference dialog will open. Select “Discover” to discover services from the current solution. The InkRecognitionService will appear in the Services pane. Double-click InkRecognitionService from the services pane, change the namespace to InkRecognitionServiceReference, and then click OK. The following image shows the Add Service Reference dialog with the InkRecognitionService selected and the namespace changed.

Add the InkCollector Class to the InkRecognition Project
Right-click on the InkRecognition project and select Add -> New Item. Select C# class from the Visual C# menu. Name the class InkCollector. The following image shows the dialog with the C# class selected and named.

After you add the InkCollector class, the class definition will open. Replace the code in the Ink Collector with the following:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace InkRecognition
{
public class InkCollector : IDisposable
{
public InkCollector(InkPresenter presenter)
{
_presenter = presenter;
_presenter.Cursor = Cursors.Stylus;
_presenter.MouseLeftButtonDown += new MouseButtonEventHandler(_presenter_MouseLeftButtonDown);
_presenter.MouseMove += new MouseEventHandler(_presenter_MouseMove);
_presenter.MouseLeftButtonUp += new MouseButtonEventHandler(_presenter_MouseLeftButtonUp);
}
void _presenter_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_presenter.CaptureMouse();
if (!e.StylusDevice.Inverted)
{
_presenter.Cursor = Cursors.Stylus;
_stroke = new Stroke(e.StylusDevice.GetStylusPoints(_presenter));
_stroke.DrawingAttributes = _drawingAttributes;
_presenter.Strokes.Add(_stroke);
}
else
{
_presenter.Cursor = Cursors.Eraser;
_erasePoints = e.StylusDevice.GetStylusPoints(_presenter);
}
}
void _presenter_MouseMove(object sender, MouseEventArgs e)
{
if (!e.StylusDevice.Inverted)
{
_presenter.Cursor = Cursors.Stylus;
}
else
{
_presenter.Cursor = Cursors.Eraser;
}
if (_stroke != null)
{
_stroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(_presenter));
}
else if (_erasePoints != null)
{
_erasePoints.Add(e.StylusDevice.GetStylusPoints(_presenter));
StrokeCollection hitStrokes = _presenter.Strokes.HitTest(_erasePoints);
if (hitStrokes.Count > 0)
{
foreach (Stroke hitStroke in hitStrokes)
{
_presenter.Strokes.Remove(hitStroke);
}
}
}
}
void _presenter_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
_presenter.ReleaseMouseCapture();
if (_stroke != null)
{
_stroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(_presenter));
}
_stroke = null;
_erasePoints = null;
}
public DrawingAttributes DefaultDrawingAttributes
{
get { return _drawingAttributes; }
set { _drawingAttributes = value; }
}
public void Dispose()
{
_presenter.MouseLeftButtonDown -= new MouseButtonEventHandler(_presenter_MouseLeftButtonDown);
_presenter.MouseMove -= new MouseEventHandler(_presenter_MouseMove);
_presenter.MouseLeftButtonUp -= new MouseButtonEventHandler(_presenter_MouseLeftButtonUp);
_presenter = null;
}
private InkPresenter _presenter = null;
private Stroke _stroke = null;
private StylusPointCollection _erasePoints = null;
private DrawingAttributes _drawingAttributes = new DrawingAttributes();
}
}
Update the XAML for the Default Page and Add a Code Behind for Handwriting Recognition
Now that you have a class that collects ink, you will need to update the XAML in page.xaml with the following XAML. The following code adds a yellow gradient to the input area, an InkCanvas control, and a button that will trigger recognition.
<UserControl x:Class="InkRecognition.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border Margin="5" Grid.Row="0" BorderThickness="4" BorderBrush="Black" CornerRadius="5" Height="200">
<Grid>
<InkPresenter x:Name="inkCanvas">
<InkPresenter.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="Yellow"/>
<GradientStop Offset="1" Color="LightYellow"/>
</LinearGradientBrush>
</InkPresenter.Background>
</InkPresenter>
<Button Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="10" Content="Recognize" Click="RecoButton_Click"/>
</Grid>
</Border>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" FontSize="28" Text="Result: "/>
<ComboBox x:Name="results" Grid.Column="1" FontSize="28"/>
</Grid>
</Grid>
</UserControl>
Replace the code behind page, Page.xaml.cs, with the following code that will add an event handler for the Recognize button.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using InkRecognition.InkRecognitionServiceReference;
namespace InkRecognition
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
inkCol = new InkCollector(inkCanvas);
recoClient = new InkRecognitionServiceClient();
recoClient.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(recoClient_RecognizeCompleted);
}
private void RecoButton_Click(object sender, RoutedEventArgs e)
{
// serialize the ink into an array on int's
ObservableCollection<ObservableCollection<int>> packets = new ObservableCollection<ObservableCollection<int>>();
double pixelToHimetricMultiplier = 2540d / 96d;
foreach (Stroke stroke in inkCanvas.Strokes)
{
packets.Add(new ObservableCollection<int>());
int index = inkCanvas.Strokes.IndexOf(stroke);
for (int i = 0; i < stroke.StylusPoints.Count; i += 2)
{
packets[index].Add(Convert.ToInt32(stroke.StylusPoints[i].X * pixelToHimetricMultiplier));
packets[index].Add(Convert.ToInt32(stroke.StylusPoints[i].Y * pixelToHimetricMultiplier));
}
}
// call the web service
recoClient.RecognizeAsync(packets);
}
void recoClient_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
{
// we have received results from the server, now display them
results.ItemsSource = e.Result;
UpdateLayout();
results.SelectedIndex = 0;
inkCanvas.Strokes.Clear();
}
private InkRecognitionServiceClient recoClient = null;
private InkCollector inkCol = null;
}
}
Remove Secure Transport Directives from the Client Configuration
Before you will be able to consume the WCF service, you must remove all secure transport options from the service configuration because secure transports are not currently supported in Silverlight 2.0 WCF services. From the InkRecognition project, update the security settings in ServiceReferences.ClientConfig. Change the security XML from
<security mode=“None“>
<transport>
<extendedProtectionPolicy policyEnforcement=“WhenSupported“ />
</transport>
</security>
to
<security mode=“None“/>
Now, your application should run. The following image shows how the application looks within a webpage with some handwriting entered into the recognition box.

The following image shows the recognized text in the dropdown box.

Windows 7 HD / SSD performance comparison
Hothardware.com has an article that looks at the I/O improvements that are incorporated into Windows 7 and they found Windows 7 is a sometimes 20-30% faster than Vista. Perhaps this is why 7 feels so snappy? From the article:
Windows 7 does a lot to un-do the damage that Microsoft did with Windows Vista. Windows 7 feels lightweight, fresh, and far more intuitive. Sure, lots of the new user interface elements are pulled from the Mac OSX design guidebook, but they are implemented well in the Windows environment, and the whole thing feels polished. Even in a release candidate (i.e, non-final) state, the OS is quick, solid, and feels production ready. For the first time in years, we are anxiously awaiting an operating system release from Microsoft.
Zune HD
Zomg! It’s not April, right?
http://gizmodo.com/5270945/zune-hd-is-real-has-multitouch-web-browsing-oled-screen-and-hd-video
Vista SP2 is out!
Check out the notable features, and then download it here or via Windows Update.
The big changes are:
- App Compat improvements
- Some updates to search, media center, and security
Pirated Windows 7 RC copies forming a Botnet
I just read about this here.
So it looks like the “leaked” copies of Win7 had a trojan in them and are now forming a botnet that is doing God knows what. One more reason to use the legit copies from MSDN. I have the proper download links posted in my last entry. Get RC while you can so that you don’t resort to torrents! </sarcasm>
Windows 7 RC!
We are finally out of the RC phase and have begun working on the RTM version of Windows 7! This is a very exciting milestone to have reached, I remember when we got here for Vista. I actually remember the Vista RC being made out as a bigger deal than RTM was… Anyways, you can grab the Windows 7 RC from:
http://www.microsoft.com/windows/windows-7/download.aspx
This build will be valid through 2010, so you will have plenty of time to get a feel for 7.
Along with the RC build of Windows 7, you can also grab the Windows 7 RC SDK from here:
http://www.microsoft.com/downloads/details.aspx?FamilyID=6db1f17f-5f1e-4e54-a331-c32285cdde0c&displaylang=en
I’m really excited about the changes in Windows Touch that we are releasing with RC. The first major change I can think of is the reduction of the number of Windows Touch system messages from 3 to 1. This is very convenient because it simplifies WndProc functions. Consider the following examples to get a feel for the contrast. The following code example the first sample is from the older SDK.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message){
case WM_TOUCHDOWN:
/* insert handler code here to do something with the message */
break;
case WM_TOUCHMOVE:
/* insert handler code here to do something with the message */
break;
case WM_TOUCHUP:
/* insert handler code here to do something with the message */
break;
}
}
Now, contrast that with the new message.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message){
case WM_TOUCH:
/* insert handler code here to do something with the message */
return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
break;
}
}
You now need to write less repetitive code which means fewer places where bugs can show up and ultimately means fewer bugs.
I have been working on tightening the documentation up a bit as well. There are some more compelling examples such as the Multiple Touch Points example, Ian Mendiola’s Manipulation and Inertia sample, and the Single Finger Panning Experience update. The documentation has tons of information for fast tracking new developers to Windows Touch programming. The FAQ / Troubleshooting section should help with many of the developer gotchas. The section Choosing the Right Approach to Windows Touch should be a great place for adopters to get started. I feel the documentation and the SDK has come a long ways since the Beta. I can only dream that we can deliver as much for RTM!
Tablet Features Light up Windows 7
It looks like Gizmodo picked up the E7 blog post about Tablet in Windwos 7 and how it will appeal to students. As the SDK documentation writer for the Tablet features on Windows 7, I have been playing with these features for the better part of a year and I think that students are going to fall in love with Tablets. From my perspective, the most important feature has to be the Math Input Control followed closely by Windows Touch. Students will no longer need to use tedious equation editors and will also be able to zoom and pan on documents.
Detecting and Tracking Multiple Touch Points
The following steps explain how to track multiple touch points using Windows Touch.

- Create an application and enable Windows Touch.
- Add handler for WM_TOUCH and track points.
- Draw the points.
Once you have your application running, it will render circles under each touch. The following illustration shows how your application might look while running.
Create an Application and Enable Windows Touch
Start with a Win32 application using the Microsoft Visual Studio wizard. After you have completed the wizard, add support for Windows Touch messages by setting the Windows Version in targetver.h and including winuser.h and windowsx.h in your application. The following code shows how to set the Windows version in targetver.h.
#ifndef WINVER // Specifies that the minimum required platform is Windows 7.
#define WINVER 0x0601 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows 7.
#define _WIN32_WINNT 0x0601 // Change this to the appropriate value to target other versions of Windows.
#endif
The following code shows how your include directives should be added. Also, you can create some global variables that will be used later.
#include <winuser.h> // included for Windows Touch
#include <windowsx.h> // included for point conversion
#define MAXPOINTS 10
// You will use this array to track touch points
int points[MAXPOINTS][2];
// You can make the touch points larger
// by changing this radius value
static int radius = 50;
// There should be at least as many colors
// as there can be touch points so that you
// can have different colors for each point
COLORREF colors[] = { RGB(153,255,51),
RGB(153,0,0),
RGB(0,153,0),
RGB(255,255,0),
RGB(255,51,204),
RGB(0,0,0),
RGB(0,153,0),
RGB(153, 255, 255),
RGB(153,153,255),
RGB(0,51,153)
};
Add Handler for WM_TOUCH and Track Points
First, declare some variables that are used by the WM_TOUCH handler in WndProc.
int wmId, wmEvent, i, x, y;
UINT cInputs;
PTOUCHINPUT pInputs;
POINT ptInput;
Now, initialize the variables used for storing touch points and register the window for touch input from the InitInstnace method.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
(...)
// register the window for touch instead of gestures
RegisterTouchWindow(hWnd, 0);
// the following code initializes the points
for (int i=0; i< MAXPOINTS; i++){
points[i][0] = -1;
points[i][1] = -1;
}
(...)
}
Next, handle the WM_TOUCH message from the WndProc method. The following code shows an implementation of the handler for WM_TOUCH.
case WM_TOUCH:
cInputs = LOWORD(wParam);
pInputs = new TOUCHINPUT[cInputs];
if (pInputs){
if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
for (int i=0; i < static_cast<INT>(cInputs); i++){
TOUCHINPUT ti = pInputs[i];
if (ti.dwID != 0 && ti.dwID < MAXPOINTS){
// do something with your touch input handle
ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x);
ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y);
ScreenToClient(hWnd, &ptInput);
points[ti.dwID][0] = ptInput.x;
points[ti.dwID][1] = ptInput.y;
}
}
}
// if you handled the message and don't want anything else done with it, you can close it
CloseTouchInputHandle((HTOUCHINPUT)lParam);
delete [] pInputs;
}else{
/* handle the error here */
}
InvalidateRect(hWnd, NULL, false);
break;
Now when a user touches the screen, the positions that they are touching will be stored in the points array. The dwID member of the TOUCHINPUT structure stores an identifier that starts at 1 and goes up to the maximum number of supported touch points for your hardware.
Draw the Points
Declare the following variables for the drawing routine.
// for double buffering
static HDC memDC = 0;
static HBITMAP hMemBmp = 0;
HBITMAP hOldBmp = 0;
// for drawing / fills
PAINTSTRUCT ps;
HDC hdc;
The memory display context memDC is used for storing a temporary graphics context which is swapped with the rendered display context, hdc to eliminate flickering. Implement the drawing routine which will just take the points you have stored and draws a circle at the points. The following code shows how you could implement the WM_PAINT handler.
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
RECT client;
GetClientRect(hWnd, &client);
// start double buffering
if (!memDC){
memDC = CreateCompatibleDC(hdc);
}
hMemBmp = CreateCompatibleBitmap(hdc, client.right, client.bottom);
hOldBmp = (HBITMAP)SelectObject(memDC, hMemBmp);
FillRect(memDC, &client, CreateSolidBrush(RGB(255,255,255)));
//Draw Touched Points
for (i=0; i < MAXPOINTS; i++){
SelectObject( memDC, CreateSolidBrush( colors[i] ) );
x = points[i][0];
y = points[i][1];
if (x >0 && y>0){
Ellipse(memDC, x - radius, y - radius, x+ radius, y + radius);
}
}
BitBlt(hdc, 0,0, client.right, client.bottom, memDC, 0,0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
When you run your application, it now should look something like the illustration at the beginning of this section. For fun, you can draw some extra lines around the touch points. The following image shows how the application could look with a few extra lines drawn around the circles.

Yes, I’m still alive!
I have just been busy working on the current milestone for Windows 7. I just recently saw this very cool compilation of Bill Gates parody vidoes that is worth checking out if you have any interest in Microsoft’s culture.