写给自己看的,怕以后代码丢了,放在网上,有需要的可以拿走
界面拖了一个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;
}