永发信息网

哪位大侠 能教小弟学习一下CFC程序块

答案:1  悬赏:50  手机版
解决时间 2021-02-18 23:07
哪位大侠 能教小弟学习一下CFC程序块
最佳答案
C#实现类似的屏幕截图程序  VS2005
程序流程如下:
1. 截取整个屏幕并保存
2. 2.新开一个全屏窗口,将保存的屏幕作为背景
3. 3.鼠标拖动改变截取范围,右键取消
4. 4.双击截取,保存在粘贴板,全屏窗口关闭
代码部分



首先新建一个项目ScreenCutter,将窗体名改为MainForm,再新建一个窗体ScreenBody.
添加一个按钮btnCutter到ScreenCutter并添加按钮事件:
private void btnCutter_Click(object sender, EventArgs e)
{
Image img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
Graphics g = Graphics.FromImage(img);
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
ScreenBody body = new ScreenBody();
body.BackgroundImage = img;
body.Show();
}Screen.AllScreens[0]是获取当前所有设备窗口的第一个,我这里只有一个显示器,当然我就是第一个.
利用Graphics的CopyFromScreen函数获取当前屏幕.


好了,现在按下按钮全屏窗口就会出来了.


下面讲全屏窗口ScreenBody,首先设置窗体的FormBorderStyle为None,然后声明以下变量
private Graphics MainPainter;  //主画笔
private Pen pen;               //就是笔咯
private bool isDowned;         //判断鼠标是否按下
private bool RectReady;         //矩形是否绘制完成
private Image baseImage;       //基本图形(原来的画面)
private Rectangle Rect;        //就是要保存的矩形
private Point downPoint;        //鼠标按下的点
int tmpx;                     
int tmpy;
之后就是窗体的鼠标函数了,里面很多代码都没有作出整理,看了一下,整理后的代码应该会更少更精简的


private void ScreenBody_DoubleClick(object sender, EventArgs e)
{
if (((MouseEventArgs)e).Button == MouseButtons.Left Rect.Contains(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y))
{
//保存的时候有很多种方法的我这里只用了这种
Image memory = new Bitmap(Rect.Width, Rect.Height);
Graphics g = Graphics.FromImage(memory);
g.CopyFromScreen(Rect.X + 1, Rect.Y + 1, 0, 0, Rect.Size);
Clipboard.SetImage(memory);
this.Close();
}
}


private void ScreenBody_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isDowned = true;

if (RectReady == false)
{
Rect.X = e.X;
Rect.Y = e.Y;
downPoint = new Point(e.X, e.Y);
}
if (RectReady == true)
{
tmpx = e.X;
tmpy = e.Y;
}
}
if (e.Button == MouseButtons.Right)
{
if (RectReady != true)
{
this.Close();
return;
}
MainPainter.DrawImage(baseImage, 0, 0);
RectReady = false;
}


}


private void ScreenBody_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isDowned = false;
RectReady = true;
}
}


private void ScreenBody_MouseMove(object sender, MouseEventArgs e)
{


if (RectReady == false)
{
if (isDowned == true)
{
Image New = DrawScreen((Image)baseImage.Clone(), e.X, e.Y);
MainPainter.DrawImage(New, 0, 0);
New.Dispose();
}
}
if (RectReady == true)
{
if (Rect.Contains(e.X, e.Y))
{
//this.Cursor = Cursors.Hand;
if (isDowned == true)
{
//和上一次的位置比较获取偏移量
Rect.X = Rect.X + e.X - tmpx;
Rect.Y = Rect.Y + e.Y - tmpy;
//记录现在的位置
tmpx = e.X;
tmpy = e.Y;
MoveRect((Image)baseImage.Clone(), Rect);
}
}
}

}


private void ScreenBody_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
MainPainter = this.CreateGraphics();
pen = new Pen(Brushes.Blue);
isDowned = false;
baseImage = this.BackgroundImage;
Rect = new Rectangle();
RectReady = false;
}


辅助函数
本来应该写更多的辅助函数的,将窗体响应函数里面的代码放到里面来,不过本人很懒,就这样将就了.呵呵


private void DrawRect(Graphics Painter, int Mouse_x, int Mouse_y)
{
int width = 0;
int heigth = 0;
if (Mouse_y lt; Rect.Y)
{
Rect.Y = Mouse_y;
heigth = downPoint.Y - Mouse_y;
}
else
{
heigth = Mouse_y - downPoint.Y;
}
if (Mouse_x lt; Rect.X)
{
Rect.X = Mouse_x;
width = downPoint.X - Mouse_x;
}
else
{
width = Mouse_x - downPoint.X;
}
Rect.Size = new Size(width, heigth);
Painter.DrawRectangle(pen, Rect);
}


private Image DrawScreen(Image back, int Mouse_x, int Mouse_y)
{
Graphics Painter = Graphics.FromImage(back);
DrawRect(Painter, Mouse_x, Mouse_y);
return back;
}
private void MoveRect(Image image, Rectangle Rect)
{
Graphics Painter = Graphics.FromImage(image);
Painter.DrawRectangle(pen, Rect.X, Rect.Y, Rect.Width, Rect.Height);
DrawRects(Painter);
MainPainter.DrawImage(image, 0, 0);
image.Dispose();
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
【盛开近义词】盛开近义词
创技广告在哪里啊,我有事要去这个地方
父母谁的基因决定了孩子智商和相貌
联华鹿城店我想知道这个在什么地方
以下关于细胞的叙述,不正确的有①细胞核、核
大众途观为什么开空调水温和机油温度的往上升
与朋友离别的打油诗
顾员的情况下手指受伤己接好能鉴定为十级伤残
升美茶业地址在哪,我要去那里办事
【冯顺弟】中国古代有关反省的名言及实例
滴滴司机端收费明细为什么会出现订单奖励0.6
我用光大信用卡在京东商城上买了件309元的东
顶伦概念酒店地址在什么地方,想过去办事
怎么彻底清除kingroot
最好的一个男生朋友,即将高考。我想送他一样
推荐资讯
夸客贷款合同金额诈骗
【肉类食品在人体内多长时间完全排出体外?】
腾飞电脑科技这个地址在什么地方,我要处理点
郸城县人民路第八中西药店在什么地方啊,我要
热血江湖怎么挂机
澄城县交道镇北社村农技校地址有知道的么?有
研究光合作用和呼吸作用的过程,对于提高农作
微筱是什么意思。用来起女人名字好不好
男孩穿43码的皮鞋,那么平常穿多少码数的其他
He found it difficult ______other with Eng
微信电子名片怎么弄
宏发轮胎配件行地址在哪,我要去那里办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?