811一周工作安排分享.docx

上传人:b****5 文档编号:6898235 上传时间:2023-01-12 格式:DOCX 页数:12 大小:429.21KB
下载 相关 举报
811一周工作安排分享.docx_第1页
第1页 / 共12页
811一周工作安排分享.docx_第2页
第2页 / 共12页
811一周工作安排分享.docx_第3页
第3页 / 共12页
811一周工作安排分享.docx_第4页
第4页 / 共12页
811一周工作安排分享.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

811一周工作安排分享.docx

《811一周工作安排分享.docx》由会员分享,可在线阅读,更多相关《811一周工作安排分享.docx(12页珍藏版)》请在冰豆网上搜索。

811一周工作安排分享.docx

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架构的自定义代码开发

窗体调用一个操作类

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1