WinForm票据套打重定位(http://www.cnblogs.com/wdong/archive/2011/07/10/2102102.html)

    项目中经常会遇到客户打印票据或证件等套打的功能需求,每次做好的打印窗体, 随着客户运行环境的不同或者打印设备参数等设置不同,都会造成最终的打印位置偏离许多。 每次都得和客户解释半天,甚至还得到现场一个一个的帮客户调试好环境,这样的事情发生了好多次,一年又一年重复着......
      当第N+1个客户打N+1个电话问起同样的问题:“怎么打印又偏移了”,终于忍无可忍,实现一个运行时可动态拖动控件并将打印控件变量的位置保存到文件中这样的功能,以后,如果客户再烦我,终于可以一句话回复他:“(你大爷的)自己调去”。。。    

      ok,思路很简单,需要考虑以下几个方面的处理:
     1.控件拖动事件处理
     2.控件拖动结束后,提取位置信息
     3.读取配置文件,并将位置信息保存到文件中

     那么,下次窗体加载时,应该首先读取配置文件,然后加载控件位置信息,流程如下:
     1.初始化配置文件
     2.窗体加载后,根据配置文件,初始化控件位置,如果窗体首次加载且尚未调整过控件位置(既配置文件为空),
        则默认将当前控件的位置信息保存到配置文件中
     3.拖动控件,精准定位打印位置
     4.窗体关闭时,将配置信息写入文件
  

     根据以上需求,定义如下几个类文件

     1.ConfigHelper : 配置缓存对象,用于读取及写入配置文件

     2.FormConfig :用于窗体配置对象

     3.ControlConfig:用于控件配置对象

     4.HigoMovingControl:用于控件拖动,其构造函数需要提供当前控件,及控件所在窗体两个参数

     过程非常简单,这里我还是写了几个配置缓存对象,代码如下:

ConfigHelper.cs

View Code
  1  using  System;
  2  using  System.Collections.Generic;
  3  using  System.Text;
  4  using  System.Xml;
  5 
  6  namespace  Higo.Controls.Config
  7  {
  8       ///   <summary>
  9       ///  配置文件辅助类
 10       ///   </summary>
 11       public   class  ConfigHelper
 12      {
 13           #region  私有域
 14 
 15           private   readonly   string  _filePath  =   null ;
 16           private  Dictionary < string , FormConfig >  _configData  =   new  Dictionary < string , FormConfig > ();
 17          
 18           #endregion
 19 
 20           #region  构造函数
 21 
 22          ConfigHelper()
 23          {
 24              _filePath  =  System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath,  " control.config " );
 25              InitConfig();
 26          }
 27          
 28           #endregion
 29 
 30           #region  自定义方法
 31 
 32           private   void  InitConfig()
 33          {
 34               try
 35              {
 36                   //  读取系统配置文件,获取系统配置信息
 37                      XmlDocument doc  =   new  XmlDocument();
 38                      doc.Load(_filePath);
 39                       if  (doc  !=   null )
 40                      {
 41                          XmlNodeList nodes  =  doc.SelectNodes( " //forms//form " );
 42                           foreach  (XmlNode formNode  in  nodes)
 43                          {
 44                              FormConfig form  =   new  FormConfig();
 45                               foreach  (XmlAttribute attr  in  formNode.Attributes) 
 46                              {
 47                                  form.Add(attr.Name, attr.Value);
 48                              }
 49 
 50                              XmlNodeList controlsNodes  =  formNode.SelectNodes( " //control " );
 51                               foreach  (XmlNode detailNode  in  controlsNodes)
 52                              {
 53                                  ControlConfig control  =   new  ControlConfig(form);
 54                                   foreach  (XmlAttribute attr  in  detailNode.Attributes)
 55                                  {
 56                                      control.Add(attr.Name, attr.Value);
 57                                  }
 58 
 59                                  form.Controls.Add(control);
 60                              }
 61 
 62                              _configData.Add(form.GetValue( " Name " ), form);
 63                          }
 64                      }
 65              }
 66               catch  (Exception ex)
 67              {
 68                   //  TODO:记录日志
 69              }
 70          }
 71 
 72           #endregion
 73 
 74           #region  单例模式辅助类
 75 
 76           class  ConfigHelperer
 77          {
 78               static  ConfigHelperer()
 79              {
 80              }
 81 
 82               internal   static   readonly  ConfigHelper instance  =   new  ConfigHelper();
 83          }
 84 
 85           ///   <summary>
 86           ///  通过单例调用配置访问接口
 87           ///   </summary>
 88           public   static  ConfigHelper Instance
 89          {
 90               get
 91              {
 92                   return  ConfigHelperer.instance;
 93              }
 94          }
 95 
 96           #endregion
 97 
 98           #region  索引器
 99 
100           ///   <summary>
101           ///  根据窗体名称,获取窗体配置
102           ///   </summary>
103           ///   <param name="Name"> 窗体名称 </param>
104           ///   <returns> 窗体配置对象 </returns>
105           public  FormConfig  this [ string  name]
106          {
107               get
108              {
109                   if  (_configData.ContainsKey(name))
110                  {
111                       return  _configData[name];
112                  }
113 
114                   return   null ;
115              }
116          }
117 
118           #endregion
119 
120           #region  公有方法
121 
122           public   void  SaveConfig()
123          {
124              XmlDocument xDoc  =   new  XmlDocument();
125              xDoc.Load(_filePath);
126 
127              XmlNode xNode;
128              XmlElement xElem;
129              XmlNodeList xNodeList;
130 
131               foreach  (KeyValuePair < string , FormConfig >  kp  in  _configData)
132              {
133                   string  name  =  kp.Key;
134                  FormConfig form  =  kp.Value;
135 
136                  xElem  =  (XmlElement)xDoc.SelectSingleNode( " //forms//form[@Name=' "   +  name  +   " '] " );
137                   if  (xElem  !=   null )
138                  {
139                       foreach  (KeyValuePair < string string >  formKP  in  form.Config)
140                      {
141                          xElem.SetAttribute(formKP.Key, formKP.Value);
142                      }
143 
144                       foreach  (ControlConfig control  in  form.Controls)
145                      {
146                          xElem  =  (XmlElement)xDoc.SelectSingleNode( " //forms//form//control[@Name=' "   +  control[ " Name " +   " '] " );
147                           if  (xElem  !=   null )
148                          {
149                               foreach  (KeyValuePair < string string >  controlKP  in  control.Config)
150                              {
151                                  xElem.SetAttribute(controlKP.Key, controlKP.Value);
152                              }
153                          }
154                      }
155                  }
156              }
157 
158              xDoc.Save(_filePath);
159          }
160 
161           #endregion
162      }
163  }

FormConfig.cs    

View Code
  1  /* ******************************************************************************
  2  #                    FormConfig.cs
  3  #  Comment:
  4  #                    
  5  #  Current Version: V1.0
  6  #  Author: 
  7  #
  8  #  History List:
  9  #  V1.0    Created by CodeBuilder@2010/10/29
 10  #
 11  #***************************************************************************** */
 12  using  System;
 13  using  System.Text;
 14  using  System.Collections.Generic;
 15 
 16  namespace  Higo.Controls.Config
 17  {
 18       ///   <summary>
 19       ///  窗体配置对象
 20       ///   </summary>
 21       public   class  FormConfig
 22      {
 23           #region  私有域
 24 
 25           private  IList < ControlConfig >  _controls  =   new  List < ControlConfig > ();
 26           private  Dictionary < string string >  _configs  =   new  Dictionary < string string > ();
 27 
 28           #endregion
 29 
 30           #region  构造函数
 31          
 32           internal  FormConfig()
 33          {
 34          }
 35 
 36           #endregion
 37 
 38 
 39           #region  公有属性
 40 
 41           public  IList < ControlConfig >  Controls
 42          {
 43               get  
 44              {
 45                   return  _controls;
 46              }
 47          }
 48 
 49           public  Dictionary < string string >  Config
 50          {
 51               get
 52              {
 53                   return  _configs;
 54              }
 55          }
 56 
 57           #endregion
 58 
 59           #region  公有方法
 60 
 61           public   void  Add( string  key,  string  value)
 62          {
 63               if  (_configs.ContainsKey(key))
 64              {
 65                  _configs[key]  =  value;
 66              }
 67               else
 68              {
 69                  _configs.Add(key,value);
 70              }
 71          }
 72 
 73           public   void  Remove( string  key)
 74          {
 75               if  (_configs.ContainsKey(key))
 76              {
 77                  _configs[key]  =   null ;
 78                  _configs.Remove(key);
 79              }
 80          }
 81 
 82           public   string  GetValue( string  key)
 83          {
 84               if  (_configs.ContainsKey(key))
 85              {
 86                   return  _configs[key];
 87              }
 88 
 89               return   string .Empty;
 90          }
 91 
 92           #endregion
 93 
 94           #region  索引器
 95 
 96           ///   <summary>
 97           ///  根据字段代码,获取配置明细对象
 98           ///   </summary>
 99           ///   <param name="fieldCode"> 配置字段代码 </param>
100           ///   <returns></returns>
101           public  ControlConfig  this [ string  key]
102          {
103               get
104              {
105                   if  (_controls.Count  <=   0 )
106                  {
107                       return   null ;
108                  }
109 
110                   foreach  (ControlConfig c  in  _controls)
111                  {
112                       if (c[ " Name " ==  key )
113                      {
114                           return  c;
115                      }
116                  }
117 
118                   return   null ;
119              }
120          } 
121 
122           #endregion
123      }
124  }

ControlConfig.cs

View Code
  1  /* ******************************************************************************
  2  #                    ControlConfig.cs
  3  #  Comment:
  4  #                    
  5  #  Current Version: V1.0
  6  #  Author: 
  7  #
  8  #  History List:
  9  #  V1.0    Created by wdong
 10  #
 11  #***************************************************************************** */
 12  using  System;
 13  using  System.Text;
 14  using  System.Collections.Generic;
 15 
 16  namespace  Higo.Controls.Config
 17  {
 18       ///   <summary>
 19       ///  Control配置对象
 20       ///   </summary>
 21       public   class  ControlConfig
 22      {
 23           #region  私有域
 24 
 25           private  FormConfig _belongto;
 26           private  Dictionary < string string >  _configs  =   new  Dictionary < string string > ();
 27 
 28           #endregion
 29 
 30           #region  构造函数
 31 
 32           internal  ControlConfig(FormConfig form)
 33          {
 34              _belongto  =  form;
 35          }
 36 
 37           #endregion
 38 
 39           #region  公有属性
 40 
 41           public  Dictionary < string string >  Config
 42          {
 43               get
 44              {
 45                   return  _configs;
 46              }
 47          }
 48 
 49           #endregion
 50 
 51           #region  公有方法
 52 
 53           public   void  Add( string  key,  string  value)
 54          {
 55               if  (_configs.ContainsKey(key))
 56              {
 57                  _configs[key]  =  value;
 58              }
 59               else
 60              {
 61                  _configs.Add(key, value);
 62              }
 63          }
 64 
 65           public   void  Remove( string  key)
 66          {
 67               if  (_configs.ContainsKey(key))
 68              {
 69                  _configs[key]  =   null ;
 70                  _configs.Remove(key);
 71              }
 72          }
 73 
 74           public   string  GetValue( string  key)
 75          {
 76               if  (_configs.ContainsKey(key))
 77              {
 78                   return  _configs[key];
 79              }
 80 
 81               return   string .Empty;
 82          }
 83 
 84           #endregion
 85 
 86           ///   <summary>
 87           ///  根据字段代码,获取配置明细对象
 88           ///   </summary>
 89           ///   <param name="fieldCode"> 配置字段代码 </param>
 90           ///   <returns></returns>
 91           public   string   this [ string  key]
 92          {
 93               get
 94              {
 95                   return  GetValue(key);
 96              }
 97               set
 98              {
 99                  Add(key, value);
100              }
101          } 
102      }
103  }
 

HigoMovingControl.cs

View Code
  1  using  System;
  2  using  System.Collections.Generic;
  3  using  System.Text;
  4  using  System.Drawing;
  5  using  System.Windows.Forms;
  6  using  Higo.Controls.Config;
  7 
  8  namespace  Higo.Controls
  9  {
 10       ///   <summary>
 11       ///  使窗口的中的指定控件支持运行时移动
 12       ///  TODO:运行时缩放
 13       ///   </summary>
 14       public   class  HigoMovingControl
 15      {
 16           #region  私有成员
 17          
 18           bool  _isMoving  =   false ;
 19          Point _pCtrlLastCoordinate  =   new  Point( 0 , 0 );
 20          Point _pCursorOffset  =   new  Point( 0 0 );
 21          Point _pCursorLastCoordinate  =   new  Point( 0 0 );
 22           private  Control _ctrl  =   null ;
 23           private  ScrollableControl _container  =   null ;
 24 
 25           #endregion
 26          
 27           #region  私有方法
 28          
 29           ///   <summary>
 30           ///  在鼠标左键按下的状态记录鼠标当前的位置,以及被移动组件的当前位置
 31           ///   </summary>
 32           ///   <param name="sender"></param>
 33           ///   <param name="e"></param>
 34           private   void  MouseDown( object  sender, MouseEventArgs e)
 35          {
 36               if  (_container  ==   null )
 37              {
 38                   return ;
 39              }
 40               if  (e.Button  ==  MouseButtons.Left)
 41              {
 42                  _isMoving  =   true ;
 43                  _pCtrlLastCoordinate.X  =  _ctrl.Left;
 44                  _pCtrlLastCoordinate.Y  =  _ctrl.Top;
 45                  _pCursorLastCoordinate.X  =  Cursor.Position.X;
 46                  _pCursorLastCoordinate.Y  =  Cursor.Position.Y;
 47              }
 48          }
 49           private   void  MouseMove( object  sender, MouseEventArgs e)
 50          {
 51               if  (_container  ==   null )
 52              {
 53                   return ;
 54              }
 55                 
 56               if  (e.Button  ==  MouseButtons.Left)
 57              {
 58                   if  ( this ._isMoving)
 59                  {
 60                      Point pCursor  =   new  Point(Cursor.Position.X, Cursor.Position.Y);
 61                   
 62                      _pCursorOffset.X  =  pCursor.X  -  _pCursorLastCoordinate.X;
 63                      _pCursorOffset.Y  =  pCursor.Y  -  _pCursorLastCoordinate.Y;
 64                      _ctrl.Left  =  _pCtrlLastCoordinate.X  +  _pCursorOffset.X;
 65                      _ctrl.Top  =  _pCtrlLastCoordinate.Y  +  _pCursorOffset.Y;
 66                  }
 67 
 68              }
 69          }
 70   
 71           private   void  MouseUp( object  sender, MouseEventArgs e)
 72          {
 73               if  (_container  ==   null )
 74              {
 75                   return ;
 76              }
 77 
 78               if  ( this ._isMoving)
 79              {
 80                   if  (_pCursorOffset.X  ==   0   &&  _pCursorOffset.Y  ==   0 )
 81                  {
 82                       return ;
 83                  }
 84 
 85                   if  ((_pCtrlLastCoordinate.X  +  _pCursorOffset.X  +  _ctrl.Width)  >   0 )
 86                  {
 87                      _ctrl.Left  =  _pCtrlLastCoordinate.X  +  _pCursorOffset.X;
 88                  }
 89                   else
 90                  {
 91                      _ctrl.Left  =   0 ;
 92                  }
 93 
 94                   if  ((_pCtrlLastCoordinate.Y  +  _pCursorOffset.Y  +  _ctrl.Height)  >   0 )
 95                  {
 96                      _ctrl.Top  =  _pCtrlLastCoordinate.Y  +  _pCursorOffset.Y;
 97                  }
 98                   else
 99                  {
100                      _ctrl.Top  =   0 ;
101                  }
102 
103                  _pCursorOffset.X  =   0 ;
104                  _pCursorOffset.Y  =   0 ;
105 
106                  ConfigHelper.Instance[_container.GetType().FullName][_ctrl.Name][ " Left " =  _ctrl.Left.ToString();
107                  ConfigHelper.Instance[_container.GetType().FullName][_ctrl.Name][ " Top " =  _ctrl.Top.ToString();
108              }
109          }
110           #endregion
111           #region  构造函数
112           ///   <summary>
113           ///  获取被移动控件对象和容器对象
114           ///   </summary>
115           ///   <param name="c"> 被设置为可运行时移动的控件 </param>
116           ///   <param name="parentContain"> 可移动控件的容器 </param>
117           public  HigoMovingControl(Control c, ScrollableControl parentContain)
118          {
119              _ctrl  =  c;
120               this ._container  =  parentContain;
121              _ctrl.MouseDown  +=   new  MouseEventHandler(MouseDown);
122              _ctrl.MouseMove  +=   new  MouseEventHandler(MouseMove);
123              _ctrl.MouseUp  +=   new  MouseEventHandler(MouseUp);
124          }
125           #endregion
126      }
127  }

应用例子代码

View Code
 1   Higo.Controls.Config.FormConfig _formConfig  =  Higo.Controls.Config.ConfigHelper.Instance[ " Higo.EntryValid.App.PrintForm " ];
 2 
 3 
 4    this .certificateWordLabel1.Text  =  _currentPersonInfo.CertificateWord;
 5              HigoMovingControl certificateWordLabel1Control  =   new  HigoMovingControl( this .certificateWordLabel1, this );
 6               if ( ! _formConfig[ " certificateWordLabel1 " ].Config.ContainsKey( " Left " ))
 7              {
 8                  _formConfig[ " certificateWordLabel1 " ][ " Left " =   this .certificateWordLabel1.Left.ToString();
 9                  _formConfig[ " certificateWordLabel1 " ][ " Top " =   this .certificateWordLabel1.Top.ToString();
10              }
11               else
12              {
13                   this .certificateWordLabel1.Left  = int .Parse(_formConfig[ " certificateWordLabel1 " ][ " Left " ].ToString());
14                   this .certificateWordLabel1.Top  = int .Parse(_formConfig[ " certificateWordLabel1 " ][ " Top " ].ToString());
15              }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值