(转)浅谈工作中使用过的几种C++界面库

Posted by & filed under Uncategorized.

通常一个界面库是否有广大的使用人群,我觉得与以下几个因素有关:支持的操作系统是否多样,支持的操作系统市场占有率是否大,使用是否方便,是否有良好的”所见即所得”(WYSIWYG)的开发工具支持,是否有经济实力的雄厚的大公司支持等等。结合我使用过的的几种C++界面库和大家交流一下。 1.MFC(MicroSoft Foundation classes):相信在windows下进行开发的各位同僚们都用过MFC进行界面开发。我记得自己初次接触MFC是大学毕设一个关于数字图像处理的课题,用的IDE是VS 6.0,那时就干了件“重复造轮子“的事,而且是个大轮子,那时并不知道VS有生成MFC程序的向导,结果坐在电脑前没黑没白的照着一本参考书上的自动生成代码敲了几天几夜,结果很残酷,没运行起来。着实把我吓了一跳,以为开发软件这么难,现在想想MFC的自动生成代码中的有些语言特性直到现在自己也未必完全了解。之后学习了孙鑫的《VC++深入编程》这才算是对MFC渐渐入了门,但是在此后有相当一段时间内都是对MFC只了解其表,会应用,并不了解其本质。直到看了侯捷老师的《深入浅出MFC》才算是对MFC有了本质的认识。(侯捷老师的写作风格很好,这是我第一次真正喜欢上一本计算机书籍)正如侯捷老师所说,要学习MFC首先要对windows程序的事件驱动特性有所了解,消息的产生,获得,分派,判断,处理;还要了解C++的性质(封装,继承,多态)。之后,侯捷老师又仿真了MFC的六大关键技术:MFC的初始化过程,RTTI(执行时类型识别),动态生成,Persistence(永久留存),消息映射,消息绕行,到此为止,MFC已经被剖析的很彻底和细致了,你也可以掌握MFC的本质了吧! 我的使用体验:支持MFC的IDE我使用过VS Read more […]

JQuery+ajax实现批量上传图片

Posted by & filed under Uncategorized.

JQuery+ajax实现批量上传图片 在网上搜索了一下,发现以jquery+ajax方式实现单张图片上传的代码是有的,但实现批量上传图片的程序却没搜索到,于是根据搜索到的代码,写了一个可以批量上传的。 先看效果图 点击增加按钮,会增加一个选择框,如下图: 选择要上传的图片,效果图如下: 上传成功如下图: 下面来看代码: 前台html主要代码: <button id=”SubUpload” class=”ManagerButton” onClick=”TSubmitUploadImageFile();return false;”>确定上传</button>&nbsp;&nbsp; <button id=”CancelUpload” class=”ManagerButton” onClick=”javascript:history.go(-1);”>取消</button>&nbsp;&nbsp; <button id=”AddUpload” class=”ManagerButton” onClick=”TAddFileUpload();return false;”>增加</button> <tr><td class=”tdClass”> 图片1: </td><td class=”tdClass”> <input name=”” size=”60″ id=”uploadImg1″ type=”file” /> <span id=”uploadImgState1″></span> </td></tr>   因为用了JQuery,所以你完全可以把click事件放在js文件中 “增加”按钮js代码: var TfileUploadNum=1; //记录图片选择框个数 var Tnum=1; //ajax上传图片时索引 function TAddFileUpload() { var idnum = TfileUploadNum+1; var str=”<tr><td class=’tdClass’>图片”+idnum+”:</td>”; str += “<td class=’tdClass’><input name=’’ size=’60’ id=’uploadImg”+idnum+”’ type=’file’ /><span id=’uploadImgState”+idnum+”’>”; str += “</span></td></tr>”; (“#imgTable”).append(str); TfileUploadNum += 1; } “确定上传”按钮js代码: function TSubmitUploadImageFile() { M(“SubUpload”).disabled=true; M(“CancelUpload”).disabled=true; M(“AddUpload”).disabled=true; setTimeout(“TajaxFileUpload()”,1000);//此为关键代码 } 关于setTimeout(“TajaxFileUpload()”,1000);这句代码:因为所谓的批量上传,其实还是一个一个的上传,给用户的只是一个假象。只所以要延时执行TajaxFileUpload(),是因为在把图片上传到服务器上时,我在后台给图片重新命名了,命名的规则是,如下代码: Random rd = new Random(); StringBuilder serial = new StringBuilder(); serial.Append(DateTime.Now.ToString(“yyyyMMddHHmmssff”)); serial.Append(rd.Next(0, 999999).ToString()); return serial.ToString(); 即使我命名精确到毫秒,另外再加上随机数,可是还是有上传的第二张图片把上传的第一张图片覆盖的情况出现。所以此处我设置了延时1秒后在上传下一张图片。刚开始做这个东西的时候,用的是for循环,来把所有的图片一个一个的循环地用ajax上传,可是for循环速度太快了,可能第一张图片还没来得及ajax,第二张就被for过来了,还是有第二张覆盖第一张的情况出现。 下面来看TajaxFileUpload()函数,代码如下: function TajaxFileUpload() { if(Tnum<TfileUploadNum+1) { //准备提交处理 (“#uploadImgState”+Tnum).html(“<img src=../images/loading.gif />”); //开始提交 .ajax ({ type: “POST”, url:”http://localhost/ajaxText2/Handler1.ashx”, data:{upfile:(“#uploadImg”+Tnum).val(),category:(“#pcategory”).val()}, success:function (data, status) { //alert(data); var stringArray = data.split(“|”); if(stringArray[0]==”1″) { //stringArray[0] 成功状态(1为成功,0为失败) //stringArray[1] 上传成功的文件名 //stringArray[2] 消息提示 (“#uploadImgState”+Tnum).html(“<img src=../images/note_ok.gif />”);//+stringArray[1]+”|”+stringArray[2]); } else { //上传出错 (“#uploadImgState”+Tnum).html(“<img src=../images/note_error.gif />”+stringArray[2]);//+stringArray[2]+””); } Tnum++; setTimeout(“TSubmitUploadImageFile()”,0); } }); } } 上面的代码没什么可说的,很容易看懂。下面来看Handler1.ashx(一般处理程序)如何来处理post过来的图片的(此代码来自网上,具体地址忘记了),下面只给出关键代码,全部代码在附件里。 1、 string _fileNamePath = “”; try { _fileNamePath = context.Request.Form[“upfile”]; //开始上传 string _savedFileResult = UpLoadFile(_fileNamePath); context.Response.Write(_savedFileResult); } catch { context.Response.Write(“0|error|上传提交出错”); } 2、 Code //生成将要保存的随机文件名 string fileName = GetFileName() + fileNameExt; //物理完整路径 string toFileFullPath = HttpContext.Current.Server.MapPath(toFilePath); //检查是否有该路径 没有就创建 if (!Directory.Exists(toFileFullPath)) { Directory.CreateDirectory(toFileFullPath); } ///创建WebClient实例 WebClient myWebClient = new WebClient(); //设定windows网络安全认证 方法1 myWebClient.Credentials = CredentialCache.DefaultCredentials; //要上传的文件 FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read); //FileStream fs = OpenFile(); BinaryReader r = new BinaryReader(fs); //使用UploadFile方法可以用下面的格式 //myWebClient.UploadFile(toFile, “PUT”,fileNamePath); byte[] postArray = r.ReadBytes((int)fs.Length); Stream postStream = myWebClient.OpenWrite(toFile, “PUT”); if (postStream.CanWrite) { postStream.Write(postArray, 0, postArray.Length); }   3、检查是否合法的上传文件 private bool CheckFileExt(string _fileExt) { string[] allowExt = new string[] { “.gif”, “.jpg”, “.jpeg” }; for (int i = 0; i < allowExt.Length; i++) { if (allowExt[i] == _fileExt) { return true; } } return false; } 4、生成要保存的随即文件名 public static string GetFileName() { Random rd = new Random(); StringBuilder serial = new StringBuilder(); serial.Append(DateTime.Now.ToString(“yyyyMMddHHmmssff”)); serial.Append(rd.Next(0, 999999).ToString()); return serial.ToString(); }   Ok,基本上这个批量上传图片的JQuery+ajax方式实现的程序完成了。如果你要上传word文档,pdf文件,只要稍作修改,就可以实现了。 Read more […]

JS的构造函数

Posted by & filed under Uncategorized.

对于想学js,从新手到高手,必须经历的,非常的好,转过来学习一下。   //构造函数 //使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法 //当对象被实例化后,构造函数会立即执行它所包含的任何代码 function myObject(msg){ //特权属性(公有属性) this.myMsg = msg; //只在被实例化后的实例中可调用 this.address = ‘上海’; //私有属性 var name = ‘豪情’; var age = 29; var that = this; //私有方法 function sayName(){ alert(that.name); } //特权方法(公有方法) //能被外部公开访问 //这个方法每次实例化都要重新构造而prototype是原型共享,所有实例化后,都共同引用同一个 this.sayAge = Read more […]

浅谈关于js中的push()、unshift()、pop()、shift()

Posted by & filed under Uncategorized.

点击(此处)折叠或打开 var list=[34,2124,44,78,31]; list[list.length]=70; alert(list[5])    //结果是:70 除了这种方法,js中还有一个push()命令可以向数组最后面添加元素: 点击(此处)折叠或打开 var list=[34,2124,44,78,31]; list.push(70); alert(list[5]);    //结果是:70 push()返回它们提供新元素后数组中的元素总数的值: 点击(此处)折叠或打开 var list = [34,2124,44,78,31]; var Num = list.push(70); alert(Num);       //结果是:6 跟push()相对应的还有一个pop()命令,这是负责从数组中删除后一个元素的: 点击(此处)折叠或打开 var list=[34,2124,44,78,31]; list.pop(); alert(list); Read more […]

网页中预览PDF文件

Posted by & filed under Uncategorized.

两种方案:一种直接链接,把pdf文件当作img文件,类似<a href=””/>这种形式,这样链接: <frame src=”pdf文件的地址”></frame> 另一种:使用js插件哈。 其中实现阅读pdf文件的js插件很多,比如:pdf.js:是一个技术原型主要用于在 HTML5 平台上展示 PDF 文档,无需任何本地技术支持;jsPDF:是一个使用Javascript语言生成PDF的开源库(IE暂不支持); 比较简单易上手的js插件:PDFObject.js,是一个 JavaScript 库用来在HTML中动态嵌入 PDF 文档。 效果如下: PDFObject.js目前已经升级到1.2,可以支持IE9. PDFObject.js宗旨:Sometimes you need a little JavaScript. When you do, try PDFObject. 来看看少之又少的js代码: <script Read more […]

6种排序算法的简洁实现:冒泡、选择、插入、归并、快速、堆[转]

Posted by & filed under Uncategorized.

注释写得已经非常详细了,有兴趣的可以瞧瞧。 源码&注释 [java] view plaincopy package cn.fansunion.common.suanfa; /** * 排序工具类 * * @author LeiWen@FansUnion.cn * */ public final class SortingUtils { public static boolean debug = false; // 不允许实例化 private SortingUtils() { } /** * 冒泡排序:最容易理解的排序方法 */ public static void bubbleSort(int[] array) { boolean needNextPass = true; int length = array.length; // 遍历N-1次,从第“2”个元素开始 for (int index = 1; index < length; index++) { // 需要下一次排序 if (needNextPass) { Read more […]

javascript之jquery DOM操作[转]

Posted by & filed under Uncategorized.

查找节点 [javascript] view plaincopy var $para = $(“p”); // 获取节点 var $li = $(“ul li:eq(1)”); // 获取第二个元素节点 var p_txt = $para.attr(“title”); // 输出元素节点属性title var ul_txt = $li.attr(“title”); // 获取里的第二个元素节点的属性title var li_txt = $li.text(); // 输出第二个元素节点的text alert(ul_txt); alert(li_txt); alert(p_txt); 创建节点 [javascript] view plaincopy var $li_1 = $(“”); // 创建第一个元素 var $li_2 = $(“”); // 创建第二个元素 var $parent = $(“ul”); // 获取节点。的父节点 $parent.append($li_1); // 添加到节点中,使之能在网页中显示 $parent.append($li_2); // 可以采取链式写法:$parent.append($li_1).append($li_2); Read more […]

c3p0连接池[转]

Posted by & filed under Uncategorized.

在这里记录对c3p0连接池管理的一些代码 一、连接池管理类 [java] view plaincopy import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jdom.Document; import org.jdom.Element; import com.mchange.v2.c3p0.ComboPooledDataSource; import com.shine.framework.util.XMLUtil; /** * 数据库连接池管理器,基于C3P0 * */ public class ConnPoolManager { private final static ConnPoolManager instance = new ConnPoolManager(); private Map pools = new HashMap(); private ConnPoolManager(){ } public static ConnPoolManager getInstance(){ return instance; } /** Read more […]

利用DES加密算法保护Java源代码[转]

Posted by & filed under Uncategorized.

本文首先分析了Java源代码需要加密的原因,简要介绍了DES算法及Java密码体系和Java密码扩展,最后说明了利用DES加密算法保护Java源代码的方法及步骤。   Java语言是一种非常适用于网络编程的语言,它的基本结构与C++极为相似,但抛弃了C/C++中指针等内容,同时它吸收了Smalltalk、C++面向对象的编程思想。它具有简单性、鲁棒性、可移植性、动态性等特点。这些特点使得Java成为跨平台应用开发的一种规范,在世界范围内广泛流传。   加密Java源码的原因   Java源代码经过编译以后在JVM中执行。由于JVM界面是完全透明的,Java类文件能够很容易通过反编译器重新转换成源代码。因此,所有的算法、类文件等都可以以源代码的形式被公开,使得软件不能受到保护,为了保护产权,一般可以有以下几种方法:   (1)”模糊”类文件,加大反编译器反编译源代码文件的难度。然而,可以修改反编译器,使之能够处理这些模糊类文件。所以仅仅依赖”模糊类文件”来保证代码的安全是不够的。   (2)流行的加密工具对源文件进行加密,比如PGP(Pretty Read more […]

(转)UDP可靠传输那些事

Posted by & filed under Uncategorized.

  原文地址:http://blog.csdn.net/danscort2000/article/details/8432778 可靠udp传输从来都不是高效率可靠传输的代名词,影响传输效率的最重要因素在于,sendto函数,每次只能投递一个mtu长度的包,频繁的系统调用极大的影响了极限性能,也许你会说,udp默认可以达到64KB,你可以投递大包,是的,可以投递,但是由于网路上mtu设备的限制,大包会被拆成小包,如果你定义一个包大于mtu,那么当其中任何一个小包发生丢包的时候,会导致整个包需要重传,这个开销非常巨大,特别是在Internet上,而采用mtu大小限制内的包进行传输,丢失一个,只需要重传一个,开销小的多。udp可靠传输的自定义校验是另外一个限制,为了避免伪造的udp包,我们需要在我们自己的可靠udp包中加入自定义的校验,这个校验方法也直接影响到性能,最快的是直接套用crc32校验,由于目前cpu指令集对这个计算进行了优化,因此它的计算速度几乎是最快的,但是代价是,人家要破解或者伪造你的udp包也很容易,因为算法是透明的,以前暴出tcp伪造漏洞也是这样,由于它的包组成是透明公开,唯一有保密性的是序列号,结果有些系统初始序列号存在规律,结果就导致了安全问题。最后,发送和接收,由于是在应用层进行[无论你是采用api Read more […]