winforms 拖动Label 和打印部分区域
来源:互联网 发布:exchange 更改域名 编辑:程序博客网 时间:2024/06/06 09:17
今天接到任务 ,做一个类似话费单的打印。要求很简单,就是可以精确的更改打印的内容的位置,还有就是打印出模板(打印的内容当然是可以替换喽)
Form窗体中包含:一个PictureBox(显示背景图片),两个Label(一个姓名,一个地址),一个Button(打印按钮)
这个问题的关键有三点:
1:怎么把Label做成透明的,如果是直接加载在Form上的话,是没有办法显示的,Label的透明是相对于它的父容器的,这就要求每次重绘的同时把它加载到PictureBox中,因为winforms 默认加载到Fom上
2:处理好事件之间的关系,关于拖动Label控件和窗体事件的混合
private bool isMove =false;
private int MouseDownX;
private int MouseDownY;
/// <summary>
///在图片控件上放开鼠标时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
isMove = false;
}
/// <summary>
/// Label控件按下鼠标时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbName_MouseDown(object sender, MouseEventArgs e)
{
isMove = true;
MouseDownX = e.X;
MouseDownY = e.Y;
}
/// <summary>
/// 在Label上的鼠标放开时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbName_MouseUp(object sender, MouseEventArgs e)
{
isMove = false;
}
/// <summary>
/// 鼠标在在Label上移动时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbName_MouseMove(object sender, MouseEventArgs e)
{
if(isMove)//如果左键按下的话
{
((Label)sender).Location = new Point(((Label)sender).Left + e.X - MouseDownX, ((Label)sender).Top + e.Y - MouseDownY);
this.pictureBox1.Controls.Add(((Label)sender));
}
}
/// <summary>
/// 在PicturesBox控件上移动时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if(isMove)//如果作家安按下的话
{
((Label)sender).Location = new Point(e.X - MouseDownX, e.Y - MouseDownY);
this.pictureBox1.Controls.Add(((Label)sender));
}
}
在做这个Demo的时候 我发现 原来当鼠标点击在Label上时是没有有办法捕捉到PictureBox的移动方法(pictureBox1_MouseMove),故:采用上述方法,最后实现了
3:关于打印 呵呵 我也是费了点心思
上网查了好多资料,关键点如下:
1:怎么打印winforms窗体中指定的区域呢?
最后查到是写到剪贴板上,呵呵 挺微妙 微软就是好
2:绘图的时候我是用了DrawImage方法,绘制了制定区域的图像,但有个问题没有弄,这只是一个Demo ,没必要弄那么细。就是边距问题,不能完全匹配,左上角有点出入。
private void btnPrint_Click(object sender, EventArgs e)
{
SendKeys.Send("%{PRTSC}");
Application.DoEvents();
this.printDocument1.PrintPage += new PrintPageEventHandler(docToPrint_PrintPage);
printDialog1.Document = printDocument1;
printDocument1.Print();
}
private void docToPrint_PrintPage(object sender, PrintPageEventArgs ev)
{
int left = this.pictureBox1.Left;
int top = this.pictureBox1.Top;
int width = this.pictureBox1.Width;
int height = this.pictureBox1.Height;
int HeadHeight = SystemInformation.CaptionHeight;//标准的标题栏高度
IDataObject iData = Clipboard.GetDataObject();
Image img = (Image)iData.GetData(DataFormats.Bitmap);
Rectangle recTo = new Rectangle(left+5, top + HeadHeight+10, width, height);
//最后没有匹配,可能是像网页中存在margin一样的和模型的缘故吧 呵呵 ,要是项目搞到了 好好研究研究
Rectangle recFrom = new Rectangle(0, 0, this.Width, this.Height);
ev.Graphics.DrawImage(img, recFrom, recTo, GraphicsUnit.Pixel);
}
- winforms 拖动Label 和打印部分区域
- Winforms: 把Label显示为多行
- WinForms中如何让Label自动换行
- C#WinForms窗体无边框拖动
- WinForms和XNA
- Winforms打包和部署
- 图片区域剪切和属性的打印
- 在网页上打印时用javascript设置打印区域和不打印区域,分页等
- vb.net中实现picturebox中图片拖动和label控件数组结合,实现label和图片同步
- C# 打印Label
- 自定义Label文字绘制区域
- openlayers限制地图拖动区域
- openlayers限制地图拖动区域
- 使用jQuery和CSS控制页面打印区域
- 使用jQuery和CSS控制页面打印区域
- winform 可拖动的自定义Label控件
- Epson LQ1600K3+ 打印区域
- 打印固定区域
- 一个简单的Jquery Plugin: 跨浏览器的Word Breaker
- 菜鸟学习OGRE和天龙八部之五: 水面TerrainLiquid基本搞定
- Customizing Websphere Portal themes
- Xercesc使用指南
- Boost::thread库的使用
- winforms 拖动Label 和打印部分区域
- Visual Studio使用SVN快速指引
- 让组合框自动匹配用户的输入
- 第一个星期AI课程要求写的随笔,结果重点部分分析错了,好在导师表示,没有不犯错的人!
- Oracle 10g 有关表分区的问题?
- dba职业规划
- ORACLE10g新特性——全局HASH分区索引
- 在Oracle数据库中移动数据文件的具体方法
- 有关Oracle数据库10g中的分区功能