<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Программирование для мобильных устройств &#187; .NET Compact Framework</title>
	<atom:link href="http://mobile-developer.ru/category/net-compact-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://mobile-developer.ru</link>
	<description>Программирование для мобильных устройств. Разработка для Windows Mobile, Windows CE, Embedded Linux, Google Android, iPhone, Palm webOS и др. Все о программировании для мобильных телефонов, смартфонов, КПК и других мобильных устройств. Статьи, новости, руководства, видео уроки.</description>
	<lastBuildDate>Sun, 05 Sep 2010 20:40:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Статья &#8220;Creating Location Aware Applications for Windows Mobile Devices&#8221;</title>
		<link>http://mobile-developer.ru/net-compact-framework/statya-creating-location-aware-applications-for-windows-mobile-devices/</link>
		<comments>http://mobile-developer.ru/net-compact-framework/statya-creating-location-aware-applications-for-windows-mobile-devices/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 11:06:17 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=771</guid>
		<description><![CDATA[Портал DotNETForDevices.com опубликовал статью о создании приложений, использующих GPS. Скачать статью в PDF (зеркало) Скачать пример к статье (зеркало) Post from: Mobile-Developer.ruСтатья &#8220;Creating Location Aware Applications for Windows Mobile Devices&#8221;<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/statya-creating-location-aware-applications-for-windows-mobile-devices/">Статья &#8220;Creating Location Aware Applications for Windows Mobile Devices&#8221;</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/net-compact-framework/statya-creating-location-aware-applications-for-windows-mobile-devices/&title=Статья+&#8220;Creating+Location+Aware+Applications+for+Windows+Mobile+Devices&#8221;&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Портал <strong>DotNETForDevices.com</strong> <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.dotnetfordevices.com/article_detail.html?id=52" >опубликовал</a></noindex> статью о создании приложений, использующих GPS.<br />
<noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://depositfiles.com/files/vzdnodmv5" >Скачать статью в PDF</a></noindex> (<noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://cid-3302ab496146f161.skydrive.live.com/self.aspx/.Public/Windows%20Mobile%20Development%20Video%20Series/Whitepapers/Windows%20Mobile%20Location%20Aware%20Applications/Windows%20Mobile%20Location%20Aware%20Applications.pdf" >зеркало</a></noindex>)<br />
<noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://depositfiles.com/files/d4gx9dg2f" >Скачать пример к статье</a></noindex> (<noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://cid-3302ab496146f161.skydrive.live.com/self.aspx/.Public/Windows%20Mobile%20Development%20Video%20Series/Whitepapers/Windows%20Mobile%20Location%20Aware%20Applications/LocationAwareSampleApp.zip" >зеркало</a></noindex>)</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/statya-creating-location-aware-applications-for-windows-mobile-devices/" >Статья &#8220;Creating Location Aware Applications for Windows Mobile Devices&#8221;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/net-compact-framework/statya-creating-location-aware-applications-for-windows-mobile-devices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mobile Application Blocks new Community Drop (05-21-2009) доступен для скачивания</title>
		<link>http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-new-community-drop-05-21-2009-dostupen-dlya-skachivaniya/</link>
		<comments>http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-new-community-drop-05-21-2009-dostupen-dlya-skachivaniya/#comments</comments>
		<pubDate>Fri, 22 May 2009 19:19:33 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=746</guid>
		<description><![CDATA[На CodePlex доступна новая версия библиотеки Mobile Application Blocks. Из нововведений: Поддержка SQL Server CE 3.5 SP1 Утилита ConfigSectionEncrypt для шифровки конфигов Проекты для .NET CF 3.5 и 2.0 Улучшения в ContainerModel Block Post from: Mobile-Developer.ruMobile Application Blocks new Community Drop (05-21-2009) доступен для скачивания<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-new-community-drop-05-21-2009-dostupen-dlya-skachivaniya/">Mobile Application Blocks new Community Drop (05-21-2009) доступен для скачивания</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-new-community-drop-05-21-2009-dostupen-dlya-skachivaniya/&title=Mobile+Application+Blocks+new+Community+Drop+(05-21-2009)+доступен+для+скачивания&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>На CodePlex <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://mobile.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27708" >доступна</a></noindex> новая версия библиотеки Mobile Application Blocks.</p>
<p>Из нововведений:</p>
<ul>
<li>Поддержка SQL Server CE 3.5 SP1</li>
<li>Утилита ConfigSectionEncrypt для шифровки конфигов</li>
<li>Проекты для .NET CF 3.5 и 2.0</li>
<li>Улучшения в ContainerModel Block</li>
</ul>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-new-community-drop-05-21-2009-dostupen-dlya-skachivaniya/" >Mobile Application Blocks new Community Drop (05-21-2009) доступен для скачивания</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-new-community-drop-05-21-2009-dostupen-dlya-skachivaniya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как программно установить GPRS-соединение в Windows Mobile</title>
		<link>http://mobile-developer.ru/wxwince/kak-programmno-ustanovit-gprs-soedinenie-v-windows-mobile/</link>
		<comments>http://mobile-developer.ru/wxwince/kak-programmno-ustanovit-gprs-soedinenie-v-windows-mobile/#comments</comments>
		<pubDate>Thu, 07 May 2009 22:11:58 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[wxWinCE]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=728</guid>
		<description><![CDATA[Для того чтобы установить соединение с Internet в Windows Mobile предусмотрен специальный программный интерфейс &#8211; Connection Manager API. Пользоваться им довольно просто. И вот пример такого использования для C# и C++ приведен ниже: C# + .NET Compact Framework using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Threading; using System.Reflection; namespace GPRSConnection { public class [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/wxwince/kak-programmno-ustanovit-gprs-soedinenie-v-windows-mobile/">Как программно установить GPRS-соединение в Windows Mobile</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/wxwince/kak-programmno-ustanovit-gprs-soedinenie-v-windows-mobile/&title=Как+программно+установить+GPRS-соединение+в+Windows+Mobile&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Для того чтобы установить соединение с Internet в Windows Mobile предусмотрен специальный программный интерфейс &#8211; <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://msdn.microsoft.com/en-us/library/aa457258.aspx" >Connection Manager API</a></noindex>.<br />
Пользоваться им довольно просто. И вот пример такого использования для C# и C++ приведен ниже:<br />
<span id="more-728"></span></p>
<h4>C# + .NET Compact Framework</h4>
<pre class="brush: cpp;">
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Threading;
using System.Reflection;

namespace GPRSConnection
{
    public class GPRSConnection
    {
        const int S_OK = 0;
        const uint CONNMGR_PARAM_GUIDDESTNET = 0x1;
        const uint CONNMGR_FLAG_PROXY_HTTP = 0x1;
        const uint CONNMGR_PRIORITY_USERINTERACTIVE = 0x08000;
        const uint INFINITE = 0xffffffff;
        const uint CONNMGR_STATUS_CONNECTED = 0x10;
        static Hashtable ht = new Hashtable();

        static GPRSConnection()
        {
            ManualResetEvent mre = new ManualResetEvent(false);
            mre.Handle = ConnMgrApiReadyEvent();
            mre.WaitOne();
            CloseHandle(mre.Handle);
        }

        ~GPRSConnection()
        {
            ReleaseAll();
        }

        public static bool Setup(Uri url)
        {
            return Setup(url.ToString());
        }

        public static bool Setup(string urlStr)
        {
            ConnectionInfo ci = new ConnectionInfo();
            IntPtr phConnection = IntPtr.Zero;
            uint status = 0;

            if (ht[urlStr] != null)
                return true;

            if (ConnMgrMapURL(urlStr, ref ci.guidDestNet, IntPtr.Zero) != S_OK)
                return false;

            ci.cbSize = (uint)Marshal.SizeOf(ci);
            ci.dwParams = CONNMGR_PARAM_GUIDDESTNET;
            ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
            ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
            ci.bExclusive = 0;
            ci.bDisabled = 0;
            ci.hWnd = IntPtr.Zero;
            ci.uMsg = 0;
            ci.lParam = 0;

            if (ConnMgrEstablishConnectionSync(ref ci, ref phConnection, INFINITE, ref status) != S_OK &amp;&amp;
                status != CONNMGR_STATUS_CONNECTED)
                return false;

            ht[urlStr] = phConnection;
            return true;
        }

        public static bool Release(Uri url)
        {
            return Release(url.ToString());
        }

        public static bool Release(string urlStr)
        {
            return Release(urlStr, true);
        }

        private static bool Release(string urlStr, bool removeNode)
        {
            bool res = true;
            IntPtr ph = IntPtr.Zero;
            if (ht[urlStr] == null)
                return true;
            ph = (IntPtr)ht[urlStr];
            if (ConnMgrReleaseConnection(ph, 1) != S_OK)
                res = false;
            CloseHandle(ph);
            if (removeNode)
                ht.Remove(urlStr);
            return res;
        }

        public static void ReleaseAll()
        {
            foreach (DictionaryEntry de in ht)
            {
                Release((string)de.Key, false);
            }
            ht.Clear();
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct ConnectionInfo
        {
            public uint cbSize;
            public uint dwParams;
            public uint dwFlags;
            public uint dwPriority;
            public int bExclusive;
            public int bDisabled;
            public Guid guidDestNet;
            public IntPtr hWnd;
            public uint uMsg;
            public uint lParam;
            public uint ulMaxCost;
            public uint ulMinRcvBw;
            public uint ulMaxConnLatency;
        }

        [DllImport(&quot;cellcore.dll&quot;)]
        private static extern int ConnMgrMapURL(string pwszURL, ref Guid pguid, IntPtr pdwIndex);

        [DllImport(&quot;cellcore.dll&quot;)]
        private static extern int ConnMgrEstablishConnectionSync(ref ConnectionInfo ci, ref IntPtr phConnection, uint dwTimeout, ref uint pdwStatus);

        [DllImport(&quot;cellcore.dll&quot;)]
        private static extern IntPtr ConnMgrApiReadyEvent();

        [DllImport(&quot;cellcore.dll&quot;)]
        private static extern int ConnMgrReleaseConnection(IntPtr hConnection, int bCache);

        [DllImport(&quot;coredll.dll&quot;)]
        private static extern int CloseHandle(IntPtr hObject);
    }
}
</pre>
<p>Пример использования</p>
<pre class="brush: cpp;">
public void DoTcpConnection()
        {
            string t = System.IO.Path.AltDirectorySeparatorChar.ToString() + System.IO.Path.DirectorySeparatorChar.ToString();
            string url = &quot;www.msn.com&quot;;
            bool res = GPRSConnection.Setup(Uri.UriSchemeHttp +
                Uri.SchemeDelimiter + url + Path.AltDirectorySeparatorChar);
            if (res)
            {
                TcpClient tc = new TcpClient(url, 80);
                NetworkStream ns = tc.GetStream();
                byte[] buf = new byte[100];
                ns.Write(buf, 0, 100);
                tc.Client.Shutdown(SocketShutdown.Both);
                ns.Close();
                tc.Close();
                MessageBox.Show(&quot;Wrote 100 bytes&quot;);
            }
            else
            {
                MessageBox.Show(&quot;Connection establishment failed&quot;);
            }
        }
</pre>
<h4>C++</h4>
<h5>Singleton.h</h5>
<pre class="brush: cpp;">
#ifndef _SINGLETON_H
#define _SINGLETON_H

template&lt;typename T&gt; class Singleton
{
public:
	static T &amp; Instance()
	{
		static T instance;
		return instance;
	}
};

#endif
</pre>
<h5>GPRSConnection.h</h5>
<pre class="brush: cpp;">
#pragma once

#include &lt;windows.h&gt;
#include &lt;connmgr.h&gt;
#include &lt;map&gt;
#include &quot;Singleton.h&quot;

class GPRSConnection : public Singleton&lt;GPRSConnection&gt;
{
	friend class Singleton&lt;GPRSConnection&gt;;
#ifndef _UNICODE
	typedef std::string StringType;
#else
	typedef std::wstring StringType;
#endif
	bool apiReady;
	std::map&lt;StringType, HANDLE&gt; Connections;
protected:
	GPRSConnection() : apiReady(false)
	{
		do
		{
			HANDLE apiHandle = ConnMgrApiReadyEvent();
			if(!apiHandle) break;
			if(WaitForSingleObject(apiHandle, 10000) != WAIT_OBJECT_0) break;
			CloseHandle(apiHandle);
			apiReady = true;
		}
		while(false);
	}
public:
	~GPRSConnection()
	{
		ReleaseAll();
	}

	bool Setup(LPCTSTR url)
	{
		StringType urlInternal = url;
		if(Connections[urlInternal] != NULL) return true;
		CONNMGR_CONNECTIONINFO ci;
		if(ConnMgrMapURL(url, &amp;ci.guidDestNet, NULL) != S_OK) return false;
		ci.cbSize = sizeof(CONNMGR_CONNECTIONINFO);
		ci.dwParams = CONNMGR_PARAM_GUIDDESTNET;
		ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
		ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
		ci.bExclusive = 0;
		ci.bDisabled = 0;
		ci.hWnd = NULL;
		ci.uMsg = 0;

		DWORD status = CONNMGR_STATUS_UNKNOWN;
		HANDLE phConnection;
		if (ConnMgrEstablishConnectionSync(&amp;ci, &amp;phConnection, -1, &amp;status) != S_OK &amp;&amp;
			status != CONNMGR_STATUS_CONNECTED) return false;

		Connections[urlInternal] = phConnection;
		return true;
	}

	bool Release(LPCTSTR url, bool removeNode)
	{
		StringType urlInternal = url;
		bool res = true;
		if(Connections[urlInternal] == NULL) return true;
		if (ConnMgrReleaseConnection(Connections[urlInternal], 1) != S_OK) res = false;
		CloseHandle(Connections[urlInternal]);
		if(removeNode)
		{
			Connections.erase(urlInternal);
		}
		else
		{
			Connections[urlInternal] = NULL;
		}
		return res;
	}

	void ReleaseAll()
	{
		for(std::map&lt;StringType, HANDLE&gt;::iterator i = Connections.begin(); i != Connections.end(); ++i)
		{
			Release(i-&gt;first.c_str(), false);
		}
		Connections.clear();
	}
};
</pre>
<p>Пример использования</p>
<pre class="brush: cpp;">
void MainFrame::OnCONNECTClick( wxCommandEvent&amp; event )
{
	TransferDataFromWindow();
	bool res = GPRSConnection::Instance().Setup(m_URL.GetData());
	if(res)
	{
		wxLogMessage(_(&quot;Connection established&quot;));
		// Дальше здесь можно делать всякие штуки
	}
	else
	{
		wxLogMessage(_(&quot;Connection error&quot;));
	}
}
</pre>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/05/gprsconnection.7z"  title="Скачать исходник: Установить GPRS соединение в Windows Mobile">Скачать исходный код к статье (C++/C#)</a></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/wxwince/kak-programmno-ustanovit-gprs-soedinenie-v-windows-mobile/" >Как программно установить GPRS-соединение в Windows Mobile</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/wxwince/kak-programmno-ustanovit-gprs-soedinenie-v-windows-mobile/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Mobile Updater Application Block теперь OpenSource</title>
		<link>http://mobile-developer.ru/net-compact-framework/mobile-updater-application-block-teper-opensource/</link>
		<comments>http://mobile-developer.ru/net-compact-framework/mobile-updater-application-block-teper-opensource/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 15:45:03 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=711</guid>
		<description><![CDATA[Компания Q4Tech подарила проекту Mobile Contribute исходники Mobile Updater Application Block &#8211; библиотеку для автоматического обновления мобильных приложений. Теперь он доступен на CodePlex по лицензии MS-PL. К сожалению текущая версия предназначена для Visual Studio 2005, .NET Compact Framework 2.0 и Windows Mobile 5, но можно надеяться что в скором времени энтузиасты переведут проект на Visual [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/mobile-updater-application-block-teper-opensource/">Mobile Updater Application Block теперь OpenSource</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/net-compact-framework/mobile-updater-application-block-teper-opensource/&title=Mobile+Updater+Application+Block+теперь+OpenSource&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Компания <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/Mobile Updater Application Block" target="_blank">Q4Tech</a> подарила проекту <a href="http://mobilecontrib.codeplex.com/" >Mobile Contribute</a></noindex> исходники <strong>Mobile Updater Application Block</strong> &#8211; библиотеку для автоматического обновления мобильных приложений. Теперь он доступен на CodePlex по лицензии MS-PL.</p>
<p>К сожалению текущая версия предназначена для Visual Studio 2005, .NET Compact Framework 2.0 и Windows Mobile 5, но можно надеяться что в скором времени энтузиасты переведут проект на Visual Studio 2008.</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://mobilecontrib.codeplex.com/Wiki/View.aspx?title=Q4Tech%20Mobile%20Updater%20Application%20Block" title="Описание Mobile Updater Application Block"  target="_blank">Узнать более подробно о Mobile Updater Application Block можно здесь</a></noindex>.</p>
<p><img id="kosa-target-image" style="position: absolute; visibility: hidden; z-index: 2147483647; left: 742px; top: 60px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAYAAACJfM0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDQvMDQvMDhrK9wWAAACMElEQVQ4ja3SP2gTcRQH8O8vvUtIGmkqTY3SaMVFz6KDW2ywg4s4dGgXp3SyVLIIthCKQxCCuoZaXaSO/ilKd4sSdXRL0EWtIRYaSkXsJTH33utwSZM01xo0D353v+N+97l33/upQCAwFgwGfehiFYtFUxsYGPCmUqmv3YQTicSwBgCapnXTBQBoSinout5VVCnVDr/44B/OZH0xs6KMThCfR3LRs+aTycjvbwfCmawvduZkn7EwN4TBfheY90fXN6uYuffdyGQRu3apkmyDmzM2K8pYmBvC6kcLK+/KMEsWLCIQMSyLULUIFhH0HsGNycNYnDuO6PRno9lQSsFVh+tDQSEY6MHymzJKFQILgxkgYhALmBnMDLNsIf1sA8cG3VDYYzhFAWWfRBjCAiIbIxYQE1ga17+2GSICKLQYznCtiATEDK6BIrU5MUhgd0+NH+AIt+5jshdqgkpVwEwNkBgs9lyE4XY3nnLMWNf13QEAG1uE2JVe9PUC5JCvCMPrVpifOor1YnW34/pw7NjvVbmZ+3ljcTaMq5EjbRFJ07Gw8QfTd9fg96rc3o7bMh4f9SytvDenLl7/ZADAl5cjWF7dwmy60PaSeiPjo56lv2Ycnzi0Fp9AEgAu39x8+urtT9x5/GP74a2++LlTuumo76kDd4W9ALj9qIDIiOfBhdO+jtB9O279TFcuet77fD7Wn+sU7ajj1+kTSccb/wv/aymloEKh0Fg4HPZ2E87n86Udvs4FoWqwSHUAAAAASUVORK5CYII=" alt="" /></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/mobile-updater-application-block-teper-opensource/" >Mobile Updater Application Block теперь OpenSource</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/net-compact-framework/mobile-updater-application-block-teper-opensource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mobile MVC Framework &#8211; Большое в малом &#8211; Часть I</title>
		<link>http://mobile-developer.ru/net-compact-framework/mobile-mvc-framework-bolshoe-v-malom-chast-i/</link>
		<comments>http://mobile-developer.ru/net-compact-framework/mobile-mvc-framework-bolshoe-v-malom-chast-i/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 23:48:18 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=638</guid>
		<description><![CDATA[Рано или поздно в своей работе программист доходит до той точки, когда писать программы &#8220;на коленке&#8221; уже не имеет смысла, т.к. время &#8211; конечный ресурс и с каждым годом становится все более и более ценным. В таком случае полезным бывает использование уже существующих наработок как, непосредственно, для реализации того или иного функционала, так и для [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/mobile-mvc-framework-bolshoe-v-malom-chast-i/">Mobile MVC Framework &#8211; Большое в малом &#8211; Часть I</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/net-compact-framework/mobile-mvc-framework-bolshoe-v-malom-chast-i/&title=Mobile+MVC+Framework+&#8211;+Большое+в+малом+&#8211;+Часть+I&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Рано или поздно в своей работе программист доходит до той точки, когда писать программы &#8220;на коленке&#8221; уже не имеет смысла, т.к. время &#8211; конечный ресурс и с каждым годом становится все более и более ценным. В таком случае полезным бывает использование уже существующих наработок как, непосредственно, для реализации того или иного функционала, так и для разработки архитектуры ПО.</p>
<p>Удачным и довольно эффективным способом сократить время, необходимое на разработку архитектуры, является использование <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://ru.wikipedia.org/wiki/Шаблоны_проектирования" title="Что такое шаблоны проектирования можно узнать на Википедии"  target="_blank">шаблонов проектирования</a></noindex> (design patterns).</p>
<p>Одним из довольно популярных в наши дни шаблонов проектирования является <strong>Model-View-Controller</strong> (<strong>MVC</strong>, <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://ru.wikipedia.org/wiki/Model-View-Controller" >Модель-представление-контроллер</a></noindex>). Об использовании этого шаблона проектирования, в применении для разработки мобильных приложений на <strong>.NET Compact Framework</strong>, я расскажу в этот раз.</p>
<p><span id="more-638"></span>Итак, что нам дает MVC в общем? MVC позволяет разделить функционал приложения на три части:</p>
<ul>
<li><strong>Model (Модель)</strong> &#8211; содержит только данные и &#8220;ничего больше не делает&#8221;. На самом деле фраза в кавычках значит, что Model предоставляет API для получения данных, и API для реакции на запросы об изменении данных (обычно такие запросы приходят от контроллера), но на остальной функционал приложения или отдельного модуля, а также на функционал по отображению данных, модель не оказывает никакого влияния и даже не знает о них.</li>
<li><strong>Controller (Контроллер)</strong> &#8211; обрабатывает данные, введенные пользователем, и уведомляет Model и Controller о необходимости реакции на действия пользователя. Модель, в этом случае, может изменять состояние хранимых ею данных, а представление должно обеспечить отображение актуальных данных.</li>
<li><strong>View (представление)</strong> &#8211; отвечает за отображение актуальных данных, предоставляемых моделью. View &#8211; это то, что мы видим на экране, пользовательский интерфейс. При использовании шаблона MVC пользовательский интерфейс не может и не должен напрямую изменять данные. Он должен уведомлять контроллер о действии пользователя, а контроллер, если это необходимо, будет запрашивать изменение данных в модели.</li>
</ul>
<p>Использование MVC позволяет уменьшить зависимости между компонентами системы таким образом, что изменение одного компонента приводит к минимальным изменениям в остальных.</p>
<p>Но довольно теории. Перейдем к рассмотрению примера использования MVC для разработки приложений на .NET Compact Framework. Оказывается, что все велосипеды уже изобретены до нас, и для мобильных приложений уже существует реализация паттерна MVC &#8211; <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.codeplex.com/MobileMVC" title="Mobile MVC Framework"  target="_blank">Mobile MVC Framework</a></noindex>, который, вместе с исходным кодом, доступен на CodePlex.</p>
<p>Здесь и далее все примеры будут использовать именно эту библиотеку для реализации MVC.</p>
<p>Итак, давайте начнем знакомство.</p>
<p>Первое, что необходимо сделать, это создать приложение на <strong>.NET Compact Framework</strong>. Для этого в Microsoft Visual Studio выбираем меню File -> New -> Project и создаем <strong>Smart Device Project</strong> на C#.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-1.png" ><img class="alignnone size-full wp-image-639" title="Создание приложения на .NET Compact Framework" src="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-1.png" alt="Создание приложения на .NET Compact Framework" width="600" height="404" /></a></p>
<p>Указав название проекта, жмем OK. После этого необходимо выбрать тип приложения. Нам подходит &#8220;<strong>Device Application</strong>&#8221;</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-2.png" ><img class="alignnone size-full wp-image-640" title="Выбор типа приложения для .NET Compact Framework" src="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-2.png" alt="Выбор типа приложения для .NET Compact Framework" width="600" height="452" /></a></p>
<p>После того как наш проект создан, распаковываем исходный код <strong>Mobile MVC Framework</strong> в папку с решением.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-3.png" ><img class="alignnone size-full wp-image-641" title="Распаковываем исходный код Mobile MVC Framework в папку с решением" src="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-3.png" alt="Распаковываем исходный код Mobile MVC Framework в папку с решением" /></a></p>
<p>Добавляем проект библиотеки Mobile MVC Framework в решение.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-4.png" ><img class="alignnone size-full wp-image-642" title="Добавляем Mobile MVC Framework в решение" src="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-4.png" alt="Добавляем Mobile MVC Framework в решение" width="269" height="544" /></a></p>
<p>Для нашего приложения добавляем ссылку на проект библиотеки в References.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-5.png" ><img class="alignnone size-full wp-image-643" title="Добавляем Mobile MVC Framework в References для приложения" src="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-5.png" alt="Добавляем Mobile MVC Framework в References для приложения" /></a></p>
<p>Отлично. Мы получили пустое приложение с одной формой. Теперь займемся внесением изменений.</p>
<p>Создаем новую форму. Это будет форма ввода имени пользователя и пароля при старте приложения.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-6.png" ><img class="alignnone size-full wp-image-644" title="Создаем новую форму в проекте приложения" src="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-6.png" alt="Создаем новую форму в проекте приложения" /></a></p>
<p>На форму добавляем два компонента TextBox (для ввода имени пользователя и пароля), два компонента Label и в главное меню формы добавляем пункты OK и Exit.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-7.png" ><img class="alignnone size-full wp-image-645" title="Форма логина" src="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-7.png" alt="Форма логина" width="299" height="462" /></a></p>
<p>Теперь выполним изменения в исходном коде формы.</p>
<p>Формы в приложении, использующем Mobile MVC Framework должны быть отнаследованы от класса <strong>ViewForm</strong>. Для этого меняем у нашей формы имя родительского класса.</p>
<pre class="brush: cpp;">
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Mobile.Mvc;

namespace MobileMVCTest
{
    public partial class LoginForm : ViewForm
    {
        public LoginForm()
        {
            InitializeComponent();
        }
    }
}
</pre>
<p>По нажатию на кнопку OK наша форма будет отправлять уведомление контроллеру. Для того чтобы отправить уведомление о необходимости проверки логина и пароля, нам необходимо сохранить состояние формы. Состояние компонента сохраняется в переменной <strong>ViewData</strong>. Для уведомления контроллера используется метод <strong>OnViewStatChanged()</strong>. Каждое действие пользователя должно иметь уникальное имя, которое будет передано в качестве параметра в метод <strong>OnViewStatChanged()</strong>. Благодаря уникальному имени контроллер сможет идентифицировать действие пользователя и обработать его соответствующим образом. Уведомления от контроллера обрабатываются в методе <strong>OnUpdateView()</strong>. Все уведомления, приходящие от контроллера также будут иметь уникальные названия, с помощью которых форма сможет их идентифицировать и обработать.</p>
<p>Полный исходный код формы предствален ниже:</p>
<pre class="brush: cpp;">
namespace MobileMVCTest
{
    public partial class LoginForm : ViewForm
    {
        public LoginForm()
        {
            InitializeComponent();
        }

        private void mnuOK_Click(object sender, EventArgs e)
        {
            ViewData[&quot;Login&quot;] = txtLogin.Text;
            ViewData[&quot;Password&quot;] = txtPassword.Text;
            OnViewStateChanged(&quot;LoginAction&quot;);
        }

        private void mnuExit_Click(object sender, EventArgs e)
        {
            OnViewStateChanged(&quot;ExitAction&quot;);
        }

        protected override void OnUpdateView(string key)
        {
            if(key == &quot;LoginSuccess&quot;)
            {
                DialogResult = DialogResult.OK;
                Close();
            }
            else if(key == &quot;LoginError&quot;)
            {
                txtLogin.Text = string.Empty;
                txtPassword.Text = string.Empty;
                MessageBox.Show(&quot;Error&quot;);
            }
        }
    }
}
</pre>
<p>Редактирование формы мы закончили. Теперь нужно создать класс контроллера.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-8.png" ><img class="alignnone size-full wp-image-646" title="Создаем контроллер для формы логина" src="http://mobile-developer.ru/wp-content/uploads/2009/03/mobile-mvc-8.png" alt="Создаем контроллер для формы логина" /></a></p>
<p>Основной код в классе контроллера сосредоточен в методе OnViewStateChanged(), который вызывается из главной формы. Если приходит уведомление о том, что пользователь нажал кнопку &#8220;OK&#8221;, то выполняется проверка введенных данных. При соответствии данных форме отсылается уведомление &#8220;LoginSuccess&#8221;, в противном случае уведомление &#8220;LoginError&#8221;.</p>
<p>Если была нажата кнопка &#8220;Exit&#8221; (и в контроллер поступило уведомление &#8220;ExitAction&#8221;), то программа завершается.</p>
<pre class="brush: cpp;">
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Mobile.Mvc;
using System.Windows.Forms;

namespace MobileMVCTest
{
    class LoginController : Controller
    {
        public LoginController(IView view)
            : base(view)
        {
        }

        protected override void OnViewStateChanged(string key)
        {
            if(key == &quot;LoginAction&quot;)
            {
                if( (View.ViewData[&quot;Login&quot;].ToString() == &quot;TestLogin&quot;) &amp;&amp;
                    (View.ViewData[&quot;Password&quot;].ToString() == &quot;TestPassword&quot;))
                {
                    View.UpdateView(&quot;LoginSuccess&quot;);
                }
                else
                {
                    View.UpdateView(&quot;LoginError&quot;);
                }
            }
            if(key == &quot;ExitAction&quot;)
            {
                Application.Exit();
            }
        }
    }
}
</pre>
<p>Все идеально и просто. Форма не знает, каким образом обрабатываются введенные данные. Она всего лишь сохраняет свое состояние и уведомляет об этом контроллер. Контроллер также ничего не знает о том, какие есть контролы на форме. Он также сохраняет состояние и уведомляет форму.</p>
<p>Теперь нам осталось всего лишь внести небольшие изменения в класс приложения:</p>
<pre class="brush: cpp;">
using System;
using System.Linq;
using System.Collections.Generic;
using System.Windows.Forms;

namespace MobileMVCTest
{
    static class Program
    {
        /// &lt;summary&gt;
        /// The main entry point for the application.
        /// &lt;/summary&gt;
        [MTAThread]
        static void Main()
        {
            LoginForm loginForm = new LoginForm();
            LoginController controller = new LoginController(loginForm);
            if(loginForm.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainForm());
            }
        }
    }
}
</pre>
<p>Здесь мы создали форму и контроллер для нее. При успешном завершении работы формы (если данные об учетной записи пользователя были введены корректно) приложение продолжает свою работу. В противном случае приложение завершается.</p>
<p><strong>Продолжение следует&#8230;</strong></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/mobile-mvc-framework-bolshoe-v-malom-chast-i/" >Mobile MVC Framework &#8211; Большое в малом &#8211; Часть I</a></p>
<p style="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "pub-5188470588945412";
/* 468x60 - mobile-developer.ru */
google_ad_slot = "3657023452";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/net-compact-framework/mobile-mvc-framework-bolshoe-v-malom-chast-i/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Compact Framework: адаптируем графику приложения под текущую цветовую схему</title>
		<link>http://mobile-developer.ru/net-compact-framework/compact-framework-adaptiruem-grafiku-prilozheniya-pod-tekushhuyu-cvetovuyu-sxemu/</link>
		<comments>http://mobile-developer.ru/net-compact-framework/compact-framework-adaptiruem-grafiku-prilozheniya-pod-tekushhuyu-cvetovuyu-sxemu/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 22:34:36 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=616</guid>
		<description><![CDATA[В этот раз статья Андрея Коновалова о работе с графикой в .NET Compact Framework. Вступление Как известно, на Windows Mobile устройствах существует возможность смены цветовой схемы. В случае, если приложение не использует графические элементы, достаточно воспользоваться набором цветов, предоставляемых классом SystemColors, чтобы приложение соответствовало текущей схеме. Из наиболее часто используемых имеет смысл отметить ActiveCaption, ActiveCaptionText, [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/compact-framework-adaptiruem-grafiku-prilozheniya-pod-tekushhuyu-cvetovuyu-sxemu/">Compact Framework: адаптируем графику приложения под текущую цветовую схему</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/net-compact-framework/compact-framework-adaptiruem-grafiku-prilozheniya-pod-tekushhuyu-cvetovuyu-sxemu/&title=Compact+Framework:+адаптируем+графику+приложения+под+текущую+цветовую+схему&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>В этот раз статья <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://darkestmaster.habrahabr.ru/" >Андрея Коновалова</a></noindex> о работе с графикой в .NET Compact Framework.</p>
<h4>Вступление</h4>
<p>Как известно, на Windows Mobile устройствах существует возможность смены цветовой схемы. В случае, если приложение не использует графические элементы, достаточно воспользоваться набором цветов, предоставляемых классом SystemColors, чтобы приложение соответствовало текущей схеме. Из наиболее часто используемых имеет смысл отметить ActiveCaption, ActiveCaptionText, InactiveCaption, InactiveCaptionText, WindowText и.т.д. Также не стоит забывать про класс SystemBrushes, в котором представлены готовые для работы кисти — нет необходимости вызывать конструкторы и т.д.</p>
<p>Но что делать, когда есть набор изображений, которые должны соответствовать текущей цветовой схеме? Неужели делать набор картинок под все основные цвета?<br />
<span id="more-616"></span><br />
Это не самое лучшее решение — при любых изменениях в базовом изображении пришлось бы заново создавать все версии этого же изображения в разных оттенках.</p>
<p>Итак, что же остаётся? Очевидно, необходимо каким-то способом трансформировать базовое изображение «на лету». Известно, что самая главная компонента цветовой схемы содержится в реестре по адресу <strong>HKLM\Software\Microsoft\Color</strong>, в DWORD переменной <strong>BaseHue</strong>. В случае, если значение находится в диапазоне от 0 до 255, то у нас градации серого. От 256 до 510 — основная радуга <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Опытным путём было установлено, что различные темы частенько кладут в эту переменную «что попало», т.е. значение, существенно превышающее диапазон 0..510. В итоге, чтобы получить честный BaseHue, воспользуемся следующей функцией:</p>
<pre class="brush: cpp;">
private const String BASEHUE_PATH = &quot;HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Color&quot;;

public static int GetBaseHue()
{
  object baseHue = Registry.GetValue(BASEHUE_PATH, &quot;BaseHue&quot;, 0);
  int bh = baseHue == null ? 0: (int)baseHue;

  if (bh &lt; 255)
    return bh;
  else
    return (bh &amp; 0xFF) + 255;
}
</pre>
<p>Про реальный смысл значения BaseHue можно почитать тут: <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://en.wikipedia.org/wiki/HSL_color_space" >HSL color space</a></noindex>.</p>
<p>Если коротко, то при значении BaseHue от 0 до 255 у нас градации серого, значит saturation должен быть 0 (т.е. гарантированно grayscale изображение). В случае с диапазоном от 256 до 510, saturation уже идёт на наше усмотрение, по желанию. Меня устраивает и 255, т.е. максимально цветное изображение. Сейчас поясню, причём тут saturation.</p>
<p>Всё дело в том, что изображение у нас хранится в RGB модели, а BaseHue к RGB никакого отношения не имеет. В итоге получается, что есть необходимость произвести RGB -&gt; HSL преобразование для получения возможности «раскраски» базового изображения, а потом обратное HSL -&gt; RGB преобразование, чтобы получить уже реальные цвета для пикселей.</p>
<h4>Применение на примере кнопки с чекбоксом</h4>
<p>Итак, разберём последовательность действий на примере графической кнопки с чек-боксом и изготовим из неактивной кнопки активную, причём она будет гармонировать с текущей цветовой схемой. Возьмём приготовленное заранее изображение неактивной кнопки. Замечу, что у кнопки есть прозрачные зоны, они цвета magenta, их можно заметить по углам.</p>
<div id="attachment_617" class="wp-caption aligncenter" style="width: 410px"><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/orig-btn.png" ><img class="size-full wp-image-617" title="Оригинал" src="http://mobile-developer.ru/wp-content/uploads/2009/03/orig-btn.png" alt="Рис. 1 - Оригинал" width="400" height="112" /></a><p class="wp-caption-text">Рис. 1 - Оригинал</p></div>
<p>Первая трансформация — просто сделаем так, чтобы вся кнопка ушла в указанный BaseHue (в моём случае 391).</p>
<div id="attachment_618" class="wp-caption aligncenter" style="width: 410px"><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/hue-btn.png" ><img class="size-full wp-image-618" title="Произведено преобразование" src="http://mobile-developer.ru/wp-content/uploads/2009/03/hue-btn.png" alt="Рис. 2 - Произведено преобразование" width="400" height="112" /></a><p class="wp-caption-text">Рис. 2 - Произведено преобразование</p></div>
<p>Вот незадача, угловые пиксели, отвечающие за прозрачность тоже сменили цвет! Пройдёмся по полученной картинке и восстановим справедливость (перебирая оригинал и находя там прозрачные пиксели):</p>
<div id="attachment_619" class="wp-caption aligncenter" style="width: 410px"><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/hue2-btn.png" ><img class="size-full wp-image-619" title="«Прозрачные» пиксели восстановлены" src="http://mobile-developer.ru/wp-content/uploads/2009/03/hue2-btn.png" alt="Рис. 3 - «Прозрачные» пиксели восстановлены" width="400" height="112" /></a><p class="wp-caption-text">Рис. 3 - «Прозрачные» пиксели восстановлены</p></div>
<p>Да, с прозрачностью теперь всё хорошо, но больно уж некрасивыми остались галочка и бокс под ней. Добавим ещё справедливости:</p>
<div id="attachment_620" class="wp-caption aligncenter" style="width: 410px"><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/hue3-btn.png" ><img class="size-full wp-image-620" title="Восстановлена зона чек-бокса" src="http://mobile-developer.ru/wp-content/uploads/2009/03/hue3-btn.png" alt="Рис. 4 - Восстановлена зона чек-бокса" width="400" height="112" /></a><p class="wp-caption-text">Рис. 4 - Восстановлена зона чек-бокса</p></div>
<p>Вот этот проход, пожалуй, не такой простой, как предыдущий. Как же это было сделано?</p>
<p>Если приглядеться, то совершенно очевидно, что изображение кнопки, свободное от чекбокса, в общем-то, повторяется (кроме угловых скруглений). И ровно такая же подложка находится под чек-боксом. Какой вывод? У нас есть возможность сравнивать «пустой» фон с частью, где поверх этого фона лежит чек-бокс и в случае, если расхождение в R, G или B более чем некая константа (путём простого перебора мне подошло число 25), то в раскрашенной картинке можно заменить пиксель на пиксель из оригинала.</p>
<p>А вот пример того, если попробовать не использовать порог, а вырезать оригинал «в лоб»:</p>
<div id="attachment_621" class="wp-caption aligncenter" style="width: 410px"><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/hue4-btn.png" ><img class="size-full wp-image-621" title="Восстановлена зона чек-бокса без учёта порога" src="http://mobile-developer.ru/wp-content/uploads/2009/03/hue4-btn.png" alt="Рис. 5 - Восстановлена зона чек-бокса без учёта порога" width="400" height="112" /></a><p class="wp-caption-text">Рис. 5 - Восстановлена зона чек-бокса без учёта порога</p></div>
<h4>Немного кода</h4>
<p>Теперь о тонкостях реализации. В Compact Framework нет ни слова про RGB &lt;-&gt; HSL. Гугление достаточно быстро решило вопрос с преобразованиями — <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm" >RGB &lt;-&gt; HSL</a></noindex>. Но не сразу решило вопрос со скоростью преобразования. Как известно, managed код небыстр при работе с графикой, т.к. GetPixel жутко тормозит. Но и для этого решение было найдено. В MSDN-блоге про Windows Mobile обнаружился отличный пост про <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://blogs.msdn.com/windowsmobile/archive/2008/04/15/faster-c.aspx" >UnsafeBitmap</a></noindex> для оперативных манипуляций с пикселями.</p>
<p>Ниже представлена функция, которая достаточно быстро раскрашивает изображение по указанным hue, saturation, brigtness, используя <strong>UnsafeBitmap</strong>:</p>
<pre class="brush: cpp;">
public static Bitmap ApplyHueSaturation(Bitmap input, int hue, int sat, int brightness)
{
  if (input == null)
    return null;

  ColorHandler.RGB rgb;
  ColorHandler.HSV hsv;
  UnsafeBitmap ibmp = new UnsafeBitmap(input);
  UnsafeBitmap obmp = new UnsafeBitmap(new Bitmap(input.Width, input.Height));

  ibmp.LockBitmap();
  obmp.LockBitmap();

  for (int y = 0; y &lt; input.Height; y++)
  {
    for (int x = 0; x &lt; input.Width; x++)
    {
      UnsafeBitmap.PixelData c = ibmp.GetPixel(x, y);
      rgb.Red = c.red;
      rgb.Blue = c.blue;
      rgb.Green = c.green;

      hsv = ColorHandler.RGBtoHSV(rgb);
      hsv.Hue = hue;
      hsv.Saturation = sat;
      hsv.value += brightness;
      if (hsv.value &gt; 255)
        hsv.value = 255;
      if (hsv.value &lt; 0)
        hsv.value = 0;

      ColorHandler.RGB r = ColorHandler.HSVtoRGB(hsv);

      obmp.SetPixel(x, y, (byte)r.Red, (byte)r.Green, (byte)r.Blue);
    }
  }

  obmp.UnlockBitmap();
  ibmp.UnlockBitmap();

  return obmp.Bitmap;
}
</pre>
<p>Работающий пример можно скачать <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://athletesoft.com/habr/basehue/BaseHue.zip" >здесь</a></noindex>.</p>
<p>PS.: Скорость работы в реальности не поражает воображение, однако, я делаю преобразование только один раз, после чего смело кеширую, благо файлики небольшие всегда получаются, даже если это целый фон для VGA-разрешения.</p>
<p>PSS.: Да, при преобразованиях для оптимизации производительности, безусловно, можно сразу игнорировать прозрачные пиксели, чтобы избежать лишнего перебора изображения. Подобные шаги продемонстрированы исключительно для наглядности процесса.</p>
<p><strong>UPD:</strong> Недостаточно адаптировать изображения под текущую схему, необходимо также правильно их вывести. Скруглённые края могут остаться с фиолетовыми углами! <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Читайте <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://habrahabr.ru/blogs/mobiledev/44327/" >продолжение цикла</a></noindex> про работу с графикой в Compact Framework.</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://habrahabr.ru/blogs/mobiledev/44319/" >Оригинал на Хабре</a></noindex>.</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/compact-framework-adaptiruem-grafiku-prilozheniya-pod-tekushhuyu-cvetovuyu-sxemu/" >Compact Framework: адаптируем графику приложения под текущую цветовую схему</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/net-compact-framework/compact-framework-adaptiruem-grafiku-prilozheniya-pod-tekushhuyu-cvetovuyu-sxemu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compact Framework: Грани прозрачности</title>
		<link>http://mobile-developer.ru/net-compact-framework/compact-framework-grani-prozrachnosti/</link>
		<comments>http://mobile-developer.ru/net-compact-framework/compact-framework-grani-prozrachnosti/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 21:42:12 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=585</guid>
		<description><![CDATA[Еще одна интересная статья от Андрея Коновалова. В статье рассмотрены особенности реализации отрисовки изображений с прозрачностью при использовании .NET Compact Framework. Вступление К большому сожалению разработчиков, Compact Framework, да и native-функции тоже, не поддерживают альфа-канал с разной прозрачностью у индивидуальных пикселей. Это означает, что нет возможности создавать красоту неописуемую с плавными переходами между изображениями. Однако, [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/compact-framework-grani-prozrachnosti/">Compact Framework: Грани прозрачности</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/net-compact-framework/compact-framework-grani-prozrachnosti/&title=Compact+Framework:+Грани+прозрачности&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Еще одна интересная статья от <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://darkestmaster.habrahabr.ru/" >Андрея Коновалова</a></noindex>. В статье рассмотрены особенности реализации <strong>отрисовки изображений с прозрачностью при использовании .NET Compact Framework</strong>.</p>
<h4>Вступление</h4>
<p>К большому сожалению разработчиков, <strong>Compact Framework</strong>, да и native-функции тоже, не поддерживают альфа-канал с разной прозрачностью у индивидуальных пикселей. Это означает, что нет возможности создавать красоту неописуемую с плавными переходами между изображениями. Однако, что же делать, если хочется иметь хотя бы подобие &#8220;полного&#8221; альфа-канала, а именно, выводить полупрозрачные изображения, у которых есть ещё и полностью прозрачные участки?<br />
<span id="more-585"></span><br />
Рассмотрим два способа вывода изображений с прозрачностью.</p>
<h4>Способ №1. Фиксированый цвет является прозрачным</h4>
<pre class="brush: cpp;">
public static void DrawImageTransparent(Graphics g,
  Bitmap b, Point location, Color transColor)
{
  if (b == null || g == null)
    return;

  ImageAttributes attrib = new ImageAttributes();
  attrib.SetColorKey(transColor, transColor);

  Rectangle destRect = new Rectangle(location.X, location.Y, b.Width, b.Height);

  g.DrawImage(b, destRect, 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, attrib);
}
</pre>
<p>Стоит заметить, что только эта хитрая разновидность DrawImage позволяет выводить изображение с указанным ColorKey, по которому определяется, какие пиксели не рисовать. Шикарный набор параметров, не находите? <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Куда рисовать, мы задаём через Rectange, а откуда — через 4 параметра. Ну это я так, лирическое отступление в сторону Microsoft.</p>
<p>Собственно, именно DrawImageTransparent и есть основной способ рисования изображений с прозрачными пикселями. Однако минус этого способа очевиден, состояния прозрачности всего два: полностью прозрачно и совсем непрозрачно.</p>
<p>Пример:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/tranparency-edges-trans.png" ><img class="aligncenter size-full wp-image-586" title="Compact Framework - Грани прозрачности" src="http://mobile-developer.ru/wp-content/uploads/2009/03/tranparency-edges-trans.png" alt="Compact Framework - Грани прозрачности" width="490" height="268" /></a><br />
На самом деле, вполне неплохо, можно на этом и остановиться. Но хочется-то большего <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Способ №2. У всего изображения фиксированный коэффициент непрозрачности</h4>
<p>В этом случае без DllImport уже не обойтись, приготовим всё, что для этого необходимо:</p>
<pre class="brush: cpp;">
public struct BlendFunction
{
  public byte BlendOp;
  public byte BlendFlags;
  public byte SourceConstantAlpha;
  public byte AlphaFormat;
}

public enum BlendOperation : byte
{
  AC_SRC_OVER = 0x00
}

public enum BlendFlags : byte
{
  Zero = 0x00
}

public enum SourceConstantAlpha : byte
{
  Transparent = 0x00,
  Opaque = 0xFF
}

public enum AlphaFormat : byte
{
  AC_SRC_ALPHA = 0x01
}

public class PlatformAPI
{
  [DllImport(&quot;coredll.dll&quot;)]
  extern public static Int32 AlphaBlend(IntPtr hdcDest,
    Int32 xDest, Int32 yDest, Int32 cxDest, Int32 cyDest,
    IntPtr hdcSrc, Int32 xSrc, Int32 ySrc, Int32 cxSrc,
    Int32 cySrc, BlendFunction blendFunction);
}
</pre>
<p>Как видно, обрезано всё, что только можно обрезать — в enum-ах по одному параметру и т.д. Но тем не менее, продолжаем. Собственно, наша функция:</p>
<pre class="brush: cpp;">
public static void DrawAlpha(Graphics g, Bitmap b, Point location, byte opacity)
{
  if (b == null || g == null)
    return;

  using (Graphics gxSrc = Graphics.FromImage(g))
  {
    IntPtr hdcDst = g.GetHdc();
    IntPtr hdcSrc = gxSrc.GetHdc();
    BlendFunction blendFunction = new BlendFunction();
    blendFunction.BlendOp = (byte)BlendOperation.AC_SRC_OVER;
    blendFunction.BlendFlags = (byte)BlendFlags.Zero;
    blendFunction.SourceConstantAlpha = opacity;
    blendFunction.AlphaFormat = (byte)0;
    PlatformAPI.AlphaBlend(hdcDst, location.X, location.Y,
      b.Width, b.Height, hdcSrc, 0, 0, b.Width, b.Height, blendFunction);
    g.ReleaseHdc(hdcDst);
    gxSrc.ReleaseHdc(hdcSrc);
  }
}
</pre>
<p>Небольшие комментарии по коду — параметры у BlendFunction нельзя менять, они проставляются единственно возможные. Это обидно, но делать нечего.</p>
<p>Пример:<br />
<a href="http://mobile-developer.ru/wp-content/uploads/2009/03/transparency-edges-alpha.png" ><img class="aligncenter size-full wp-image-587" title="Compact Framework - грани прозрачности" src="http://mobile-developer.ru/wp-content/uploads/2009/03/transparency-edges-alpha.png" alt="Compact Framework - грани прозрачности" width="490" height="268" /></a><br />
Жутковато, да? Противные фиолетовые пиксели никуда не делись и тоже стали немного прозрачными <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<h4>Комбинированное использование обоих способов</h4>
<p>Вариантов комбинирования у нас, к сожалению, немного. На первый взгляд их совсем нет <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Но есть всё-таки один способ.</p>
<p>Итак, решение следующее. Раз мы не можем одновременно задать <strong>ColorKey</strong> и вызвать <strong>AlphaBlend</strong>, будем использовать их по очереди. Сначала нарисуем фон стандартным спосбом без изысков, затем кнопку первым спосбом, а в конце… вторым спосбом нарисуем поверх фон с небольшим коэффициентом непрозрачности!</p>
<pre class="brush: cpp;">
g.DrawImage(background, 0, 0);
DrawImageTransparent(g, button, new Point(10, 10), Color.FromArgb(255, 0, 255));
DrawAlpha(g, background, new Point(0, 0), 75);
</pre>
<p>Результат:<br />
<a href="http://mobile-developer.ru/wp-content/uploads/2009/03/transparency-edges-alpha-trans.png" ><img src="http://mobile-developer.ru/wp-content/uploads/2009/03/transparency-edges-alpha-trans.png" alt="Compact Framework - Грани прозрачности" title="Compact Framework - Грани прозрачности" width="490" height="268" class="aligncenter size-full wp-image-588" /></a></p>
<p>Описанный выше способ вполне жизнеспособен. Я им пользуюсь и вполне удовлетворён скоростью работы — на отрисовку всех элементов интерфейса в подобном стиле уходит в среднем от 60 до 80 миллисекунд (проверялось на разнообразных устройствах). Для создания приложения в таком стиле, безусловно, стандартные контролы не подойдут, но а кто обещал, что будет легко? В любом случае, для создания неописуемой красоты без собственного фреймворка рендеринга графических элементов не обойтись.</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://habrahabr.ru/blogs/mobiledev/44327/" >Оригинал статьи на Хабре.</a></noindex></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/compact-framework-grani-prozrachnosti/" >Compact Framework: Грани прозрачности</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/net-compact-framework/compact-framework-grani-prozrachnosti/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Кросс-платформенная разработка — Windows Mobile и Windows (.NET Compact Framework, C#)</title>
		<link>http://mobile-developer.ru/net-compact-framework/kross-platformennaya-razrabotka-windows-mobile-i-windows-net-compact-framework-c/</link>
		<comments>http://mobile-developer.ru/net-compact-framework/kross-platformennaya-razrabotka-windows-mobile-i-windows-net-compact-framework-c/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 11:17:44 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=571</guid>
		<description><![CDATA[В этот раз статья от Андрея Коновалова о том, как сделать мультиплатформенный проект в Visual Studio с использованием .NET Compact Framework. Не так много разработчиков осознают, что разрабатывая приложения для платформы Windows Mobile с использованием Compact Framework, у них существуют шансы собрать это же приложение под десктоп версию Windows! Я и сам об этом долгое [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/kross-platformennaya-razrabotka-windows-mobile-i-windows-net-compact-framework-c/">Кросс-платформенная разработка — Windows Mobile и Windows (.NET Compact Framework, C#)</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/net-compact-framework/kross-platformennaya-razrabotka-windows-mobile-i-windows-net-compact-framework-c/&title=Кросс-платформенная+разработка+—+Windows+Mobile+и+Windows+(.NET+Compact+Framework,+C#)&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>В этот раз статья от <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://darkestmaster.habrahabr.ru/" >Андрея Коновалова</a></noindex> о том, как сделать мультиплатформенный проект в Visual Studio с использованием .NET Compact Framework.<br />
Не так много разработчиков осознают, что разрабатывая приложения для платформы Windows Mobile с использованием Compact Framework, у них существуют шансы собрать это же приложение под десктоп версию Windows! Я и сам об этом долгое время только задумывался, предполагая, что подобная возможность есть, но не рассматривал её как нечто, хоть сколько-нибудь реальное.</p>
<p>Существует несколько важных аспектов, которые нужно понимать, чтобы успешно организовать кросс-платформенную сборку. Я потратил прилично времени, собирая обломки знаний в разных местах сети, причём местами было настолько нетривиально, что решил поделиться с хабрасообществом тонкостями.<br />
<span id="more-571"></span></p>
<h4>Во-первых, во-вторых, в-третьих&#8230;</h4>
<p>Во-первых, необходимо изначально создавать приложение для Windows Mobile (т.е. это основная платформа). Это действительно важно. Причин несколько, но основная заключается в том, что Compact Framework на то и компактный, что там существенно меньше классов и свойств у классов. Т.е. совместимость с десктопом есть, но односторонняя, т.е. только в сторону десктопа.</p>
<p>Во-вторых, нужно понимать, что отличия в приложении всё-таки будут и их придётся программировать отдельно. Например, стандартное меню, находящееся внизу на Windows Mobile автоматически перемещается наверх, и там Cancel и More выглядят не очень привлекательно. Далее, на десктопе в принципе нет InputPanel. Т.е. по сути нужно быть готовым к инструкциям компилятору #if #else #endif.</p>
<p>В-третьих, надо также готовиться к тому, что будут некоторые ограничения, касающиеся дизайна форм. А именно, нельзя открывать форму визуальным редактором при десктопе, выбранном в качестве текущего таргета — сразу же в *.Designer.cs налетит множество свойств, не поддерживаемых мобильным фреймворком — придётся откатывать.</p>
<p>В-четвёртых, придётся вручную править *.csproj файлы и видеть в Solution Explorer-е жёлтые треугольники — это нормально <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>В пятых, не все сборки и неймспесы на 100% работают на десктопе. Например, я совершенно не уверен в том, что SQL Server Compact собирается на десктопе. Не проверял, поэтому не обещаю. Точно знаю, что с SQLite всё хорошо (хотя и придётся попотеть немного).</p>
<p>В-шестых, нужно разобраться, как можно отлаживать приложение на десктопе, ведь все знают, что при сборке мобильного приложения необходимо выбрать некое устройство, физическое или эмулятор!</p>
<p>Попробуем разобраться с основными тонкостями.</p>
<h4>Desktop Target</h4>
<p>Начнём с того, что у нас должен быть некоторый проект, созданный для Compact Framework. Создадим новый таргет через Build-&gt;Configuration Manager:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/winmobile-and-win-confmgr.jpg" ><img class="aligncenter size-full wp-image-572" title="Windows Mobile and Windows - Configuration Manager" src="http://mobile-developer.ru/wp-content/uploads/2009/03/winmobile-and-win-confmgr.jpg" alt="Windows Mobile and Windows - Configuration Manager" width="600" height="374" /></a>После этого добавим символ условной компиляции в свойствах проекта:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/03/winmobile-and-win-projprops.jpg" ><img class="aligncenter size-full wp-image-573" title="Windows Mobile and Windows - Project Settings" src="http://mobile-developer.ru/wp-content/uploads/2009/03/winmobile-and-win-projprops.jpg" alt="Windows Mobile and Windows - Project Settings" width="654" height="272" /></a>Начало положено. Посмотрим теперь, что делать, чтобы обеспечить подключение правильных сборок в нужном таргете. По умолчанию в нашем csproj файле нет никаких разделений по таргетам:</p>
<pre class="brush: xml;">
 &lt;ItemGroup&gt;
  &lt;Reference Include=&quot;mscorlib&quot; /&gt;
  &lt;Reference Include=&quot;System&quot; /&gt;
  &lt;Reference Include=&quot;System.Data&quot; /&gt;
  &lt;Reference Include=&quot;System.Drawing&quot; /&gt;
  &lt;Reference Include=&quot;System.Windows.Forms&quot; /&gt;
  &lt;Reference Include=&quot;System.Xml&quot; /&gt;
 &lt;/ItemGroup&gt;
</pre>
<p>Чтобы иметь полный контроль, необходимо организовать примерно следующий финт:</p>
<pre class="brush: xml;">
&lt;ItemGroup Condition=&quot; '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' &quot;&gt;
  &lt;Reference Include=&quot;mscorlib&quot;&gt;
   &lt;Private&gt;False&lt;/Private&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;Microsoft.WindowsMobile, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&quot;&gt;
   &lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt;
   &lt;HintPath&gt;..\..\..\..\..\Program Files\Windows Mobile 6 SDK\Managed Libraries\Microsoft.WindowsMobile.dll&lt;/HintPath&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;Microsoft.WindowsMobile.Status, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&quot;&gt;
   &lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt;
   &lt;HintPath&gt;..\..\..\..\..\Program Files\Windows Mobile 6 SDK\Managed Libraries\Microsoft.WindowsMobile.Status.dll&lt;/HintPath&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;Microsoft.WindowsCE.Forms&quot;&gt;
   &lt;Private&gt;True&lt;/Private&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;System&quot; /&gt;
  &lt;Reference Include=&quot;System.Data&quot;&gt;
   &lt;Private&gt;False&lt;/Private&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;System.Windows.Forms&quot; /&gt;
  &lt;Reference Include=&quot;System.Drawing&quot; /&gt;
  &lt;Reference Include=&quot;System.Data.SQLite, Version=1.0.60.0, Culture=neutral, PublicKeyToken=1fdb50b1b62b4c84, processorArchitecture=MSIL&quot;&gt;
   &lt;Private&gt;True&lt;/Private&gt;
   &lt;HintPath&gt;..\..\..\..\..\Program Files\SQLite.NET\bin\CompactFramework\SQLite.Interop.060.DLL&lt;/HintPath&gt;
  &lt;/Reference&gt;
 &lt;/ItemGroup&gt;

 &lt;ItemGroup Condition=&quot; '$(Configuration)|$(Platform)' == 'Desktop|AnyCPU' &quot;&gt;
  &lt;Reference Include=&quot;mscorlib&quot;&gt;
   &lt;Private&gt;False&lt;/Private&gt;
   &lt;HintPath&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll&lt;/HintPath&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86&quot;&gt;
   &lt;HintPath&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll&lt;/HintPath&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;System.Windows.Forms&quot;&gt;
   &lt;HintPath&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll&lt;/HintPath&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;System.Drawing&quot;&gt;
   &lt;HintPath&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll&lt;/HintPath&gt;
  &lt;/Reference&gt;
  &lt;Reference Include=&quot;System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86&quot; /&gt;
  &lt;Reference Include=&quot;System.Data.SQLite, Version=1.0.60.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86&quot;&gt;
   &lt;Private&gt;True&lt;/Private&gt;
   &lt;HintPath&gt;..\..\..\..\..\Program Files\SQLite.NET\bin\System.Data.SQLite.DLL&lt;/HintPath&gt;
  &lt;/Reference&gt;
 &lt;/ItemGroup&gt;
</pre>
<p>Как видно, мы разделяем блоки ItemGroup по таргетам и указываем разные пути до сборок. Признаюсь, что именно здесь я возился дольше всего в моём проекте. Правильные версии выдирались прямо из сообщений об ошибках компиляции <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Т.е. компилятор ругался, что не находятся такие-то нужные сборки и я подставлял правильные значения. И именно здесь я несколько раз порывался бросить всё, т.к. гуглятся подобные ошибки очень плохо.</p>
<p>В результате хитрых манипуляций с csproj файлом получается такая ерунда в Solution Explorer:<br />
<a href="http://mobile-developer.ru/wp-content/uploads/2009/03/winmobile-and-win-warnings.jpg" ><img src="http://mobile-developer.ru/wp-content/uploads/2009/03/winmobile-and-win-warnings.jpg" alt="Windows Mobile and Windows - Warnings" title="Windows Mobile and Windows - Warnings" width="249" height="305" class="aligncenter size-full wp-image-574" /></a><br />
Это нормально, т.к. Visual Studio не совсем пригодна к таким извращениям (хотя и позволяет их в итоге).</p>
<h4>#if #endif</h4>
<p>Когда сборки подключаются правильные, мы имеем возможность для каждой платформы использовать тот максимум, который каждая из платформ поддерживает. Напомню, однако, что автоматическая кодогенерация дизайнера форм нам тут всё портит. Поэтому необходимо, по возможности, сначала всё надизайнить, а потом уже править только руками — ведь при перегенерации *.Designer.cs, студия не сохраняет наши правки и добавления #if endif участков.</p>
<p>Немного хитрый момент. Мой проект поддерживает как QVGA, так и VGA разрешение, однако, в Designer.cs у форм свойство ClientSize всегда соответствует QVGA разрешению. На десктопе же иметь окно размером 240х268 как-то неправильно, особенно, когда есть VGA-скин. Поэтому в конструкторе после InitializeComponent() я помещаю участок условной компиляции:</p>
<p>    Size vertSize = new Size(480, 560);<br />
    Size horisSize = new Size(640, 480);<br />
[...]<br />
      InitializeComponent();<br />
#if Desktop<br />
      this.ClientSize = vertSize;<br />
      this.FormBorderStyle = FormBorderStyle.Fixed3D;<br />
      this.MaximizeBox = false;<br />
      this.MouseWheel += new MouseEventHandler(MainController_MouseWheel);<br />
#endif</p>
<p>Как видно, у меня объявлено две переменные типа Size. Зачем это нужно? Просто-напросто, у меня по F9 происходит переключение ClientSize, для эмуляции смены ориентации экрана. Полезно, когда необходимо протестировать OnResize. Да и в конце концов, есть же нетбуки с 800х480, для них ландшафтная ориентация — единственно возможная, чтобы всё поместилось на экране <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Также видно, что MouseWheel тоже обрабатывается только на десктопе. </p>
<h4>System.Diagnostics.Conditional</h4>
<p>Есть удобный способ указывать, для какого таргета собирать некоторый метод:</p>
<pre class="brush: cpp;">
[Conditional(&quot;Desktop&quot;)]
public void SomeDesktopMethod()
{
}
</pre>
<p>В данном способе хорошо то, что вызовы данного метода могут существовать в коде, но при наличии данного атрибута, вызовы будут просто проигнорированы на других таргетах! Альтернатива с использованием #if #endif предполагает, что везде, где нужен вызов, необходимо проставить проверку, чтобы компилировать или не компилировать вызов на нужной платформе.</p>
<h4>Отладка на десктопе</h4>
<p>Существует два способа отладки. Первый (неудобный) заключается в том, мы идём в bin\Desktop\, запускаем exe-файл и потом в студии говорим Debug — Attatch to process. Этот способ сначала кажется единственно возможным. Но! Есть мега-хак, неофициальный и неподдерживаемый способ (который, тем не менее, работает как в VS2005, так и в VS2008). Способ следующий:</p>
<ul>
<li>В студии открыть Tools/Options, далее в дереве выбрать Device Tools/Devices.</li>
<li>В выпадающем меню выбрать платформу, для которой необходимо организовать отладку на десктопе. Это будет необходимо повторить для всех платформ, где необходимо.</li>
<li>Далее нужно выбрать любой из эмуляторов и нажать [Save As…]. Удобно назвать копию &#8220;My Computer&#8221;.</li>
<li>Теперь надо закрыть студию и открыть %USERPROFILE%\Local Settings\Application Data\Microsoft\CoreCon\1.0\conman_ds_platform.xsl файл в текстовом редакторе.</li>
<li>В файле необходимо найти <DEVICE …> элемент, соответствующий свежесозданному &#8220;дивайсу&#8221;</li>
<li>Далее добавляем следующую строку — <PROPERTY ID="IsDesktopDevice" Name="IsDesktopDevice">true</PROPERTY>  сразу после тега <PROPERTYCONTAINER>.</li>
<li>Сохраняем conman_ds_platform.xsl и перезапускаем студию</li>
</ul>
<p>Ну вот, теперь нам доступен отладчик и все вкусности десктопной отладки.</p>
<h4>Заключение</h4>
<p>Чтож, в статье перечислены основные подводные камни, с которыми я столкнулся в процессе сборки своего проекта под Windows. Далее всё было делом техники — ловил исключения и разбирался в их причине. Среди них были не найденные пути, которые, очевидно, на десктопе отличаются и т.д., но это всё уже было ничто, по сравнению с начальными проблемами.</p>
<p><strong>PS.</strong> Почти всё, что описано выше, я выстрадал в результате долгих поисков, и вот, в самом конце, когда я искал способ отладки на десктопе, я натолкнулся на шикарную статью Дениела Моса о кросс-платформенной компиляции для Compact Framework <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Моя статья ни в коем случае не является переводом, однако, не могу не дать на неё <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.danielmoth.com/Blog/2005/01/deploy-to-my-computer.html" >ссылку</a></noindex>.</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://habrahabr.ru/blogs/mobiledev/54539/" >Оригинал статьи на Хабре</a></noindex>.</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/kross-platformennaya-razrabotka-windows-mobile-i-windows-net-compact-framework-c/" >Кросс-платформенная разработка — Windows Mobile и Windows (.NET Compact Framework, C#)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/net-compact-framework/kross-platformennaya-razrabotka-windows-mobile-i-windows-net-compact-framework-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mobile Application Blocks. Наконец-то дождались!</title>
		<link>http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-nakonec-to-dozhdalis/</link>
		<comments>http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-nakonec-to-dozhdalis/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 21:32:40 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[SDK]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=486</guid>
		<description><![CDATA[На CodePlex наконец-то появился первый релиз Mobile Application Block. Mobile Application Block &#8211; это набор готовых решений типовых задач, возникающих при разработке приложений для мобильных устройств на платформе .NET Compact Framework. Как пишут сами авторы, это порт Mobile Client Software Factory для Visual Studio 2008 с более легковесным механизмом Dependency Injection. В текущей версии доступны [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-nakonec-to-dozhdalis/">Mobile Application Blocks. Наконец-то дождались!</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-nakonec-to-dozhdalis/&title=Mobile+Application+Blocks.+Наконец-то+дождались!&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>На CodePlex наконец-то появился первый релиз <strong>Mobile Application Block</strong>.</p>
<p><strong>Mobile Application Block</strong> &#8211; это набор готовых решений типовых задач, возникающих при разработке приложений для мобильных устройств на платформе <strong>.NET Compact Framework</strong>.</p>
<p>Как пишут сами авторы, это порт <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://msdn.microsoft.com/en-us/library/aa480471.aspx" title="Узнать больше о Mobile Client Software Factory"  target="_blank">Mobile Client Software Factory</a></noindex> для Visual Studio 2008 с более легковесным механизмом <strong>Dependency Injection</strong>.</p>
<p>В текущей версии доступны такие блоки как:</p>
<ul>
<li>Configuration</li>
<li>ConnectionMonitor</li>
<li>ContainerModel</li>
<li>DataAccess</li>
<li>DisconnectedAgent</li>
<li>EndpointCatalog</li>
<li>PasswordAuthentication</li>
</ul>
<p>Диаграммы классов нескольких блоков можно посмотреть ниже:</p>
<div id="attachment_487" class="wp-caption aligncenter" style="width: 474px"><a href="http://mobile-developer.ru/wp-content/uploads/2009/02/mab-configuration.png" ><img class="size-full wp-image-487" title="Mobile Application Block - Configuration - Class Diagram" src="http://mobile-developer.ru/wp-content/uploads/2009/02/mab-configuration.png" alt="Mobile Application Block - Configuration - Class Diagram" width="464" height="294" /></a><p class="wp-caption-text">Mobile Application Block - Configuration - Class Diagram</p></div>
<div id="attachment_487" class="wp-caption aligncenter" style="width: 610px"><a href="http://mobile-developer.ru/wp-content/uploads/2009/02/mab-container-model.png" ><img class="alignnone size-full wp-image-488" title="Mobile Application Block - ContainerModel - Class Diagram" src="http://mobile-developer.ru/wp-content/uploads/2009/02/mab-container-model.png" alt="Mobile Application Block - ContainerModel - Class Diagram" width="600" height="572" /></a><p class="wp-caption-text">Mobile Application Block - ContainerModel - Class Diagram</p></div>
<div id="attachment_487" class="wp-caption aligncenter" style="width: 610px"><br />
<a href="http://mobile-developer.ru/wp-content/uploads/2009/02/mab-disconnected-agent.png" ><img class="alignnone size-full wp-image-489" title="Mobile Application Block - Disconnected Agent - Class Diagram" src="http://mobile-developer.ru/wp-content/uploads/2009/02/mab-disconnected-agent.png" alt="Mobile Application Block - Disconnected Agent - Class Diagram" width="600" height="404" /></a><p class="wp-caption-text">Mobile Application Block - Disconnected Agent - Class Diagram</p></div>
<p>Все это добро весит совсем немного, после установки для каждого блока создается Visual Studio Solution с примером и юнит-тестами, так что процесс ознакомления с функционалом, предоставляемым MAB должен пройти быстро и безболезненно.</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://mobile.codeplex.com/" title="Скачать Mobile Application Block"  target="_blank">Скачать Mobile Application Block можно на странице проекта</a></noindex>.</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-nakonec-to-dozhdalis/" >Mobile Application Blocks. Наконец-то дождались!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/net-compact-framework/mobile-application-blocks-nakonec-to-dozhdalis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как программно сменить имя устройства в Windows Mobile</title>
		<link>http://mobile-developer.ru/wxwince/kak-programmno-smenit-imya-ustrojstva-v-windows-mobile/</link>
		<comments>http://mobile-developer.ru/wxwince/kak-programmno-smenit-imya-ustrojstva-v-windows-mobile/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 01:42:21 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[.NET Compact Framework]]></category>
		<category><![CDATA[wxWinCE]]></category>
		<category><![CDATA[Windows CE]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=462</guid>
		<description><![CDATA[Имя устройства в Windows Mobile хранится в реестре. Это параметр Name ключа HKEY_LOCAL_MACHINE\Ident. Имя устройства используется для отображения устройства при синхронизации с настольным компьютером и, например, при обзоре Wi-Fi или Bluetooth устройств. В этом посте я расскажу как получить и изменить имя устройства с помощью Native API и с помощью .NET Compact Framework. На имена [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/wxwince/kak-programmno-smenit-imya-ustrojstva-v-windows-mobile/">Как программно сменить имя устройства в Windows Mobile</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/wxwince/kak-programmno-smenit-imya-ustrojstva-v-windows-mobile/&title=Как+программно+сменить+имя+устройства+в+Windows+Mobile&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Имя устройства в Windows Mobile хранится в реестре. Это параметр <strong>Name</strong> ключа <strong>HKEY_LOCAL_MACHINE\Ident</strong>. Имя устройства используется для отображения устройства при синхронизации с настольным компьютером и, например, при обзоре Wi-Fi или Bluetooth устройств.</p>
<p>В этом посте я расскажу как получить и изменить имя устройства с помощью Native API и с помощью .NET Compact Framework.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/02/mobile-device-name.png" ><img class="aligncenter size-full wp-image-463" title="Change Mobile Device Name" src="http://mobile-developer.ru/wp-content/uploads/2009/02/mobile-device-name.png" alt="Change Mobile Device Name" width="342" height="357" /></a><br />
<span id="more-462"></span><br />
На имена устройств накладываются определенные ограничения:</p>
<ul>
<li>имя должно содержать от 1 до 15 символов.</li>
<li>Первый символ должен быть из диапазона &#8216;a&#8217;-'z&#8217; или &#8216;A&#8217;-'Z.&#8217;</li>
<li>Остальные символы &#8216;a&#8217;-'z&#8217;, &#8216;A&#8217;-'Z&#8217;, &#8217;0&#8242;-&#8217;9&#8242;, или &#8216;-.&#8217;</li>
</ul>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://msdn.microsoft.com/en-us/library/ms881787.aspx" >Более подробно об именовании мобильных устройств можно узнать в MSDN</a></noindex>.</p>
<p>А вот и примеры:</p>
<p><strong>Native API (C++)</strong></p>
<pre class="brush: cpp;">
int _tmain(int argc, _TCHAR* argv[])
{
	HKEY hKey = NULL;
	DWORD dataSize(0);
	BYTE * data = NULL;
	do
	{
		if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T(&quot;Ident&quot;), 0,  KEY_READ, &amp;hKey)
			!= ERROR_SUCCESS) break;

		if(RegQueryValueEx(hKey, _T(&quot;Name&quot;), NULL, NULL, NULL, &amp;dataSize)
			!= ERROR_SUCCESS) break;

		int allocatedSize = max((int)(dataSize+1), (int)256);
		data = new BYTE[allocatedSize];
		ZeroMemory(data, allocatedSize);
		if(RegQueryValueEx(hKey, _T(&quot;Name&quot;), NULL, NULL, data, &amp;dataSize)
			!= ERROR_SUCCESS) break;
		MessageBox(0, (LPCTSTR)data, _T(&quot;Device Name&quot;), MB_OK);
#if defined _UNICODE
		wsprintf((LPTSTR)data, _T(&quot;SampleName&quot;));
#else
		sprintf((LPTSTR)data, _T(&quot;SampleName&quot;));
#endif
		if(RegSetValueEx(hKey, _T(&quot;Name&quot;), NULL, REG_SZ, data,
#if defined _UNICODE
			wcslen((wchar_t*)data)*sizeof(wchar_t)
#else
			strlen((char*)data)
#endif
			)
			!= ERROR_SUCCESS) break;
	}
	while(false);
	if(data) delete [] data;
	if(hKey) RegCloseKey(hKey);
	return 0;
}
</pre>
<p>Указанный выше способ работает как для ANSI так и для UNICODE-сборки проекта.</p>
<p><strong>wxWidgets (wxWinCE)</strong></p>
<pre class="brush: cpp;">
bool MobileDeviceNameMainFrame::SetDeviceName(const wxString &amp; newDeviceName)
{
	do
	{
		if(newDeviceName.IsEmpty())
		{
			wxLogError(_(&quot;Device name can't be empty&quot;));
			break;
		}
		wxRegKey key(wxRegKey::HKLM, wxT(&quot;Ident&quot;));
		if(!key.Open())
		{
			wxLogError(_(&quot;Unable to open registry key&quot;));
			break;
		}
		key.SetValue(wxT(&quot;Name&quot;), newDeviceName);
		key.Close();
		return true;
	}
	while(false);
	return false;
}

wxString MobileDeviceNameMainFrame::GetDeviceName()
{
	do
	{
		wxRegKey key(wxRegKey::HKLM, wxT(&quot;Ident&quot;));
		if(!key.Open())
		{
			wxLogError(_(&quot;Unable to open registry key&quot;));
			break;
		}
		wxString result;
		if(!key.QueryValue(wxT(&quot;Name&quot;), result)) break;
		return result;
	}
	while (false);
	return wxEmptyString;
}
</pre>
<p><strong>.NET Compact Framework</strong></p>
<pre class="brush: cpp;">
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(&quot;Ident&quot;, true))
            {
                deviceNameTextCtrl.Text = key.GetValue(&quot;Name&quot;).ToString();
            }
        }

        private void btnChangeDeviceName_Click(object sender, EventArgs e)
        {
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(&quot;Ident&quot;, true))
            {
                key.SetValue(&quot;Name&quot;, deviceNameTextCtrl.Text);
            }
        }
    }
</pre>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/02/mobiledevicename.7z"  title="Скачать исходник: Как сменить имя устройства в Windows Mobile">Скачать исходный код к статье</a>.</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/wxwince/kak-programmno-smenit-imya-ustrojstva-v-windows-mobile/" >Как программно сменить имя устройства в Windows Mobile</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/wxwince/kak-programmno-smenit-imya-ustrojstva-v-windows-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
