811一周工作安排分享.docx
《811一周工作安排分享.docx》由会员分享,可在线阅读,更多相关《811一周工作安排分享.docx(12页珍藏版)》请在冰豆网上搜索。
811一周工作安排分享
项目开发周期表
开发项目名称:
开发人员:
序号
开发内容
预计开始时间
预计结束时间
备注
1
解决:
自定义组件的
鼠标控制滚动条和点击事件冲突
·兼容上下分页和鼠标控制滚动框
·FileControl组件的MouseClick事件拆分为MouseDown&MouseUp
2
文件预览
·TextPreview
·PicturePreview
·WordPreview
3
1、用1-5位的0-9a-z的36个字符根据匹配算法(*)生成互不冲突的账号集合
使用者签名:
质量评测:
(优秀、良好)
备注:
开发环境:
win7&VS2013Framework3.5&office2007&Date(2014-8)
验收人员:
日期:
开发人员:
1、鼠标移动列表【改】(11)
·鼠标拖动页面,以查看超出显示范围之外的部分内容
来自:
usingSystem.Runtime.InteropServices;
以下API函数和常量就是实现上述功能的关键了:
[DllImport("user32.dll")]
privatestaticexternintSetScrollPos(IntPtrhwnd,intnBar,intnPos,boolbRedraw);
[DllImport("user32.dll")]
privatestaticexternintGetScrollPos(IntPtrhwnd,intnBar);
[DllImport("user32.dll")]
privatestaticexternboolPostMessage(IntPtrhWnd,intnBar,intwParam,intlParam);
[DllImport("user32",CharSet=CharSet.Auto)]
privatestaticexternboolGetScrollRange(IntPtrhWnd,intnBar,
outintlpMinPos,outintlpMaxPos);
privateconstintSB_HORZ=0x0;
privateconstintSB_VERT=0x1;
privateconstintWM_HSCROLL=0x114;
privateconstintWM_VSCROLL=0x115;
privateconstintSB_THUMBPOSITION=4;
简单说明一下吧:
SetScrollPos:
设置所指定滚动条中的滚动按钮的位置
GetScrollPos:
获取指定滚动条的滚动按钮的位置
GetScrollRange:
获取指定滚动条的滚动按钮的位置最大最小值
PostMessage:
这个函数是关键中的关键,它负责向Windows控件发送相应的消息,以真正执行相应的操作。
一些网友实现了滚动条中滑块位置的移动,但却没有引起控件中内容的移动,其原因就是因为没有调用这个函数,没有把移动内容的消息发送给控件。
SB_HORZ:
代表水平滚动条
SB_VERT:
代表垂直滚动条
WM_HSCROLL:
代表水平滚动事件
WM_VSCROLL:
代表垂直滚动事件
SB_THUMBPOSITION:
至于这个常量,其含义我也不是很清楚
好了,准备工作做好了,就可以开工了。
先声明几个变量:
boolPreview_move=false;//是否按下鼠标,表示处理移动状态。
PointMoveStart;//移动开始时,鼠标的坐标点
PointMoveEnd;//移动过程中鼠标的坐标点
在控件的MouseDown事件中,当鼠标按下时开始移动页面,并记下起始坐标点:
privatevoidpreviewer_MouseDown(objectsender,MouseEventArgse)
{
Preview_move=true;
MoveStart=e.Location;
}
在控件的MouseUp事件中,记得当鼠标放开后要置回非移动状态:
privatevoidpreviewer_MouseUp(objectsender,MouseEventArgse)
{
Preview_move=false;
}
以下就是实现移动页面的关键部分了,在控件的MouseMove实现用代码间接控制控件的滚动条位置并实现页面实时移动:
privatevoidpreviewer_MouseMove(objectsender,MouseEventArgse)
{
if(!
Preview_move)return;
MoveEnd=e.Location;
intMinH,MaxH,MinV,MaxV;
//获得鼠标在X和Y两个方向上的移动量。
//除以10是为是让移动页面的速度变慢一点。
//而前面的负号则是用来调节页面移动方向的。
intMoveX=-(MoveEnd.X-MoveStart.X)/10;
intMoveY=-(MoveEnd.Y-MoveStart.Y)/10;
//获取滚动条的最大最小位置和当前位置
GetScrollRange(previewer.Handle,0,outMinH,outMaxH);
GetScrollRange(previewer.Handle,1,outMinV,outMaxV);
intPosH=GetScrollPos(previewer.Handle,0);
intPosV=GetScrollPos(previewer.Handle,1);
//计算最终滚动条的位置(注意最终位置不要超出最大最小值的范围)
intPosH1=PosH+MoveX;
if(PosH1>=MinH&&PosH1<=MaxH)
{
SetScrollPos(previewer.Handle,SB_HORZ,PosH1,true);//设置滚动条的位置
//告诉控件移动页面内容到相应的位置上
PostMessage(previewer.Handle,
WM_HSCROLL,
SB_THUMBPOSITION+0x10000*PosH1,0);
}
intPosV1=PosV+MoveY;
if(PosV1>=MinV&&PosV1<=MaxV)
{
SetScrollPos(previewer.Handle,SB_VERT,PosV1,true);
PostMessage(previewer.Handle,
WM_VSCROLL,
SB_THUMBPOSITION+0x10000*PosV1,0);
}
}
OK,一个能用鼠标实时移动页面内容的打印预览功能作好了。
其实,对于.net中很多控件都可以用相似的方面实现对滚动条的控制。
·MouseClick=MouseDown+MouseUp
拆分鼠标点击事件,使程序能够识别区分点击事件和按下+拖动+离开的鼠标组合事件。
·自定义组件FileControl组件
图1自定义FileControl组件
图2控件间类图
1)增加对FileControl组件的MouseDownMouseMoveMouseUp事件的处理函数
2)增加状态标识变量_isMouseClick,状态图如下:
图3组合事件解决冲突的事件
3)组件事件的传递
将FileControl组件容器中的其他空间的MouseDownMouseMoveMoseUp事件处理函数指向该FileControl组件的MosuedownMouseMoveMouseUp事件处理函数;组件容器中的控件和组件存在在层次关系,如下图的床垫剖析图,VS开发工具提供了最底层的夹白色材料的黄褐色平整板,上面几层淡黄、蓝色、绿色、紫色的材料,就是我们添加的控件,如FileControl中的PictureBoxCheckBoxLabel。
如何才能让最底层的组件容器接收到MouseDownMouseMoveMouseUp,就需要我们进行事件传递:
this.OnMouseDown()this.OnMouseMovethis.OnMouseUp(this表示FileControl组件的实例对象),或者事件处理函数指向:
pictureBox1.MouseDown+=newMouseEventHandler(this.FileControl_MouseDown)(或者在属性面板的事件列表中直接指定MouseDownMouseUpMouseMove事件的处理函数)。
图4床垫剖析图
4)给一个事件绑定多个处理函数
我们在该FileControl内部对MouseDownMouseMoveMouseUp事件进行处理函数的绑定,在FileSysControl组件中,动态添加FileControl对象时,又对FileControl对象的MouseDownMouseMoveMouseUp事件进行处理方法的绑定,用于鼠标控制滚动条的处理;从测试效果中可以看出,这两部分的代码都是有效的,我称之为事件处理函数集。
当前处理函数的执行顺序为:
FileControl处理函数FileSysControl的处理函数,对这个顺序,有如下推断:
事件处理函数集有序,VS编译顺序,先FileControl对象初始化,这时进行FileControl事件处理函数的绑定,然后在FileSysControl中对FileControl对象动态事件处理函数绑定。
C#编程书籍给出一段例子,连续对同一事件绑定不同的处理函数,我们可以跟踪函数集的处理顺序,得出初步结论。
5)TableLayoutPanel的ScrollBar会维持最大的列表长度的状态(无法解决)
2、打印预览(11)
·TextPreviewPicturePreviewWordPreview
暂时实现着三类文档的预览
1)TextPreviewFunction
Reference:
来自:
将文本文件的内容转成jpg,png等格式的图片
下面是一个将文本文件data.txt内容转成图片并生成在根目录下的例子,调用方法:
ConvertTextFileToImage(Server.MapPath("~/Data.txt"),Server.MapPath("~/Data.jpg"));
方法代码:
usingSystem.Drawing;
usingSystem.Drawing.Printing;
usingSystem.IO;
protectedvoidConvertTextFileToImage(StringtextFile,StringimageFile)
{
constintFixedWidth=1024;//期望的显示宽度
System.Drawing.FontdrawFont=newSystem.Drawing.Font("宋体",12);
System.Drawing.Bitmapimage=newSystem.Drawing.Bitmap(1,1);
System.Drawing.Graphicsg=System.Drawing.Graphics.FromImage(image);
Stringtext=System.IO.File.ReadAllText(textFile,
System.Text.Encoding.GetEncoding("GB2312"));
System.Drawing.SizeFsf=g.MeasureString(text,drawFont,FixedWidth);
System.Drawing.SizeshowSize=newSystem.Drawing.Size(Convert.ToInt32(sf.Width),
Convert.ToInt32(sf.Height));
image=newSystem.Drawing.Bitmap(image,showSize);
g=System.Drawing.Graphics.FromImage(image);
g.Clear(System.Drawing.Color.White);
g.TextRenderingHint=System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
g.DrawString(text,drawFont,System.Drawing.Brushes.Black,new
System.Drawing.RectangleF(newSystem.Drawing.PointF(0,0),sf));
image.Save(imageFile,System.Drawing.Imaging.ImageFormat.Png);
g.Dispose();
image.Dispose();
}
2)PicturePreviewFunction
ImageImage.ImageForm(path);
3)WordPreviewFunction
Reference:
来自:
C#技术分享【Word转换成图片和PDF——2种方案】
分类:
C#.Net Pdf-Word-图片2012-02-2219:
24
Aspose.Wordsc#Word转PDFWord转图片
GitHubCloneAdress:
(yougetit).
4)Structure总分结构
图5缩略图总分结构
varext=Path.GetExtension(inputFile.ToLower());
varguid=Guid.NewGuid();
stringimgFolder=Environment.CurrentDirectory+"\\"+
Environment.UserName;
stringimgPath=Path.Combine(imgFolder,guid.ToString()+".png");
//Ifthefileisa"text"file.
if(ext==".txt")
{
newTextPreview().ConvertTextFileToImage(inputFile,
imgPath);
preview.setPicture(imgPath);
preview.Show();
returntrue;
}
//Ifthefileisa"WordDocument"file.
elseif(ext==".doc"||ext==".docx"||ext==".rtf")
{
WordPreview.ConvertWordToImage(inputFile,imgFolder,
guid.ToString(),1,1,null,0);
preview.setPicture(imgPath);
preview.Show();
returntrue;
}
//Ifthefileisa"Excel"file.
elseif(ext==".xls"||ext==".xlsx"){}
//Ifthefileisa"PowerPoint"file.
elseif(ext==".ppt"||ext==".pptx"){}
//Ifthefileisa"PDF"file.
elseif(ext==".pdf"){}
//Ifthefileisa"HTML"file.
elseif(ext==".htm"||ext==".html"){}
//Ifthefileisa"image"file.
elseif(ext==".jpg"||ext==".jpeg"||
ext==".png"||ext==".gif")
{
preview.setPicture(inputFile);
preview.Show();
returntrue;
}
分析:
利用Guid生成Guid码存放文档生成的图片,在某种程度上解决了文件句柄的冲突,缺点是会造成文件碎片过多,需要管理员手动清扫。
所以,分析资源的流动,解决同一个缓存文件存放临时图片的句柄冲突问题,在当下环境,需要在PreviewForm的Hide()时对PictureBox的Image进行Dispose:
界面隐藏时,对静态资源进行回收。
3、账号匹配和相关文件生成:
WFormStringCompare
a)Int类型和char类型的隐士转换
b)0-9和a-z在ASCII表的排列顺序
c)基于全排列的基数组:
10个数字和26个小写字母
d)生成排列算法的sleep
(1)
foreach(stringstr1instore.AccountList)
{
foreach(stringstr2instore.AccountList)
{
foreach(stringstr3instore.AccountList)
foreach(stringstr4instore.AccountList)
{
list.Add(str1+str2+str3+str4);
//Thread.Sleep
(1);
}
}
}
36*36*36*36(百万级)次运算,自己弄了一个计时器,如果没有sleep
(1),只需要一秒的时间,如果使用了sleep
(1),十分钟还没有运算出结果。
Sleep
(1)的初衷,是均衡系统资源,避免内存和CPU消耗速率过高,但sleep
(1)在这个事例中并不适用。
e)系统为每个程序分配的内存是有限的,我们需要把运算过程中,产生的结果,及时存放在磁盘文件,避免产生的百万级数的字符串数据在无需二次使用时,耗尽内存资源。
f)WinForm开发,使用了功能驱动,对每一个可以产生输出、产生UI交互的操作,先进行人工控制,把整套流程测试完毕,直接进行组合。
g)XML序列化和反序列化
i.对一个公共类public进行可序列化声明[Serializable]
ii.对序列化的元素访问级别为public,集合类采用List集合类
iii.序列化:
XML序列化实例+写入流
publicvoidmySerialize(stringfilename)
{
stringpath=string.Format(pathFormat,filename);
XmlSerializermyserializer=newXmlSerializer(typeof(StorageHelper));
StreamWritermyWriter=newStreamWriter(path);
myserializer.Serialize(myWriter,this);
myWriter.Close();
this.AccountList.Clear();
}
iv.反序列化:
XML序列化实例+文件流
publicListmyDeserialize(stringfilename)
{
AccountList.Clear();
stringpath=string.Format(pathFormat,filename);
if(File.Exists(path))
{
XmlSerializermySerializr=newXmlSerializer(typeof(StorageHelper));
FileStreammyFileStream=newFileStream(path,FileMode.Open);
StorageHelperinstance=(StorageHelper)mySerializr.Deserialize(myFileStream);
AccountList=instance.AccountList;
myFileStream.Close();
}
returnAccountList;
}
v.XML序列化和反序列化的优势
使用类来做存储结构,而不是SQL的表结构来做存储结构,轻量等优点。
vi.
h)基于MVC架构的自定义代码开发
窗体调用一个操作类