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

воскресенье, 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());
}


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