Чтение онлайн

ЖАНРЫ

Программирование КПК и смартфонов на .NET Compact Framework

Климов Александр Петрович

Шрифт:

 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.

Листинг 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);

Поделиться с друзьями: