Danh mục tài liệu

Đồ hoạ, đa phương tiện ( Mutilmedia) và In ấn Đồ họa phần 3

Số trang: 8      Loại file: pdf      Dung lượng: 159.86 KB      Lượt xem: 11      Lượt tải: 0    
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Thực hiện chụp màn hình DesktopBạn cần lấy ảnh chụp của màn hình Desktop hiện thời. Sử dụng các lời gọi
Nội dung trích xuất từ tài liệu:
Đồ hoạ, đa phương tiện ( Mutilmedia) và In ấn Đồ họa phần 3using System;using System.Windows.Forms;using System.Drawing;public class PictureScroll : System.Windows.Forms.Form { private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Panel panel1; // (Bỏ qua phần mã designer.) private void PictureScroll_Load(object sender, System.EventArgs e) { string text = The quick brown fox jumps over the lazy dog.; Font font = new Font(Tahoma, 20); // Tạo một hình bitmap trong-bộ-nhớ. Bitmap b = new Bitmap(600, 600); Graphics g = Graphics.FromImage(b); g.FillRectangle(Brushes.White, new Rectangle(0, 0, b.Width, b.Height)); // Vẽ nhiều dòng text lên hình bitmap. for (int i=0; i < 10; i++) { g.DrawString(text, font, Brushes.Black, 50, 50 + i*60); } // Hiển thị hình bitmap trong PictureBox. pictureBox1.BackgroundImage = b; pictureBox1.Size = b.Size; }} 1.1 Thực hiện chụp màn hình Desktop Bạn cần lấy ảnh chụp của màn hình Desktop hiện thời. Sử dụng các lời gọi Win32 API GetDesktopWindow, GetDC, và ReleaseDC trong thư viện user32.dll. Ngoài ra, sử dụng GetCurrentObject trong thư viện gdi32.dll..NET Framework không cung cấp lớp nào thực hiện việc chụp toàn bộ màn hình (thườngđược đề cập là cửa sổ Desktop). Tuy nhiên, bạn có thể truy xuất các đặc tính này bằngcách sử dụng P/Invoke với Win32 API.Bước đầu tiên là tạo một lớp đóng gói các hàm Win32 API bạn cần sử dụng. Lớp dướiđây sẽ khai báo các hàm này và sử dụng chúng trong phương thức công khai Capture đểtrả về một đối tượng .NET Image chứa cửa sổ Desktop:using System;using System.Drawing;using System.Runtime.InteropServices;using System.Windows.Forms;public class DesktopCapture { [DllImport(user32.dll)] private extern static IntPtr GetDesktopWindow(); [DllImport(user32.dll)] private extern static IntPtr GetDC(IntPtr windowHandle); [DllImport(gdi32.dll)] private extern static IntPtr GetCurrentObject(IntPtr hdc, ushort objectType); [DllImport(user32.dll)] private extern static void ReleaseDC( IntPtr hdc ); const int OBJ_BITMAP = 7; public static Bitmap Capture() { // Lấy Device Context của cửa sổ Desktop. IntPtr desktopWindow = GetDesktopWindow(); IntPtr desktopDC = GetDC( desktopWindow ); // Lấy GDI handle của bức hình. IntPtr desktopBitmap = GetCurrentObject(desktopDC, OBJ_BITMAP); // Sử dụng handle để tạo đối tượng .NET Image. Bitmap desktopImage = Image.FromHbitmap( desktopBitmap ); // Giải phóng Device Context và trả về bức hình. ReleaseDC(desktopDC); return desktopImage; }} The image part with relationship ID rId5 was not found in the file. Hình 8.6 Chụp màn hình DesktopBước kế tiếp là tạo một client có thể sử dụng chức năng này. Form dưới đây (xem hình8.6) sẽ hiển thị bức hình chụp được trong một PictureBox (nằm trong một Panel cuộnđược, như đã được mô tả trong mục 8.5).public class ScreenCapture : System.Windows.Forms.Form { private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.Panel panel1; // (Bỏ qua phần mã designer.) private void cmdCapture_Click(object sender, System.EventArgs e) { pictureBox1.Image = DesktopCapture.Capture(); pictureBox1.Size = pictureBox1.Image.Size; }} 1.2 Sử dụng “double buffering” để tăng tốc độ vẽ lại Bạn cần tối ưu thao tác vẽ đối với một form thường xuyên được làm tươi, và bạn muốn giảm hiện tượng rung hình (flicker). Biểu diễn hình ảnh ở dạng hình bitmap trong-bộ-nhớ, rồi chép hình bitmap đã hoàn chỉnh vào form.Trong một vài ứng dụng, bạn thường xuyên phải vẽ lại form hoặc điều kiểm. Điều nàythường gặp khi thể hiện animation (hình động). Ví dụ, bạn có thể sử dụng Timer để làmmất hiệu lực form mỗi giây. Khi đó, đoạn mã thực hiện thao tác vẽ có thể vẽ lại một bứchình tại một vị trí mới, tạo cảm giác động. Cách tiếp cận này có một vấn đề: mỗi lần bạnlàm mất hiệu lực form, Windows sẽ vẽ lại nền cửa sổ (xóa form), và rồi chạy đoạn mãthực hiện thao tác vẽ. Điều này có thể gây ra rung hình đáng kể.“Double buffering” là một kỹ thuật bạn có thể hiện thực để giảm hiện tượng rung hình.Với “double buffering”, logic vẽ sẽ ghi một hình bitmap trong-bộ-nhớ, và hình này đượcchép lên form vào cuối quá trình vẽ bằng một thao tác vẽ lại đơn lẻ trong suốt, nhờ đó màhiện tượng rung hình giảm một cách đáng kể.Bước đầu tiên khi hiện thực “double buffering” là phải bảo đảm nền của form không tựđộng được vẽ lại khi form bị mất hiệu lực. Đây là ngu ...