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 Documentssave.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 Documentsscreen.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 Documents5sec.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 секунд, чтобы запустить другое приложение.