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

вторник, 24 марта 2009 г.

Проверь знания и выиграй призы

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


И вот запускается новая серия. Попробуйте свои силы. Для того, чтобы принять участие в новом конкурсе, перейдите по ссылке и зарегистрируйтесь (если у вас нет LiveID, OpenId).


Всем удачи!

понедельник, 23 марта 2009 г.

Моя книга в Библио-Глобусе

Совсем недавно в издетельстве Питер вышла моя книга Программирование для мобильных устройств под управлением Windows Mobile. Первое время она продавалась только в Петербурге, но недавно добралась и до прилавков московских магазинов. Несколько дней назад на сайте книжного магазина Библио-Глобус обнаружил, что у них тоже продается моя книга. Сегодня зашел в этот магазин и долго искал книгу на полках компьютерного отдела. Так и не нашел. Но, к счастью, магазин оборудован очень удобными терминалами с сенсорными дисплеями. Набираешь на экране название нужной книги и запускаешь поиск. Через несколько секунд система выдает тебе список найденных книг. При желании можно распечатать себе квитанцию с точным расположением книги. С удовольствием воспользовался этой услугой и уже через несколько секунд держал в руках свою книгу.
Кстати, завтра 24 марта в магазине проходит акция - всем покупателям с 18.00 до 22.00 предоставляется скидка 20% на любую книгу. Поэтому, если вы покупаете книги в книжных магазинах, то приезжайте завтра в Библио-Глобус. Можно сэкономить неплохую сумму при нынешних ценах на компьютерную литературу.
Приятного вам чтения!

воскресенье, 22 марта 2009 г.

ShellAbout

Сегодня познакомлю вас с простой функцией Windows API ShellAbout.



[DllImport("shell32.dll")]
static extern int ShellAbout(IntPtr hWnd, string szApp, string szOtherStuff, IntPtr hIcon);


ShellAbout выводит стандартное диалоговое окно Windows "О программе". Такое окно, например, вы можете увидеть при выборе меню О программе в Блокноте (notepad.exe). ЭТо окно можно использовать, когда у вас нет времени на разработку своего окна About.



Параметры



hwnd
Описатель родительского окна, вызывающего функцию

szApp
Выводит текст в заголовке диалогового окна и в первой строчке после слова "Microsoft". Если текст содержит разделитель (#), разделяющий текст на две части, то функция выводит первую часть в заголовке, а вторую после слова "Microsoft"

szOtherStuff
Выводит текст после информации о версии и копирайте

hIcon
Значок, выводимый в диалоговом окне. Если параметр равен NULL, функция показывает значок Microsoft Windows


Пример



ShellAbout(this.Handle, "Блокнотик", "Супер-программа Александра Климова", IntPtr.Zero);

Данная функция включена в справочник по функциям Windows API.

суббота, 28 февраля 2009 г.

Удаление файлов из корзины

В своей книге C#.Советы программистам я привел несколько примеров удаления файлов в системную Корзину. Если вы хотите удалить файлы из самой корзины, то воспользуйтесь функцией Windows API SHEmptyRecycleBin.
[C#]
[DllImport("shell32.dll")]
static extern int SHEmptyRecycleBin(IntPtr hWnd, string pszRootPath, uint dwFlags);
[Visual Basic]
Declare Function SHEmptyRecycleBin Lib "shell32.dll" Alias "SHEmptyRecycleBinA" (
ByVal hwnd As Integer,
ByVal pszRootPath As String,
ByVal dwFlags As Integer) As Integer


Теперь остается только вызвать функцию с нужными параметрами.
SHEmptyRecycleBin(IntPtr.Zero, "", SHERB_NOCONFIRMATION SHERB_NOSOUND);
Полное описание функции будет добавлено в справочник по функциям Windows API в среде .NET Framework.
Удачного вам программирования!

суббота, 14 февраля 2009 г.

Создание кружочков с цифрами без Photoshop

Сегодня в рассылке VB Helper Newsletter (http://www.vb-helper.com/) прочитал, как автор рассылки создавал специальные картинки для иллюстрации к своим книгам или статьям. Картинки представляют собой маленькие кружочки с цифрами внути. Подобные картинки обычно размещают для показа последоватьельности действий. Например, установите текст в текстовом поле (рис.1), нажмите на кнопку Далее (рис.2) и тому подобное. Безусловно, подобные вещи можно сделать в фотошопе и другом графическом редакторе. Но программисты не ищут легких путей. Гораздо интереснее самому генерировать картинки. Хотя, если серьезно, пример обладает определенным потенциалом для изучения техники работы с графикой, а также может послужить отправной точкой для создания других интересных вещей, например, генерирование лотерейных шаров с номерами.



Пример я портировал с Visual Basic на C#. Желающие ознакомиться с исходниками на VB, могут скачать пример с http://www.vb-helper.com/HowTo/howto_2005_make_number_icons.zip.



Привожу пример на C#. Одно маленькое замечание: в первоисточнике использовался цикл for для генерации десяти кружочков с цифрами от 0 до 9. Я ограничился одной цифрой 1.




const int WID = 24;



string base_path = @"e:\down\"; // ваш путь к папке



Font the_font = new Font("Arial", 10, FontStyle.Bold);



Bitmap bm = new Bitmap(WID,WID);



Graphics gr = Graphics.FromImage(bm);



gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;

gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

gr.Clear(Color.White);



Rectangle layout_rectangle = new Rectangle(0, 0, WID - 1, WID - 1);



using (LinearGradientBrush br = new LinearGradientBrush(layout_rectangle,

Color.White,Color.Blue,

LinearGradientMode.ForwardDiagonal))

{

gr.FillEllipse(br,layout_rectangle);

gr.DrawEllipse(Pens.Blue, layout_rectangle);

}



StringFormat string_format = new StringFormat();

string_format.LineAlignment = StringAlignment.Center;

string_format.Alignment = StringAlignment.Center;

gr.DrawString("1",the_font,Brushes.White,layout_rectangle,string_format);

bm.Save(base_path + "1" + ".bmp",System.Drawing.Imaging.ImageFormat.Bmp);



MessageBox.Show("Готово");




Кстати, сегодня День святого Валентина. Поздавляю всех романтичных котиков и кошечек )))



суббота, 17 января 2009 г.

Математические функции на мобильных устройствах или Справка тоже ошибается

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


Сегодня хочу поделиться с одним наблюдением, которое поможет некоторым программистам, использующих математические функции в проектах для .NET Framework.


В составе класса System.Math есть методы Sinh, Cosh и Tanh, которые возвращают гиперболические синус, косинус и тангенс соответственно. Если вы посмотрите в справочной системе, то увидите, что данные методы поддерживаются, начиная с CF 1.0. Но так ли это на самом деле? Давайте попробуем проверить эти утверждения. Запустим новый проект для мобильных устройств и введем простой код для кнопки:



textBox1.Text = Math.Sinh(1.2).ToString();

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


К счастью, не все так страшно. Эти методы легко создать самостоятельно.



double angle = 1.2;

// sinh(double angle): (e^x - e^-x) / 2
double res = (Math.Exp(angle) - Math.Exp(-angle)) / 2.0;

// cosh(double angle): (e^x + e^-x) / 2
res = (Math.Exp(angle) + Math.Exp(-angle)) / 2.0;

// tanh(double angle): sinh / cosh
res = (Math.Exp(angle) - Math.Exp(-angle)) /
(Math.Exp(angle) + Math.Exp(-angle));


Сам я не математик и вряд ли мне придется использовать гиперболические синусы (я даже не знаю, что это такое), но, возможно, кто-то из читателей нарвется на эту неприятность. Отсюда вывод - не относитесь к справке MSDN как к догме.


Данный совет будет помещен на страницу Вопрос+ответ=совет


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

воскресенье, 4 января 2009 г.

Ширина столбцов у ListView

Всех с Новым Годом!

Сегодня поделюсь с вами одним наблюдением, о котором возможно не все знают. Если вы используете в своих проектах элемент управления ListView в режиме Details, то могли заметить одно неудобство. В некоторых случаях, слова обрезаются по ширине ColumnHeader и это слегка раздражает пользователя. Приходится самому вручную увеличивать ширину столбца, чтобы прочитать весь текст. Первое, что приходит в голову - это самостоятельно вычислять ширину слов с помощью MeasureString.
Но не все так плохо. Если прочитать документацию по свойству ColumnHeader.Width, то можно узнать о двух интересных значениях - это отрицательные значения -1 и -2. Первое значение устанавливает ширину столбца по самому длинному слову в столбце, а второе значение устанавливает ширину по слову, содержащему в самом столбце.
Вы можете установить эти значения в режиме разработки, но обратите внимание, что когда вы нажимаете на кнопку OK в редакторе свойств для ListView, то значения -1 или -2 автоматические заменяются на реальную ширину, которая IDE вычисляет автоматически за нас. Поэтому, если внесете изменения в ListView во время разработки, то еще раз установите нужные значения.
Если вы хотите поддерживать нужные размеры столбцов во время выполнения программы, то делайте это программным способом.

ColumnHeader header;
header.Width = -1;


Этот совет я помещаю на страницу Вопросов и ответов. Кстати, он справедлив и для .NET Compact Framework.

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