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));//这行可以不用,我同事加的,我也理了
            }
        }


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

   

        ///   
        /// 
        /// 
        /// 文字水印
        /// 图片水印,这个图片建议不要太大,目前没的做比例绽放
        /// 控件宽度 大于0才有效,小于等于0保持原图片大小
        /// 控件高度  大于0才有效,小于等于0保持原图片大小
        /// 
        public static string MakeWaterPic(string SourcePicPath, string WaterText, string WaterPath)
        {
            if (File.Exists(SourcePicPath) == false)
            {
                return "-1";//文件不存在
            }
            List listExtention = new List();
            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;
        }

  

你可能感兴趣的:(C# Winform实现按钮透明的,及接收键盘事件)