<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">.Net CF UI and More</title><subtitle type="html" /><id>http://blogs.msdn.com/chrislorton/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/chrislorton/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/chrislorton/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2006-04-07T07:40:00Z</updated><entry><title>Type.MakeXxxType() (or The Intricacies of Reflection) - a non-NETCF post</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/chrislorton/archive/2007/02/20/type-makexxxtype-or-the-intricacies-of-reflection.aspx" /><id>http://blogs.msdn.com/chrislorton/archive/2007/02/20/type-makexxxtype-or-the-intricacies-of-reflection.aspx</id><published>2007-02-21T00:34:00Z</published><updated>2007-02-21T00:34:00Z</updated><content type="html">&lt;P&gt;The other day someone dropped into my office and asked about the Type.MakeByRefType() method.&amp;nbsp; Neither I nor my other visitor are experts in reflection on .Net, but we investigated and found the following:&lt;/P&gt;
&lt;P&gt;Imagine this situation:&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;public class foo {&lt;BR&gt;&lt;/CODE&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Do something with an int.&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void bar(Int32 anArgument) { ... }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Do something to an int and modify it.&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void bar(ref Int32 aRefArgument) { ... }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Do something multiple times in one call.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void bar(Int32[] anArrayArgument) { ... }&lt;BR&gt;} &lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;Now say you want to find bar() on&amp;nbsp;type foo&amp;nbsp;via reflection:&lt;/P&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MethodInfo mi = typeof(foo).GetMethod("bar"); &lt;/CODE&gt;
&lt;P&gt;To specify the version of bar you want, you need GetMethod(string name, Type[] types).&amp;nbsp; Okay, so getting the first version is straightforward:&lt;/P&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MethodInfo mi = typeof(foo).GetMethod("bar", new Type[]&amp;nbsp;{ typeof(Int32) }); &lt;/CODE&gt;
&lt;P&gt;What if you want the second of third overload of bar()?&amp;nbsp; Well, now you need Type.MakeByRefType() or Type.MakeArrayType() like this:&lt;/P&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MethodInfo mi = typeof(foo).GetMethod("bar", new Type[] { typeof(Int32).MakeByRefType() }); &lt;/CODE&gt;
&lt;P&gt;or&lt;/P&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MethodInfo mi = typeof(foo).GetMethod("bar", new Type[] ( typeof(Int32).MakeArrayType() }); &lt;/CODE&gt;
&lt;P&gt;Similarly, you can use Type.MakeGenericType() and/or Type.MakePointerType() for other method signatures.&lt;/P&gt;
&lt;P&gt;Here's a simple sample:&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;using System;&lt;/CODE&gt;&lt;BR&gt;&lt;CODE&gt;using System.Reflection;&lt;BR&gt;&lt;BR&gt;namespace SAMPLE&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class foo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public foo() {}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void bar(int arg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("bar(int arg):&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " + arg.ToString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void bar(ref int arg)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("bar(ref int arg): " + arg.ToString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arg *= arg;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("&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;" + arg.ToString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void bar(int[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("bar(int[] args):&amp;nbsp; ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int iArg = 0; iArg &amp;lt; args.Length; iArg++)&lt;BR&gt;&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; Console.WriteLine("&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; " + args[iArg].ToString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class MakeXxxType&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static int arg = 1968;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static int refArg = 256;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static int[] argArray = new int[] { 1970, 1995, 2000 };&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static int Main()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo f = new foo();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MethodInfo mi = f.GetType().GetMethod("bar", new Type[] { typeof(Int32) });&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mi.Invoke(f, new object[] { arg });&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mi = f.GetType().GetMethod("bar", new Type[] { typeof(Int32).MakeByRefType() });&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mi.Invoke(f, new object[] { refArg });&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mi = f.GetType().GetMethod("bar", new Type[] { typeof(Int32).MakeArrayType() });&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mi.Invoke(f, new object[] { argArray });&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;By the way, Type.MakeByRefType(), Type.MakeArrayType() and Type.MakePointerType()&amp;nbsp;are not supported in the .net Compact Framework (yet?).&amp;nbsp; However, Type.MakeGenericType() &lt;EM&gt;&lt;STRONG&gt;is&lt;/STRONG&gt;&lt;/EM&gt; supported.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1730214" width="1" height="1"&gt;</content><author><name>clorton</name><uri>http://blogs.msdn.com/members/clorton.aspx</uri></author></entry><entry><title>Fonts, LogFonts and the Compact Framework (NETCF)</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/chrislorton/archive/2007/02/07/fonts-logfonts-and-the-compact-framework-netcf.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="42958" href="http://blogs.msdn.com/chrislorton/attachment/1623210.ashx" /><id>http://blogs.msdn.com/chrislorton/archive/2007/02/07/fonts-logfonts-and-the-compact-framework-netcf.aspx</id><published>2007-02-08T04:22:00Z</published><updated>2007-02-08T04:22:00Z</updated><content type="html">&lt;P&gt;As you may know, much of System.Drawing on the desktop/full framework is based on GDI+.&amp;nbsp; Because GDI+ is not implemented on PocketPC/Smartphone/WindowsMobile, the functionality of System.Drawing in the Compact Framework is somewhat constrained.&lt;/P&gt;
&lt;P&gt;As we were planning and adding features to V2 of the Compact Framework, there were requests for the ability to draw rotated text from managed code (one might like to align street names with the street in a map, for example).&amp;nbsp; On the desktop, this is done by setting calling Graphics.RotateTransform() prior to calling Graphics.DrawString().&amp;nbsp; Since SetWorldTransform is not supported in GWES on WindowsCE (and WindowsCE based devices), Graphics.RotateTransform() is not available on the Compact Framework.&amp;nbsp; So, how would we enable rotated text in the Compact Framework?&lt;/P&gt;
&lt;P&gt;The answer is found in the LOGFONT structure and CreateFontIndirect().&amp;nbsp; Well, actually it's found in Font.FromLogFont() method.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note #1:&lt;/STRONG&gt; &lt;EM&gt;On the desktop the Font.FromLogFont comes in two flavors, FromLogFont(object) and FromLogFont(object, IntPtr).&amp;nbsp; This was too painful for the Compact Framework team (what does it mean to call Font.FromLogFont(12)?) so on the Compact Framework the first argument to FromLogFont must be a Microsoft.WindowsCE.Forms.LogFont object even though the method signature matches the desktop: FromLogFont(object).&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;After you find Font.FromLogFont and Microsoft.WindowsCE.Forms.LogFont, it is straightforward to create a font which includes rotation and will render at an angle when used in a call to Graphics.DrawString().&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Note #2a:&lt;/STRONG&gt; &lt;EM&gt;Escapement and Orientation cannot be set independently and should be set to the same value per &lt;/EM&gt;&lt;A class="" title="MSDN documentation on the LOGFONT structure" href="http://msdn2.microsoft.com/en-us/library/ms901140.aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/library/ms901140.aspx"&gt;&lt;EM&gt;MSDN documentation on the LOGFONT structure&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Note #2b:&lt;/STRONG&gt; &lt;EM&gt;The rotation fields of LOGFONT (and the LogFont class), escapement and orientation, are measured in tenths of degrees - i.e. specifiy 45 degrees of rotation with a value of 450.&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Another tidbit to know about fonts on devices is that the device wide setting for ClearType will, if ClearType is enabled, override whatever value you use in the Quality field of your LogFont object.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Note #3:&lt;/STRONG&gt; &lt;EM&gt;If ClearType is enabled system wide on your device, that setting will override the value in the Quality property of your LogFont object used in FromLogFont().&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Finally, one more piece of information from the MSDN documentation is relevant here - the Height property of the LogFont object may be positive &lt;EM&gt;or negative.&lt;/EM&gt;&amp;nbsp; If the value is positive, e.g. 12, this is matched against the &lt;EM&gt;cell height&lt;/EM&gt; of available fonts.&amp;nbsp; If the value is negative, e.g. -12, the absolute value of the height is matched against the &lt;EM&gt;character height&lt;/EM&gt; of&amp;nbsp;available fonts.&amp;nbsp; The standard formula for calculating the value the height property of the LogFont object from point size is the following:&lt;/P&gt;
&lt;P mce_keep="true"&gt;height = -MulDiv(pointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72) where MulDiv(a, b, c) is (((a)*(b))/(c)).&lt;/P&gt;
&lt;P mce_keep="true"&gt;Graphics.DpiY can be substituted for GetDeviceCaps(hDC, LOGPIXELSY) in managed code.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I've attached a basic LogFontExplorer project which allows control over most of the properties of LogFont and the ability to change the system wide ClearType setting from inside the application.&amp;nbsp; The text rendering is buffered to a bitmap so the difference between quality levels with and without system wide ClearType can be discerned.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Also, just for comparison, here's a snippet of code showing how to do rotated text on the desktop framework (I've included this project in the attachment as well).&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT color=#008080 size=2&gt;Font&lt;/FONT&gt;&lt;FONT size=2&gt; fnt = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Font&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Tahoma"&lt;/FONT&gt;&lt;FONT size=2&gt;, 12.0f);&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT size=2&gt;...&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; Form1_MouseDown(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;object&lt;/FONT&gt;&lt;FONT size=2&gt; sender, &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;MouseEventArgs&lt;/FONT&gt;&lt;FONT size=2&gt; e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Graphics&lt;/FONT&gt;&lt;FONT size=2&gt; g = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.CreateGraphics())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.TranslateTransform(e.X, e.Y);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.RotateTransform(((&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;float&lt;/FONT&gt;&lt;FONT size=2&gt;)numericUpDown1.Value) / 10.0f);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawString(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Hello, world!"&lt;/FONT&gt;&lt;FONT size=2&gt;, fnt, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;SolidBrush&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Color&lt;/FONT&gt;&lt;FONT size=2&gt;.Blue), 0.0f, 0.0f);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1623210" width="1" height="1"&gt;</content><author><name>clorton</name><uri>http://blogs.msdn.com/members/clorton.aspx</uri></author><category term="rotate rotated rotation font logfont compact framework" scheme="http://blogs.msdn.com/chrislorton/archive/tags/rotate+rotated+rotation+font+logfont+compact+framework/default.aspx" /></entry><entry><title>Keyboard Navigation on PocketPC with the Compact Framework</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/chrislorton/archive/2007/01/23/keyboard-navigation-on-pocketpc-with-the-compact-framework.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="47108" href="http://blogs.msdn.com/chrislorton/attachment/1516416.ashx" /><id>http://blogs.msdn.com/chrislorton/archive/2007/01/23/keyboard-navigation-on-pocketpc-with-the-compact-framework.aspx</id><published>2007-01-23T21:53:00Z</published><updated>2007-01-23T21:53:00Z</updated><content type="html">&lt;P&gt;We recently had a customer let us know that the difference between keyboard navigation on PocketPC and Smartphone was causing them trouble.&amp;nbsp; I thought I would take little time to work up a workaround for this issue.&amp;nbsp; I'll present a solution using the recommended managed methods first and then an alternative which plays with native interop to the SendInput() API.&lt;/P&gt;
&lt;P&gt;The basic problem is that the direction pad (d-pad) can be used to navigate through a form of controls on Smartphone but not on PocketPC.&amp;nbsp; The d-pad on both devices act like the arrow keys of a standard keyboard and sends VK_UP, VK_DOWN, VK_LEFT and VK_RIGHT inputs to the system when used.&amp;nbsp; ComboBox, DateTimePicker and TextBox are examples of controls which capture and respond to the up and down arrows on PocketPC (Tab and Shift-Tab still navigate as expected and stylus input to the touchscreen, if present,&amp;nbsp;will switch focus between controls).&lt;/P&gt;
&lt;P&gt;The recommended solution is to hook the KeyDown event (or override OnKeyDown) to capture Keys.Down and Keys.Up and use the SelectNextControl() method on the Control class (which calls the same code as the internal tabbing navigation) to navigate to the next/previous control in the tab order.&lt;/P&gt;
&lt;P&gt;Here's an excerpt from SmartphoneStyleNavigationWithSNC.zip which contains&amp;nbsp;an instance of each of the troublesome controls, ComboBox, DateTimePicker and TextBox:&lt;/P&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;// Excerpted from InitializeComponent() in SampleForm.Designer.cs&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.comboBox1.KeyDown += &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; System.Windows.Forms.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KeyEventHandler&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.HandleKeyDown);&lt;FONT size=2&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.dateTimePicker1.KeyDown += &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; System.Windows.Forms.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KeyEventHandler&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.HandleKeyDown);&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=2&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.textBox1.KeyDown += &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; System.Windows.Forms.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KeyEventHandler&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.HandleKeyDown);&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;&lt;FONT color=#008000 size=2&gt;// Custom code in SampleForm.cs&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; HandleKeyDown(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;object&lt;/FONT&gt;&lt;FONT size=2&gt; sender, &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KeyEventArgs&lt;/FONT&gt;&lt;FONT size=2&gt; e)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch&lt;/FONT&gt;&lt;FONT size=2&gt; (e.KeyData)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Keys&lt;/FONT&gt;&lt;FONT size=2&gt;.Up:&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Keys&lt;/FONT&gt;&lt;FONT size=2&gt;.Down:&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;e.Handled = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT size=2&gt;.SelectNextControl((&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Control&lt;/FONT&gt;&lt;FONT size=2&gt;)sender, e.KeyData == &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Keys&lt;/FONT&gt;&lt;FONT size=2&gt;.Down, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default&lt;/FONT&gt;&lt;FONT size=2&gt;:&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;Something to note above is that we can call SelectNextControl() directly because HandleKeyDown() is implemented on a form, a top level window.&amp;nbsp; If you decide to create custom control classes from ComboBox, DateTimePicker and/or TextBox which override OnKeyDown, you will need to use the following code:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.TopLevelControl.SelectNextControl((&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Control&lt;/FONT&gt;&lt;FONT size=2&gt;)sender, e.KeyData == &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Keys&lt;/FONT&gt;&lt;FONT size=2&gt;.Down, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Just for kicks I looked into eating the arrow key messages and putting [Shift-]Tab key messages into the message queue.&amp;nbsp; There's an official API, SendInput(), to do this.&amp;nbsp; Here are the relevant parts of that code (note that you still need to hook the KeyDown events of the controls in question to HandleKeyDown):&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;class&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The unused private fields below are required to match the native structure layout.&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;#pragma&lt;/FONT&gt;&lt;FONT size=2&gt; warning disable 0169&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;struct&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KEYBOARDINPUT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; type;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ushort&lt;/FONT&gt;&lt;FONT size=2&gt; wVk;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ushort&lt;/FONT&gt;&lt;FONT size=2&gt; wScan;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; dwFlags;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; time;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; dwExtraInfo;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; unused1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; unused2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;#pragma&lt;/FONT&gt;&lt;FONT size=2&gt; warning restore 0169&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;const&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; INPUT_KEYBOARD = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;const&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; KEYEVENTF_KEYUP = 2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;const&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ushort&lt;/FONT&gt;&lt;FONT size=2&gt; VK_TAB = 0x0009;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;const&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ushort&lt;/FONT&gt;&lt;FONT size=2&gt; VK_SHIFT = 0x0010;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;DllImport&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"coredll.dll"&lt;/FONT&gt;&lt;FONT size=2&gt;, SetLastError = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;extern&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; SendInput(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; cInputs, &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;/* [MarshalAs(UnmanagedType.LPArray)] */&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KEYBOARDINPUT&lt;/FONT&gt;&lt;FONT size=2&gt;[] inputs, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;FONT size=2&gt; cbSize);&lt;BR&gt;}&lt;/P&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; HandleKeyDown(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;object&lt;/FONT&gt;&lt;FONT size=2&gt; sender, &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KeyEventArgs&lt;/FONT&gt;&lt;FONT size=2&gt; e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KEYBOARDINPUT&lt;/FONT&gt;&lt;FONT size=2&gt;[] inputs;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; retVal;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;FONT size=2&gt; error;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;switch&lt;/FONT&gt;&lt;FONT size=2&gt; (e.KeyData)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Keys&lt;/FONT&gt;&lt;FONT size=2&gt;.Down:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Handled = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KEYBOARDINPUT&lt;/FONT&gt;&lt;FONT size=2&gt;[2];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs[0].type = inputs[1].type = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.INPUT_KEYBOARD;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs[0].wVk = inputs[1].wVk = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.VK_TAB;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs[1].dwFlags = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.KEYEVENTF_KEYUP;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retVal = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.SendInput(2, inputs, 0x001C);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;if&lt;/FONT&gt;&lt;FONT size=2&gt; (retVal != 2)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&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; error = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.GetLastWin32Error();&lt;BR&gt;&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; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;throw&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Exception&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt;.Format(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"SendInput() returned {0}."&lt;/FONT&gt;&lt;FONT size=2&gt;, error));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;break&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Keys&lt;/FONT&gt;&lt;FONT size=2&gt;.Up:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Handled = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;true&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;KEYBOARDINPUT&lt;/FONT&gt;&lt;FONT size=2&gt;[4];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs[0].type = inputs[1].type = inputs[2].type = inputs[3].type = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.INPUT_KEYBOARD;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs[0].wVk = inputs[3].wVk = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.VK_SHIFT;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs[1].wVk = inputs[2].wVk = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.VK_TAB;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputs[2].dwFlags = inputs[3].dwFlags = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.KEYEVENTF_KEYUP;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retVal = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;WinCE&lt;/FONT&gt;&lt;FONT size=2&gt;.SendInput(4, inputs, 0x001C);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;if&lt;/FONT&gt;&lt;FONT size=2&gt; (retVal != 4)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&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; error = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.GetLastWin32Error();&lt;BR&gt;&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; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;throw&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Exception&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt;.Format(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"SendInput() returned {0}."&lt;/FONT&gt;&lt;FONT size=2&gt;, error));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;break&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;default&lt;/FONT&gt;&lt;FONT size=2&gt;:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;break&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;
&lt;P&gt;This posting is provided "AS IS" with no warranties, and confers no rights.&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1516416" width="1" height="1"&gt;</content><author><name>clorton</name><uri>http://blogs.msdn.com/members/clorton.aspx</uri></author></entry><entry><title>Alphablending with NETCF</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/chrislorton/archive/2006/04/07/570649.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="84191" href="http://blogs.msdn.com/chrislorton/attachment/570649.ashx" /><id>http://blogs.msdn.com/chrislorton/archive/2006/04/07/570649.aspx</id><published>2006-04-07T09:40:00Z</published><updated>2006-04-07T09:40:00Z</updated><content type="html">&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Not long after V1 of the Compact Framework went out we started getting questions about support (or lack thereof) for advanced graphics and drawing functions available on the desktop framework but missing from the Compact Framework.&amp;nbsp; For V1 we made a decision based on both size and performance to implement System.Windows.Forms and System.Drawing over the native functionality of WindowsCE/PocketPC/Smartphone.&amp;nbsp; Since there is no version of GDI+ on these platforms, System.Drawing was limited to GDI (actually GWES) functionality and lacked a number of the more sophisticated features such as image rotation and coordinate scaling (among other things).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;However, with the advent of Windows Mobile 5.0 we have reason for some rejoicing: &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Alpha-blending"&gt;&lt;FONT face=Tahoma size=2&gt;alpha blending&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Tahoma size=2&gt;.&amp;nbsp; This ability allows some interesting effects which can really spiff up an application.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Briefly, there are two ways to do alpha blending in WM5: the &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrfAlphaBlend.asp"&gt;&lt;FONT face=Tahoma size=2&gt;AlphaBlend()&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;function and with the &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemultimedia5/html/wce50lrfimagingclasses.asp"&gt;&lt;FONT face=Tahoma size=2&gt;Image&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Tahoma size=2&gt; COM object in the &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemultimedia5/html/wce50lrfImagingStructures.asp"&gt;&lt;FONT face=Tahoma size=2&gt;Imaging API&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Tahoma size=2&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;First, AlphaBlend().&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;The AlphaBlend function has the ability to do either constant alpha blending over the entire source image or pixel level blending for bitmaps with an alpha channel.&amp;nbsp; Unfortunately, the NETCF bitmap loader creates a bitmap with the same pixel format as the display when loading a bitmap file or resource and loses the alpha channel information (if present).&amp;nbsp; This means that the AlphaBlend function can only be used for constant value alpha blending of images.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Here is a set of declarations for using AlphaBlend through p/invoke:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;struct&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; BlendFunction&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; BlendOp;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; BlendFlags;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; SourceConstantAlpha;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; AlphaFormat;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;enum&lt;/FONT&gt;&lt;FONT size=2&gt; BlendOperation : &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AC_SRC_OVER = 0x00&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;enum&lt;/FONT&gt;&lt;FONT size=2&gt; BlendFlags : &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Zero = 0x00&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;enum&lt;/FONT&gt;&lt;FONT size=2&gt; SourceConstantAlpha : &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transparent = 0x00,&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Opaque = 0xFF&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;enum&lt;/FONT&gt;&lt;FONT size=2&gt; AlphaFormat : &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AC_SRC_ALPHA = 0x01&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;class&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; PlatformAPIs&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;{&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080 size=2&gt;DllImport&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"coredll.dll"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;)]&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; extern&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;FONT size=2&gt; AlphaBlend(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IntPtr&lt;/FONT&gt;&lt;FONT size=2&gt; hdcDest,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;FONT size=2&gt; xDest,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;FONT size=2&gt; yDest,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;FONT size=2&gt; cxDest,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;FONT size=2&gt; cyDest,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IntPtr&lt;/FONT&gt;&lt;FONT size=2&gt; hdcSrc,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;FONT size=2&gt; xSrc,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;FONT size=2&gt; ySrc,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;FONT size=2&gt; cxSrc,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Int32&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; cySrc,&lt;BR&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; BlendFunction blendFunction);&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Here's an example of using the function inside an override of OnPaint():&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;// Load the image to use with the AlphaBlend API.&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; path = System.IO.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Path&lt;/FONT&gt;&lt;FONT size=2&gt;.GetDirectoryName(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Assembly&lt;/FONT&gt;&lt;FONT size=2&gt;.GetExecutingAssembly().GetName().CodeBase);&lt;BR&gt;constantAlphaImage = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; Bitmap(path + &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;@"\blendme.bmp"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;// AlphaBlend takes two HDC's - one source and one destination. Here's the source.&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt; (Graphics gxSrc = Graphics.FromImage(constantAlphaImage))&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; hdcDst = e.Graphics.GetHdc();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; hdcSrc = gxSrc.GetHdc();&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BlendFunction blendFunction = &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff&gt;new&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; BlendFunction();&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blendFunction.BlendOp = (&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;)BlendOperation.AC_SRC_OVER; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;// Only supported blend operation&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blendFunction.BlendFlags = (&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;)BlendFlags.Zero; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;// Documentation says put 0 here&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blendFunction.SourceConstantAlpha = (&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;)128;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;// Constant alpha factor&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blendFunction.AlphaFormat = (&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;)0;&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; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;// Don't look for per pixel alpha&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PlatformAPIs.AlphaBlend(hdcDst, &lt;EM&gt;left&lt;/EM&gt;, &lt;EM&gt;top&lt;/EM&gt;, &lt;EM&gt;width&lt;/EM&gt;, &lt;EM&gt;height&lt;/EM&gt;, hdcSrc, 0, 0, &lt;EM&gt;width&lt;/EM&gt;, &lt;EM&gt;height&lt;/EM&gt;, blendFunction);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gxSrc.ReleaseHdc(hdcSrc);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;// Required cleanup to GetHdc()&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics.ReleaseHdc(hdcDst); &lt;FONT color=#008000&gt;// Required cleanup to GetHdc()&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma&gt;Next, the Image object (or IImage interface) from the Imaging API.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma&gt;If we instantiate an IImagingFactory and use it to load our image from a file or resource, the alpha channel will be preserved (don't, however, confuse the IImage COM interface we get back with a System.Drawing.Image managed object).&amp;nbsp; Then we can ask the Imaging object to draw itself and it will use the alpha channel information in the image during the render.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma&gt;Here is the declaration of the enums and COM interfaces:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Pulled from gdipluspixelformats.h in the Windows Mobile 5.0 Pocket PC SDK&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;enum&lt;/FONT&gt; PixelFormatID : &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff&gt;int&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormatIndexed = 0x00010000,&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Indexes into a palette&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormatGDI = 0x00020000,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Is a GDI-supported format&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;PixelFormatAlpha = 0x00040000,&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Has an alpha component&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;PixelFormatPAlpha = 0x00080000,&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Pre-multiplied alpha&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;PixelFormatExtended = 0x00100000, &lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000&gt;// Extended color 16 bits/channel&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;PixelFormatCanonical = 0x00200000,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormatUndefined = 0,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormatDontCare = 0,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat1bppIndexed = (1 | ( 1 &amp;lt;&amp;lt; 8) | PixelFormatIndexed | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat4bppIndexed = (2 | ( 4 &amp;lt;&amp;lt; 8) | PixelFormatIndexed | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat8bppIndexed = (3 | ( 8 &amp;lt;&amp;lt; 8) | PixelFormatIndexed | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat16bppRGB555 = (5 | (16 &amp;lt;&amp;lt; 8) | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat16bppRGB565 = (6 | (16 &amp;lt;&amp;lt; 8) | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat16bppARGB1555 = (7 | (16 &amp;lt;&amp;lt; 8) | PixelFormatAlpha | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat24bppRGB = (8 | (24 &amp;lt;&amp;lt; 8) | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat32bppRGB = (9 | (32 &amp;lt;&amp;lt; 8) | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat32bppARGB = (10 | (32 &amp;lt;&amp;lt; 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat32bppPARGB = (11 | (32 &amp;lt;&amp;lt; 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatGDI),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat48bppRGB = (12 | (48 &amp;lt;&amp;lt; 8) | PixelFormatExtended),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat64bppARGB = (13 | (64 &amp;lt;&amp;lt; 8) | PixelFormatAlpha | PixelFormatCanonical | PixelFormatExtended),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormat64bppPARGB = (14 | (64 &amp;lt;&amp;lt; 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatExtended),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PixelFormatMax = 15&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;enum&lt;/FONT&gt; BufferDisposalFlag : &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff&gt;int&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferDisposalFlagNone,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferDisposalFlagGlobalFree,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferDisposalFlagCoTaskMemFree,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferDisposalFlagUnmapView&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;enum&lt;/FONT&gt; InterpolationHint : &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff&gt;int&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InterpolationHintDefault,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InterpolationHintNearestNeighbor,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InterpolationHintBilinear,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InterpolationHintAveraging,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InterpolationHintBicubic&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;struct&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; ImageInfo&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// I am being lazy here, I don't care at this point about the RawDataFormat GUID&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GuidPart1;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GuidPart2;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GuidPart3;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GuidPart4;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; PixelFormatID pixelFormat;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; Width;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; Height;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; TileWidth;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; TileHeight;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;double&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; Xdpi;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;double&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; Ydpi;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; Flags;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK&lt;BR&gt;&lt;/FONT&gt;[&lt;FONT color=#008080&gt;ComImport&lt;/FONT&gt;, &lt;FONT color=#008080&gt;Guid&lt;/FONT&gt;(&lt;FONT color=#800000&gt;"327ABDA7-072B-11D3-9D7B-0000F81EF32E"&lt;/FONT&gt;), &lt;FONT color=#008080&gt;InterfaceType&lt;/FONT&gt;(&lt;FONT color=#008080&gt;ComInterfaceType&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.InterfaceIsIUnknown)]&lt;BR&gt;[&lt;FONT color=#008080&gt;ComVisible&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;)]&lt;BR&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;interface&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; IImagingFactory&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateImageFromStream(); &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateImageFromFile(&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt; filename, &lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; IImage image);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// We need the MarshalAs attribute here to keep COM interop from sending the buffer down as a Safe Array.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateImageFromBuffer([&lt;FONT color=#008080&gt;MarshalAs&lt;/FONT&gt;(&lt;FONT color=#008080&gt;UnmanagedType&lt;/FONT&gt;.LPArray)] &lt;FONT color=#0000ff&gt;byte&lt;/FONT&gt;[] buffer, &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; size, BufferDisposalFlag disposalFlag, &lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; IImage image);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateNewBitmap(&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateBitmapFromImage(&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateBitmapFromBuffer();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateImageDecoder();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateImageEncoderToStream(); &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; CreateImageEncoderToFile();&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GetInstalledDecoders();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GetInstalledEncoders();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; InstallImageCodec();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; UninstallImageCodec();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000&gt;// This is a place holder&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK&lt;BR&gt;&lt;/FONT&gt;[&lt;FONT color=#008080&gt;ComImport&lt;/FONT&gt;, &lt;FONT color=#008080&gt;Guid&lt;/FONT&gt;(&lt;FONT color=#800000&gt;"327ABDA9-072B-11D3-9D7B-0000F81EF32E"&lt;/FONT&gt;), &lt;FONT color=#008080&gt;InterfaceType&lt;/FONT&gt;(&lt;FONT color=#008080&gt;ComInterfaceType&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.InterfaceIsIUnknown)]&lt;BR&gt;[&lt;FONT color=#008080&gt;ComVisible&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;)]&lt;BR&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;interface&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; IImage&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GetPhysicalDimension(&lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; Size size);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GetImageInfo(&lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; ImageInfo info);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; SetImageFlags(&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; flags);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// "Correct" declaration: uint Draw(IntPtr hdc, ref Rectangle dstRect, ref Rectangle srcRect);&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; Draw(&lt;FONT color=#008080&gt;IntPtr&lt;/FONT&gt; hdc, &lt;FONT color=#0000ff&gt;ref&lt;/FONT&gt; Rectangle dstRect, &lt;FONT color=#008080&gt;IntPtr&lt;/FONT&gt; NULL);&lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; PushIntoSink(); &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;// This is a place holder&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; GetThumbnail(&lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; thumbWidth, &lt;FONT color=#0000ff&gt;uint&lt;/FONT&gt; thumbHeight, &lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; IImage thumbImage);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma&gt;Here is how to load an image from a file:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=3&gt;&lt;FONT size=3&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; path = System.IO.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Path&lt;/FONT&gt;&lt;FONT size=2&gt;.GetDirectoryName(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Assembly&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;.GetExecutingAssembly().GetName().CodeBase);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000 size=2&gt;// Load the image with alpha data through Imaging.&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;IImagingFactory factory = (IImagingFactory)&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Activator&lt;/FONT&gt;&lt;FONT size=2&gt;.CreateInstance(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Type&lt;/FONT&gt;&lt;FONT size=2&gt;.GetTypeFromCLSID(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Guid&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"327ABDA8-072B-11D3-9D7B-0000F81EF32E"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;)));&lt;BR&gt;&lt;FONT size=2&gt;IImage imagingImage;&lt;BR&gt;&lt;/FONT&gt;factory.CreateImageFromFile(path + &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;@"\ihavealpha.png"&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;out&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt; imagingImage);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face=Tahoma size=2&gt;Here is how to load an image from an embedded resource:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=3&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; path = System.IO.&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Path&lt;/FONT&gt;&lt;FONT size=2&gt;.GetDirectoryName(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Assembly&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.GetExecutingAssembly().GetName().CodeBase);&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;IImagingFactory factory = (IImagingFactory)&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080 size=2&gt;Activator&lt;/FONT&gt;&lt;FONT size=2&gt;.CreateInstance(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Type&lt;/FONT&gt;&lt;FONT size=2&gt;.GetTypeFromCLSID(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Guid&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"327ABDA8-072B-11D3-9D7B-0000F81EF32E"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;)));&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT face="Courier New"&gt;// Load the image with alpha data from an embedded resource through Imaging&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT face="Courier New"&gt;// !! If your data source is not a MemoryStream, you will need to get your image data into a byte array and use it below. !!&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080 size=2&gt;MemoryStream&lt;/FONT&gt;&lt;FONT size=2&gt; strm = (&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;MemoryStream&lt;/FONT&gt;&lt;FONT size=2&gt;)&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Assembly&lt;/FONT&gt;&lt;FONT size=2&gt;.GetExecutingAssembly().GetManifestResourceStream(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"AlphaExample.embedded.png"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;);&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;[] pbBuf = strm.GetBuffer();&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;FONT size=2&gt; cbBuf = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;uint&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;)strm.Length;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;IImage imagingResource;&lt;BR&gt;&lt;/FONT&gt;factory.CreateImageFromBuffer(pbBuf, cbBuf, BufferDisposalFlag.BufferDisposalFlagNone, &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff&gt;out&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; imagingResource);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Here is how to render the image during the OnPaint():&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;&lt;FONT color=#008000 size=2&gt;// The bitmap needs to be created with the 32bpp pixel format for the IImage to do the right thing.&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080 size=2&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; (Bitmap &lt;/FONT&gt;backBuffer = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; Bitmap(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.ClientSize.Width, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb))&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000&gt;{&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using&lt;/FONT&gt;&lt;FONT size=2&gt; (Graphics gxBuffer = Graphics.FromImage(backBuffer))&lt;BR&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;gxBuffer.Clear(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.BackColor);&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr&lt;/FONT&gt;&lt;FONT size=2&gt; hdcDest = gxBuffer.GetHdc();&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rectangle&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;dstRect = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; Rectangle(&lt;EM&gt;left&lt;/EM&gt;, &lt;EM&gt;top&lt;/EM&gt;, &lt;EM&gt;right&lt;/EM&gt;, &lt;EM&gt;bottom&lt;/EM&gt;);&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ask the Image object from Imaging to draw itself.&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagingImage.Draw(hdcDest, &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;ref&lt;/FONT&gt;&lt;FONT size=2&gt; dstRect, &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IntPtr&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.Zero);&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gxBuffer.ReleaseHdc(hdcDest);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;// Put the final composed image on screen.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2&gt;e.Graphics.DrawImage(backBuffer, 0, 0);&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;I've attached a simple WM5 PocketPC project for VS 2005 which includes several images (two .PNGs with alpha data) and demonstrates the use of AlphaBlend() and the Imaging API.&amp;nbsp; Please note that there is no hardware acceleration of alpha blending on devices so use this functionality prudently or expect to notice an effect on your rendering performance.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This posting is provided "AS IS" with no warranties, and confers no rights.&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=570649" width="1" height="1"&gt;</content><author><name>clorton</name><uri>http://blogs.msdn.com/members/clorton.aspx</uri></author></entry></feed>