C# Winform实现按钮透明的,及接收键盘事件

写给自己看的,怕以后代码丢了,放在网上,有需要的可以拿走

界面拖了一个PICTUREBOX,两个按钮,想支持鼠标点按钮实现翻页同时按键盘向左向右按键实现左右翻页,

首先按钮透明

网上找了

    btn_left.FlatStyle = FlatStyle.Flat;//样式
            btn_left.ForeColor = Color.Blue;//前景
            btn_left.BackColor = Color.Transparent;//去背景
            btn_left.FlatStyle = FlatStyle.Flat;
            //btn_left.FlatAppearance.BorderSize = 0;//去边线
            btn_left.FlatAppearance.MouseOverBackColor = Color.CadetBlue;//鼠标经过
            btn_left.FlatAppearance.MouseDownBackColor = Color.Transparent;//鼠标按下

            btn_right.FlatStyle = FlatStyle.Flat;//样式
            btn_right.ForeColor = Color.Blue;//前景
            btn_right.BackColor = Color.Transparent;//去背景
            //btn_right.FlatAppearance.BorderSize = 0;//去边线
            btn_right.FlatAppearance.MouseOverBackColor = Color.CadetBlue;//鼠标经过
            btn_right.FlatAppearance.MouseDownBackColor = Color.Transparent;//鼠标按下

加入以上代码发现根本不起作用,之前模糊的听说过,前的的JS那里的样式容易被上一级标签影响,我也猜测可能是这个原因,在同事的帮助下,加入这行代码 

            pic_url.BackColor = Color.Transparent;
            btn_right.Parent = pic_url;
            btn_left.Parent = pic_url;

按钮通知完全。


接下来实现键盘左事翻页,发现每次必须用鼠标点几下按钮才能用用键盘左右翻动,刚出来工作那时,同事有做过一个控件,当时听他说,同于控件没有获取焦点,所以用户控件捕捉不到键盘事件

后面,这个方使用控件那里加了点代码,手工做用启控件获得焦点(业务场景是不一定都需要翻图片,用户想保证每次输入资料名称为优先)

//重写键盘命令事件,其实中间还有其它代码,公司的就不公开

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.F9)
            {                
				pictureBoxCtl1.Focus();
				pictureBoxCtl1.BackColor=Color.Yellow;
				return true;
               
            }
            else
            {
                return base.ProcessCmdKey(ref msg, keyData);
            }
        }


加了上面的代码发现有时响应不好,我也没有去想为整个用户控件批一个什么KEY事件

所以最后网上找了一段代码 

        protected override bool ProcessDialogKey(Keys keyData)
        {//当子控件没有对任何键处理的时候正常执行。
            //MessageBox.Show("当子控件没有对任何键处理的时候正常执行");




            switch (keyData)
            {
                case Keys.Left:
                    RollLeft();//私人方法自行实现
                    break;
                case Keys.Right:
                    RollRight();//私人方法自行实现
                    break;
            }
            return true;
            //return base.ProcessDialogKey(keyData);
        }


        
protected override bool ProcessKeyPreview(ref Message m)
        {//当子控件处理任何一个键的时候执行的方法。
            //MessageBox.Show("当子控件处理任何一个键的时候执行的方法");


            Keys keyData = (Keys)((int)m.WParam) & Keys.KeyCode;




            switch (keyData)
            {
                case Keys.Left:
                    RollLeft();//私人方法自行实现
                    break;
                case Keys.Right:
                    RollRight();//私人方法自行实现
                    break;
            }
            return base.ProcessKeyPreview(ref m);
        }



然后我的问题就解决了哈,

之前有在网上找把本地图片加了水印再保存,我感觉这样容易破坏图片的质量(小白不懂这些原理,少发动最安全)

后来在图片控件上的Paint事件上加一个委托,在图层加载时加了一些文字(这上图层跟图片的区别是不懂我也解释不了了,我是当时在自学MFC看了一些)

this.pic_url.Paint += pic_url_Paint;


        void pic_url_Paint(object sender, PaintEventArgs e)
        {
            if (toatalCount >= 1)
            {
                string pen = string.Format("{0}/{1}[新旧包装←→键切换]", curentIndex + 1, toatalCount);               
                e.Graphics.DrawString(pen, new Font("黑体", 26), Brushes.Red, new PointF(0, 0));
            }
            else
            {
                e.Graphics.DrawString("", new Font("黑体", 26), Brushes.Red, new PointF(0, 0));//这行可以不用,我同事加的,我也理了
            }
        }


另外在本地图片加水印,及图片方法(网上找的)

   

        /// <summary>  
        /// </summary>
        /// <param name="SourcePicPath"></param>
        /// <param name="WaterText">文字水印</param>
        /// <param name="WaterPath">图片水印,这个图片建议不要太大,目前没的做比例绽放</param>
        /// <param name="conWidth">控件宽度 大于0才有效,小于等于0保持原图片大小</param>
        /// <param name="conHeight">控件高度  大于0才有效,小于等于0保持原图片大小</param>
        /// <returns></returns>
        public static string MakeWaterPic(string SourcePicPath, string WaterText, string WaterPath)
        {
            if (File.Exists(SourcePicPath) == false)
            {
                return "-1";//文件不存在
            }
            List<string> listExtention = new List<string>();
            string extension = Path.GetExtension(SourcePicPath).ToLower();//后缀
            listExtention.AddRange(new string[] { ".jpg", ".gif", ".png" });
            if (listExtention.Contains(extension) == false) throw new Exception("不允许的后缀:" + SourcePicPath + "\n");
            string fileName = "";


            //加文字水印
            System.Drawing.Image image = System.Drawing.Image.FromFile(SourcePicPath, true);
            int imgwidth = image.Width;//生成图片的大小,按窗口
            int imgheight = image.Height;//生成图片的大小,按窗口
            using (System.Drawing.Bitmap bitmap = new Bitmap(image.Width, image.Height))
            {

                using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))//
                {
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    g.Clear(System.Drawing.Color.Transparent);
                    g.DrawImage(image, 0, 0, imgwidth, imgheight);//画上原图片

                    image.Dispose();
                    //g.DrawImage(image, 0, 0, image.Width, image.Height);
                    if (WaterText != "")
                    {
                        Font f = new Font("Verdana", 32);
                        Brush b = new SolidBrush(Color.Blue);
                        g.DrawString(WaterText, f, b, 10, 10);
                    }
                    //g.Dispose();

                    if (File.Exists(WaterPath))
                    {
                        //加图片水印
                        System.Drawing.Image copyImage = System.Drawing.Image.FromFile(WaterPath);
                        g.DrawImage(copyImage, new Rectangle(imgwidth - copyImage.Width, imgheight - copyImage.Height, copyImage.Width,
                                copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
                    }
                    if (File.Exists(SourcePicPath))
                    {
                        File.Delete(SourcePicPath);
                    }
                    /* */
                    //保存加水印过后的图片,删除原始图片
                    // string newPath = fileName + extension;
                    switch (extension)
                    {
                        case ".jpg":
                            bitmap.Save(SourcePicPath, System.Drawing.Imaging.ImageFormat.Jpeg);

                            break;
                        case ".gif":
                            bitmap.Save(SourcePicPath, System.Drawing.Imaging.ImageFormat.Gif);
                            break;
                        case ".png":
                            bitmap.Save(SourcePicPath, System.Drawing.Imaging.ImageFormat.Png);
                            break;
                        default:
                            throw new Exception("不允许的后缀:" + SourcePicPath);
                    }
                    fileName = SourcePicPath;
                }
            }

            return fileName;
        }

  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现控制屏幕录制的功能,可以使用C# WinForm中提供的Screen类和Graphics类。 首先,我们需要在窗体上添加一个按钮控件,然后在按钮的Click事件中编写代码来控制屏幕录制的开始和停止。 以下是实现的基本步骤: 1. 引用命名空间: ``` using System.Drawing; using System.Windows.Forms; using System.IO; using System.Diagnostics; ``` 2. 定义一个变量来存储录制状态: ``` private bool isRecording = false; ``` 3. 在按钮的Click事件中编写录制和停止录制的代码: ``` private void btnRecord_Click(object sender, EventArgs e) { if (!isRecording) { // 开始录制 isRecording = true; Rectangle bounds = Screen.PrimaryScreen.Bounds; string filePath = Path.Combine(Application.StartupPath, "record.avi"); ProcessStartInfo psi = new ProcessStartInfo("ffmpeg.exe", "-f gdigrab -framerate 30 -offset_x " + bounds.X + " -offset_y " + bounds.Y + " -video_size " + bounds.Width + "x" + bounds.Height + " -i desktop -c:v libx264 -pix_fmt yuv420p -preset ultrafast -qp 0 " + filePath); psi.UseShellExecute = false; psi.CreateNoWindow = true; Process p = Process.Start(psi); } else { // 停止录制 isRecording = false; foreach (Process p in Process.GetProcessesByName("ffmpeg")) { p.Kill(); } } } ``` 这段代码中使用了FFmpeg来实现屏幕录制,需要将FFmpeg.exe文件放在程序的同一目录下。录制的视频文件将保存为record.avi。 需要注意的是,这段代码只是一个示例,实际应用中还需要进行异常处理和优化。 希望这些信息对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值