Сайт для программистов

воскресенье, 3 апреля 2011 г.

ClipCursor

Недавно редактировал страницы описаний функций Windows API для Visual Basic 6.0 (http://rusproject.narod.ru/api/winapi.htm) и обратил внимание, что не написал аналога функции ClipCursor для другого Справочника по функциям Windows API для .NET Framework. Решил восполнить пробел. Сама функция интересна тем, что с ее помощью можно запереть курсор мыши в замкнутом пространстве. Это дает простор для создания различных шуток и розыгрышей (эх, 1 апреля пропустил). Только учтите, что даже при закрытии приложения мышь будет метаться в заданном вами прямоугольнике! Поэтому необходимо предусмотреть возможность восстановить работоспособность бедной мышки. По секрету скажу, что комбинации клавиш Ctrl+Alt+Del или Alt+Tab позволяют освободить мышь из плена. Теперь сам пример.

// Временно ограничим перемещения курсора областью формы Form1
[DllImport("user32.dll")]
static extern bool ClipCursor(ref RECT lpRect);

[DllImport("user32.dll")]
public static extern int GetWindowRect(IntPtr hwnd, ref RECT lpRect);

[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow();

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}

private void button1_Click(object sender, EventArgs e)
{
RECT rc = new RECT(); // прямоугольник ограничения
GetWindowRect(this.Handle, ref rc); // помещаем координаты окна в прямоугольник
ClipCursor(ref rc); // ограничиваем перемещения курсора
}

private void button2_Click(object sender, EventArgs e)
{
//код для "освобождения" курсора.
RECT rc = new RECT(); // прямоугольник ограничения
IntPtr hWind = GetDesktopWindow(); // получаем описатель рабочего стола
GetWindowRect(hWind, ref rc); // помещаем координаты рабочего стола в прямоугольник
ClipCursor(ref rc); // "ограничиваем" курсор целым экраном
}

воскресенье, 13 февраля 2011 г.

Microsoft+Nokia: В одну кучку гоп!

В последние дни очень активно обсуждается тема будущего совместного сотрудничества между компаниями Nokia и Microsoft. Мнения по этому поводу разделились диаметрально противоположным образом. Я тоже решил высказать здесь свое мнение, чтобы спустя некоторое время проверить, насколько был прав.
Во-первых, для меня очевидно, что и Nokia и Microsoft переживают трудные времена в области мобильных телефонов. Рынок телефонов сейчас является лакомым кусочком для многих компаний, и поэтому таким гигантам очень обидно проигрывать на этом участке, учитывая их амбиции.
Примечательно, что сами компании вслух отрицают, что дела у них плохо. И стараются делать хорошую мину при плохой игре. Например, просто замалчивают результаты своих продаж, или составляют статистику немного хитрым образом. Но независимые аналитики доказывают, что доля Nokia и Microsoft на рынке падает. А потребитель выбирает iPhone и телефоны на базе Android.
В конце концов Nokia сдалась и призналась, что они стали аутсайдерами в гонке. Это признание сделал новый главный руководитель Nokia в закрытом письме для сотрудников. Позже он подтвердил свое авторство письма, когда оно стало достоянием общественности.
Microsoft пока держится и не делает никаких признаний. Но косвенные улики указывают на плачевное состояние дел. Во-первых, компания упорно не раскрывает статистику продаж. Особенно смешно это выглядит на фоне парадных рапортов о рекордных продажах Windows 7, MS Office, Kinect. Далее стали просачиваться осторожные высказывания некоторых партнеров MS, которые сетуют на то, что они рассчитывали на более высокие продажи, но при этом быстро добавляли, что сама система им очень-очень нравится (правда, правда). Видимо, чтобы не вызвать праведного гнева корпорации.
Я долго ждал, кто же первым произнесет слово Провал в отношении Windows Phone 7. И, наконец-то, дождался. Первым смельчаком оказался известный аналитик Эльдар Муртазин.
Так что же нам ждать от объединения Nokia и Microsoft? А никто не знает. Во-первых, было произнесено слишком много общих слов. Во-вторых, две компании с богатыми потенциальными возможностями не всегда могут составить идеальную пару, даже став союзниками. Лично я скептически отношусь к новообразованному союзу. И вот почему. Nokia собирается переходить на систему Windows Phone 7, которая и так уже ничем не удивила пользователя. Да, число владельцев Windows Phone 7 увеличится, но оно увеличится только за счет уменьшения доли Symbian. А часть поклонников Nokia также перейдут на Android и iPhone.
Но на самом деле, для меня не так важно, какую часть рынка займут телефоны Windows Phone 7. Например, несмотря на растущую популярность Android и iPhone, я до сих пор пользуюсь Windows Mobile 6.5. Причина моего выбора была проста - я мог писать программы для себя на Visual Studio 2008. Но Microsoft сама обрубила сук, на котором сидела. Во-первых, она прекратила без объяснения причин поддержку Windows Mobile в Visual Studio 2010. Во-вторых, она решила полностью скопировать поведение Apple и ввела систему членства и ограничений. Теперь, чтобы написать программу и поделиться с другом, нужно заплатить 99 долларов в год и разместить ее в MarketPlace. Объединение с Nokia ничего не изменит в этой политике. Естественно, на фоне этих событий мне придется переходить на Android с ее более демократичным подходом.
Это очень обидно, так как программировать в Visual Studio для Windows Phone 7 гораздо приятнее, чем в Eclipse для Android. Например, приступая к изучению основ программирования под Windows Phone 7, совершенно не знал Silverlight и XNA. Но вхождение в новые технологии было очень простым и понятным. Для Android все немного сложнее и запутаннее.
Остается маленькая надежда, что в Microsoft будут сделаны кадровые перестановки и придет очень хороший руководитель, который сможет убедить руководство изменить систему в лучшую сторону. То, что мы видим сейчас - это, простите, убожество. Чем дальше я смотрю на дизайн Windows Phone, тем больше в нем разочаровываюсь. Уже все знают о черной полоске со стрелкой на главном окне телефона и несимметричном расположении плиток. Но меня также удивляет и стиль Metro, который выдают за оригинальное дизайнерское решение. Я не дизайнер, и поэтому принимал данное утверждение на веру. А теперь выскажу свое скромное мнение. Посмотрим на эту ситуацию с такой стороны. На сегодняшний день все продающиеся телефоны с Windows Phone 7 можно отнести к дорогой ценовой категории от 500 долларов и выше. А теперь представьте, подобный телефон покупает состоятельный человек, который видит простенький интерфейс Metro без градиентов, округлостей, теней. Но состоятельный человек на метро не катается, зачем ему убогий интерфейс, если он привык к красивым блестящим машинам, ноутбукам, хрустальным бокалам и так далее. Красивые сайты в стиле Web 2.0 тоже еще не потеряли своей привлекательности. Сюда же можно добавить победное распространение HTML5 и CCS3, которые позволяют делать очень симпатичные вещи. На этом фоне интерфейс Windows Phone 7 выглядит шагом назад, а его функциональные возможности сравнимы с первыми моделями iPhone.
Таким образом, мой прогноз относительно будущего Windows Phone 7: в 2011 году будет полный провал по всем фронтам. Далее возможны варианты. Microsoft признает свое поражение и начнет кардинально улучшать систему. Либо компания упорно будет гнуть свою линию и делать косметические изменения, накапливая силы на другой проект, чтобы выстрелить в 2012 году.
Тем не менее, альянсу хочется пожелать удачи. Во-первых, это заставит шевелиться конкурентов, во-вторых у пользователя будет больше выбора, в-третьих, это просто интересно, что получится если скрестить ежа с колючей проволокой (шутка).

воскресенье, 31 октября 2010 г.

ExtractAssociatedIcon

C помощью системной функции Windows API ExtractAssociatedIcon можно извлечь значок, ассоциированный с файлом. Значки возвращаются с размером 32х32.

[C#]
[DllImport("shell32.dll")]
static extern IntPtr ExtractAssociatedIcon(IntPtr hInst, StringBuilder lpIconPath,
out ushort lpiIcon);

или

[DllImport("shell32.dll")]
static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);


Пример



// Отобразим значок какого-нибудь файла
// Добавим в проект элемент OpenFileDialog, кнопку и PictureBox

openFileDialog1.ShowDialog();

ushort uicon;
StringBuilder strB = new StringBuilder(openFileDialog1.FileName);
IntPtr handle = ExtractAssociatedIcon(this.Handle, strB, out uicon);
Icon ico = Icon.FromHandle(handle);

pictureBox1.Image = ico.ToBitmap();


Запустите проект и выберите любой файл на диске. На форме в PictureBox отобразится значок, который используется для выбранного файла (как это мы видим в Проводники).

Описание функции и ее параметров добавлено в справочник по функциям Windows API для .NET Framework.

К слову сказать, совсем не обязательно использовать неуправлямый код. В .NET Framework есть метод Icon.ExtractAssociatedIcon пространства имен System.Drawing, который делает ту же работу.



Добавьте в проект еще одну кнопку и напишите следующий код:

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Icon icon = Icon.ExtractAssociatedIcon(openFileDialog1.FileName);
this.Icon = icon;
pictureBox1.Image = icon.ToBitmap();
}


Удачного вам программирования!

суббота, 30 октября 2010 г.

Разлочка эмулятора Windows Phone 7

Эмулятор Windows Phone 7, который входит в состав Windows Phone Developer Tools, какой-то обрезанный. Непонятно, зачем Микрософт пошла на такой шаг. Доступен только Internet Explorer и собственные приложения, создаваемые в Visual Studio. К счастью, нашлись умельцы, которые сумели разлочить эмулятор, отредактировав его файл. Файл можно найти в интернете по слову WM70C1.en-US.unlocked. Я скачивал отсюда.
Скачайте файл и перенесите его в папку %programfiles%\Microsoft SDKs\Windows Phone\v7.0\Emulation\Images\. В этой папке вы найдет образ оригинального эмулятора (файл WM70C1.en-US.bin). Далее переименуйте оригинальный файл эмулятора и сохраните его на всякий случай. Теперь переименуйте ваш скачанный файл, чтобы он имел нужное имя. Запустите какой-нибуль проект на Visual Studio. Ваше приложение запустится в новом эмуляторе.
Закройте свое приложение и просмотрите новый вид разлоченного эмулятора. Небо и земля. Естественно, вы все делаете на свой страх и риск. Я никаких сбоев не заметил, все работает.

Скриншоты






Видео




Пользуйтесь на здоровье.

воскресенье, 12 сентября 2010 г.

Изучайте XAML, WPF и Silverlight

В наше время происходит какой-то бум в языках программирования. Кажется, совсем недавно в ходу были C++, Visual Basic, Delphi, Java. Сейчас лидерами становятся совсем другие языки и технологии. И программистам очень трудно угнаться за этой гонкой.
Я сам в свое время очень долго не мог соскочить с Visual Basic 5.0 на Visual Basic 6.0, хотя, казалось, это всего лишь обновление номера версии. Но, я настолько привык к привычному окружению, что просто боялся все поломать. Спустя некоторое время уже сам удивлялся другим коллегам, которые не собирались переходить на VB 6.0, объясняя тем, что VB5.0 гораздо быстрее и занимает меньше места. А изменения не настолько существенны, чтобы обновляться.
Еще большим шоком стало появление .NET Framework со своей новой идеологией и полным отсутствием совместимости со старыми программами. Первые версии фреймворка благополучно пролетели мимо меня. Но Microsoft упорно гнула свою линию и убеждала переходить на новые языки. И я купил на Озоне Visual Basic.NET 2003. Но большу часть времени я все равно программировал на старом добром VB6.0.
В какой-то момент времени я вдруг понял, что пока не поздно, лучше начать изучение .NET Framework на C#. Сейчас я понимаю, что тогда я сделал правильный выбор. И, хотя, Microsoft пытается параллельно поддерживать все языки, большинство материлов в сети базируется именно на C#.
Но, успокаиваться было рано. Неожиданно на горизонте появилась новая технология XAML. Но, к тому времени я очень интенсивно изучал программирование для мобильной платформы Windows Mobile. Поэтому слова XAML, Silverlight, WPF были для меня пустым звуком, так как они не поддерживались мобильными телефонами. К сожалению, это был мой стратегический просчет. Технология XAML окрепла и стала завоевывать сердца разработчиков. Я пытался оттянуть тот момент, когда придется изучать XAML, жизнь внесла свои коррективы.
Когда Microsoft в очередной раз поменяла правила игры и объявила, что следующая платформа Windows Phone 7 будет базироваться на Silverlight, я понял, что мне придется снова переучиваться.
И чем больше я погружаюсь в этот неведомый мир, тем больше он мне нравится. Знаю, что многие программисты находятся в похожем состоянии и еще не приняли решения о переходе на новые технологии. На мой взгляд, на сегодняшний день в сети или в магазинах нет хороших материалов для начинающих, которые бы с самых азов объяснили возможности XAML. Как правило, все учебные материалы уже предполагают базовое знакомство с языком C# и имеют высокий порог вхождения.
Но, на самом деле, язык XAML очень прост и элегантен. Сейчас я попытаюсь очень популярно объяснить, как пишется код на XAML, чтобы даже самые отъявленные новички поняли суть материала.
Если у вас есть опыт работы с HTML, то вам будут понятны основные понятия. По-существу, XAML - это язык разметки, как и HTML. (Обязательно найдется зануда, который скажет, что это язык разметки XML). Код состоит из тегов: начальный, конечный, или укороченный вариант самозакрывающего тега.
Предположим, нам для работы нужна кнопка. Достаточно написать следующее

<Button Foreground="LightSeaGreen" FontSize="24pt" Width="200" Height="50">
Привет, XAML
</Button>

Как видите, все очень просто. Есть тег Button с параметрами цвета, шрифта, размеров. Также обстоят дела и с другими элементами. Нужно только запомнить, что существует самый главный единственный корневой тег (в HTML таким тегом можно считать <html>), внутри которого находятся дочерние элементы. Таким образом выстраивается целое дерево родительских и дочерних элементов.
Обратите внимание, что код XAML можно написать даже в Блокноте и запустить из Проводника. Более подробно я описал этот материал в статье Что такое XAML.
Рекомендую первое время писать код вручную, хотя в Visual Studio 2010 появился свой GUI-редактор, позволяющий визуально размещать элементы, как это делалось в Windows Forms.
Когда вы наберетесь небольшого опыта, вы заметите, что некоторые вещи делать гораздо проще в WPF и Silverlight, которые тесно завязаны на XAML (но это не одно и то же).
Даже, если вам еще не приходилось работать с WPF, все равно прочитайте другую мою статью Закругляем углы и отбрасываем тень. Код настолько простой и понятный, что вы удивитесь, как легко создать различные эффекты отбрасывающей тени или закругления уголков. Причем, возможности XAML гораздо выше. Наверняка, вы слышали, что Silverlight считают конкурентом Flash. Так вот, XAML обладает широким арсеналом анимационных эффектов и других рюшечек.
Просматривая свои старые проекты, написанные традиционным способом на WinForms, я все чаше испытываю соблазн переписать их на WPF. И, хотя я не волшебник, а только учусь, но XAML теперь стоит у меня на первом месте в плане изучения.
Присоединяйтесь!

воскресенье, 6 июня 2010 г.

ShowThumbnailsOnNavigation

Хочу поделиться с вами одним трюком, который был описан в одном блоге MSDN.

В IDE-редакторе Visual Studio 2010 при нажатии Ctrl+Tab вы можете перемещаться между открытыми активными файлами. Менеджер окон выглядит следующим образом.



При помощи небольшого трюка можно добавить в это окно эскизы файлов. Откройте редактор реестра и в разделе HKCU\Software\Microsoft\VisualStudio\10.0\General добавьте параметр DWORD ShowThumbnailsOnNavigation со значением 1. Перезапустите Visual Studio и вы увидите, что теперь появились эскизы.



Интересно отметить, что данные эскизы были доступны в Visual Studio 2008 и Visual Studio 2010beta, но затем эту функциональность убрали.

Примечание: большой сборник настроек реестра Windows вы можете найти в справочнике по реестру Windows.

понедельник, 3 мая 2010 г.

Windows Phone Developer Tools CTP

На прошлой неделе на нашей улице наступил праздник и имя ему Апрельский фрэш Windows Phone Developer Tools CTP April Refresh. Объясню, почему праздник. Когда вышла финальная версия Visual Studio 2010, я снес предыдущую Visual Studio 2008 и остался у разбитого корыта. В новой версии напрочь отсутствует поддержка Windows Mobile 6 и я теперь не могу поддерживать свои старые проекты. А бету-версия Windows Phone Developer Tools нельзя было ставить на финальный релиз VS2010.
Я плевался и ругался, потому что так нельзя работать. Все пошло коту под хвост. К счастью, ребята из Microsoft подсуетились и выпустили в свет упомянутый выше пакет разработки под Windows Phone.
В состав пакета входит Visual Studio 2010 Express for Windows Phone и эмулятор. Если у вас уже стояла профессиональная версия VS2010, то у вас также появятся новые шаблоны для проектов под Windows Phone.
Теперь можно более предметно изучать примеры под новую платформу. Несмотря на то, что теперь нет никакой совместимости со старым .NET Compact Framework, я не сильно переживаю по этому поводу. Как известно, теперь требуется программировать под Silverlight и XNA. Давно собирался вплотную заняться изучением этих технологий, но стимула не было. Теперь такой стимул появился.
Сама технология интенсивно развивается, и, наверняка, много к концу года поменяется. Тем не менее можно уже сейчас создавать интересные примеры. Кстати, если вы не боитесь экспериментов, то можете разлочить эмулятор, чтобы увидеть скрытые возможности. Подробнее можете почитать на Хабре (http://habrahabr.ru/blogs/mobiledev/92600/).
А для новичков я собираюсь подготовить учебный курс, который будет располагаться по адресу http://developer.alexanderklimov.ru/winmobile/wp7/wp7-tutorial.php
Не обещаю, что наполнение курса новыми материалами будет идти быстрыми темами, но одну-две статьи в неделю, я надеюсь, разместить смогу.
Присоединяйтесь!