最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決C#全屏幕截圖的實(shí)現(xiàn)方法

 更新時(shí)間:2013年05月20日 11:28:55   作者:  
本篇文章是對(duì)在C#中實(shí)現(xiàn)全屏幕截圖的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
今天一位同事想寫一個(gè)全屏幕截圖的代碼。當(dāng)然要實(shí)現(xiàn)的第一步是能夠獲取整個(gè)屏幕的位圖,記得Win32 API的CreateDC, BitBlt等函數(shù)可以使用。于是上網(wǎng)查了下,果然屏幕截圖用這些函數(shù)。但winform已經(jīng)可以把API都忘記了,所以得尋找一個(gè)無(wú)Win32 API的實(shí)現(xiàn)方式。綜合了網(wǎng)上的實(shí)現(xiàn),以及自己的一些設(shè)計(jì),實(shí)現(xiàn)思路如下:
1. 開始截圖時(shí),創(chuàng)建一個(gè)與屏幕大小一樣的位圖,然后用Graphics.CopyFromScreen()把屏幕位圖拷貝到該位圖上。這是很關(guān)鍵的一步,這樣所有的操作就都可以在該位圖上進(jìn)行了,而無(wú)實(shí)際屏幕無(wú)關(guān)了。 
復(fù)制代碼 代碼如下:

Code
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;
Bitmap bmp = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(bmp)) {
    g.CopyFromScreen(0, 0, 0, 0, new Size(width, height));
}

2. 接下來(lái)為了方便在這之上進(jìn)行截圖,有一個(gè)很重要的設(shè)計(jì)實(shí)現(xiàn)方式:用全屏幕窗體代替現(xiàn)有真實(shí)屏幕,這樣就可以把截圖過(guò)程的所有操作都在那個(gè)窗體上實(shí)現(xiàn)(該窗體設(shè)置成無(wú)邊框,高寬等于屏幕大小即可),另外為了顯示掩蔽效果(只能正常顯示選擇的部分屏幕內(nèi)容,而其實(shí)部分用一個(gè)如半透明層覆蓋),就添加一層半透明位置位圖。具體代碼如下:
復(fù)制代碼 代碼如下:

Code
public partial class FullScreenForm : Form {
    private Rectangle rectSelected = Rectangle.Empty;
    private bool isClipping = false;
    private Bitmap screen;
    private Bitmap coverLayer = null;
    private Color coverColor;
    private Brush rectBrush = null;
    private Bitmap resultBmp = null;
    public FullScreenForm(Bitmap screen) {
        InitializeComponent();
        int width = Screen.PrimaryScreen.Bounds.Width;
        int height = Screen.PrimaryScreen.Bounds.Height;
        coverLayer = new Bitmap(width, height);
        coverColor = Color.FromArgb(50, 200, 0, 0);
        rectBrush = new SolidBrush(coverColor);
        using (Graphics g = Graphics.FromImage(coverLayer)) {
            g.Clear(coverColor);
        }
        this.Bounds = new Rectangle(0, 0, width, height);
        this.screen = screen;
        this.DoubleBuffered = true;
    }
    protected override void OnMouseDown(MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            isClipping = true;
            rectSelected.Location = e.Location;
        }
        else if (e.Button == MouseButtons.Right) {
            this.DialogResult = DialogResult.OK;
        }
    }
    protected override void OnMouseMove(MouseEventArgs e) {
        if (e.Button == MouseButtons.Left && isClipping) {
            rectSelected.Width = e.X - rectSelected.X;
            rectSelected.Height = e.Y - rectSelected.Y;

            this.Invalidate();
        }
    }
    protected override void OnMouseUp(MouseEventArgs e) {
        if (e.Button == MouseButtons.Left && isClipping) {
            rectSelected.Width = e.X - rectSelected.X;
            rectSelected.Height = e.Y - rectSelected.Y;
            this.Invalidate();
            resultBmp = new Bitmap(rectSelected.Width, rectSelected.Height);
            using (Graphics g = Graphics.FromImage(resultBmp)) {
                g.DrawImage(screen,new Rectangle(0, 0, rectSelected.Width, rectSelected.Height), rectSelected, GraphicsUnit.Pixel);
            }
            this.DialogResult = DialogResult.OK;
        }
    }
    protected override void OnPaint(PaintEventArgs e) {
        Graphics g = e.Graphics;
        g.DrawImage(screen, 0, 0);
        g.DrawImage(coverLayer, 0, 0);
        PaintRectangle();
    }
    protected override void OnPaintBackground(PaintEventArgs e) {

    }
    protected override void OnKeyDown(KeyEventArgs e) {
        if (e.KeyCode == Keys.Escape) {
            this.DialogResult = DialogResult.Cancel;
        }
    }
    private void PaintRectangle() {
        using (Graphics g = Graphics.FromImage(coverLayer)) {
            g.Clear(coverColor);
            GraphicsPath path = new GraphicsPath();
            path.AddRectangle(this.Bounds);
            path.AddRectangle(rectSelected);
            g.FillPath(rectBrush, path);
            g.DrawRectangle(Pens.Blue, rectSelected);
        }
    }
    public Bitmap ResultBitmap {
        get { return resultBmp; }
    }
}

上面的代碼都很容易看明白,這里有一個(gè)技巧就是GraphicsPath,它自動(dòng)會(huì)形成一個(gè)中空的區(qū)域。上面的實(shí)現(xiàn)很容易擴(kuò)展:多區(qū)域截圖,多裁判截圖等都很容易實(shí)現(xiàn)。

相關(guān)文章

  • 基于C#實(shí)現(xiàn)屏幕取色器的示例詳解

    基于C#實(shí)現(xiàn)屏幕取色器的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)屏幕取色器,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • C#面向?qū)ο蟮?3種設(shè)計(jì)模式介紹

    C#面向?qū)ο蟮?3種設(shè)計(jì)模式介紹

    這篇文章介紹了C#面向?qū)ο蟮?3種設(shè)計(jì)模式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • C#讀寫操作app.config中的數(shù)據(jù)應(yīng)用介紹

    C#讀寫操作app.config中的數(shù)據(jù)應(yīng)用介紹

    C#讀寫操作app.config中的數(shù)據(jù)應(yīng)用介紹;需要的朋友可以參考下
    2012-11-11
  • C#實(shí)現(xiàn)常見時(shí)間格式

    C#實(shí)現(xiàn)常見時(shí)間格式

    這篇文章介紹了C#實(shí)現(xiàn)常見時(shí)間格式的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#實(shí)現(xiàn)IP攝像頭的方法

    C#實(shí)現(xiàn)IP攝像頭的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)IP攝像頭的方法,涉及C#IP連接與攝像頭視頻錄像的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#執(zhí)行SQL事務(wù)用法實(shí)例

    C#執(zhí)行SQL事務(wù)用法實(shí)例

    這篇文章主要介紹了C#執(zhí)行SQL事務(wù)用法,實(shí)例分析了通過(guò)C#中提供的Transaction執(zhí)行SQL事務(wù)的使用技巧,需要的朋友可以參考下
    2015-01-01
  • c#批量上傳圖片到服務(wù)器示例分享

    c#批量上傳圖片到服務(wù)器示例分享

    這篇文章主要介紹了c#批量上傳圖片到服務(wù)器示例,服務(wù)器端需要設(shè)置圖片存儲(chǔ)的虛擬目錄,需要的朋友可以參考下
    2014-03-03
  • C#中Random.Next方法的使用小結(jié)

    C#中Random.Next方法的使用小結(jié)

    在C#中,Random.Next()方法用于生成一個(gè)隨機(jī)整數(shù),本文主要介紹了C#中Random.Next方法的使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • WPF中的ValidationRule實(shí)現(xiàn)參數(shù)綁定解決方案

    WPF中的ValidationRule實(shí)現(xiàn)參數(shù)綁定解決方案

    在WPF中,默認(rèn)情況下,DataContext是通過(guò)可視化樹來(lái)傳遞的,父元素的DataContext會(huì)自動(dòng)傳遞給其子元素,以便子元素可以訪問父元素的數(shù)據(jù)對(duì)象,這篇文章主要介紹了WPF中的ValidationRule實(shí)現(xiàn)參數(shù)綁定解決方案,需要的朋友可以參考下
    2023-08-08
  • C#中DataTable實(shí)現(xiàn)篩選查詢的示例

    C#中DataTable實(shí)現(xiàn)篩選查詢的示例

    本文主要介紹了C#中DataTable實(shí)現(xiàn)篩選查詢的示例,主要是DataTable進(jìn)行過(guò)濾篩選,常用的一些方法為:Select,dataview,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-04-04

最新評(píng)論

甘洛县| 闸北区| 兰西县| 遂宁市| 深州市| 买车| 横峰县| 邵东县| 吉安市| 拜泉县| 桐梓县| 辽宁省| 西畴县| 尚义县| 阳信县| 湘潭市| 合水县| 湘潭市| 安龙县| 灌南县| 原阳县| 洛南县| 富蕴县| 乐清市| 台南县| 蓬莱市| 高密市| 黑山县| 高邑县| 上思县| 和静县| 米泉市| 普宁市| 长子县| 稻城县| 新泰市| 蚌埠市| 岳普湖县| 昆山市| 青田县| 射洪县|