Александр Климов - Программирование КПК и смартфонов на .NET Compact Framework
- Название:Программирование КПК и смартфонов на .NET Compact Framework
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:978-5-91180-270-7
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Александр Климов - Программирование КПК и смартфонов на .NET Compact Framework краткое содержание
Мобильные устройства все активнее вторгаются в нашу жизнь. Карманные компьютеры и смартфоны давно утратили статус дорогих игрушек и перекочевали в разряд необходимых устройств. Значит, для них необходимо создавать программное обеспечение. Так почему вы должны оставаться в стороне?
Прочитав эту книгу, вы получите знания, которые позволят вам уверенно создавать программы для карманных компьютеров и смартфонов. А огромное количество разнообразных примеров поможет быстро совершенствоваться и развиваться, обогащая свой опыт работы.
Книга предназначена для начинающих программистов.
Программирование КПК и смартфонов на .NET Compact Framework - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Так как .NET Compact Framework не позволяет создавать округленные прямоугольники встроенными средствами, то необходимо самостоятельно реализовать эту задачу. В этом разделе будет рассматриваться решение, предложенное Алексом Яхниным (Alex Yakhnin) в его блоге blog.opennetcf.org/ayakhnin/. Для достижения заданного эффекта надо нарисовать серию линий, которые соединяют эллипсы, и закрасить внутреннюю область сплошным цветом (рис. 6.7).

Рис. 6.7. Создание прямоугольника со скругленным углами
Соответствующий код приведен в листинге 6.19.
public static void DrawRoundedRectangle(Graphics g, Pen p, Color backColor,
Rectangle rc, Size size) {
Point[] points = new Point[8];
// подготовим точки для фигуры
points[0].X = rc.Left + size.Width / 2;
points[0].Y = rc.Top + 1;
points[1].X = rc.Right - size.Width / 2;
points[1].Y = rc.Top + 1;
points[2].X = rc.Right;
points[2].Y = rc.Top + size.Height / 2;
points[3].X = rc.Right;
points[3].Y = rc.Bottom - size.Height / 2;
points[4].X = rc.Right - size.Width / 2;
points[4].Y = rc.Bottom;
points[5].X = rc.Left + size.Width / 2;
points[5].Y = rc.Bottom;
points[6].X = rc.Left + 1;
points[6].Y = rc.Bottom - size.Height / 2;
points[7].X = rc.Left + 1;
points[7].Y = rc.Top + size.Height / 2;
// приготовим кисть для фона
Brush fillBrush = new SolidBrush(backColor);
// рисуем отрезки и круги для округленного прямоугольника
g.DrawLine(p, rc.Left + size.Width / 2, rc.Top,
rc.Right - size.Width / 2, rc.Top);
g.FillEllipse(fillBrush, rc.Right - size.Width, rc.Top,
size.Width, size.Height);
g.DrawEllipse(p, rc.Right - size.Width, rc.Top, size.Width, size.Height);
g.DrawLine(p, rc.Right, rc.Top + size.Height / 2, rc.Right,
rc.Bottom - size.Height /2);
g.FillEllipse(fillBrush, rc.Right - size.Width, rc.Bottom - size.Height,
size.Width, size.Height);
g.DrawEllipse(p, rc.Right - size.Width, rc.Bottom - size.Height,
size.Width, size.Height);
g.DrawLine(p, rc.Right - size.Width / 2, rc.Bottom,
rc.Left + size.Width / 2, rc.Bottom);
g.FillEllipse(fillBrush, rc.Left, rc.Bottom - size.Height,
size.Width, size.Height);
g.DrawEllipse(p, rc.Left, rc.Bottom - size.Height,
size.Width, size.Height);
g.DrawLine(p, rc.Left, rc.Bottom - size.Height / 2,
rc.Left, rc.Top + size.Height / 2);
g.FillEllipse(fillBrush. rc.Left, rc.Top, size.Width, size.Height);
g.DrawEllipse(p, rc.Left, rc.Top, size.Width. size.Height);
// заполняем прямоугольник, скрывая внутренние эллипсы
g.FillPolygon(fillBrush, points);
// освобождаем ресурсы
fillBrush.Dispose();
}
private void butDrawRoundedRectangle_Click(object sender, EventArgs e) {
Graphics g = CreateGraphics();
Rectangle rc = new Rectangle(10, 10, 200, 50);
DrawRoundedRectangle(g,
new Pen(Color.Black), Color.CadetBlue, rc, new Size(8, 8));
}
Результат работы этого кода показан на рис. 6.8.

Рис. 6.8. Отображение закрашенного прямоугольника со скругленными углами
Создание экранных снимков
Если при работе с мобильным устройством необходимо сделать скриншоты, то для реализации замысла необходимо использовать внешние устройства. Конечно, можно просто сфотографировать экран, но настоящий программист будет использовать функции Windows API. В этом разделе главы будет рассматриваться пример копирования определенной области окна, всего рабочего окна программы или любого другого окна. Для демонстрации примера надо разместить на форме список, три кнопки и один таймер. Сам код приведен в листинге 6.20.
[DllImport("coredll.dll", EntryPoint = "GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow();
[DllImport("coredll.dll", EntryPoint = "GetDC")]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("coredll.dll", EntryPoint = "ReleaseDC")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("coredll.dll")]
public static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest,
int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
const int SRCCOPY = 0x00CC0020;
private void screenshot(string filename, Graphics gx, Rectangle rect) {
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bmp);
BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, gx.GetHdc(),
rect.Left, rect.Top, SRCCOPY);
bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp);
bmp.Dispose();
g.Dispose();
}
private void butPartOfWindow_Click(object sender, EventArgs e) {
// Делаем снимок списка
ScreenShot(@"\My Documents\save.bmp", this.CreateGraphics(),
listBox1.Bounds);
}
private void butScreen_Click(object sender, EventArgs e) {
// Делаем снимок экрана
Rectangle rect = new Rectangle(0,0,240,240);
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bmp);
IntPtr hwnd = GetDesktopWindow();
IntPtr hdc = GetDC(hwnd);
BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, hdc, rect.Left,
rect.Top, SRCCOPY);
bmp.Save(@"\My Documents\screen.bmp",
System.Drawing.Imaging.ImageFormat.Bmp);
// Освобождаем ресурсы
ReleaseDC(hwnd, hdc);
bmp.Dispose();
g.Dispose();
}
private void timer1_Tick(object sender, EventArgs e) {
// Делаем снимок экрана через 5 секунд
Rectangle rect = new Rectangle(0, 0. 240, 240);
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bmp);
IntPtr hwnd = GetDesktopWindow();
IntPtr hdc = GetDC(hwnd);
BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, hdc, rect.Left,
rect.Top, SRCCOPY);
bmp.Save(@"\My Documents\5sec.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
// Освобождаем ресурсы
ReleaseDC(hwnd, hdc);
bmp.Dispose();
g.Dispose();
timer1.Enabled = false;
}
private void but5Sec_Click(object sender, EventArgs e) {
timer1.Enabled = true;
}
Функция ScreenShot
позволяет быстро получить участок экрана и сохранить его в графическом файле. В рассмотренном примере внешний вид списка сохраняется в файле listbox.bmp
. Для этого достаточно было указать имя файла, объект Graphics
и размеры списка ListBox
. Для получения снимка экрана пример пришлось несколько усложнить, добавив вызовы функций GetDesktopWindow
и GetDC
.
Если нужно получить снимок другой программы, то придется воспользоваться таймером. После запуска таймера в распоряжении пользователя будет 5 секунд, чтобы запустить другое приложение. Основная программа будет работать в фоновом режиме и сделает снимок экрана.
Чтобы проверить работу приложения, нужно запустить программу, нажать каждую кнопку, а затем с помощью программы File Explorer найти сохраненные файлы.
Нужно проявлять определенную осторожность при работе с методом Bitmap.Save(). Дело в том, что в Windows Mobile 2003 и более ранних версиях операционных систем библиотека .NET Compact Framework не поддерживает сохранение графических файлов в форматах GIF, JPEG или PNG. Сохранять файлы можно только в формате BMP. Причем во время написания кода редактор не заметит ошибки и позволит запустить программу с неправильным вызовом метода. Однако при вызове метода возникнет исключение NotSupportedException. К счастью, в Windows Mobile 5.0 поддерживаются все четыре графических формата.
Метод Lockbits
В .NET Compact Framework 2.0 появилась ограниченная поддержка метода LockBits
, при помощи которого можно манипулировать массивом пикселов изображения. Перечисление ImageLockMode
в данном методе позволяет использовать значения ReadWrite
, ReadOnly
и WriteOnly
. А перечисление PixelFormat
поддерживает значения, перечисленные в следующем списке:
Интервал:
Закладка: