Основная программа будет работать в фоновом режиме и сделает снимок экрана.
Чтобы проверить работу приложения, нужно запустить программу, нажать каждую кнопку, а затем с помощью программы 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 поддерживает значения, перечисленные в следующем списке:
□ Format16bppRgb555;
□ Format16bppRgb565;
□ Format24bppRgb;
□ Format32bppRgb.
На сайте MSDN можно найти статью «How to: Use LockBits» с примером, в котором создается картинка и меняется интенсивность синих пикселов с помощью метода LockBits. В листинге 6.21 приведен пример, который для большей наглядности пришлось немного изменить.
private Bitmap CreateBitmap(int width, int height) {
 Bitmap bmp = new Bitmap(@'Windowsmsn.gif');
 width = bmp.Size.Width;
 height = bmp.Size.Height;
 Graphics g = Graphics.FromImage(bmp);
 g.Dispose();
 return bmp;
}
protected override void OnPaint(PaintEventArgs e) {
 Bitmap bmp = CreateBitmap(100, 100);
 // Выводим картинку-оригинал
 e.Graphics.DrawImage(bmp, 0, 0);
 MakeMoreBlue(bmp);
 // Рисуем модифицированную картинку ниже исходного изображения
 e.Graphics.DrawImage(bmp, 0, 50);
 bmp.Dispose();
}
private void MakeMoreBlue(Bitmap bmp) {
 // Задаём формат данных о цвете для каждой точки изображения
 PixelFormat pxf = PixelFormat.Format24bppRgb;
 // Блокируем изображение в памяти
 Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
 BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf);
 // Получаем адрес первой строки развертки
 IntPtr ptr = bmpData.Scan();
 // Массив, содержащий байты изображения
 int numBytes = bmp.Width * bmp.Height * 3;
 byte[] rgbValues = new byte[numBytes];
 // Копируем значения RGB в массив
 Marshal.Copy(ptr, rgbValues, 0, numBytes);
 // Модифицируем изображение, устанавливая
 // синий цвет для каждой точки в картинке
 for (int counter = 0; counter < rgbValues.Length; counter += 6)
  rgbValues[counter] = 255;
 // Копируем значения RGB обратно в изображение
 Marshal.Сору(rgbValues, 0, ptr, numBytes);
 // Разблокируем биты в памяти
 bmp.UnlockBits(bmpData);
}
После запуска приложения на экране будут показаны две копии картинки, причем нижнее изображение будет немного отличаться от верхнего насыщенностью цветов.
Графический редактор
Теперь, когда мы ознакомились с графическими методами, настало время написать простейший графический редактор с минимальными возможностями. В этом приложении можно будет рисовать при помощи стилуса линии, а также прямые цветные линии из трех цветов. Процесс рисования узоров на экране КПК при помощи стилуса гораздо больше похож на реальное рисование, чем рисование мышью в стандартных графических редакторах.
Весь код программы сводится к обработке событий мыши MouseDown, MouseMove и MouseUp. В принципе, приемы создания графических эффектов ничем не отличаются от соответствующих приемов, применяемых на обычных персональных компьютерах. Я взял два примера из своей книги «Занимательное программирование на Visual Basic .NET» и перенес код в проект с учетом синтаксиса языка С#, что иллюстрирует листинг 6.22.
private int x_md, y_md;
Pen myPen = new Pen(Color.LightBlue);
private bool bPaint;
Graphics g;
private Pen erasePen;
private Point ptsStart;
private Point ptsPrevious;
private Point ptsCurrent;

 
                