<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" media="screen" href="/styles/xslt/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:c9="http://channel9.msdn.com">
<channel>
	<title>Comment Feed for Channel 9 - Winter Visualization for Windows Media Player in C++</title>
	<atom:link rel="self" type="application/rss+xml" href="http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C/RSS"></atom:link>
	<image>
		<url>http://ecn.channel9.msdn.com/o9/c4f/images/6821379_100.jpg</url>
		<title>Channel 9 - Winter Visualization for Windows Media Player in C++</title>
		<link></link>
	</image>
	<description>
 Ever wondered what&#39;s behind a visualization? This is your opportunity to learn something
 new because there are only a couple of Windows Media Player Visualizations that deliver source code. You&#39;ll learn to build a new visualization with Visual C&amp;#43;&amp;#43; 2005 Express (you won&#39;t even require a Standard Edition)! Winter is here... Snow is here... we&#39;ll
 render 
Koch Snowflake Fractals that depend on the waveform of the playing song with the Windows Graphics Device Interface. This article will also change the way you ever looked at a visualization. Enjoy! 
Paul-Valentin Borza - http://www.borza.ro  

Difficulty: Intermediate
Cost: Free
Time required: 1-3 hours
Software: 
Visual C&amp;#43;&amp;#43; 2005 Express, 
Windows Server 2003 R2 Platform SDK, 
Windows Software Development Kit for Windows Vista
Hardware: None
Download Source: Winter Visualization Source Code
 

How do we build a visualization?
Please install (don&#39;t change the default installation directory): 

Visual C&amp;#43;&amp;#43; 2005 Express
Windows Server 2003 R2 Platform SDK (contains MFC and ATL headers and libraries)
Windows Software Development Kit for Windows Vista (contains Windows Media Player 11 SDK)

We need to make Visual C&amp;#43;&amp;#43; 2005 Express work with visualizations: 

Navigate to &#39;C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\Multimedia\WMP_11\Wizards\VSNET&#39;;
Copy &#39;wmpwiz2005.vsz&#39;, &#39;wmpwiz.vsdir&#39; and &#39;wmpwiz.ico&#39;;
Navigate to &#39;C:\Program Files\Microsoft Visual Studio 8\VC\Express\VCProjects&#39;;
Paste &#39;wmpwiz2005.vsz&#39;, &#39;wmpwiz.vsdir&#39; and &#39;wmpwiz.ico&#39;;
Rename &#39;wmpwiz2005.vsz&#39; to &#39;wmpwiz.vsz&#39; (you&#39;re in &#39;C:\Program Files\Microsoft Visual Studio 8\VC\Express\VCProjects&#39;);
Edit &#39;wmpwiz.vsz&#39; using Notepad and change the line &#39;Param=&amp;quot;ABSOLUTE_PATH = &amp;lt;path to wmpwiz directory goes here&amp;gt;&amp;quot;&#39; with &#39;Param=&amp;quot;ABSOLUTE_PATH = C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\Multimedia\WMP_11\Wizards\VSNET&amp;quot;&#39;;
The Windows Media Player Plug-in Wizard is now installed. Launch 
Visual C&amp;#43;&amp;#43; 2005 Express.

Click on &#39;File&#39; &amp;gt; &#39;New&#39; &amp;gt; &#39;Project...&#39;; In &#39;Project types:&#39; select &#39;Visual C&amp;#43;&amp;#43;&#39;; In &#39;Templates:&#39; select &#39;Windows Media Player Plug-in Wizard&#39;;
Change &#39;Name:&#39; from &#39;wmpplugin1&#39; to &#39;MyWinterVisualization&#39; and click &#39;OK&#39;;
The Windows Media Player Plug-in Wizard appears; On the &#39;Welcome to the Windows Media Player Plug-in Wizard&#39; select &#39;Visualization&#39; and click &#39;Next&#39;;
On the &#39;Visualization Plug-in&#39; change &#39;Friendly Name:&#39; from &#39;MyWinterVisualization Plugin&#39; to &#39;Coding4Fun Winter Visualization&#39; and &#39;Description:&#39; from &#39;Description of MyWinterVisualization plugin&#39; to
 &#39;Description of Coding4Fun Winter Visualization&#39;; don&#39;t check &#39;Property Page&#39; or &#39;Listen to events&#39;;
Click &#39;Next&#39;. The wizard will create a new visualization for you; you&#39;re almost done!


You&#39;ll notice that the created project won&#39;t compile because the &#39;atlbase.h&#39;, &#39;wmpplug.h&#39;, &#39;effects.h&#39; and &#39;winres.h&#39; can&#39;t be opened; to overcome: 

Click on &#39;Project&#39; &amp;gt; &#39;Properties&#39;; Expand &#39;Configuration Properties&#39; &amp;gt; &#39;C/C&amp;#43;&amp;#43;&#39; &amp;gt; &#39;General&#39;;
In &#39;Additional Include Directories&#39; add &#39;&amp;quot;C:\Program Files\Microsoft SDKs\Windows\v6.0\Include&amp;quot;&#39; and click &#39;OK&#39;;
Expand &#39;Configuration Properties&#39; &amp;gt; &#39;Linker&#39; &amp;gt; &#39;Input&#39;;
In &#39;Additional Dependencies&#39; add &#39;msimg32.lib&#39; (we&#39;ll need this to give smoothness to the visualization);
Click on &#39;Tools&#39; &amp;gt; &#39;Options...&#39;; Expand &#39;Projects and Solutions&#39; &amp;gt; &#39;VC&amp;#43;&amp;#43; Directories&#39;; In &#39;Platform:&#39; select &#39;Win32&#39; and in &#39;Show directories for:&#39; select &#39;Include files&#39;;
Add &#39;&amp;quot;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\atl&amp;quot;&#39; and &#39;&amp;quot;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\mfc&amp;quot;&#39;;

One last trick... Edit &#39;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\atl\atlbase.h&#39; using
Notepad. Find the following text (begins on line 287):  

&amp;nbsp; 287 PVOID __stdcall __AllocStdCallThunk(VOID); 
&amp;nbsp; 288 VOID&amp;nbsp; __stdcall __FreeStdCallThunk(PVOID); 
&amp;nbsp; 289&amp;nbsp; 
&amp;nbsp; 290&amp;nbsp;#define AllocStdCallThunk() __AllocStdCallThunk() 
&amp;nbsp; 291&amp;nbsp;#define FreeStdCallThunk(p) __FreeStdCallThunk(p) 
&amp;nbsp; 292&amp;nbsp; 
&amp;nbsp; 293&amp;nbsp;#pragma comment(lib,
&amp;quot;atlthunk.lib&amp;quot;) 

Comment line 287 to 293 and add &#39;AllocStdCallThunk&#39; and &#39;FreeStdCallThunk&#39; to look like: 

&amp;nbsp; 287&amp;nbsp;/* 
&amp;nbsp; 288&amp;nbsp;PVOID __stdcall __AllocStdCallThunk(VOID); 
&amp;nbsp; 289&amp;nbsp;VOID&amp;nbsp; __stdcall __FreeStdCallThunk(PVOID); 
&amp;nbsp; 290&amp;nbsp; 
&amp;nbsp; 291&amp;nbsp;#define AllocStdCallThunk() __AllocStdCallThunk() 
&amp;nbsp; 292&amp;nbsp;#define FreeStdCallThunk(p) __FreeStdCallThunk(p) 
&amp;nbsp; 293&amp;nbsp; 
&amp;nbsp; 294&amp;nbsp;#pragma comment(lib, &amp;quot;atlthunk.lib&amp;quot;) 
&amp;nbsp; 295&amp;nbsp;*/ 
&amp;nbsp; 296&amp;nbsp; 
&amp;nbsp; 297&amp;nbsp;#define AllocStdCallThunk() HeapAlloc(GetProcessHeap(), 0,
sizeof(_stdcallthunk)) 
&amp;nbsp; 298&amp;nbsp;#define FreeStdCallThunk(p) HeapFree(GetProcessHeap(), 0, p) 

You should now be able to compile a visualization. Compile your visualization and launch
Windows Media Player. 

Play a song; you can try My Fair Lady by David Byrne over 
ccMixter (this is the melody from the video preview); Click on &#39;Now Playing&#39;; Right-click inside Windows Media Player and click &#39;Coding4Fun Winter Visualization&#39; &amp;gt; &#39;Coding4Fun Winter Visualization Bars&#39; or &#39;Coding4Fun Winter Visualization Wave&#39;;
Please take a good look at the generated visualization. Do you see the flicker (the flashing effect that you wouldn&#39;t want to see)? Don&#39;t worry, we&#39;ll make the visualization flicker-free in a few minutes.

How do we debug a visualization?
We know how to build and try a visualization; however, how do we debug one? Simple - we attach to the &#39;wmplayer.exe&#39; process. 

Click on &#39;Project&#39; &amp;gt; &#39;Properties&#39;; Expand &#39;Configuration Properties&#39; &amp;gt; &#39;Debugging&#39;; In &#39;Command&#39; enter &#39;C:\Program Files\Windows Media Player\wmplayer.exe&#39;;
Change &#39;Attach&#39; from &#39;No&#39; to &#39;Yes&#39;; Click &#39;OK&#39;; Open &#39;MyWinterVisualization.cpp&#39; and locate &#39;CMyWinterVisualization::Render&#39;;
Add a breakpoint at line &#39;60&#39; in &#39;MyWinterVisualization.cpp&#39;;
Build Solution and launch Windows Media Player; Start Debugging and select your visualization in Windows Media Player; the visualization should break in
Visual Studio. 
The Winter Visualization
From now on, we&#39;ll take a look at the source code for the Winter Visualization. A visualization can have one or more
presets (Bars and Wave for example). I&#39;ve decided to go with two presents for the Winter Visualization and named them:
Snow Flakes (draws blue snowflakes) and Snow Flames (draws red snowflakes). 
Configuration
Open &#39;WinterVisualization.h&#39; and check the configuration values: 

&amp;nbsp;&amp;nbsp; 18&amp;nbsp;#define EQ_ANGLE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1.0471975511965977461542144610932f&amp;nbsp;&amp;nbsp;&amp;nbsp;
// - PI / 3 
&amp;nbsp;&amp;nbsp; 19&amp;nbsp;#define SNOW_MIN_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 23&amp;nbsp;&amp;nbsp;&amp;nbsp; // in pixels 
&amp;nbsp;&amp;nbsp; 20&amp;nbsp;#define SNOW_MAX_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 337&amp;nbsp;&amp;nbsp;&amp;nbsp; 
// in pixels 
&amp;nbsp;&amp;nbsp; 21&amp;nbsp;#define SNOW_STEP_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp; // in pixels 
&amp;nbsp;&amp;nbsp; 22&amp;nbsp;#define SNOW_COUNT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13&amp;nbsp;&amp;nbsp;&amp;nbsp; 
// number of snowflakes 
&amp;nbsp;&amp;nbsp; 23&amp;nbsp;#define SNOW_FLAKE_COLOR_COUNT&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of blue colors 
&amp;nbsp;&amp;nbsp; 24&amp;nbsp;#define SNOW_FLAME_COLOR_COUNT&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of red colors 
&amp;nbsp;&amp;nbsp; 25&amp;nbsp;#define SNOW_ALPHA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 237&amp;nbsp;&amp;nbsp;&amp;nbsp; 
// alpha value 
&amp;nbsp;&amp;nbsp; 26&amp;nbsp;#define KOCH_IT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp; 
// number of iterations for Koch 

Don&#39;t modify EQ_ANGLE as it&#39;s needed to make equilateral triangles for the Koch Snowflake Fractal. If you change
SNOW_FLAKE_COLOR_COUNT or SNOW_FLAME_COLOR_COUNT, modify the appropriate lines in
CWinterVisualization::FinalConstruct. The visualization involves a lot of computations and changing any configuration value could potentially slow it down. However, you&#39;re more than welcome to try anything... For example, increasing
KOCH_IT to 6 will make the visualization run slower, but the snowflakes will have a more defined border. Try playing with
SNOW_ALPHA (value should be between 0 and 255). 
Initialization
Open &#39;WinterVisualization.cpp&#39;: 

&amp;nbsp;&amp;nbsp; 37 HRESULT CWinterVisualization::FinalConstruct() 
&amp;nbsp;&amp;nbsp; 38 { 
&amp;nbsp;&amp;nbsp; 39&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tsPrev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // previous time stamp 
&amp;nbsp;&amp;nbsp; 40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rcPrev.left&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // previous drawing surface 
&amp;nbsp;&amp;nbsp; 41&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rcPrev.top&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // previous drawing surface 
&amp;nbsp;&amp;nbsp; 42&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rcPrev.right&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // previous drawing surface 
&amp;nbsp;&amp;nbsp; 43&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rcPrev.bottom&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // previous drawing surface 
&amp;nbsp;&amp;nbsp; 44&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 45&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcPrev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // previous handler to device context 
&amp;nbsp;&amp;nbsp; 46&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hNewBitmapPrev&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // previous drawing bitmap 
&amp;nbsp;&amp;nbsp; 47&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 48&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcMem&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // memory handler to device context 
&amp;nbsp;&amp;nbsp; 49&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hNewBitmapMem&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; // memory drawing bitmap 
&amp;nbsp;&amp;nbsp; 50&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 51&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Create Elapsed Font */ 
&amp;nbsp;&amp;nbsp; 52&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOGFONT lfElapsed; 
&amp;nbsp;&amp;nbsp; 53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfHeight&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 23; 
&amp;nbsp;&amp;nbsp; 54&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfWidth&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp;&amp;nbsp; 55&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfEscapement&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp;&amp;nbsp; 56&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfOrientation&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp;&amp;nbsp; 57&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfWeight&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FW_BOLD; 
&amp;nbsp;&amp;nbsp; 58&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfItalic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE; 
&amp;nbsp;&amp;nbsp; 59&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfUnderline&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE; 
&amp;nbsp;&amp;nbsp; 60&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfStrikeOut&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE; 
&amp;nbsp;&amp;nbsp; 61&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfCharSet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = DEFAULT_CHARSET; 
&amp;nbsp;&amp;nbsp; 62&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfOutPrecision&amp;nbsp;&amp;nbsp;&amp;nbsp; = OUT_DEFAULT_PRECIS; 
&amp;nbsp;&amp;nbsp; 63&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfClipPrecision&amp;nbsp;&amp;nbsp;&amp;nbsp; = CLIP_DEFAULT_PRECIS; 
&amp;nbsp;&amp;nbsp; 64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfQuality&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ANTIALIASED_QUALITY; 
&amp;nbsp;&amp;nbsp; 65&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfElapsed.lfPitchAndFamily&amp;nbsp;&amp;nbsp;&amp;nbsp; = FF_MODERN; 
&amp;nbsp;&amp;nbsp; 66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tcscpy_s(lfElapsed.lfFaceName, TEXT(&amp;quot;\0&amp;quot;)); 
&amp;nbsp;&amp;nbsp; 67&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hfElapsed = CreateFontIndirect(&amp;amp;lfElapsed); 
&amp;nbsp;&amp;nbsp; 68&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 69&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Create Plus Font */ 
&amp;nbsp;&amp;nbsp; 70&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOGFONT lfPlus; 
&amp;nbsp;&amp;nbsp; 71&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfHeight&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 9; 
&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfWidth&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp;&amp;nbsp; 73&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfEscapement&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp;&amp;nbsp; 74&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfOrientation&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp;&amp;nbsp; 75&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfWeight&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FW_BOLD; 
&amp;nbsp;&amp;nbsp; 76&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfItalic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE; 
&amp;nbsp;&amp;nbsp; 77&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfUnderline&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE; 
&amp;nbsp;&amp;nbsp; 78&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfStrikeOut&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = FALSE; 
&amp;nbsp;&amp;nbsp; 79&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfCharSet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = DEFAULT_CHARSET; 
&amp;nbsp;&amp;nbsp; 80&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfOutPrecision&amp;nbsp;&amp;nbsp;&amp;nbsp; = OUT_DEFAULT_PRECIS; 
&amp;nbsp;&amp;nbsp; 81&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfClipPrecision&amp;nbsp;&amp;nbsp;&amp;nbsp; = CLIP_DEFAULT_PRECIS; 
&amp;nbsp;&amp;nbsp; 82&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfQuality&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ANTIALIASED_QUALITY; 
&amp;nbsp;&amp;nbsp; 83&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lfPlus.lfPitchAndFamily&amp;nbsp;&amp;nbsp;&amp;nbsp; = FF_MODERN; 
&amp;nbsp;&amp;nbsp; 84&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tcscpy_s(lfPlus.lfFaceName, TEXT(&amp;quot;\0&amp;quot;)); 
&amp;nbsp;&amp;nbsp; 85&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hfPlus = CreateFontIndirect(&amp;amp;lfPlus); 
&amp;nbsp;&amp;nbsp; 86&amp;nbsp; 
&amp;nbsp;&amp;nbsp; 87&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Flake Colors */ 
&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[0] = CreatePen(PS_SOLID, 1, RGB(99, 184, 255));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #63B8FF 
&amp;nbsp;&amp;nbsp; 89&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[1] = CreatePen(PS_SOLID, 1, RGB(92, 172, 238));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #5CACEE 
&amp;nbsp;&amp;nbsp; 90&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[2] = CreatePen(PS_SOLID, 1, RGB(30, 144, 255));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #1E90FF 
&amp;nbsp;&amp;nbsp; 91&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[3] = CreatePen(PS_SOLID, 1, RGB(28, 134, 238));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #1C86EE 
&amp;nbsp;&amp;nbsp; 92&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[4] = CreatePen(PS_SOLID, 1, RGB(16, 78, 139));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #104E8B 
&amp;nbsp;&amp;nbsp; 93&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Flame Colors */ 
&amp;nbsp;&amp;nbsp; 94&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[5] = CreatePen(PS_SOLID, 1, RGB(220, 20, 60));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #DC143C 
&amp;nbsp;&amp;nbsp; 95&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[6] = CreatePen(PS_SOLID, 1, RGB(255, 48, 48));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #FF3030 
&amp;nbsp;&amp;nbsp; 96&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[7] = CreatePen(PS_SOLID, 1, RGB(238, 44, 44));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #EE2C2C 
&amp;nbsp;&amp;nbsp; 97&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[8] = CreatePen(PS_SOLID, 1, RGB(205, 38, 38));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #CD2626 
&amp;nbsp;&amp;nbsp; 98&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hpSnowColor[9] = CreatePen(PS_SOLID, 1, RGB(139, 26, 26));&amp;nbsp;&amp;nbsp;&amp;nbsp;
// #8B1A1A 
&amp;nbsp;&amp;nbsp; 99&amp;nbsp; 
&amp;nbsp; 100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hBrushBack = CreateSolidBrush(RGB(0, 0, 0)); 
&amp;nbsp; 101&amp;nbsp; 
&amp;nbsp; 102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iKochCount = (SNOW_MAX_SIZE - SNOW_MIN_SIZE) / SNOW_STEP_SIZE; 
&amp;nbsp; 103&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateSnow(); // populate pKoch 
&amp;nbsp; 104&amp;nbsp; 
&amp;nbsp; 105&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Make snowflakes re-initialize in DrawSnow 
&amp;nbsp; 106&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (INT i = 0; i &amp;lt; SNOW_COUNT; &amp;#43;&amp;#43;i) 
&amp;nbsp; 107&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iSnowSize[i] = iKochCount - 1; 
&amp;nbsp; 108&amp;nbsp; 
&amp;nbsp; 109&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK; 
&amp;nbsp; 110 } 

The surface size, the device contexts, the fonts, the pens and the brushes are initialized (the variables are declared in &#39;WinterVisualization.h&#39;). Notice that I&#39;m also precomputing the Koch Snowflake Fractal because it doesn&#39;t make sense to compute
 it each time a snowflake is drawn; see CWinterVisualization::CreateSnow for more details.
Don&#39;t forget that we&#39;re in the native C&amp;#43;&amp;#43; world and we have to release memory! The article won&#39;t cover the memory deallocation, but you can find it inside
CWinterVisualization::FinalRelease. 
Rendering the Elapsed Time
CWinterVisualization::DrawText renders the elapsed time in the top-right corner; use this method when you want to see how frequent your
CWinterVisualization::Render gets called by Windows Media Player. 

&amp;nbsp; 414&amp;nbsp;void CWinterVisualization::DrawText(TimedLevel * pLevels, HDC hdcMem, RECT rcMem) 
&amp;nbsp; 415 { 
&amp;nbsp; 416&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // don&#39;t display elapsed text when screen is too small 
&amp;nbsp; 417&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rcMem.bottom &amp;lt; 240) 
&amp;nbsp; 418&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; 
&amp;nbsp; 419&amp;nbsp; 
&amp;nbsp; 420&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HFONT hfOld = static_cast&amp;lt;HFONT&amp;gt;(SelectObject(hdcMem, hfElapsed)); 
&amp;nbsp; 421&amp;nbsp; 
&amp;nbsp; 422&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetBkMode(hdcMem, TRANSPARENT); 
&amp;nbsp; 423&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetTextAlign(hdcMem, TA_RIGHT | TA_TOP); 
&amp;nbsp; 424&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetTextColor(hdcMem, RGB(255, 255, 255)); 
&amp;nbsp; 425&amp;nbsp; 
&amp;nbsp; 426&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Convert time stamp to string */ 
&amp;nbsp; 427&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR tcElapsed[32]; 
&amp;nbsp; 428&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_i64tot_s(pLevels-&amp;gt;timeStamp, tcElapsed, _countof(tcElapsed), 10) == 0) 
&amp;nbsp; 429&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextOut(hdcMem, rcMem.right, rcMem.top, tcElapsed, 
static_cast&amp;lt;int&amp;gt;(_tcslen(tcElapsed))); 
&amp;nbsp; 430&amp;nbsp; 
&amp;nbsp; 431&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SelectObject(hdcMem, hfOld); 
&amp;nbsp; 432 } 

pLevels-&amp;gt;timeStamp is measured in 100 nanoseconds and indicates the elapsed time inside the playing song. Be aware that the &#39;SelectObject&#39; method returns the previous/old selected object in the device context; you&#39;re advised to select the
 old object back in the device context after you&#39;ve finished working with the new one. 
Rendering the Wave
If you watched the video preview, you&#39;ve seen that there is a wave in the middle of the screen. The
CWinterVisualization::DrawPlus method draws plusses (&#39;&amp;#43;&#39;) to build the wave (drawing plusses instead of connected lines gives a better effect). 

&amp;nbsp; 382&amp;nbsp;void CWinterVisualization::DrawPlus(TimedLevel * pLevels, HDC hdcMem, RECT rcMem) 
&amp;nbsp; 383 { 
&amp;nbsp; 384&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // don&#39;t display plus line when screen is too small 
&amp;nbsp; 385&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rcMem.right &amp;lt; 240) 
&amp;nbsp; 386&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; 
&amp;nbsp; 387&amp;nbsp; 
&amp;nbsp; 388&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HFONT hfOld = static_cast&amp;lt;HFONT&amp;gt;(SelectObject(hdcMem, hfPlus)); 
&amp;nbsp; 389&amp;nbsp; 
&amp;nbsp; 390&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetBkMode(hdcMem, TRANSPARENT); 
&amp;nbsp; 391&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetTextAlign(hdcMem, TA_RIGHT | TA_TOP); 
&amp;nbsp; 392&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (m_nPreset) 
&amp;nbsp; 393&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 394&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case PRESET_FLAKE: 
&amp;nbsp; 395&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetTextColor(hdcMem, RGB(176, 226, 255)); 
&amp;nbsp; 396&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; 
&amp;nbsp; 397&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case PRESET_FLAME: 
&amp;nbsp; 398&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetTextColor(hdcMem, RGB(255, 64, 64)); 
&amp;nbsp; 399&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; 
&amp;nbsp; 400&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 401&amp;nbsp; 
&amp;nbsp; 402&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR tcPlus[] = TEXT(&amp;quot;&amp;#43;&amp;quot;); 
&amp;nbsp; 403&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT iPlusLen = static_cast&amp;lt;INT&amp;gt;(_tcslen(tcPlus)); 
&amp;nbsp; 404&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (INT i = 0; i &amp;lt; SA_BUFFER_SIZE; &amp;#43;&amp;#43;i) 
&amp;nbsp; 405&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 406&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT x = static_cast&amp;lt;INT&amp;gt;(rcMem.right * i / 1024.0f); 
&amp;nbsp; 407&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT y = static_cast&amp;lt;INT&amp;gt;(rcMem.bottom * pLevels-&amp;gt;waveform[0][i] / 256.0f); 
&amp;nbsp; 408&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextOut(hdcMem, x, y, tcPlus, iPlusLen); 
&amp;nbsp; 409&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 410&amp;nbsp; 
&amp;nbsp; 411&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SelectObject(hdcMem, hfOld); 
&amp;nbsp; 412 } 

This method depends on the currently selected preset and changes the color of the wave: blue for Flakes and red for Flames. We&#39;ll be rendering only the first channel (mono) waveform
pLevels-&amp;gt;waveform[0]. If you decide to use both channels (stereo), you&#39;ll have to use
pLevels-&amp;gt;waveform[0] and pLevels-&amp;gt;waveform[1]; if the song is mono, then the second array is undefined (take care)! The method scales the values to the canvas size and draws the linked plusses. 
Creating a Koch Snowflake
CWinterVisualization::CreateSnow computes the Koch Snowflake as described on the
MathWorld Web Site. We construct an equilateral triangle with 3 vertices and start iterating: at the first iteration we have a polygon (which starts to resemble with a snowflake)
 with 12 vertices; at the second iteration we have a better snowflake/polygon with 48 vertices... at the fifth iteration we have a snowflake with 3072 vertices. 

&amp;nbsp; 272&amp;nbsp;void CWinterVisualization::CreateSnow() 
&amp;nbsp; 273 { 
&amp;nbsp; 274&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Create Koch */ 
&amp;nbsp; 275&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pKoch = new POINT * [iKochCount]; 
&amp;nbsp; 276&amp;nbsp; 
&amp;nbsp; 277&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Frames */ 
&amp;nbsp; 278&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (INT w = 0; w &amp;lt; iKochCount; &amp;#43;&amp;#43;w) 
&amp;nbsp; 279&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 280&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Initialize Koch Fractal Snowflake with the equilateral triangle */ 
&amp;nbsp; 281&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iVertexNowCount&amp;nbsp;&amp;nbsp;&amp;nbsp; = 3; 
&amp;nbsp; 282&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT * pVertexNow&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = new POINT[iVertexNowCount]; 
&amp;nbsp; 283&amp;nbsp; 
&amp;nbsp; 284&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT iSize = (SNOW_MIN_SIZE &amp;#43; w * SNOW_STEP_SIZE) / 2; 
&amp;nbsp; 285&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNow[0].x = - iSize;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNow[0].y = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
// A 
&amp;nbsp; 286&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNow[1].x = &amp;#43; iSize;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNow[1].y = 23;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
// B 
&amp;nbsp; 287&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNow[2] = MakeEqTriangle(pVertexNow[0], pVertexNow[1]);&amp;nbsp;&amp;nbsp;&amp;nbsp;
// C 
&amp;nbsp; 288&amp;nbsp; 
&amp;nbsp; 289&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* http://mathworld.wolfram.com/KochSnowflake.html */ 
&amp;nbsp; 290&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (INT q = 1; q &amp;lt; KOCH_IT &amp;#43; 1; &amp;#43;&amp;#43;q) 
&amp;nbsp; 291&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 292&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iVertexNewCount = iVertexNowCount * 4; 
&amp;nbsp; 293&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT * pVertexNew&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = new POINT[iVertexNewCount]; 
&amp;nbsp; 294&amp;nbsp; 
&amp;nbsp; 295&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (INT i = 0; i &amp;lt; iVertexNowCount; &amp;#43;&amp;#43;i) 
&amp;nbsp; 296&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 297&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT j = (i &amp;#43; 1) % iVertexNowCount; 
&amp;nbsp; 298&amp;nbsp; 
&amp;nbsp; 299&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT pA = pVertexNow[i]; 
&amp;nbsp; 300&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT pE = pVertexNow[j]; 
&amp;nbsp; 301&amp;nbsp; 
&amp;nbsp; 302&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG lWidth&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = pE.x - pA.x; 
&amp;nbsp; 303&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG lHeight&amp;nbsp;&amp;nbsp;&amp;nbsp; = pE.y - pA.y; 
&amp;nbsp; 304&amp;nbsp; 
&amp;nbsp; 305&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT pB; 
&amp;nbsp; 306&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pB.x = pA.x &amp;#43; lWidth / 3; 
&amp;nbsp; 307&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pB.y = pA.y &amp;#43; lHeight / 3; 
&amp;nbsp; 308&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT pD; 
&amp;nbsp; 309&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pD.x = pA.x &amp;#43; lWidth * 2 / 3; 
&amp;nbsp; 310&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pD.y = pA.y &amp;#43; lHeight * 2 / 3; 
&amp;nbsp; 311&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT pC = MakeEqTriangle(pD, pB); // equilateral triangle for the inner third 
&amp;nbsp; 312&amp;nbsp; 
&amp;nbsp; 313&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT k = i * 4; 
&amp;nbsp; 314&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNew[k &amp;#43; 0] = pA; 
&amp;nbsp; 315&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNew[k &amp;#43; 1] = pB; 
&amp;nbsp; 316&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNew[k &amp;#43; 2] = pC; 
&amp;nbsp; 317&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNew[k &amp;#43; 3] = pD; 
&amp;nbsp; 318&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 319&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // move to the next Koch iteration 
&amp;nbsp; 320&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete[] pVertexNow; 
&amp;nbsp; 321&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNow&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = pVertexNew; 
&amp;nbsp; 322&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iVertexNowCount&amp;nbsp;&amp;nbsp;&amp;nbsp; = iVertexNewCount; 
&amp;nbsp; 323&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 324&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Done */ 
&amp;nbsp; 325&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pKoch[w] = pVertexNow; 
&amp;nbsp; 326&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 327 } 

Rendering the Snowflakes
There are 13 (this is the default value) snowflakes that need to be rendered on the device context. When a snowflake reaches its maximum size, it gets reinitialized: its size depends on the waveform, its color depends on the preset and it&#39;s randomly distributed
 across the surface. Each snowflake is translated and rotated to its target position (this is required because of the precomputation where we considered the snowflake to be around x=0 and y=0). 

&amp;nbsp; 329&amp;nbsp;void CWinterVisualization::DrawSnow(TimedLevel * pLevels, HDC hdcMem, RECT rcMem) 
&amp;nbsp; 330 { 
&amp;nbsp; 331&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (INT i = 0; i &amp;lt; SNOW_COUNT; &amp;#43;&amp;#43;i) 
&amp;nbsp; 332&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 333&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Initialize snowflake when reached SNOW_MAX_SIZE */ 
&amp;nbsp; 334&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (&amp;#43;&amp;#43;iSnowSize[i] == iKochCount) 
&amp;nbsp; 335&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 336&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // size depends on waveform 
&amp;nbsp; 337&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iSnowSize[i] = iKochCount * pLevels-&amp;gt;waveform[0][SA_BUFFER_SIZE * i / SNOW_COUNT] / 256; 
&amp;nbsp; 338&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (m_nPreset) 
&amp;nbsp; 339&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 340&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case PRESET_FLAKE: 
&amp;nbsp; 341&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iSnowColor[i] = rand() % SNOW_FLAKE_COLOR_COUNT; 
&amp;nbsp; 342&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; 
&amp;nbsp; 343&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case PRESET_FLAME: 
&amp;nbsp; 344&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iSnowColor[i] = SNOW_FLAKE_COLOR_COUNT &amp;#43; rand() % SNOW_FLAME_COLOR_COUNT; 
&amp;nbsp; 345&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; 
&amp;nbsp; 346&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 347&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // distribute snowflakes on the screen 
&amp;nbsp; 348&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pSnowPosition[i].x = rcMem.right * i / SNOW_COUNT; 
&amp;nbsp; 349&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pSnowPosition[i].y = rand() % rcMem.bottom; 
&amp;nbsp; 350&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 351&amp;nbsp; 
&amp;nbsp; 352&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Prepare snowflake for drawing */ 
&amp;nbsp; 353&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT iVertexNowCount&amp;nbsp;&amp;nbsp;&amp;nbsp; = static_cast&amp;lt;INT&amp;gt;(3 * pow(4.0f, KOCH_IT)); 
&amp;nbsp; 354&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT * pVertexNow&amp;nbsp;&amp;nbsp;&amp;nbsp; = new POINT[iVertexNowCount]; 
&amp;nbsp; 355&amp;nbsp; 
&amp;nbsp; 356&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (INT j = 0; j &amp;lt; iVertexNowCount; &amp;#43;&amp;#43;j) 
&amp;nbsp; 357&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 358&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Just translation */ 
&amp;nbsp; 359&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //pVertexNow[j].x = pKoch[iSnowSize[i]][j].x &amp;#43; pSnowPosition[i].x; 
&amp;nbsp; 360&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //pVertexNow[j].y = pKoch[iSnowSize[i]][j].y &amp;#43; pSnowPosition[i].y; 
&amp;nbsp; 361&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Translation and rotation */ 
&amp;nbsp; 362&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FLOAT fAngle = pLevels-&amp;gt;waveform[0][SA_BUFFER_SIZE * i / SNOW_COUNT] * 3.1415926535897932384626433832795f / 256.0f; 
&amp;nbsp; 363&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FLOAT fAngleCos = cos(fAngle); 
&amp;nbsp; 364&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FLOAT fAngleSin = sin(fAngle); 
&amp;nbsp; 365&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNow[j].x = static_cast&amp;lt;LONG&amp;gt;(fAngleCos * pKoch[iSnowSize[i]][j].x - fAngleSin * pKoch[iSnowSize[i]][j].y &amp;#43; pSnowPosition[i].x); 
&amp;nbsp; 366&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pVertexNow[j].y = static_cast&amp;lt;LONG&amp;gt;(fAngleSin * pKoch[iSnowSize[i]][j].x &amp;#43; fAngleCos * pKoch[iSnowSize[i]][j].y &amp;#43; pSnowPosition[i].y); 
&amp;nbsp; 367&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 368&amp;nbsp; 
&amp;nbsp; 369&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Draw Koch Snowflake */ 
&amp;nbsp; 370&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HPEN hpOld = static_cast&amp;lt;HPEN&amp;gt;(SelectObject(hdcMem, hpSnowColor[iSnowColor[i]])); 
&amp;nbsp; 371&amp;nbsp; 
&amp;nbsp; 372&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MoveToEx(hdcMem, pVertexNow[0].x, pVertexNow[0].y, 0); 
&amp;nbsp; 373&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PolylineTo(hdcMem, pVertexNow, iVertexNowCount); 
&amp;nbsp; 374&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LineTo(hdcMem, pVertexNow[0].x, pVertexNow[0].y); 
&amp;nbsp; 375&amp;nbsp; 
&amp;nbsp; 376&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SelectObject(hdcMem, hpOld); 
&amp;nbsp; 377&amp;nbsp; 
&amp;nbsp; 378&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete[] pVertexNow; 
&amp;nbsp; 379&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 380 } 

PolylineTo is the fastest way to draw a polygon when you use a pen with width
1. The width of the pen has to be one! 
Wrapping up: Blending and Rendering
So far, we&#39;ve seen some methods that did something if someone called them. 
CWinterVisualization::Render calls those methods and in turn is called by 
Windows Media Player (which decides how frequent to call it). Notice the line
169 which allows this method to be called only 30 times per second. Because the size of the drawing surface can change (when you resize
Windows Media Player), the device contexts are deleted and created again. 

&amp;nbsp; 167 STDMETHODIMP CWinterVisualization::Render(TimedLevel *pLevels, HDC hdc, RECT *prc) 
&amp;nbsp; 168 { 
&amp;nbsp; 169&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_abs64(pLevels-&amp;gt;timeStamp - tsPrev) &amp;lt; 333333)
// 10^7 is 1 second; use only 30fps 
&amp;nbsp; 170&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK; 
&amp;nbsp; 171&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tsPrev = pLevels-&amp;gt;timeStamp; // keep time stamp 
&amp;nbsp; 172&amp;nbsp; 
&amp;nbsp; 173&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RECT rcMem = {0, 0, prc-&amp;gt;right - prc-&amp;gt;left, prc-&amp;gt;bottom - prc-&amp;gt;top};
// memory rectangle 
&amp;nbsp; 174&amp;nbsp; 
&amp;nbsp; 175&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check whether drawing surface changed */ 
&amp;nbsp; 176&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((rcMem.left != rcPrev.left) || (rcMem.top != rcPrev.top) ||
 
&amp;nbsp; 177&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (rcMem.right != rcPrev.right) || (rcMem.bottom != rcPrev.bottom)) 
&amp;nbsp; 178&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 179&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rcPrev = rcMem; // keep memory rectangle 
&amp;nbsp; 180&amp;nbsp; 
&amp;nbsp; 181&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Delete Prev */ 
&amp;nbsp; 182&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hNewBitmapPrev) 
&amp;nbsp; 183&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 184&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SelectObject(hdcPrev, hOldBitmapPrev); 
&amp;nbsp; 185&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteObject(hNewBitmapPrev); 
&amp;nbsp; 186&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 187&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hNewBitmapPrev&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp; 188&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hOldBitmapPrev&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp; 189&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hdcPrev) 
&amp;nbsp; 190&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteDC(hdcPrev); 
&amp;nbsp; 191&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcPrev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp; 192&amp;nbsp; 
&amp;nbsp; 193&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Delete Mem */ 
&amp;nbsp; 194&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hNewBitmapMem) 
&amp;nbsp; 195&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 196&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SelectObject(hdcMem, hOldBitmapMem); 
&amp;nbsp; 197&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteObject(hNewBitmapMem); 
&amp;nbsp; 198&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 199&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hNewBitmapMem&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp; 200&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hOldBitmapMem&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp; 201&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hdcMem) 
&amp;nbsp; 202&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteDC(hdcMem); 
&amp;nbsp; 203&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcMem&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0; 
&amp;nbsp; 204&amp;nbsp; 
&amp;nbsp; 205&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Make snowflakes re-initialize in DrawSnow 
&amp;nbsp; 206&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (INT i = 0; i &amp;lt; SNOW_COUNT; &amp;#43;&amp;#43;i) 
&amp;nbsp; 207&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iSnowSize[i] = iKochCount - 1; 
&amp;nbsp; 208&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 209&amp;nbsp; 
&amp;nbsp; 210&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Create Prev */ 
&amp;nbsp; 211&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!hdcPrev) 
&amp;nbsp; 212&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcPrev = CreateCompatibleDC(hdc); 
&amp;nbsp; 213&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!hNewBitmapPrev) 
&amp;nbsp; 214&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 215&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hNewBitmapPrev = CreateCompatibleBitmap(hdc, rcMem.right, rcMem.bottom); 
&amp;nbsp; 216&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hOldBitmapPrev = static_cast&amp;lt;HBITMAP&amp;gt;(SelectObject(hdcPrev, hNewBitmapPrev)); 
&amp;nbsp; 217&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 218&amp;nbsp; 
&amp;nbsp; 219&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Create Mem */ 
&amp;nbsp; 220&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!hdcMem) 
&amp;nbsp; 221&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcMem = CreateCompatibleDC(hdc); 
&amp;nbsp; 222&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!hNewBitmapMem) 
&amp;nbsp; 223&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp; 224&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hNewBitmapMem = CreateCompatibleBitmap(hdc, rcMem.right, rcMem.bottom); 
&amp;nbsp; 225&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hOldBitmapMem = static_cast&amp;lt;HBITMAP&amp;gt;(SelectObject(hdcMem, hNewBitmapMem)); 
&amp;nbsp; 226&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp; 227&amp;nbsp; 
&amp;nbsp; 228&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Draw background on Mem */ 
&amp;nbsp; 229&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FillRect(hdcMem, &amp;amp;rcMem, hBrushBack); 
&amp;nbsp; 230&amp;nbsp; 
&amp;nbsp; 231&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Blend Prev with Mem */&amp;nbsp;&amp;nbsp;&amp;nbsp;  
&amp;nbsp; 232&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BLENDFUNCTION bfPrev = {AC_SRC_OVER, 0, SNOW_ALPHA, AC_SRC_ALPHA}; 
&amp;nbsp; 233&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AlphaBlend(hdcMem, rcMem.left, rcMem.top, rcMem.right, rcMem.bottom,
 
&amp;nbsp; 234&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcPrev, rcMem.left, rcMem.top, rcMem.right, rcMem.bottom, bfPrev); 
&amp;nbsp; 235&amp;nbsp; 
&amp;nbsp; 236&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Draw Snow on Mem */ 
&amp;nbsp; 237&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DrawSnow(pLevels, hdcMem, rcMem); 
&amp;nbsp; 238&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Draw Plus on Mem */ 
&amp;nbsp; 239&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DrawPlus(pLevels, hdcMem, rcMem); 
&amp;nbsp; 240&amp;nbsp; 
&amp;nbsp; 241&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Copy Mem to Prev */ 
&amp;nbsp; 242&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BitBlt(hdcPrev, rcMem.left, rcMem.top, rcMem.right, rcMem.bottom, 
&amp;nbsp; 243&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcMem, rcMem.left, rcMem.top, SRCCOPY); 
&amp;nbsp; 244&amp;nbsp; 
&amp;nbsp; 245&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Draw Text on Mem */ 
&amp;nbsp; 246&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Uncomment the following line to draw elapsed text in the top-right corner */ 
&amp;nbsp; 247&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DrawText(pLevels, hdcMem, rcMem); 
&amp;nbsp; 248&amp;nbsp; 
&amp;nbsp; 249&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Copy Mem to WMP */ 
&amp;nbsp; 250&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BitBlt(hdc, prc-&amp;gt;left, prc-&amp;gt;top, prc-&amp;gt;right - prc-&amp;gt;left, prc-&amp;gt;bottom - prc-&amp;gt;top,
 
&amp;nbsp; 251&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hdcMem, rcMem.left, rcMem.top, SRCCOPY); 
&amp;nbsp; 252&amp;nbsp; 
&amp;nbsp; 253&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK; 
&amp;nbsp; 254 } 

I haven&#39;t said anything about the flicker... how was that avoided? Take a good look at this method (especially at line
250): we weren&#39;t drawing directly on the default device context as the wizard-generated visualization did, instead we were drawing on a memory device context
hdcMem which was copied to the default device context only when everything was ready. It&#39;s a simple solution and it avoids the flicker! Never draw directly to the
hdc received as the argument!
What about the smooth effect? We needed the msimg32.lib, especially the 
AlphaBlend method which blends two device contexts together. The blend between
hdcPrev and hdcMem lets the previous rendered scene to be drawn again with a darker shade, while the new scene is as vivid as it should be;
hdcMem is saved to hdcPrev to keep it for the next rendering when it becomes the old scene. That&#39;s it! 
Conclusion
Winter Visualization, Snow Flakes:
 
Winter Visualization, Snow Flames:
 
You&#39;ve created a beautiful winter visualization... Watch the dancing snowflakes and download the

Winter Visualization Source Code or download only the installer 
WinterVisualizationSetup.msi (share the Winter Visualization with your friends). I hope you enjoyed working with C&amp;#43;&amp;#43; and you like what you&#39;ve learned today!
Thanks to the Microsoft Student Partners - Microsoft Academic Program Team Romania for support. Happy Holidays! 
Reference

Windows Media Player Custom Visualizations

Bio
Paul-Valentin Borza is in its third year of study at the 
Babeş-Bolyai University of Cluj-Napoca, Romania. Driven by his passion for technology, he was invited in 2005 to be a
Microsoft Student Partners member - Microsoft Academic Program at the
Faculty of Mathematics and Computer Science. He can be reached through his web site at
www.borza.ro or on the Windows Live Network with windowslive@borza.ro.
 
</description>
	<link></link>
	<language>en</language>
	<pubDate>Sun, 19 May 2013 09:50:17 GMT</pubDate>
	<lastBuildDate>Sun, 19 May 2013 09:50:17 GMT</lastBuildDate>
	<generator>Rev9</generator>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>this visualization is off the hook i believe this is the best visualization ever if i could just take the whole world of it i would.</p><p>posted by Davon Muchett</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633594672000000000</link>
		<pubDate>Mon, 13 Oct 2008 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633594672000000000</guid>
		<dc:creator>Davon Muchett</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>this is totally off the hook every one should have this i even hate it because i love it its davon yow!!!!!!!!!!!!!!!!!!!</p><p>posted by Davon Muchett</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633594672000000000</link>
		<pubDate>Mon, 13 Oct 2008 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633594672000000000</guid>
		<dc:creator>Davon Muchett</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>Thank you Paul-Valentin,</p><p>A few weeks ago my development machine with Visual Studio .NET, Media Player 10 and Media Player 10 SDK died. &nbsp;This was replaced with a new machine with Visual Studion 2005 and Media Player 11. &nbsp;I've been trying for weeks to figure out how to get the Project wizard in the 2008 Windows SDK to work with Visual Studio 2005. &nbsp;The Microsoft documentation doesn't give a clue how to do this. &nbsp;Your explaination gave me all the info I needed to get it to work. &nbsp;As an added plus, you described exactly what I've needed to get off-screen buffering to work.</p><p>Many Thanks!!</p><p>posted by Richard Haaf</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633618036000000000</link>
		<pubDate>Sun, 09 Nov 2008 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633618036000000000</guid>
		<dc:creator>Richard Haaf</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>Last year I was doing an engineering project for &nbsp;my Science Fair Project. I wanted to create a Music Visualization and this tutorial saved my grade and project. Thank you!</p><p>posted by Adriana</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633645684000000000</link>
		<pubDate>Thu, 11 Dec 2008 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633645684000000000</guid>
		<dc:creator>Adriana</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>It looked like fun project, but unfortunately Visual Studio could not load the Windows Media Player Plug-In Wizard.</p><p>Running Windows XP, Visual Studio C&#43;&#43; 2008 Express, SDK version 6.1. I have changed the path-adresses accordingly - that is equivalently to your description. Get the fail message on status bar at the bottom of the Studio: Creating Project .... &nbsp;project creation failed. What can I have done wrong?</p><p>posted by Martin</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633696660000000000</link>
		<pubDate>Sun, 08 Feb 2009 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633696660000000000</guid>
		<dc:creator>Martin</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>@Martin, looking into it.</p><p>posted by Clint</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633698388000000000</link>
		<pubDate>Tue, 10 Feb 2009 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633698388000000000</guid>
		<dc:creator>Clint</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>@Martin,</p><p>Have you installed the 2003 R2 SDK also? Although it's similar with the SDK for Vista, you need to install that in order to make it work. However, those steps for changing paths are only required for the Express editions -- if you have a standard or higher version, there's no need to make those.</p><p>Do you have a more clearer error message than &quot;creation failed&quot;?</p><p>posted by Paul</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633699252000000000</link>
		<pubDate>Wed, 11 Feb 2009 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633699252000000000</guid>
		<dc:creator>Paul</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>@Martin,</p><p>Have you installed the 2003 R2 SDK also? Although it's similar with the SDK for Vista, you need to install that in order to make it work. However, those steps for changing paths are only required for the Express editions -- if you have a standard or higher version, there's no need to make those.</p><p>Do you have a more clearer error message than &quot;creation failed&quot;?</p><p>posted by Paul</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633699252000000000</link>
		<pubDate>Wed, 11 Feb 2009 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633699252000000000</guid>
		<dc:creator>Paul</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>I found 2003 R2 SDK, and it did not install, stating I already have got the latest version of the plug-in program. Same result as before.</p><p>And no, sorry, &quot;creation failed&quot; is the only message I get. It is a small, almost not notable message, at the bottom part of the Express window.</p><p>posted by Martin</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633710484000000000</link>
		<pubDate>Tue, 24 Feb 2009 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633710484000000000</guid>
		<dc:creator>Martin</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>I installed the windows media player plug-in wizard. Got Windows SDK (newer version of platform SDK)... When I create a new project and select the wizard, it opens up an IE page, but it says it can't find the webpage i'm looking for.</p><p>posted by Gautham G</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633745872000000000</link>
		<pubDate>Mon, 06 Apr 2009 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633745872000000000</guid>
		<dc:creator>Gautham G</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>well im having trouble, but not with the installation and the other things. </p><p>anyway when i finished writing the code for the Initialization part of the tutorial and i went 2 build the code i get the undeclared errors so then i go and add the #include &quot;WinterVisualization.h&quot; all the errors go away but then i get another error saying that it can't open the include file. so im wondering what i need 2 do that will hep me get past the problem.</p><p>So does anyone know how i can declare all the undeclared units or what ever you want to call them?</p><p>or can some one give me a link to a working code of this visualization, or even a screen shot or even email me the code. &nbsp;</p><p>posted by Alan Z</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633767472000000000</link>
		<pubDate>Fri, 01 May 2009 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633767472000000000</guid>
		<dc:creator>Alan Z</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>@Lachlan I emailed Paul, he is currently out of the country for two weeks. &nbsp;If you email me (code4fun@microsoft.com), I'll email you when I get the files. &nbsp;I'll also update the post with new links on our server.</p><p>posted by Clint</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633934260000000000</link>
		<pubDate>Tue, 10 Nov 2009 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633934260000000000</guid>
		<dc:creator>Clint</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>Fixed! &nbsp;Source now lives on the Coding4Fun server. &nbsp;Sorry about that. &nbsp;<a rel="nofollow" target="_new" href="http://coding4fun.net/source/WinterVisualization.zip">http://coding4fun.net/source/WinterVisualization.zip</a></p><p>posted by Clint</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633942900000000000</link>
		<pubDate>Fri, 20 Nov 2009 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633942900000000000</guid>
		<dc:creator>Clint</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>This is an excellent demonstration of how to create a visualization. &nbsp;Thanks. &nbsp;I only came looking for how to get the WMP SDK to work with VS2005, but ended up with a great head start on creating a visualization.</p><p>By coincidence it's snowing outside, so the example is so appropriate!</p><p>posted by Phil Rogers</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633983508000000000</link>
		<pubDate>Wed, 06 Jan 2010 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633983508000000000</guid>
		<dc:creator>Phil Rogers</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>I built this visualization and then ran WMP 11.</p><p>It appeared in the visualization menu, and I selected it.</p><p>However, the visualization client area is not repainted after selecting it, so the menu is not removed until I start playing some music and the first call to Render occurs.</p><p>I noticed the same thing happens if I open anything else that covers the visualization client area, such as the About Box.</p><p>I created a default visualization using the Wizard in the SDK and that works as expected. &nbsp;I compared the code of the two projects and there's nothing obviously missing from the Winter Visualization, so why is it not refreshing the client area correctly?</p><p>posted by Phil Rogers</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633984372000000000</link>
		<pubDate>Thu, 07 Jan 2010 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633984372000000000</guid>
		<dc:creator>Phil Rogers</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>Hi Phil,</p><p>I haven't been playing with Windows Media Player visualizations since 2007, so my advices might not be as accurate as you'd expect. However, the rendering has to occur once the song starts playing (and it does from what you're saying). In a visualization, you have to take care of all the drawing that occurs in the specified rectangle, or the surface; that includes, taking care when user is resizing the window, right-clicks the surface and the menu appears etc.</p><p>Usually, when you right-click, and event will be fired up telling you the invalidated region that needs repainting (the menu that you're talking about).</p><p>First, try to see if you have the same behavior on a different machine. If you do, investigate the following:</p><p>* has the visualization been created before playing a song (is the constructor being called, and the rendering performed);</p><p>* has some event changed (it's been three years since I've published the article -- are you using Windows 7, a different SDK version perhaps);</p><p>* are the events that I was using now deprecated and no longer being called properly.</p><p>Try to attach to the WMP event and debug it to see what happens; use breakpoints in some key functions and see whether those functions are called after you right-click in the drawing area.</p><p>If everything fails, try to reproduce the same behavior using a computer that runs Windows Vista, and be sure you use Visual Studio 2005 together with all additional dependencies.</p><p>Thanks,</p><p>Paul</p><p>posted by Paul V. Borza</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633994740000000000</link>
		<pubDate>Tue, 19 Jan 2010 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633994740000000000</guid>
		<dc:creator>Paul V. Borza</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>@Phil Rogers &nbsp;Contacting Paul-Valentin to see what is up.</p><p>posted by Clint</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633994740000000000</link>
		<pubDate>Tue, 19 Jan 2010 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633994740000000000</guid>
		<dc:creator>Clint</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>Thanks for the tips. &nbsp;I'll give them a try.</p><p>I guessed it must be something to do with invalidated rectangles and events etc. &nbsp;I'll just have to do some experimenting.</p><p>Phil</p><p>posted by Phil Rogers</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633998196000000000</link>
		<pubDate>Sat, 23 Jan 2010 05:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c633998196000000000</guid>
		<dc:creator>Phil Rogers</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>@nkateko, try the download link again at the top of the page.</p><p>posted by Clint</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634182192000000000</link>
		<pubDate>Tue, 24 Aug 2010 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634182192000000000</guid>
		<dc:creator>Clint</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>i need winter vusualisation for my windows 7 windows media player</p><p>posted by nkateko</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634182192000000000</link>
		<pubDate>Tue, 24 Aug 2010 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634182192000000000</guid>
		<dc:creator>nkateko</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>@Alan Z, confused by your last statement, you don't want to increase the list but you want to add more?</p><p>posted by Clint</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634188240000000000</link>
		<pubDate>Tue, 31 Aug 2010 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634188240000000000</guid>
		<dc:creator>Clint</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>so i got it working and i have been exploring and modifying the code as i see fit. the one thing that i have been trying to do and with no success yet in adding more visualizations to the list, by that i mean other choices other then Snow Flakes and Snow Flames. also with out increasing the list in the Visualization list.</p><p>posted by Alan Z</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634188240000000000</link>
		<pubDate>Tue, 31 Aug 2010 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634188240000000000</guid>
		<dc:creator>Alan Z</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>So what I'm trying to say is that I don't want to increase the list of categories, meaning that i don want to add more to the Album Art, Alchemy, Bars and Waves, Battery, and Winter, list (the only categories that I have in my Windows Media Player). I want to add more choices in the category, meaning I want other selections in the Winter category other then Snow Flakes and Snow Flames.</p><p>posted by Alan Z</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634200336000000000</link>
		<pubDate>Tue, 14 Sep 2010 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634200336000000000</guid>
		<dc:creator>Alan Z</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>So the menu I don't want to increase is the main visualization menu, I don't want to add more categories to the main list of visualizations, meaning I don't want to add more to the Album Art, Alchemy, Bars and Waves, Battery, Winter, list. I want to add more selections with in the Winter category, I want more choices other then Snow Flakes, and Snow Flames. </p><p>posted by Alan Z.</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634200336000000000</link>
		<pubDate>Tue, 14 Sep 2010 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634200336000000000</guid>
		<dc:creator>Alan Z.</dc:creator>
	</item>
	<item>
		<title>Re: Winter Visualization for Windows Media Player in C++</title>
		<description>
			<![CDATA[ <p>Hi Alan,</p><p>You'll have to change the following:</p><p>1. Open WinterVisualization.rc with the visual editor (if you open the source file, you'll also have to modify resource.h by hand) and add IDS_NEWPRESET &quot;My New Preset Name&quot;;</p><p>3. WinterVisualization.h:31 (duplicate the enum value and change it to something like NEW_PRESET);</p><p>4. WinterVisualization.cpp:515-517 (duplicate those lines and make the necessary changes in the switch/case);</p><p>5. Search for &quot;PRESET_FLAME&quot; and whenever you find it in WinterVisualization.cpp duplicate those line and make whatever change you wish (like making the snowflakes green).</p><p>I believe that's enough to add another option under the winter menu item. If you have additional questions, please leave a comment and we'll get back to you.</p><p>Thanks,</p><p>Paul</p><p>posted by Paul V. Borza</p>]]>
		</description>
		<link>http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634202064000000000</link>
		<pubDate>Thu, 16 Sep 2010 04:00:00 GMT</pubDate>
		<guid isPermaLink="true">http://channel9.msdn.com/coding4fun/articles/Winter-Visualization-for-Windows-Media-Player-in-C#c634202064000000000</guid>
		<dc:creator>Paul V. Borza</dc:creator>
	</item>
</channel>
</rss>