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

суббота, 27 декабря 2008 г.

Что общего между Microsoft и пивом?

Ответ: пивной бокал. Не прекращается поток подарков от Microsoft. На следующий день после первого подарка (см. предыдущий пост) меня снова побеспокоила служба DHL. На этот раз компания Microsoft подарила мне пивной бокал.

Если вы помните, я предлагал вам участвовать в конкурсе, в котором можно было выиграть призы. Я тоже участвовал и мне удалось стать обладателем приза. Спустя несколько месяцев награда нашла героя.

Кстати, компания приготовила еще один подарок - можно бесплатно скачать электронную версию книги по Silverlight. Ссылку не даю, ищите сами.

С наступающим Новым годом и счастливого вам программирования!

четверг, 25 декабря 2008 г.

Новогодние подарки от Microsoft

Сегодня служба DHL доставила в мой дом большую посылку (41х34х27 см). Оказалось это подарок от Microsoft. Некоторое время назад по интернету прошел слух, что компания подарит набор из 8 книг по программированию всем, кто подпишется на их рассылку. Не особо веря в чудо, я все-же подписался. И вот, накануне Нового года Microsoft решила немного побыть Дедом Морозом и стала рассылать подарки.


В коробке под толстым-толстым слоем упаковочной пленки (такая с кнопочками, которые так любят давить некоторые особы для успокоения нервов) оказалась еще одна красивая коробка Боекомплект ИТ-профессионала и разработчика, а также DVD-диск с Библиотекой MSDN и Visual Studio 2008 Express. Перечислять все книги я не буду. Но все они очень интересные.
С Рождеством, вас, Microsoft!
И большое спасибо за подарки!

воскресенье, 7 декабря 2008 г.

Улучшенные элементы управления Windows Vista

Здравствуйте!


Продолжаем изучать новые возможности Windows Vista. Открываем статью из MSDN Magazine за август 2007 года и внимательно ее читаем. Хотя статья написана для программистов C++, нас это не должно останавливать. Я позволю себе скопировать оттуда часть интересующей нас информации. Итак...


Элементы управления редактирования и поля списка
Windows XP представил возможность показывать текстовую подсказку для элементов управления редактированием при помощи сообщения EM_SETCUEBANNER. Эта подсказка показывает пользователю информацию, которая исчезает при выделении элемента управления. Windows Vista добавил к этому весьма ценное свойство, позволяющее показывать текст подсказки даже тогда, когда элемент управления выделен. Это на первый взгляд незначительное улучшение во многих случаях снимает необходимость статических элементов управления. Просто используйте ранее незадействованный WPARAM и установите для него значение «истина», чтобы воспользоваться этим свойством.
Примерно таким же образом Windows Vista придает это свойство и полям списка при помощи сообщения CB_SETCUEBANNER. Не существует, однако, варианта показа текста подсказки, когда элемент управления выделен, и только поля раскрывающегося списка продолжают показывать текст подсказки до тех пор, пока не сделан выбор.



Теперь чуть подробнее о том, что тут написано. Возьмем, к примеру браузер Internet Explorer. В верхнем правом углу мы видим строку поиска (текстовое поле), в котором находится слово-подсказка Google. Как только мы установим фокус на нем, то поле очистится и мы можем вводить запрос. Насколько я помню, в Firefox также реализована эта функция (под рукой нет этого браузера). Так вот, это легко реализуется при помощи соответствующего сообщения Windows.
Аналогично и для комбинированного окна ComboBox. Надо заметить, что в Windows XP, если ComboBox получает фокус, то подсказка исчезает (не могу проверить, т.к. у меня Виста).
В чем преимущество данных подсказок? У вас появляется возможность сэкономить место на форме, не прибегая к Label, так как подсказки позволяют разместить информацию для пользователя.
Я набросал небольшой пример для демонстрации, можете взглянуть на картинку ниже.





По традиции, код и описание новых сообщений Windows будут доступны зарегистрированным пользователям справочника по функциям Windows API. Остальным придется самостоятельно написать программу. Информацию я вам предоставил.
Счастливого вам программирования!

понедельник, 1 декабря 2008 г.

PrintScreen, Codin4Fun и справочник по Visual Studio

Здравствуйте!
Наступило 1 декабря, а на улицах Москвы нет снега. Перейдем к новостям. Сегодня перечитывал журнал MSDN Magazine за ноябрь 2005 года и наткнулся на статью, как отключить клавишу PrintScreen, чтобы пользователь не мог скопировать снимок экрана в буфер. Автор статьи рассказывает о том, что в принципе, помешать чужой программе получить снимок экрана невозможно. Но, тем не менее, если вам все-таки нужно отключить клавишу PrintScreen, то воспользуйтесь функцией Windows API RegisterHotKey с константами IDHOT_SNAPDESKTOP и IDHOT_SNAPWINDOW. Далее в статье приводится пример на C++. Так как в моем справочнике по функциям Windows API уже было описание этой функции, то я решил написать тестовое приложение, чтобы проверить, как это все работает. Результат своих опытов я помещу в справочник в виде отдельной статьи, которая будет доступна зарегистрированным пользователям через несколько месяцев. Остальных приглашаю попробовать самостоятельно написать аналогичную программу.
Также в разделе справочники появился еще один справочник по Visual Studio. В последнее время пополнение справочника идет за счет советов Сары Форд, которые доступны с русскоязычного блога. А сегодня появилась еще одна хорошая новость - был запущен русский Codin4Fun по адресу http://blogs.msdn.com/rucoding4fun. К сожалению, на сайте появятся переводы постов, начиная с февраля 2008 года. Более ранние статьи (а среди них есть очень интересные) останутся без перевода. Если у вас есть желание перевести какие-нибудь старые статьи, то присылайте мне по адресу rusproject@mail.ru. В разделе Статьи я уже опубликовал несколько материалов оттуда.
Присоединяйтесь!
Всем удачного программирования!

понедельник, 24 ноября 2008 г.

CoCreateGuid, "Русалка" и блондинка

Начну свою запись в блоге с функции Windows API CoCreateGuid. Если вы раньше использовали эту функцию в .NET Compact Framework 1.1, то можете отказаться от нее, так как в CF2.0 и выше поддерживается метод Guid.NewGuid. Я убрал описание этой функции из справочника по функциям Windows API и поместил ее на страницу устаревших функций.
Кстати, если вы программируете для мобильных устройств, то обратите внимание, что вышли новые версии эмуляторов под Windows Mobile 6.1. (ссылки ищите здесь).
Переходим к Русалке. Недавно я рассказывал о песне в исполнении певицы Массква про телефон за тысячу евро. Недавно по 1 каналу показали этот фильм. Я не мог пропустить это событие и посмотрел картину. Мне фильм понравился, и песня нормально слушается. А как вам?
И, напоследок, расскажу о встрече с блондинкой. Шел я недавно в центре Москвы по Кривоколенному переулку. Навстречу мне идет молодая блондика и обращается за помощью. Ей нужен был дом 9, а мы стояли как раз между домами 8 и 10. Она мне и говорит: "Вы случайно не местный? Не подскажете, где дом 9, вот дом 8, а за ним сразу дом 10". Я немного растерялся, на миг потерял дар речи. Потом все-таки собрался, показал рукой на другую сторону переулка и сказал, что нечетные номера домов находятся на другой стороне. Она так удивилась...
Удачи вам, блондинки!

понедельник, 3 ноября 2008 г.

Системные значки Windows

Если вам понадобится в приложении использовать системные значки Windows, которые мы обычно применяем в MessageBox, то воспользуйтесь классом SystemIcons. Например, пользователям Windows Vista хорошо знаком значок с изображением щита, тесно связанного с функциями UAC. Чтобы вывести этот значок, используйте такой код:

using (Graphics g = CreateGraphics())
{
g.DrawIcon(SystemIcons.Shield, 20, 30);
}

Если вам необходимо вывести все системные значки Windows, то лучше воспользоваться отражением. Пример с щитом показывает, что набор системных значков постоянно пополняется, и Reflection поможет написать универсальный код для этой задачи:

using System.Reflection;

// Получаем PropertyInfo для всех статических
// свойств SystemIcons
PropertyInfo[] props = typeof(SystemIcons).GetProperties(BindingFlags.Public BindingFlags.Static);
Graphics g = CreateGraphics();

int y = 0;
// Отображаем каждый значок. Все статические члены
// получаем через отражение — класс!
//
foreach (PropertyInfo p in props)
{
Object obj = p.GetValue(null, null);
if (obj.GetType() == typeof(Icon))
{
Icon icon = (Icon)obj;
g.DrawIcon(icon, 0, y);
g.DrawString(String.Format("SystemIcons.{0}",
p.Name), new Font("Arial", 12), Brushes.Blue, icon.Width + 2, y);
y += icon.Height;
}
}
g.Dispose();

Счастливого вам программирования!

воскресенье, 2 ноября 2008 г.

Защита файлов

Поговорим о функции Windows API SfcIsFileProtected.
В Windows Vista есть защищенные файлы, которые нельзя изменять или удалять. Поэтому, если ваша программа занимается чем-то подобным, то проверьте сначала, не является ли используемый файл защищенным. Для этой цели и служит функция SfcIsFileProtected, которая возвращает true, если файл защищен, и false, если файл не защищен. Проверяем.

// Проверим, является ли Блокнот и утилита от NERO в папке Windows защищенными файлами
MessageBox.Show(SfcIsFileProtected(IntPtr.Zero,@"c:\windows\notepad.exe").ToString());
MessageBox.Show(SfcIsFileProtected(IntPtr.Zero,@"c:\windows\unnerovision.exe").ToString());


Полное описание функции, как всегда, будет доступно зарегистрированным пользователям справочника по функциям Windows API.

Счастливого вам программирования!

вторник, 28 октября 2008 г.

Функция StrFormatByteSize

Сегодня хочу рассказать вам об интересной функции Windows API StrFormatByteSize. Особенность этой функции в том, что вы передаете ей большое число (размер вашего диска), а она автоматически выдает результат в удобном виде, например, 1.4кб или 1.4Гб и т.д. Хочу обратить ваше внимание, что ANSI-версия этой функции может работать до 1.99Гб. Конечно, такое ограничение нас не устроит, если даже флешки уже стали по 32 Гб и выше. Но, не все так плохо. Unicode-функция может возвращать до 7.99 Эбайт. Большинство из вас даже не знают, что такое Эбайт. Эбайт (сокр. от Эксабайт) - это очень огромная цифра. Вы уже слышали, что появились жесткие диски с объемом Терабайт. Так вот, после терабайтов идут петабайты и только потом эксабайты. Трудно представить, что в обозримом будущем появятся накопители такой емкости. Еще одна особенность функции - названия байтов выдается на родном языке. На русском - Кб, Мб, Гб, а английском - kb, gb и т.д.
Вот как выглядит объявление функции на C#
[DllImport("Shlwapi.dll", CharSet = CharSet.Auto)]public static extern long StrFormatByteSize( long dw,[MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszBuf, int cchBuf );

Создаем для нее обертку и выводим результат
public static string FormatByteSize(long fileSize)
{
StringBuilder sbBuffer = new StringBuilder(20);
StrFormatByteSize(fileSize, sbBuffer, 20);
return sbBuffer.ToString();
}
// Выбираем максимальное возможное значение
MessageBox.Show(FormatByteSize(long.MaxValue));

Описание параметров и примеры на Visual Basiс будут доступны в моем справочнике по фунциями Windows API.
Счастливого вам программирования!

Два события, достойные вашего внимания

Сегодня хочу поделиться с вами новостями. Первое - наконец-то запущен русский MSDN. Произошло это видимо сразу после полуночи, так как я уже сразу после 12 часов ночи заглянул на этот сайт и увидел страницы на русском. Главный интерес представляет справочный раздел по .NET Framework. Его главная страница находится по адресу http://msdn.microsoft.com/ru-ru/library/d11h6832.aspx. Название не очень удачное, поэтому лучше сразу занести в Избранное. Зато дальше уже лучше. Например, статья о пространстве имен System находится по адресу http://msdn.microsoft.com/ru-ru/library/system.aspx, а статья о его классе Console находится на http://msdn.microsoft.com/ru-ru/library/system.console.aspx, ну и так далее. Принцип уловили?
Этого события я ждал более 10 лет, когда самостоятельно начал изучать Visual Basic. Так как в школе я изучал немецкий (Гитлер капут), то мне было труднее вдвойне. Новому поколению программистов будет гораздо легче. И не согласен с теми консерваторами, которые считают, что изучать язык программирования надо только на английском. Здесь все зависит от поставленных целей в жизни - кому-то вполне хватит и русской документации в работе.
Второе событие - это открытие моего сайта http://developer.alexanderklimov.ru (заносим в Избранное). Да, мы опять переезжаем. Это, наверное, уже четвертая площадка для моих страниц. Может, кто-то еще помнит мой первый проект на http://members.xoom.com/wwwind, открытый лет 10 назад? Тогда, если помните еще не было бесплатных страничех Narod.ru, только-только появился сайт Mail.ru, потом появились ICQ и т.д. К сожалению, я не располагаю возможностями Microsoft, поэтому мой переезд на новое место будет происходить постепенно. Наберитесь терпения. Обратите внимание, что новые материалы будут появляться только на новом сайте.
Счастливого вам программирования!

четверг, 23 октября 2008 г.

Числа прописью на русском

У многих программистов (сужу по форумам) встает задача написать число прописью на русском. Если вам тоже нужно, то взгляните на следующие ссылки:
Число прописью на C# 3.0
http://code.hash.su/374
Говорим по Русски - отображение числительных

Во второй ссылке приводится код, в котором содержится ошибка. Программист забыл, что в русском языке имеется не только женский и мужской род, но и средний. Следовательно, в коде должно быть использовано слово одно (одно яблоко, одно перо). На всякий случай, я написал автору. Но, вы тоже имейте в виду.
В других ссылках обязательно почитайте комментарии, которые дадут вам пищу для размышлений.
Удачного вам подсчета!

пятница, 17 октября 2008 г.

Угадайка

Итак, сегодня пятница и впереди два выходных дня. Развлечемся. Бороздя по бескрайним просторам Интернета, наткнулся на прикольный сайт, где предлагается сыграть в игру на угадывание персонажей. Вы задумываете какую-нибудь известную личность и начинаете отвечать на вопросы (на английском). После короткой серии вопросов вам показывается фотография персонажа. Результаты меня удивили. Судите сами: я загадал Аллу Пугачеву, Арнольда Шварценеггера, Леонардо Да Винчи и Карла Маркса. Отгадывающий угадал три варианта, за исключением Да Винчи. Впрочем, и его он показал в списке подозреваемых. Некоторые даже загадывали чебурашку (и его отгадали). Посетите сайт Akinator и попробуйте свои силы. О результатах можете рассказать в комментариях.

понедельник, 13 октября 2008 г.

Укоротить длинный путь к файлу

В своей книге C#. Советы программистам я приводил пример с использованием функции Windows API PathCompactPathEx. Но сегодня в своих архивах нашел еще один пример, который забыл добавить в книгу. Этот пример использует регулярные выражения и использует следующий алгоритм: оставляет первые две папки, последнюю папку и имя файла, а среднюю часть путь заменяется многоточием (...). Делается это следующим образом:

static string PathShortener(string path)
{
const string pattern = @"^(\w+:\\)(\\[^\\]+\\[^\\]+\\).*(\\[^\\]+\\[^\\]+)$";
const string replacement = "$1$2...$3";
if (Regex.IsMatch(path, pattern))
{
return Regex.Replace(path, pattern, replacement);
}
else
{
return path;
}
}

Теперь, вы можете вызвать данный метод для укорачивания длинного пути.

string myPath = @"C:\Documents and Settings\jatwood\My Documents\Visual Studio 2005
\SimpleEncryption\UnitTests\UnitTests.vb\wumpus\public\Hilo Deliverables\Hilo
Final\Introduction\Code\Intro\App_Themes\cellphone\photo-small.jpg";

MessageBox.Show(PathShortener(myPath));

У вас выведется путь: C:\Documents and Settings\jatwood\...\cellphone\photo-small.jpg
(Источник: Coding Horror).

Системная фукнция работает по другому алгоритму, поэтому вы можете выбрать удобный для вас способ.

пятница, 10 октября 2008 г.

Мой телефон стоит тысячу евро, но я не хочу звонить первой

Я частенько посещаю блог Экслера. Особенно мне нравится читать комментарии к статьям автора блога. Сегодня меня очень порадовала статья об одной песне певицы Массква. Я слышал несколько ее песен, а также видел несколько передач с ее участием, и должен признаться, что ее песни мне нравятся больше, чем песни Тимати, Блестящих или Виагры (хотя я и не меломан). Но речь не о ней, а о песне из фильма Русалка, номинированной на Оскар от России. Алекса Экслера задела строчка из песни Мой телефон стоит тысячу евро, но я не хочу звонить первой. Он предложил свои варианты:
Мой телефон стоит тысячу баксов, но я не хочу носить слаксы.
Мой телефон стоит тысячу йен, но кот сожрал весь пурген.
Мой телефон стоит тысячу тугриков, но я предпочла бы рублики.

Посетителям блога эти варианты понравились, и понеслась...
Каждый изощрялся в своем остроумии. Я читал эти комментарии на работе и еле сдерживал свой смех. Работа просто встала.
Надеюсь, уважаемый Алекс Экслер не обидится, если я размещу некоторые варианты на этой страничке. Ссылка на оригинал находится здесь, почитайте все комменты.
Поехали:
Мой телефон стоит тысячу злоты, но ты сдохнешь от икоты.
Мой телефон стоит тысячу песо, но ты пойдёшь сегодня лесом.
Мой телефон стоит тысячу евро и я не люблю преклонных годов негров.
Мой телефон стоит тысячу денег, а ведь сегодня только понедельник.
Мой телефон стоит тысячу сольдо, но это не повод чтоб выступить сольно.
Мой телефон стоит тысячу зайчиков, у сестры в классе очень много мальчиков.
Мой телефон стоит тысячу гривен, в десятом классе я был очень наивен.
Мой телефон стоит тысячу теньге, четырнадцать дней мы блуждали в тайге.
У меня нет мобилы, есть телефон с будкой, вот такой я лузер с барабаном и дудкой! (ржунимагу)
Мой телефон стоит тыщщу рублей, а ты носи валенки и не болей.

А мой телефон стоит мильон (его мне принес пивной павильон)!
Давай, доставай свой за тысячу евро. Ломаться кончай, и звони первой! (это 5+)

А мой телефон стоит пару монет. Давай, не упрямься, делай минет!
Мой телефон стоит тысячу лари, но я лучше хлебну цинандали
Мой телефон стоит тысячу лат, вот такой я богатый прибалт
Мой телефон стоит тысячу крон, и я им с деревьев сбиваю ворон
Мой телефон стоит 20 КОПЕЕК . Жду Вас на складе Б/У телогреек.
Мой телефон стоит тыщу манат, походу я... ни х№уя не магнат.
Мой телефон стоит тысячу лек, сдуру албанский учил я чучмек.
Мой телефон стоит тыщу динаров, отсоси у меня, я отдам его даром. Мой телефон стоит тыщу песет, "сеть не доступна" - регулярный ответ.

Не все варианты удачны, но какой азарт у людей. Видно, что день у многих прошел не зря, люди занимались творчеством.
Удачных вам песен, певица Массква!

воскресенье, 5 октября 2008 г.

Устаревшая функция MessageBeep

Если в ваших старых проектах встречается функция Windows API MessageBeep, то можете отказаться от нее, и использовать методы класса System.Media.SystemSounds, который появился в .NET Framework/.NET Compact Framework 3.5. Единственное исключение - это проекты для Windows Mobile 6/6.1, в которых встроена версия CF2.0. Там эту функцию еще приходится использовать. Описание и пример использования функции можете посмотреть на странице устаревших функций Windows API.
Счастливого вам программирования!

вторник, 23 сентября 2008 г.

Функция IsProcessorFeaturePresent

Давно не разбирали какую-нибудь функцию Windows API. Сегодня познакомлю вас с функцией IsProcessorFeaturePresent. Функция IsProcessorFeaturePresent определяет, поддерживается ли указанная особенность на процессоре текущего компьютера. Ее объявление выглядит следующим образом:
[DllImport("kernel32.dll")]
static extern bool IsProcessorFeaturePresent(uint ProcessorFeature);
Описывать все параметры ProcessorFeature я не буду, зарегистрированные пользователи смогут ознакомиться с ними в справочнике. Приведу пример, где проверяется поддержка процессором MMX-инструкций (параметр PF_MMX_INSTRUCTIONS_AVAILABLE = 3).
[DllImport("kernel32.dll")]
static extern bool IsProcessorFeaturePresent(uint ProcessorFeature);
private const int PF_MMX_INSTRUCTIONS_AVAILABLE = 3;
// Проверяем доступность MMX-инструкций
MessageBox.Show(IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE).ToString());
Удачного вам программирования!

суббота, 13 сентября 2008 г.

Есть ли подключение к интернету

Достаточно распространненая задача - проверка на наличие подключения к интернету. Определить, подключен ли компьютер к интернету, можно при помощи метода NetworkInterface.GetIsNetworkAvailable, который появился в .NET Framework 2.0.
Следует заметить, что если компьютер подключен к локальной сети, то этот способ окажется бесполезным, так как ваша машина
может иметь подключение к сети, но не иметь выхода в интернет. В этом случае попробуйте воспользоваться функцией Windows API
InternetGetConnectedState, которая описана в моей книге C#.Cоветы программистам или в справочнике по функциям Windows API.
MessageBox.Show("Наличие подключения: " + System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable().ToString());
Удачного вам подключения к интернету!

четверг, 11 сентября 2008 г.

Microsoft готова обменять твои знания на призы

Microsoft запустила любопытную акцию - вам необходимо пройти тест из пяти вопросов. Если вы пройдете тест, то у вас есть шанс выиграть какой-нибудь приз. Вопросы совсем не сложные, поэтому попробовать свои силы может даже программист-любитель. На данный момент существует более 50 тестов на самые разные темы. Ссылку на сайт с викториной я разместил на своей главной странице. Поэтому заходим на нее, кликаем на кнопочке или ссылке и участвуем.
Счастливого вам прохождения тестов!

пятница, 5 сентября 2008 г.

Обмен книгами

Недавно узнал о существовании замечательного проекта БукРивер, который проходит под девизом Поменяй книгу - спаси дерево. Проект построен по принципу социальных сетей, наподобие Одноклассники.ру, VKontakte.ru и т.п. Цель проекта - обменять свои книги на другие (или подарить). На странице есть ТОП активных участников, у которых счет обменянных книг идет десятками. Если у вас скопилась гора прочитанных книг, то вступайте в эту сеть.
Удачного вам чтения!

Пошутим над коллегой

Недавно вышел совет от Сары Форд в блоге Секреты Visual Studio, в котором рассказывалось, как изменить цвет фона в редакторе кода на черный. А ведь это неплохая возможность подшутить над коллегой. Улучите минутку, когда сосед-программист отойдет от своего компьютера и сделайте цвет фона и символов одинаковым белым цветом. Когда коллега вернется на свое рабочее место и начнет печатать, то ничего не увидит на экране. Как вариант, можно показать своему руководителю или знакомому, как вы запускаете программу на исполнение при девственно чистом редакторе кода и ваше приложение запускается словно по волшебству.
P.S. Сегодня пятница, поэтому пост не очень серьезный. Удачного вам отдыха в выходные!

воскресенье, 31 августа 2008 г.

О перечислении Enum, стилях для HatchBrush и документации на MSDN

В своей книге C#. Советы программистам я привел несколько примеров для работы с перечислением Enum. Недавно для одного проекта мне понадобилось воспользоваться одним из описанных способов для перечисления всех стилей для кисти HatchBrush. Я написал следующее:

foreach (HatchStyle hatch_style in Enum.GetValues(typeof(HatchStyle)))
{
listBox1.Items.Add(hatch_style.ToString());
}

Когда я посмотрел на список, то увидел, что некоторые элементы списка повторяются. Например, стиль Horizontal повторяется два раза, а стиль LargeGrid - три раза. Сначала я подумал, что совершил ошибку в коде. Не найдя ошибки в этом примере, я решил прогуляться на сайт MSDN и посмотреть, что пишут про перечисление HatchStyle. Просматривая все значения стилей, я заметил, что стилю Min соответствует стиль Horizontal. Стало понятно, откуда взялось в моем списке два одинаковых стиля Horizontal. Обрадовшись, стал искать соответствия для трех значений LargeGrid. И тут я столкнулся с проблемой. В документации говорилось, что этому стилю соответствует сам LargeGrid и стиль Cross. А как же быть с третьим вариантом? Больше нигде не упоминалось о связи стилей с значением LargeGrid. Тут меня осенило. Взглянув еще раз на примеры из книги, я решил написать дополнительно еще несколько строчек кода, которые выводят имена стилей HatchBrush при помощи Enum.GetNames:

string[] hatchstyles = Enum.GetNames(typeof(HatchStyle));
foreach (string s in hatchstyles)
{
listBox2.Items.Add(s);
}

Расположив два списка рядом, сразу стало видно, что чему соответствует. Как уже говорилось выше, значению Horizontal соответствовали стили Horizontal и Min, а значению LargeGrid соответствовали стили Cross, LargeGrid, Max. Обратившись снова к документации, обнаружил, что стилю Max соответствует значение SolidDiamond. Удивившись, я решил просто вывести на форме три прямоугольника с разными стилями:

private void Form1_Paint(object sender, PaintEventArgs e)
{
HatchBrush hatchbrush = new HatchBrush(HatchStyle.Max, Color.Blue);
e.Graphics.FillRectangle(hatchbrush, 20, 20, 300, 100);

hatchbrush = new HatchBrush(HatchStyle.LargeGrid, Color.Blue);
e.Graphics.FillRectangle(hatchbrush, 20, 130, 300, 100);

hatchbrush = new HatchBrush(HatchStyle.SolidDiamond, Color.Blue);
e.Graphics.FillRectangle(hatchbrush, 20, 240, 300, 100);
}

Запустив пример, я убедился, что мой код для списков выдает правильные результаты. Если вы посмотрите на форму, то увидите, что первые два прямоугольника закрашены одинаковыми узорами (Max и LargeGrid), а третий прямоугольник закрашен совсем по другому. Таким образом, получается, что в документацию MSDN вкралась ошибка. Поэтому, когда вы обращаетесь к документации, старайтесь перепроверять написанное. Документацию пишут тоже живые люди, которые могут ошибаться.
А завтра начинается новый учебный год для школьников и студентов. Некоторые из них начнут или продолжат изучение программирования.
Счастливого вам программирования, девочки и мальчики!

воскресенье, 17 августа 2008 г.

Трудности перевода

Зайдите на www.Translate.ru и введите следующую фразу: my cat has given birth to four kittens, two yellow, one white and one black. Посмотрите, что у вас получится.
Для ленивых: переводчик выдает следующую фразу:
мой кот родил четырех котят, два желтых цвета, одно белое и одного афроамериканца.
Классно получилось. И политкорректно. Кстати, не стоит говорить, что черная кошка перебежала вам дорогу. Афроамериканка перебежала вам дорогу (а то еще засудят).

воскресенье, 10 августа 2008 г.

Поговорки и пословицы на C#

Недавно разбирал свои архивы и наткнулся на ссылку в Избранном. Ссылка вела на один из форумов RSDN, где предлагалось оформить любую поговорку или пословицу в виде кода на любом языке программирования. Естественно, меня больше заинтересовали варианты, написанные на C#.
Вот один из примеров (ГИББД посвящается)
if (!подмажешь)
{
поедешь = false;
}

Остальные примеры найдете на моей странице Занимательное программирование. Если у вас будет желание, то присылайте свои варианты на мою почту klimoff{собака}csfan.ru.
Могу предложить следующие фразы для упражнений:
Истина в вине
Не имей 100 рублей, а имей 100 друзей
Не тяни кота за хвост
Веселого вам программирования!

Функции для Aero Glass

Наверняка, вы слышали, что в Windows Vista имеется схема Aero Glass, поддерживающую полупрозрачность и стеклянный интерфейс. При помощи функций DwmIsCompositionEnabled и DwmEnableComposition можно управлять схемой Aero Glass. Сначала объявим эти функции
[DllImport("dwmapi.dll", PreserveSig = false)]public static extern bool DwmIsCompositionEnabled();

[DllImport("dwmapi.dll", PreserveSig = false)]public static extern void DwmEnableComposition(bool bEnable);

Теперь можно использовать их следующим образом:
// Если компновка рабочего стола доступна (включен Aero Glass)
if (DwmIsCompositionEnabled())
{
MessageBox.Show("Aero Glass включен");
}
else
{
MessageBox.Show("Aero Glass выключен");
}

// Отключаем компоновку рабочего стола (отключаем Aero Glass)
DwmEnableComposition(false);

Описания функций добавлены в Справочник по функциям Windows API для .NET Framework и будут доступны зарегистрированным пользователям в течение ближайших месяцев.
Удачного вам программирования!

суббота, 2 августа 2008 г.

Visual Basic 2005. Рецепты программирования

Недавно у меня был День Варенья. Решил к празднику купить себе какую-нибудь книжку по программированию. Остановил свой выбор на книжке Visual Basic 2005. Рецепты программирования. Книга по сути похожа на мою книгу C#. Советы программистам. Где-то наши советы пересекаются, но имеются и другие советы и темы, которые я не затрагивал. Книга очень толстая, советов много. Даются хорошие пояснения и комментарии. Наверняка, часть примеров я перепишу для C#. Если вы програмируете на Visual Basic, то рекомендую и вам приобрести эту книгу.
Удачного вам чтения!

четверг, 31 июля 2008 г.

11 правил Билла Гейтса

Попался мне на глаза еженедельник Upgrade. Там наткнулся на интересную статью. Якобы Билл Гейтся, выступая перед американскими школьниками, привел 11 правил, которым не учат в школе. Неизвестно, насколько достоверна эта информация, но правила представляют определенный интерес. Эти правила элементарно находятся по поисковому запросу. Поэтому, я не стал перепечатывать правила из журнала, а скопировал из первого попавшего источника в сети. Литературный перевод правил на некоторых сайтах различается, но общий смысл одинаков.
Правило 1: Жизнь не справедлива – привыкайте.
Правило 2: Общество совершенно не волнует Ваша САМООЦЕНКА. От вас ждут ДОСТИЖЕНИЙ прежде всего.
Правило 3: Вы НЕ БУДЕТЕ зарабатывать $60,000 в год сразу по окончании школы. Вы не станете вице-президентом с личным водителем, пока вы не заработаете на то и другое.
Правило 4: Если вы думаете, что учитель слишком суров по отношению к вам, - это еще цветочки. Подождите, пока у вас появится босс.Правило
5: Жарить гамбургеры - ниже вашего достоинства? Ваши дедушки и бабушки считали совсем по-другому. Для них жарить гамбургеры было возможностью зацепиться в этой жизни.
Правило 6: Если у вас что-то не вышло, это не вина ваших родителей, так что не надо хныкать, УЧИТЕСЬ на своих ошибках.
Правило 7: Родители не всегда были такие скучные, как вам сейчас кажется. Может быть постоянная забота о вас сделала их такими? Они вас кормят, одевают, постоянно слушают какие вы замечательные. Так что прежде чем критиковать поколение своих родителей, начните с себя.
Правило 8: Быть может в вашей школе не корректно открыто называть неудачника неудачником и в вашей школе уже не осталось неудачников, но не в жизни. В некоторых школах уже не возможно остаться на второй год, потому что вам дается СТОЛЬКО попыток СДАТЬ экзамены, сколько необходимо для перевода в другой класс. В жизни все СОВСЕМ по-другому.
Правило 9: Жизнь не делится на семестры. У вас не будет летних каникул, и ваш работодатель не будет помогать вам НАЙТИ СЕБЯ. Вам придется делать это самим в свое свободное время.
Правило 10: В телевизоре не показывают НАСТОЯЩУЮ жизнь. В реальной жизни не получится весь день сидеть в кафе и болтать с друзьями.
Правило 11: Поласковее с «ботаниками». Один из них может оказаться вашим боссом после окончания школы.
Удачи вам в этой жизни! (это от меня)

суббота, 26 июля 2008 г.

Обновление совета: Определение версии операционки

В своей книге C#. Советы программистам я приводил пример определения версии операционной системы. Хотелось бы дополнить слегка устаревший пример. На данный момент, операционные системы Windows Vista SP1 и Windows Server 2008 имеют одинаковые номер 6.0.6001. Поэтому возникает проблема в определении операционки. На сайте http://www.vb-helper.com/howto_2005_os_version.html предлагается для решения проблемы прочитать значение ключа из реестра (пример на Visual Basic). Ниже предлагается мой вариант для C# (для краткости я не учитываю устаревшие версии Windows 3.1/95/98/Me/NT)


private const string REG_PRODUCT_KEY = @"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion";
private string GetOSVersion()
{
OperatingSystem osInfo = Environment.OSVersion;
string osName = "Не определено";
switch (osInfo.Platform)
{
case PlatformID.Win32NT:
{
switch (osInfo.Version.Major)
{
case 5:
{
if (osInfo.Version.Minor == 0)
{
osName = "Windows 2000";
}
else if (osInfo.Version.Minor == 1)
{
osName = "Windows XP";
}
else if (osInfo.Version.Minor == 2)
{
osName = "Windows Server 2003";
}
break;
}
case 6:
{
string info = Microsoft.Win32.Registry.GetValue(REG_PRODUCT_KEY, "ProductName", "").ToString();
if (info.ToLower().Contains("vista"))
{
osName = "Windows Vista";
}
if (info.ToLower().Contains("server"))
{
osName = "Windows 2008";
}
break;
}
}
break;
}
}
return osName;
}

private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show(GetOSVersion());
}


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

воскресенье, 20 июля 2008 г.

Modern Talking

Нет, речь пойдет не творчестве некогда очень популярного немецкого дуэта Modern Talking. Я покажу вам способ, заставить компьютер разговаривать. Начиная с .NET Framework 3.0, в библиотеке классов появилось новое пространство имен System.Speech, которое отвечает за голосовые движки. Вот простейший пример. Добавьте сначала ссылку на System.Speech в проекте и напишите следующий код.
using System.Speech.Synthesis;

// Код для кнопки
SpeechSynthesizer synth = new SpeechSynthesizer();
synth.Speak("I love .NET Framework!");


Запустите пример и щелкните на кнопку. На компьютере под управлением Windows Vista есть уже предустановленный голос Microsoft Anna, в чем вы можете убедиться, если откроете в Панели управления настройку Текст и речь. Если вы обнаружите, что у вас установлено несколько голосов, то сначала можете выбрать нужный при помощи дополнительной строчки
synth.SelectVoice("Microsoft Lili");
Удачных вам современных разговоров с компьютером!

воскресенье, 13 июля 2008 г.

UseSystemPasswordChar

Давно мы с вами не говорили о новинках в .NET Framework 2.0. Сегодня я расскажу вам о новом свойстве UseSystemPasswordChar, которое появилось у элемента управления TextBox.
Свойство TextBox.UseSystemPasswordChar получает или устанавливает значение, показывающее, вводятся ли в элементе управления TextBox символы пароля, визуально заданные на уровне системы. Например, в Windows Vista символы пароля имеют вид крупных точек, а не звездочек. Свойство UseSystemPasswordChar имеет преимущество перед свойством PasswordChar и при использовании системных символов для пароля любые символы, заданные при помощи PasswordChar, игнорируются.
Значение свойства:
Тип: System.Boolean. true, если текст в TextBox должен отображаться в виде стандартного вида парольного символа на уровне системы. В других случаях равно false.
Пример:
// Используем системные символы для пароля при вводе
textBox1.UseSystemPasswordChar = true;

Счастливого вам программирования!

суббота, 5 июля 2008 г.

Приемная Путина

Сегодня с утра меня в квартире несколько раз зазвенел телефон.
-Алло?
-Здравствуйте, это приемная Путина?
-Нет.
-А что?
-Квартира.
-Извините.
На моей памяти, когда по ошибке набирали мой номер телефона, то спрашивали детский сад, налоговую инспекцию, баню. Но, приемная Путина - это круто. Даже с учетом, что он теперь не Президент России.
И хотя сегодня суббота и первый выходной день после рабочей недели, этот звонок с утра не вызвал раздражения, что не дали мне отдохнуть.

вторник, 1 июля 2008 г.

Картинки для TreeView

Если вам приходилось раньше использовать элемент TreeView в своих проектах, то, наверняка, задавались вопросом - как использовать вместо плюсиков-минусов привычные картинки открытой или закрытой папки как в Проводнике или использовать свои собственные картинки. Для решения этой проблемы нужно было использовать системное сообщение Windows TVM_SETIMAGELIST. Готовый пример можно посмотреть например на странице FAQ от GotDotNet. Я также поместил этот пример на страницу устаревших функций Windows API.
Но, начиная с .NET Framework 2.0 у элемента TreeView есть свойства ImageIndex и SelectedImageIndex, которые в сочетании с элементом ImageList, помогут вам обеспечить необходимую функциональность. Пересмотрите свои старые примеры и внесите необходимые изменения.
Удачного вам программирования!

воскресенье, 29 июня 2008 г.

Солянка

Сегодня не будет какой-то конкретной темы. Поговорим понемногу обо всем. Начнем с поисковой системы. Когда-то давно в сети (лет 10 назад) появилась поисковая система, которая искала запросы в исходных кодах. Я в то время увлекался программированием на Visual Basic 5.0/6.0 и тем поисковым сайтом я пользовался достаточно регулярно. К сожалению, уже не помню адрес этого сайта. Сейчас появились другие поисковые системы, которые также ищут ответы в исходных кодах. Но я ими не пользуюсь. Мне хватает обычного Google. Но недавно наткнулся на интересный проект. На этот раз предлагают искать ответы в текстах книг по программированию. Адрес проекта - http://www.codefetch.com.
Выбираем язык программирования, вбиваем запрос и вперед. Понятно, что поиск идет среди англоязычных книг. Возьмите на заметку.
Вторая тема - .NET Compact Framework. Очень интересное предложение сделал в своем блоге программист Крис Крафт. Он обещал в течение месяца написать 30 полезных программ, по одной программе в день. И свое обещание сдержал. На данный момент уже выложено 27 программ. Все программы поставляются в двух вариантах - готовые приложения и исходные коды. Найти это чудо можно по адресу http://www.cjcraft.com/blog/default,month,2008-06.aspx.
Меня поразила схожесть наших интересов. Одна треть этих программ уже имелась в моем арсенале. Вторую треть программ я только собирался написать. Теперь сэкономлю время и изучу готовые примеры. А остальная часть программ - это приложения, которые я хотел бы написать, но не представлял, с чего начинать. Эти примеры меня восхитили больше всего. С удовольствием изучу их, найти бы только время на изучение.
Третья тема - изучение IDE. Недавно стал нажимать на все кнопочки и менюшки в Visual Studio и обнаружил в ней новое окно Document Outline. Честно признаюсь, не знаю, когда это окно появилось в Visual Studio, может оно всегда там было? Окно это можно вызвать через View Other Windows или через Ctrl+Alt+T.
В этом окне как на ладони видны все элементы управления проекта. Их можно перемещать, удалять и добавлять из панели инструментов. Я пока не оценил практическую ценность окна, так как использовал простые проекты для исследования. Но, что-то мне подсказывает, что это полезная вещь в хозяйстве.
Четвертая тема - функции Windows API. Недавно я закончил писать пример выключения компьютера при помощи функции ExitWindowsEx. Чтобы использовать эту функцию в Windows XP/Vista, необходимо также вызывать функции GetCurrentProcess, OpenProcessToken, LookupPrivilegeValue, AdjustTokenPrivileges. Я не стану приводить этот пример здесь. Он будет доступен пользователям, которые приобрели мой справочник по фунциям Windows API. Остальные могут поискать ответ самостоятельно в интернете. Следующими функциями для изучения станут функции Windows Vista, связанные с Aero Glass. Немного об этих функциях было сказано в апрельском номере журнал MSDN Magazine за 2007 год. Надо это дело разобрать по косточкам и поместить в справочник.
Есть еще несколько интересных тем для разговора. Но, я, пожалуй, оставлю их до следующего раза.
Удачного вам программирования!

вторник, 24 июня 2008 г.

Ангел мой, пойдем со мной: ты впереди, я - за тобой

Если вы смотрели футбольный матч Россия-Голландия по телевизору, то, возможно, обратили внимание, как рассказывал о ходе встречи телекомментатор Геннадий Орлов. Еще до начала матча неожиданно стали обсуждать, кто должен стать комментатором этой встречи и на каком канале ее показывать. Все боялись вспугнуть удачу. В конце концов все-таки решили не переносить показ матча на другой канал, но попросили поработать на матче Орлова, считая его фартовым комментатором. И он выдал такой репортаж! Постоянно путал фамилии футболистов, оговаривался, обращался к судье с вопросами и замечаниями. В дополнительное время немного напутал со временем и ждал окончания матча на 115 минуте вместо положенных 120 минут. В конце концов ему подсказали и он поправился и извинился. Но, кульминацией его репортажа стала фраза в конце матча
Ангел мой, пойдем со мной: ты впереди, я - за тобой.
На моей памяти это первый случай, когда в эфире ведущий спортивного канала произносит своеобразный оберег. Это была бомба. На многих спортивных форумах обсуждали этот удивительный репортаж. Один из участников форума даже назвал его белым магом, в отличие от другого популярного комментатора, названного черным магом. Должен признаться, меня тоже поразила эта фраза. От нее повеяло чем-то таким необыкновенным...
Удачного вам боления!
P.S. А вы обратили внимание, что у нас комментаторы носят птичьи фамилии: Орлов, Гусев, Уткин.

суббота, 21 июня 2008 г.

Советы Сары Форд на русском

Постоянные читатели моего блога помнят, что я предлагал ознакомиться с советами Сары Форд, которые она публиковала с завидной периодичностью на своей англоязычной страничке. У меня для вас хорошая новость. Эти же советы теперь можно будет читать и на русском языке. Найти это чудо можно по адресу http://blogs.msdn.com/rusaraford/. Надеюсь, советы на русском будут также появляться регулярно.
Первый совет был посвящен инкрементному поиску. Кстати, такой же совет имеется и в моей книге C#. Советы программистам (глава Интегрированная среда разработки (IDE)).
P.S. А сборная России по футболу уже в полуфинале Чемпионата Европы!
Удачного вам боления!

суббота, 7 июня 2008 г.

Админ ли ты?

Продолжаю читать книжку Защищенный код для Windows Vista. Оказывается, если вы регистрировались в системе как Администратор, то все равно администратором по сути не являетесь. По умолчанию система дает вам права стандартного пользователя. Если вам необходимо выполнить административную задачу, то система предложит вам повысить свои права. Срабатывает механизм UAC (контроль учетных записей пользователей), который так раздражает многих пользователей. Автор книги рекомендует использовать системную функцию IsUserAnAdmin для проверки ваших текущих прав. К счастью, синтаксис этой функции очень прост и мне не составило труда написать объявление этой функции для C# через механизм P/Invoke:
[DllImport("shell32.dll")]
private static extern bool IsUserAnAdmin();

// Является ли пользователь администратором
Console.WriteLine("Вы админ?: {0}", IsUserAnAdmin().ToString());


Если запустите эту программу, то можете убедиться, что вы не являетесь администратором (False). Теперь найдите исполняемый файл проекта в Проводнике, щелкните правой кнопкой для вызова контекстного меню и выберите команду Запуск от имени администратора. Теперь программа будет выводить значение True. Вы повысили себе права до уровня администратора ручным способом.
Существует и другой аспект. Предположим, вы сами хотите реализовать возможность повышения уровня привилегий в своей программе. В таком случае воспользуйтесь следующим кодом:

Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"cmd.exe");
psi.UseShellExecute = true;
psi.Verb = "runas";
p.StartInfo = psi;
p.Start();


В приведенном примере показано, как можно запускать новый процесс с повышенными привилегиями.

Итак, после прочтения очередных страниц книги, мы познакомились с новой функцией Windows API IsUserAnAdmin, которую я сразу же поместил в свой справочник по функциям Windows API и узнали, как программно повышать права при вызове нового процесса.
Удачного вам программирования!
P.S. Чемпионат Европы по футболу стартовал. Удачного вам боления!

вторник, 27 мая 2008 г.

Назад в будущее

В прошлом выпуске я поведал вам о выходе в свет книги C#. Советы программистам. Одна из глав книги посвящена различным трюкам, которые можно использовать в IDE Visual Studio. Сегодня узнал еще один интересный прием, который, похоже, не имеется в книге. Суть в следующем. Предположим у вас имеется большой проект. Вы выбираете в редакторе кода какое-нибудь слова и вызываете из контекстного меню команду Go To Definition. Вам мгновенно переносит в нужное место. Все это, безусловно, прекрасно. Но нам нужно вернуться теперь обратно, а проект очень большой... Неужели придется прокручивать редактор в поисках места, с которого вас выбросило? Запомните волшебную комбинацию клавиш Ctrl + -. Как только вы нажмете эту комбинацию, вы снова вернетесь на предыдущую позицию. Строго говоря, эта комбинация в паре с комбинацией Ctrl + Shift + - работает как кнопки Вперед и Назад в Internet Explorer.
Удачного вам программирования!

суббота, 24 мая 2008 г.

Моя новая книжка C#. Советы программистам

Издательство BHV-Петербург выпустило мою новую книжку C#. Советы программистам. Я постарался отобрать наиболее интересные примеры, которые я использовал в своей практике или собираюсь использовать в будущем. Более полную информацию о книге вы можете почерпуть с моей специальной странички, посвященной книжным новинкам. За написание книги я приступил около двух лет назад. Естественно, часть советов просто не попала в это издание. Поэтому я буду выкладывать новые советы на страницу FAQ. Наиболее интересные решения, возможно, попадут в следующее издании книги. Буду рад, если вы поделитесь своими замечаниями и предложениями по книге. Также можете присылать свои советы, которые я с удовольствием рассмотрю.
Счастливого вам чтения!

воскресенье, 11 мая 2008 г.

Новая книга Защищенный код для Windows Vista

Здравствуйте!
Недавно издательство Питер выпустило книгу Защищенный код для Windows Vista. Книга содержит очень много полезной информации о том, как правильно нужно писать программы под новую операционную систему Windows Vista. Большинство примеров в книге приводится на C++ и только небольшая часть на C#. Но тем не менее, книга очень нужная и своевременная. Я с удовольствием начал ее читать.

пятница, 9 мая 2008 г.

Узнать редакцию Vista

В каждой новой операционной системе появляются новые функции. Не стала исключением и Windows Vista. Как вы, вероятно, знаете, Vista поставляется в нескольких редакциях: Home Basic, Home Premium, Business и так далее. Чтобы узнать, какая версия используется у пользователя, можно воспользоваться двумя способами. Первый способ - использовать WMI (свойство OperatingSystemSKU из класса Win32_OperatingSystem). Пример использования этого свойства можно найти в справочнике по WMI.
Но нас интересует пример на C#. Для этой цели нам подойдет новая функция Windows API GetProductInfo, которая появилась в Windows Vista. Описание этой функции я поместил в справочник по функциям Windows API для .NET Framework, а здесь приведу небольшой пример использования в функции в проекте на C#:

[DllImport("kernel32.dll")]
public static extern bool GetProductInfo(
int dwOSMajorVersion,
int dwOSMinorVersion,
int dwSpMajorVersion,
int dwSpMinorVersion,
out uint pdwReturnedProductType);
// констанды для pdwReturnedProductType
public const uint PRODUCT_BUSINESS = 0x00000006; // Business
public const uint PRODUCT_ENTERPRISE = 0x00000004; // Enterprise
public const uint PRODUCT_HOME_BASIC = 0x00000002; // Home Basic
public const uint PRODUCT_HOME_PREMIUM = 0x00000003; // Home Premium
public const uint PRODUCT_ULTIMATE = 0x00000001; // Ultimate
public const uint PRODUCT_UNDEFINED = 0x00000000;


int majorVersion = Environment.OSVersion.Version.Major;
int minorVersion = Environment.OSVersion.Version.Minor;
int spMajorVersion = Environment.OSVersion.Version.MajorRevision;
int spMinorVersion = Environment.OSVersion.Version.MinorRevision;
// Vista GerProductInfo
uint edition = PRODUCT_UNDEFINED;
if (GetProductInfo(
majorVersion,
minorVersion,
spMajorVersion,
spMinorVersion,
out edition))
{
switch (edition)
{
case PRODUCT_ENTERPRISE:
textBox1.Text += " Enterprise";
break;
case PRODUCT_ULTIMATE:
textBox1.Text += " Ultimate";
break;
case PRODUCT_BUSINESS:
textBox1.Text += " Business";
break;
case PRODUCT_HOME_PREMIUM:
textBox1.Text += " Home Preminum";
break;
case PRODUCT_HOME_BASIC:
textBox1.Text += " Home Basic";
break;
default:
textBox1.Text += " Unknown";
break;
}
}


Программисты, которые по-прежнему работают на Visual Basic 6.0, также не будут забыты. Я постараюсь включить эту фунцию в справочник по функциям Windows API для Visual Basic 6.0.
Всех с праздником Победы!
И счастливого вам программирования!

вторник, 6 мая 2008 г.

Массив байтов и файловые потоки

В одном из проектов мне понадобилось конвертировать массив байтов bytes[] в поток System.IO.Stream. Так как я вплотную потоками не работал, то моя работа затормозилась. Пришлось искать решение в интернете. Оказалось, что мы не одиноки во Вселенной. Одного человека также интересовал этот вопрос, который он задал на форуме ASP.NET Mania. Добрый человек откликнулся на просьбу и предложил решение в виде класса. Я вытащил из кода нужную мне функциональность, но своей странице FAQ оставил оригинальную версию. Вдруг, спустя некоторое время, мне опять понадобится работать с потоками.
public static class StreamConverter
{
public static Stream ToStream(byte[] bytes)
{
return new MemoryStream(bytes);
}


public static byte[] ToBytes(Stream stream)
{
long initialPosition = stream.Position;
stream.Position = 0;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Position = initialPosition;
return bytes;
}
}
Удачного вам программирования!

воскресенье, 27 апреля 2008 г.

Как создавать zip-архивы

Каждое утро на моей работе начинается с одной и той же операции. Необходимо скопировать с сервера пять xls-файлов на свой компьютер и заархивировать их в zip-файлы, чтобы выложить их на ftp-сервер. Раньше эту работу делали вручную, но в конце концов мне надоело выполнять одну и ту же последовательность действий и я решил написать для себя небольшую утилитку. Копирование файлов с одного компьютера на другой не представляет интереса, а вот архивирование файлов в zip-формат оказалось не таким простым делом. Пришлось обратиться к помощи Google, чтобы узнать больше об этой проблеме. После непродолжительных поисков я нашел пять различных способов архивации файлов. Например, можно запустить процесс WinZip c необходимыми параметрами. Но у меня на компьютере нет программы WinZip, поэтому такой способ мне не подходит. Существуют более удобные способы для архивации в виде специальных библиотек. Большинство этих библиотек бесплатны и с открытым исходным кодом. Я протестировал часть самых популярных библиотек в своих примерах и решил остановиться на библиотеке DotNet Zip, которую можно найти по адресу http://www.codeplex.com/DotNetZip.
Чтобы воспользоваться этой библиотекой, необходимо добавить ссылку на Ionic.Utils.Zip и написать, например, такой код:
using (ZipFile zip = new ZipFile("MyZipFile.zip")
{
zip.AddFile(@"c:\photos\cat.jpg");
zip.AddFile(@"c:\Desktop\kitty.jpg");
zip.AddFile("ReadMe.txt");
zip.Save();
}
Вы можете скачать готовую библиотеку, исходный код, документацию, инсталлятор. На сегодняшний день библиотека DotNet Zip имет версию 1.3 (есть еще бета-версия 1.4).
Сразу оговорюсь, что я не проверял производительность при архивации файлов разными библиотеками, а также не рассматривал их функциональные возможности. Я решал конкретную задачу и данное решение полностью удовлетворило меня. Теперь работа, которая отнимала у меня полчаса драгоценного времени, выполняется в течении минуты. Сейчас я тестирую программу на предмет отправки файлов на ftp-сервер. Но об этом в следующий раз.
А вам удачного программирования!
Христос воскресе!

воскресенье, 20 апреля 2008 г.

SoundPlayer

В .NET Framework 2.0 появилась поддержка звуковых файлов и теперь не нужно прибегать к услугам функций Windows API PlaySound. Для проигрывания звуковых файлов используется класс SoundPlayer из пространства имен System.Media. Приведу небольшой кусок с использованиме этого класса. Более подробно о новых классах вы можете прочитать в документации MSDN или в моем справочнике по .NET Framework.
using System.Media;
SoundPlayer player = new SoundPlayer();
player.SoundLocation = "c:/tada.wav";
player.Play();

Будьте внимательны, поддержка этого класса в .NET Compact Framework доступна только в версии 3.5.
P.S. Кстати, я обзавелся новым электронным адресом klimoff@csfan.ru. CSFAN - это, наверное, фанат C#. Ну что ж, пусть будет еще один адрес. Можете слать на это мыло свои сообщения. Вы также можете приобрести такой адрес, если пройдете на сайт http://www.mailnica.ru/. На этом сайте Майкрософт предлагает на выбор самые разнообразные адреса, например, дочь танкиста.ру или дайте-денег.ру

понедельник, 14 апреля 2008 г.

Не прислоняться или детская забава

Когда я учился в школе, мне приходилось ездить каждый день на метро, начиная с 5 класса. Чтобы первым успевать к экскалатору или к переходу на другую ветку, я старался держаться около дверей вагона. В течении получаса передо мной маячила надпись Не прислоняться, написанная на каждой двери вагона московского метро. Сначала я смотрел на эту надпись снизу вверх, потом надпись была на уровне моих глаз, а когда заканчивал школу, то смотрел на нее уже свысока))). Чтобы не скучать, я придумал себе простое занятие - составлять слова из букв, входящих в эту надпись. Слова из трех или четырех букв придумать было достаточно просто: стол, слон, нос, сон, лот и т.п. Когда легкие слова закончились, я пытался найти уже более сложные слова. И испытывал радость, когда получалось составить какое-нибудь новое слово. Например, удалось найди шестибуквенные слова типа пистон, пионер. Были даже семибуквенные находки - престол. Позже, когда я увлекся программированием, я поймал себя на мысли - как было бы здорово написать программу, которая сама найдет все существующие варианты. Эта была моя детская мечта. Как хорошо было бы, если эту задачку предложили на олимпиаде для программистов. Так хочется узнать все слова, зашифрованные в этой незамысловатой надписи. Как я себе представляю, эту задачу можно разделить на два этапа. Первый этап - комбинаторная задача, которая сводится к получению всех возможных перестановок букв. Вторая задача - сверка получившихся комбинаций с каким-то большим словарем, чтобы оставить только осмысленные слова. Вот такая у меня была детская забава.

четверг, 20 марта 2008 г.

GetDrives и IsReady

Сегодня продолжим разговор о новинках, которые появились в .NET Framework 2.0. Рассмотрим метод GetDrives и свойство IsReady из класса DriveInfo. Метод GetDrives получает массив имен всех логических дисков на компьютере. Естественно, используя этот массив, мы можем пройтись по всем дискам и получить информацию о каждой диске. Но, чтобы не нарваться на ошибку, желательно воспользоваться свойством IsReady, который определяет доступность диска, например, можно определить наличие компакт-диска в CD-ROM. Берем на вооружение все вышесказанное и пишем следующий пример.
using System;
using System.IO;
class Test
{
public static void Main()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
Console.WriteLine("Диск {0}", d.Name);
Console.WriteLine(" Тип диска: {0}", d.DriveType);
if (d.IsReady == true)
{
Console.WriteLine(" Полный размер диска: {0, 15} bytes ", d.TotalSize);
}
}
}
}
Описываемые метод и свойство я добавил в свой справочник по .NET Framework, доступный зарегистрированным пользователям. Кстати, вы можете бесплатно получить один выпуск справочника, если выполните одно условие. Вам необходимо выбрать любой пример, написанный на Visual Basic 6.0 с сайта Русский_Проект и портировать его на язык C# или VB.NET. Хочу обратить ваше внимание, что нужно, именно, портировать исходник, а не присылать похожий пример. Примеры можете присылать по адресу rusproject@mail.ru.
Удачного вам программирования!

среда, 12 марта 2008 г.

Перетаскивание строчек кода в IDE

Сегодня в блоге Сары Форд (надеюсь, все уже нашли адрес ее блога и подписались?) прочитал очень интересный совет.
Сначала вспомним, как обычно мы управляем строчками кода. Если нужно переместить строчки кода в другое место, то просто выделяем нужный фрагмент и перемещаем текст (а-ля Word). Если нужно скопировать кусочек текста, то мы сначала выделяем текст, выбираем команду Copy, щелкаем мышкой в другом месте редактора кода и сновы вызываем контекстное меню для команды Paste (либо пользуемся комбинациями клавиш). Но есть еще один интересный способ. Выделите строчку кода, затем нажмите на правую кнопку мыши и, удерживая ее, перетащите выделенную строчку в нужное место. Когда вы отпустите кнопку мыши, то
увидите всплывающее меню с командами "Move here, Copy here и Cancel." Очень удобно для быстрого копирования или перемещения кода. Возьмите на заметку. Счастливого вам программирования!

воскресенье, 2 марта 2008 г.

Недавно в справочник добавил пример с применением функций SetPowerRequirement и ReleasePowerRequirement. С помощью этих функций можно сделать так, чтобы экран мобильного устройства не выключался, если долго не нажимать на кнопки или не пользоваться пером. Это может пригодиться, например, при просмотре видео. Приведу объявление одной функции на VB:
Declare Function SetPowerRequirement Lib "coredll.dll" (ByVal pvDevice As String, _ ByVal DeviceState As PowerState, _ ByVal DeviceFlags As Integer, _ ByVal pvSystemState As IntPtr, _ ByVal StateFlags As Integer) As IntPtr

Чтобы экран не выключался, нужно сделать так:
' Отключаем автоматическое выключение экрана
Public Sub Activate()
'request full power handle = SetPowerRequirement("BKL1:", CEDEVICE_POWER_STATE.D0, 1, IntPtr.Zero, 0)
End Sub
Более полное описание функций и примеры на C# и Visual Basic можно найти в справочнике по функциям Windows API.
Кстати, новость для тех, кто интересуется программированием для мобильных устройств. Microsoft поменяла главную страницу Windows Mobile Developer Center. Теперь на этой странице в более удобном виде собраны ресурсы для разработчика под платформу Windows Mobile. Рекомендую всем. (А вечером многие страницы Microsoft были недоступны. Надеюсь, это временное явление).

 

суббота, 23 февраля 2008 г.

Сегодня снова поговорим о новинках .NET Framework 2.0. В новом классе DriveInfo есть свойство VolumeLabel, которое позволяет получать или устанавливать метку тома диска. Данное свойство позволяет отказаться от вызова неуправляемых функций Windows API SetVolumeLabel и GetVolumeInformation. Описание свойства мы можете найти в моем справочнике, который можно скачать с моей страницы, а здесь я приведу лишь пример использования этого свойства:
DriveInfo di = new DriveInfo("d");
// Устанавливаем новую метку для диска D:
di.VolumeLabel = "DriveD";
// Получим метку тома
Console.WriteLine(new DriveInfo("d").VolumeLabel);

воскресенье, 17 февраля 2008 г.

На прошлой неделе купил книгу Чарльза Петцольда Microsoft Windows Presentation Foundation. Базовый курс. Мне нравится стиль изложения материала этого писателя, поэтому в моей библиотеке есть практически все его книги. Советую и вам приобрести эту книгу и освоить новую технологию WPF.
А на моем сайте есть специальный раздел Книги, в котором вы найдете другие полезные и интересные произведения, связанные с .NET Framework.

четверг, 7 февраля 2008 г.

Лошадиная фамилия

Сегодня пришло письмо от одного клиента. Фамилия у него была весьма необычна. Девушка, которая обрабатывает письма клиентов, засомневалась, что фамилия настоящая и стала показывать письмо всем сотрудникам офиса. Там было написано, что человека зовут Бляблин. Возник спор по поводу такой фамилии - стоит ли выходить замуж за такого человека и так далее. Вечером пришел домой и решил немного погуглить. К моему удивлению, фамилия оказалась достаточно популярной и распространенной!
Счастливого вам программирования, господин Бляблин! )))

воскресенье, 27 января 2008 г.

Открыть папку, содержащую файл

Впрочем, кроме получения полного пути к файлу (смотри предыдущий совет), еще требуется быстро открыть саму папку, в которой содержится нужный файл проекта. В контекстном меню той же файловой закладки есть пункт Open Containing Folder. Эта команда позволяет мгновенно оказаться в нужной папке и произвести необходимые действия с файлом: поменять атрибуты файла, переименовать его и т.д.
P.S. Может есть смысл размещать эти советы на сайте http://netsources.narod.ru?
Счастливого вам программирования!

суббота, 26 января 2008 г.

Путь к файлу

Вот вам еще один совет, который вам пригодится. Иногда, требуется быстро получить полный путь к файлу, с которым вы работаете в IDE Visual Studio. Раньше приходилось открывать Проводник, искать нужный файл, смотреть его свойства и т.д. Теперь достаточно щелкнуть правой кнопкой на закладке с именем файла и выбрать пункт Copy Full Path.
Кстати, если вам интересна тема советов, связанных со средой разработки Visual Studio, то советую посетить блог Sara Ford's WebLog. Специально не даю прямую ссылку, чтобы вы самостоятельно нашли эту страницу. Поработайте, ребята.
Часть советов из ее блога уже были в моей коллекции, но иногда попадаются и новинки.
Счастливого вам программирования!

воскресенье, 20 января 2008 г.

TotalFreeSpace

Поговорим о новых методах, свойствах, классах и т.д., которые появились в .NET Framework 2.0. Иногда, просматривая старые проекты, написанные под .NET Framework 1.0/1.1, видишь, устаревшие строчки кода. Например, в NF 2.0 появилось новое свойство TotalFreeSpace класса DriveInfo. Это свойство возвращает общее количество свободного места на диске. Например, можно написать так:
MessageBox.Show(new DriveInfo("c").TotalFreeSpace.ToString());
Просто и понятно.
Удачного вам программирования!

четверг, 17 января 2008 г.

Прозрачная подсказка IntelliSense

Продолжим изучение среды разработки Visual Studio 2008. Меня очень часто раздражало, когда выпадающее окно подсказки IntelliSense закрывало часть кода, написанного строчками ниже. Приходилось прекращать печатать код, чтобы посмотреть, что же было написано на этих строчках, и потом снова возвращаться на редактируемую строку. Видимо, это раздражало не только меня, но и многих программистов. В Visual Studio 2008 можете поступить следующим образом. Когда подсказка снова закроет нужную часть кода, то просто нажмите на клавишу Ctrl. Вау, подсказка стала прозрачной и вы видите нужные данные. Отпустите клавишу - подсказка снова примет свой стандартный вид. Снова нажмите на клавишу. Снова отпустите ))). Уверен, вам понравится. Теперь поводов для раздражения стало меньше, а значит жизнь прекрасна! На этой радостной ноте и закончим. Счастливого вам программирования!

пятница, 11 января 2008 г.

Изучайте среду разработки

Сегодня хотелось бы поговорить о среде разработки IDE для Visual Studio 2008. Данная среда разработки является очень мощным инструментом, который используется программистами не на полную катушку. Программисты основное внимание уделяют написанию своего кода и компиляции. На изучение возможностей IDE у ленивых разработчиков нет времени. Тогда читайте мой блог. Я буду рассказывать вам понемногу о всяких полезных мелочах. Авось, пригодится. Начнем с начального экрана при запуске IDE. У большинства пользователей при начальной загрузке отображается RSS-ридер, который показывает последние новости с сайта Майкрософт. Вы можете установить свой адрес для чтения RSS-новостей. Для этого идем в Tools Options… Environment Startup. В списке At Startup: вы выбираете, что должно появляться при загрузке IDE. А в поле Start Page news channel вы можете указать свой адрес для чтения RSS-новостей. По умолчанию там стоит строка http://go.microsoft.com/fwlink/?linkid=35587&clcid=409. Также вы можете определить время обновления новостей.
Удачного вам программирования!

вторник, 8 января 2008 г.

Устаревшие функции Windows API (продолжение)

Продолжаем избавляться от устаревших функций Windows API. Просматривая книгу Программирование КПК и смартфонов на .NET Compact Framework, обнаружил код для работы с реестром. Описание функций заняло около 10 страниц книги. К счастью, в .NET Compact Framework 2.0 появилась поддержка работы с реестром при помощи класса Registry. В качестве примера можете посмотреть устаревшую функцию RegOpenKeyEx на странице Функций Windows API.
Старые функции в топку! Теперь аналогичный пример с использованием управляемого кода займет полстраницы вместо десяти страниц (почувствуйте разницу).
Удачного вам программирования!

четверг, 3 января 2008 г.

Устаревшие функции Windows API

Я сейчас пересматриваю старые проекты для .NET Compact Framework. Теперь в Windows Mobile 6 зашита 2 версия .NET Compact Framework, поэтому некоторые конструкции с применением вызовов функций Windows API выглядят устаревшими. Например, вместо функции GetSystemPowerStatusEx можно воспользоваться свойствами SystemState.PowerBatteryStrength и SystemState.PowerBatteryState пространства имен Microsoft.WindowsMobile.Status.
Если вас интересуют описания устаревших функций Windows API, то можете посетить специальную страничку на моем сайте (http://netsources.narod.ru/oldapi/winapi.html).
Удачного вам программирования!

вторник, 1 января 2008 г.

С Новым 2008 годом!

В первый день нового года нет смысла грузить вас листингами кодов и умными словами. Просто позвольте пожелать вам удачи в новом году. Тем более, что символом года является мышь, которая является другом программиста. Пусть левая и правая кнопка мыши тихо щелкают под вашей рукой. Ладно, приведу небольшой код.

private void Form1_MouseClick(object sender, MouseEventArgs e)
{

MessageBox.Show("Счастливого вам программирования!");
}

Для зарегистрированных пользователей сообщаю, что вышло обновления справочника по функциям Windows API для .NET Framework. Проверьте вашу почту.