【数据集处理】怎样将xml文件信息还原到原始图片中

拿到一批别人标注的图片,xml文件,想查看别人标注的具体情况,将xml里面的坐标,名称信息还原到原始图片中。

# -*- coding: utf-8 -*-

import xml.etree.ElementTree as ET
import os, cv2

# 将路径换成自己的即可
annota_dir = "C:/Users/Lenovo/Desktop/VOCdevkit/VOC2007/Annotations"     #xml文件保存的路径
origin_dir = "C:/Users/Lenovo/Desktop/VOCdevkit/VOC2007/JPEGImages"      #jpg图片保存的路径
target_dir1= "C:/Users/Lenovo/Desktop/VOCdevkit/VOC2007/remark"          #生成带有标签信息的文件夹路径,即想将转化后的图片保存在哪

def divide_img(oriname):
    img_file = os.path.join(origin_dir, oriname + '.jpg')
    im = cv2.imread(img_file)

    # 读取每个原图像的xml文件
    xml_file = os.path.join(annota_dir, oriname + '.xml')  
    tree = ET.parse(xml_file)
    root = tree.getroot()

    for object in root.findall('object'):
        object_name = object.find('name').text
        Xmin = int(object.find('bndbox').find('xmin').text)
        Ymin = int(object.find('bndbox').find('ymin').text)
        Xmax = int(object.find('bndbox').find('xmax').text)
        Ymax = int(object.find('bndbox').find('ymax').text)
        color = (4, 250, 7)
        cv2.rectangle(im, (Xmin, Ymin), (Xmax, Ymax), color, 2)
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(im, object_name, (Xmin, Ymin - 7), font, 0.5, (6, 230, 230), 2)

    img_name = oriname + '.jpg'
    to_name = os.path.join(target_dir1, img_name)
    cv2.imwrite(to_name, im)

img_list = os.listdir(origin_dir)
for name in img_list:
    divide_img(name.rstrip('.jpg'))
print("转化完成!")  

转化结果如图:
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件文件夹属性操作、文件文件夹系统操作、系统控制操作、程序版权信息、系统软件信息、 系统硬件信息、存储设备管理、鼠标及键盘、声音和视频、图形和图像、网络、数据库) IOCP 完成端口编程技术 《远程控制编程技术》源代码 内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的数据库的各种操作(连接、删除、添加……等等) ATL开发指南源码 内部包含了atl控件的开发以及如何应用,演示了COM的包容与集合、自动化、事件和连接点、枚举器和集合以及线程管理等等。 ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一个网页游览的例子 C++自绘窗体的完整代码 注释非常详细,相信会帮助大家设计好自己的个性窗体。 C++_Primer_第4版_文+英文 原书源码+课后习题答案。 CameraController(云界面) 实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件管理和监测系统源码 它包括客户端和服务端,客户端软件主要作用是监测本主机的活动,并将监测到的信息定时发送给服务器。服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除"运行"的自动匹配历史记录、清除"文档"的历史记录、清除上次登陆用户记录、清除"查找文件"自动匹配历史记录、清除"查找计算机"自动匹配历史记录、清除网络联接历史记录、清除远程登录历史记录、清除浏览网址历史记录。实现的代码很简单。 CListCtrl 阙套其它控件 自绘了CListCtrl 控件,实现了其它控件阙套到List并自绘等。主要的实现在CListReport类。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其应用 如题。 CSkinSlier CSliderCtrl自绘 Cursor 生成图标,运行到鼠标图标。 cutscene win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页的元素 dshowplayer 媒体播放器的实现,实现了VMR7、VMR9、EVR方式。 DSoundManager 实现了声音管理。 Excel文件的导入和导出操作 主要的实现在CMyExcel类。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 FTP、HTTP 多线程断点续传下载文件 源码 gdiplus应用实例 gdiplus应用实例2 GetFileVersion 这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理单元的源码文件。完成端口通讯模块内存管理。 haisanidsV1.2-网络连接监控 IP实时数据。自绘了很多控件。自绘CTabCtrl、CToolBar、CMenu、CButton、CHtmlCtrl、CListCtrl。 hyperlink 自绘CStatic,实现超链接。 iconbutton_demo 演示了多种自绘Button。 IDocHostUIHandler Extended CHtmlView IM_毕业设计 聊天系统,操作了数据库,有服务端和客户端。 ini文件的类适合VC使用 Inline Hook(ring3) 简单源码 代码里用了备份dll的方法,因此在自定义的函数可以直接调用在内存备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 IP所在地查询器 jpeglib_demo 处理Jpeg图片。 KeyHook 键盘钩子,截获键盘信息。 Kugou7+UI 界面设计。学习界面的好实例,强烈推荐。 自绘button 自绘MENU 自绘tab 自绘Tree 自绘按钮button源代码 自绘编辑框 自绘窗体界面 自绘对话框 listbox-6 重载CListBox,演示了拖动功能。 Mail_Report 演示了发送邮箱的功能。 MD5算法 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 MFC+DLL的编写和调用示例 MFC换肤完全贴图实现 Smile简体版 Linux内核完全注释附 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC实现。 MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统底层! MiniPlayer 源代码 媒体播放实现。 MP3解码 代码 内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 MPEG4播放器源代码 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ整套聊天系统) 老版qq系统的实现。 MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+technology文档。 P2P视频技术源码(含开发文档) PcShare 内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow win32情况下实现媒体播放。 preemptivepopupkiller C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_Demo 自绘List控件的实例。 Smile 自绘List控件的实例。 SOCK登录SSL加密网站 调用ie接口。主要的代码在IEComCtrlSink。 sqlite3使用 引用了Splayer的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法。 tabcontrol_demo 自绘了CTabCtrl的实现。 To Create A COOL Desktop Lyrics Demo 歌词显示,效果非常好。对话框实现。 TopMost 自绘CListCtrl的实现。 Trace程序 演示了输出信息。 TransparentStatic 自绘CStatic控件。 TreeView控件 自绘CTreeView控件。 VC 创建向导模式 VC 精品源码打包下载(解) CatListBox_src.zip CatListBox_demo.zip 这个程序模仿Outlook建立分类列表框。 CClockST_src.zip CClockST_demo.zip 一个简单的数字时钟程序,其的date类派生于MFC CStatic 基类。 CIVStringSet_Demo.zip CIVStringSet_Source.zip 基于MFC和STL平台的字符串类,可以实现在快速字符串搜索。 enum_display_modes_demo.zip enum_display_modes_src.zip 列出所有的显示模式并列表出来,通过单击列表来改变显示分辨率。 iconbutton_demo.zip iconbutton_src.zip 创建一个按钮,并在上面显示图标。 jpeglib_demo.zip jpeglib_src.zip 利用Delphi的代码在VC显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框。 Undo_demo.zip undo_src.zip 在VC实现Undo和Redo功能。 VC 利用底层键盘钩子屏蔽任意按键MaskKey 动态链接库实现钩子,然后程序调用。 VC 透明窗口效果的电子标尺源代码 实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 知道的人不多,但提起国内的暴风影音,我想知道的人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本的使用。 VC++精仿QQ2008窗体及分类菜单 VC++卡通风格气泡提示源码 VC++实现任务管理器源码 任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 vc-ftp 多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 多任务多线程断点续传DLL 多线程文件下载 多线程查找文件(功能增强版) 自定义了一个文件搜索类。多线程实现。 多线程高速文件搜索程序源码 VC++视频聊天系统源代码 实例简单,有用户登录、传输文件、视频、画质调节、禁音检测、回音消除、自动增益、噪音抑制、视频控制等、 VC++搜索指定文件文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要操作在CFileSpltDlg。 vc++写的音乐播放器 VC++制作3D效果的旋转文字特效 VC++注册码加密源程序(含注册机、解密机) 压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框出现气球提示 调用系统自带的提示显示。 VC实现创建模态对话框 VC释放EXE资源文件 vc网络 网络系列使用教程。 VC星号密码探测显示程序 vc网络通信编程实用案例精选 局域网网络通信编程实例、IE编程实例、基本网络编程实例、网络通信协议编程、Modem /串口通信编程、代理服务器编程实例、高级网络通信编程实例。 Visual_C++网络高级编程 TCP/IP协议、Winsock网络编程接口、Visual C 与网络编程、基本网络编程技术、Telnet协议的实现、HTTP协议的实现、 FTP协议的实现、文件下载、UDP协议的实现、ICMP协议的实现、PPP协议的实现、代理服务器的实现、 ATL DCOM和ActiveX技术、网络安全。 vld-10-src 内存泄漏检测源码。 vmrplayer 简单播放器的实现,集成到了一个类。 ATL开发Gif的ActiveX控件 如题。使用控件显示gif文件。 weather(天气预报界面) 通过soso网站获得城市以及天气信息。 WebBrowser-Httprequest(http请求捕捉) Win32多线程程序设计 有文档以及源码。 Windows Media Player界面的实现 Windows Shell扩展 实现文件拷贝。 windows设计 源码 书本源码。1.VC++的基本使用 2.一个简单的HelloWorld程序 3.进程的创建 4.进程控制 5.控制其他进程 6.游戏内存修改器1 7.游戏内存修改器2 8.多线程 9.线程的优先级 10.线程同步 11.第一个窗口程序 WINDOWS网络编程技术-附源码 如题。内有文档以及源码。 WM调用DrectShow例子 wm播放器。 XFileDialog_demo xml文件操作。 xml 树控件的使用,以及ChtmlView或站点拦截调用等。 XML文件读取及管理工具VC++源码 重写了很多控件,重要功能源码集合到了CXML。 暴风压力测试2010(V7.0)源码 如题,演示了攻击服务端的源码,tcp多连接攻击、cc攻击等等……。 播放器 MM ARM_流媒体、暴风影音源码用于编解码分析。 超清晰播放器源代码 超旋的音乐播放器 含歌词……,效果看源码。 穿还原的下载者 C++源码 驱动程序可以穿透还原卡,并且可以修改系统文件,这里是通过修改系统文件userinit.exe来实现的。userinit.exe的功能很简单,就是启动explorer.exe。这里就是通过替换uerinit.exe,伪造一个userinit.exe。这个伪造的程序可以实现uerinit.exe的原始功能,并可以实现自定义的功能,比如下载执行,发送数据。 窗体透明、窗体上控件和DC绘图不透明 从dll动态装载类的源程序 大型多媒体视频会议服务器端和客户端源码VC 基于H323格式。 发一个界面库skin#全集合 SkinH_VC使用帮助(含源码)、Skinsharp V1.0.6.6各种语言全破解、vc全部函数各自独立的demo、制作皮肤工具。 仿360杀毒软件界面源码 MFC重载控件实现了360界面效果。 仿QQ、MSN信息提示窗口 重载CWnd实现了动画显示。 仿QQ2011界面的源码 仿QQ信息提示窗口 仿金山词霸界面 仿制金山毒霸专杀工具界面 重载CEdit实现自绘。 实现QQ界面绝对经典 用户界面多线程 多线程的使用。 搞基控件 List Ctrl 演示了List Ctrl控件的使用方法。 搞基控件 ListBox 演示了ListBox控件的使用方法。 搞基控件 Tab Ctrl 演示了Tab Ctrl控件的使用方法。 搞基控件 TreeCtrl 演示了TreeCtrl控件的使用方法。 带加密功能的SQLite3.3.6封装类 第12章+DLL开发与系统编程 创建导出浮点数四则运算函数的Win32 DLL、使用显式方式调用DLL实现浮点数的四则运算、使用隐式方式调用DLL实现浮点数的四则运算、创建Win32 DLL导出一个全局变量、调用DLL,获取其导出的全局变量值、创建Win32 DLL导出一个计算长方体表面积和体积的类、调用DLL,使用其导出类计算长方体的表面积和体积、创建MFC常规DLL,通过导出函数显示颜色信息对话框、调用MFC常规DLL,显示颜色信息对话框、创建MFC扩展DLL,实现圆形按钮类、调用MFC扩展DLL,创建圆形按钮、创建记录键盘动作的全局钩子DLL、调用键盘钩子DLL,实现监视系统的键盘操作、创建记录当前鼠标所在窗口标题信息的鼠标钩子DLL、调用鼠标钩子DLL,显示鼠标所在窗口的标题、获取当前操作系统的版本信息、获取系统CPU信息、获取系统内存的相关信息、获取当前系统所有安装的硬件设备、调用系统关机对话框、编码实现关闭和重启计算机、实现休眠计算机,并创建快捷键、显示并设置系统的显示属性、隐藏显示系统的任务条、改变系统的桌面壁纸。 对磁盘下任意目录的动作进行监控 创建线程不断的监视。 多功能小闹钟 不规则窗体效果显示,实现了多功能的小闹钟。 仿QQ和飞秋的局域网聊天程序(文件+语音) 这个程序用的协议是UDP,socket是CAsyncSocket,这是我在这个网站看到了qq也优先用UDP来连接服务器,连上服务器,能获得服务器上的人员列表,客户端的人员列表随用户上下线改变,服务器掉线了 也能收到通知,双击用户名字可以聊天,聊天窗口上有个文件传输,在我电脑上能传输一些小文件,但在别人电脑上就会使程序崩溃。 工具栏画到标题栏上 关联文件 自动恢复系统文件关联,以及文件关联操作的代码。使用注册表防止多次运行。 基于CDialogBar的IE多标签栏的实现 基于IE内核的多进程浏览器Raptor 基于WTL控件实现了多进程。 极速FTP客户端程序(VC++版) 截屏mfc和dll程序 进程防杀的实现 Hook TerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。 精美挂机锁源码 局域网视频监控 客户端和服务器 考虑到作为服务器的一端一般来说是固定的,所以当开启服务器后,一般服务器是不能停止的,所以在正式的软件里面,作为客户端让输入的服务器端IP的那一项是可以省略的,因为在制作安装程序的时候可以将服务器IP直接固定,但是这个作为简单的功能演示版本考虑到作为服务器的一端可以为任意电脑,所以在客户端设置了填写服务器IP。运行时:首先是运行Sever.exe服务器端,然后是“开启服务器”,“产生新的随机码” ,然后运行Client.exe客户端,输入用户名和密码,然后输入服务器端IP地址,然后登陆服务器,如果密码或者登陆号不正确会有提示,也可以选择试用版的软件。 快捷键 演示了快捷键设置的代码。 类似QQ截屏的屏幕取色器 主要功能在CColorPickerDlg。 两款拼音输入法源代码 拼音输入法、AboutWiz_src。 枚举进程 系统监视 有磁盘监视、系统目录监视,任务栏监视、端口监视、流量监视等等。 媒体播放器 如题。音乐播放器的实现,内有文档以及总结。 模仿QQ抖动 闹钟软件V1.0 (带VC++源码) 基于MFC窗体的闹钟。 能弹出复选框组合列表的combobox 屏幕放大镜源代码 屏幕监控+远程控制+mfc+vc 屏幕录像模块程序设计 屏幕录像源代码 屏幕小精灵 七彩泡泡屏保代码 轻松实现类VC界面 两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所需的界面。 全屏幕播放AVI文件的启动界面程序 全屏幕播放flash的动画启动界面 任务栏终级编程 三种方法来检索处理信息 获取CPU的信息,以及判断是否支持MMX SSE SSE2 3DNOW等等操作。 深入解剖远程管理软件编写 教程,如题。 深入解析ATL(第二版)源代码资源大小 附带书籍源码。 深入体验VC开发源码 附带书籍源码。 十进制、十六进制、二进制互相转换的VC++程序 实现DLL拦截 在windows下当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间。由于输入表是根据DLL名来进行查找,首先是查找当前目录下有没这文件,没有话在去查找系统目录C:\\Windows\\system32有没这文件,所以我们可以完全趁这个机会去劫持DLL,把他劫持下来后就可以在里面进行我们要做的事情。 实现DLL内存补丁,DLL劫持技术([Symanli原创]) 实现EDIT控件自绘 使用VC编写的文件加解密操作类 自定义封装了一个文件加解密类,对文件加解密。lzari.c提供了lzari压缩算法的实现。 视频+语音+播放器源代码(不断更新内容) H.323 开发包与源码、P2P视频技术源码、TopPlayerSrc、VOD核心源码、大型多媒体视频会议服务器端和客户端源码、屏幕截取制作avi的源代码、视频会议系统、视频聊天源代码、优秀的IP网络语音通讯软件Speak Fleely源代码。源码与上面的有些重复。 手机远控电脑源码 分两个模式:一个是短信模式,一个浏览器模式。只要你遵循数据包的格式发送数据就一定可以成功的。不过不是源码。 手写输入法源码 太简单的实例。有利于对输入法开发的入门和深入学习。 鼠标钩子 钩子的实现。如题。 完全自绘软件更换皮肤例子 完整源码 统计后台([源码信息] 梦者 绿色下载器 流量商必备 ) 本统计后台无须安装数据库。可直接使用。 可多用户登录,多用户统计,顶级防刷,一键扣量,等等强大功能。 网络电视软件源码 网络电台收听助手V3.0(VC源码) 文件(文件夹)加密解密工具源码 源码实现了主要功能:1 文件(夹)加密解密 2 文件夹伪装保护解除伪装 3 右键关联加密解密到系统菜单 4 开机最小化启动到托盘(气球提示) 5 支持文件(文件夹)拖动 6 支持WIN2000,XP,VISTA,WIN7。非常好的一个实例。 文件加密程序 自绘了很多控件,使用了多线程加密以及解密,支持换肤,非常好的一个实例。详细见源码啦。 文件夹加密小程序 简单的加密源码。 文件捆绑器源代码 文件操作的实例,主要功能在BindFileDlg。 文字图象识别OCR系统开发包 引用了第三方库OcrWencui.lib 来识别。 显示网络流量 监听了端口显示了网络流量,使用了绘图显示了出来。学习流量监控的好例子。是使用了自绘按钮实现的。 线程池的一种实现 相当不错的一个挂机锁 写日志log的类 封装了一个类Log,使用它输出信息。 循序渐进实现仿QQ界面 六个步骤实现了QQ类似界面、仿QQ界面上的各种自绘控件。 迅雷资源搜索 阳历阴历转换 封装了一个CLunar实现阳历阴历转换。 一个服务端只有7k大小的后门 RegOpenKeyEx和RegCreateKeyEx函数由于电脑经常会关闭,或者应用程序也会经常关闭,但有一些参数是经常需要保存。比如当你打开程序,并设置了窗口的大小,想每次打开时都设置窗口为上次打开的大小。这样就需要保存窗口的大小,那么窗口大小的参数保存到那里呢?其实在Windows里最方便的做法,就是保存到注册表里。又比如游戏登录时,总是想保存最后一个登录的用户,那么也需要保存这个用户到注册表里。其实注册表是Windows保存系统配置的数据库,比如不同的语言设置,不同的时区设置,不同的用户登录,不同的权限等等。下面就来学习怎么样使用函数RegOpenKeyEx来打开注册表里的键和用函数RegCreateKeyEx来创建新的键。 一个可以获取硬件信息源代码 一个轻量级网络通信开发库源码 音乐播放器 音频录入mfc源码 用C写的播放器,超强 引用了libmad库、ogg库、Zlib库等等,强烈推荐学习。 自绘右键菜单。 在ToolBar上添加控件 在工具栏上添加COMBOBOX,EditBox,ProgressCtrl,Slider控件,根据相同的道理您还可以添加其他控件复选框、单选按钮等等 注册表监控程序 该程序的作用是记录系统发生的注册表操作,(只记录成功的,忽略失败的) 自己动手写操作系统 自由更改文件对话框的外观 自绘对话框。 应用程序与驱动通信(DeviceIoControl ) VC++系统开发实例精粹 光驱控制程序、枚举当前所有窗体、硬件信息查看器、注册表操作程序、USB编程、目录浏览器、资源管理器、二进制浏览器、日历管理器、字体设置对话框、任意形状窗体、自动停靠窗体、带图像的下拉列表框、实时曲线显示、OutLooK风格界面、屏幕保护系统、MP3播放器、MIDI音乐演奏器、VFW视频捕捉系统、256色转换灰度图、对比度拉伸、二值化变换、反色、亮度增减、取对数、取指数、直方图均衡、灰度均衡、阈值变换、图像镜像、图像平移、图像缩放、图像旋转、高斯平滑、均值滤波、拉普拉斯边缘检测、梯度锐化、值滤波、离散余弦变换、傅立叶变换、Walsh变换、方块编码、图像细化、Canny算子提取边缘、Hough变换、逆滤波处理、维纳滤波处理、文字、图像特效显示、带预览的图像选择框、图像浏览器、聊天室、CRC循环冗余检测、ICMP系统、能够发送附件的邮件程序、获取多个IP地址、获取计算机基本网络设置、获取计算机安装的各种网络协议、远程监控系统、FTP客户端、类似MSN的即时通信工具、文件共享系统、考试成绩管理系统、学生管理信息系统、二进制数据库编程、多线程实例、动态链接库(DLL)实例、消息循环重载实例、进程查看程序、文件关联实例、剪贴板查看器、键盘发声系统、运行后自销毁的程序、文件查找系统 、屏幕拷贝实例、文件分割器、密码探测器、带微调和滑动条控件的工具栏、透明窗体实例、状态栏动画、圆盘式和数字式时钟实例、Windows XP风格菜单、 Office XP风格菜单、Windows XP风格标题栏、Windows XP风格对话框、Windows XP风格按钮和滚动条、基于DirectSound的声音播放器、AVI视频制作实例、电影播放器、仿Winamp多媒体播放器、BMP图片浏览器、小波算法的VC++实现、基因算法的VC++实现、细胞识别统计系统、基于神经网络的文字识别系统、车牌定位与识别系统、点对点文件传输、Sniff网络嗅探器、基于UDP的网段扫描器、网络流量监控系统、网络语音电话、HTTP服务器实例、数据库浏览器、数据库查询器、报表打印实例、课程管理信息系统、库存管理信息系统、医院管理信息系统。 VC++餐厅餐饮管理系统 这是一个毕业课程设计,含论文,简单明了,全部引用了MFC控件实现,主要是操作数据库的部分。 VC++开发的仓库管理系统设计文档和源码 如题,含论文,简单明了,全部引用了MFC控件实现,主要是操作数据库的部分。 VC++库存管理系统(毕业设计) 如题,含论文,简单明了,全部引用了MFC控件实现,主要是操作Access数据库的部分。 VC++图书管理系统完整版 一个简单的客户端操作数据库的程序。 餐饮管理系统(全程开发) 餐饮管理系统 超市进销存管理系统 基本功能:前台销售结帐、基本信息管理、基本信息查询、日结查询、超市小票打印。操作ORACLE数据库。 局域网监控系统 主要功能:系统采用人机交互的方式,界面美观友好、屏幕信息需要时时显示,网络延时不能大于1秒、服务器端可以随时运行,只要客户端运行,就能够显示屏幕信息、系统运行时占用内存不能大于10MB,以免影响系统性能、客户端运行时需要隐藏显示窗口,起其感觉不到在运行。 库存管理信息系统 在运行系统前,首先要安装SQL Server数据库,注意要设定用户名为“sa”,密码为空。 可以有两种方法创建该数据库:1.使用SQL server查询分析器运行Database目录下的sql.txt的sql语句,这样会创建stock数据库。2.使用SQL Server的企业管理器直接附加“附加数据文件”目录下的Stock.mdf文件。系统默认帐号:admin 密码:888888 企业办公管理系统 这个源码不错,自定义了很多类,适合学习。 企业电话语音录音管理系统 主要功能:采用人机对话的操作方式,界面设计美观友好、操作灵活、方便、快捷、准确、数据存储安全可靠。系统可以进行来电显示和来电接听等功能。提供电话拨出功能,可以通过程序拨出电话。提供客户管理功能,记录客户信息,并可以在拨出电话时以电话簿的形式显示客户信息。提供电话录音功能,当电话接通时开始录音,当电话挂断时结束录音。提供录音管理功能,可以通过程序修改录音文件的存储位置。系统最大限度地实现了易维护性和易操作性。系统运行稳定、安全可靠。适合学习。 企业短信群发管理系统 主要功能:电话簿管理。常用语管理。短信息发送。短信息接收。短信猫设置。不过使用了第三方库实现发送接受等功能。 人力资源管理系统 主要功能:系统界面设计美观、友好;智能化程度高、操作灵活、方便;系统运行稳定、安全可靠;反应快速、计算准确;实现新员工入职登记、查询修改及入职合同的录入、编辑;登记并可以浏览日常考勤信息;记录公司定期的员工考核成绩;实现部门用人申请的登记;实现应聘者信息备档;实现工资单自动录入及缺勤原因的扣资计算。 社区视频监控系统 本程序有三个实例,msado15(数据库)、Autodlg(操作文件)、Capture(主要的程序)。本实例是天敏VC4000监控卡,其使用了MPG4c32.dll、MediaTransmit.dll、MediaTransmit.lib、MediaTransmit.h、Sa7134Capture.dll、Sa7134Capture.lib和Sa7134Capture.h几个文件,在运行程序前,需要将这些文件添加到当前工程。程序没有提供这些文件。 物流综合管理系统VC源码+毕业设计 学生管理系统 学生考试系统
jQuery详细教程,讲解很透彻, 一. jQuery 语法实例 $(this).hide() 演示 jQuery hide() 函数,隐藏当前的 HTML 元素。 $("#test").hide() 演示 jQuery hide() 函数,隐藏 id="test" 的元素。 $("p").hide() 演示 jQuery hide() 函数,隐藏所有 元素。 $(".test").hide() 演示 jQuery hide() 函数,隐藏所有 class="test" 的元素。 jQuery 语法 jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些操作。 基础语法是:$(selector).action() • 美元符号定义 jQuery • 选择符(selector)“查询”和“查找” HTML 元素 • jQuery 的 action() 执行对元素的操作 示例 $(this).hide() - 隐藏当前元素 $("p").hide() - 隐藏所有段落 $("p.test").hide() - 隐藏所有 class="test" 的段落 $("#test").hide() - 隐藏所有 id="test" 的元素 提示:jQuery 使用的语法是 XPath 与 CSS 选择器语法的组合。在本教程接下来的章节,您将学习到更多有关选择器的语法。 文档就绪函数 您也许已经注意到在我们的实例的所有 jQuery 函数位于一个 document ready 函数: $(document).ready(function(){ --- jQuery functions go here ---- }); 这是为了防止文档在完全加载(就绪)之前运行 jQuery 代码。 二. jQuery 选择器 在前面的章节,我们展示了一些有关如何选取 HTML 元素的实例。 关键点是学习 jQuery 选择器是如何准确地选取您希望应用效果的元素。 jQuery 元素选择器和属性选择器允许您通过标签名、属性名或内容对 HTML 元素进行选择。 选择器允许您对 HTML 元素组或单个元素进行操作。 在 HTML DOM 术语: 选择器允许您对 DOM 元素组或单个 DOM 节点进行操作。 jQuery 元素选择器 jQuery 使用 CSS 选择器来选取 HTML 元素。 $("p") 选取 元素。 $("p.intro") 选取所有 class="intro" 的 元素。 $("p#demo") 选取 id="demo" 的第一个 元素。 jQuery 属性选择器 jQuery 使用 XPath 表达式来选择带有给定属性的元素。 $("[href]") 选取所有带有 href 属性的元素。 $("[href='#']") 选取所有带有 href 值等于 "#" 的元素。 $("[href!='#']") 选取所有带有 href 值不等于 "#" 的元素。 $("[href$='.jpg']") 选取所有 href 值以 ".jpg" 结尾的元素。 jQuery CSS 选择器 jQuery CSS 选择器可用于改变 HTML 元素的 CSS 属性。 下面的例子把所有 p 元素的背景颜色更改为红色: 实例 $("p").css("background-color","red"); 更多的选择器实例 语法 描述 $(this) 当前 HTML 元素 $("p") 所有 元素 $("p.intro") 所有 class="intro" 的 元素 $(".intro") 所有 class="intro" 的元素 $("#intro") id="intro" 的第一个元素 $("ul li:first") 每个 的第一个 元素 $("[href$='.jpg']") 所有带有以 ".jpg" 结尾的属性值的 href 属性 $("div#intro .head") id="intro" 的 元素的所有 class="head" 的元素 三. jQuery 事件函数 jQuery 事件处理方法是 jQuery 的核心函数。 事件处理程序指的是当 HTML 发生某些事件时所调用的方法。术语由事件“触发”(或“激发”)经常会被使用。 通常会把 jQuery 代码放到 部分的事件处理方法: 实例 $(document).ready(function(){ $("button").click(function(){ $("p").hide(); }); }); This is a heading This is a paragraph. This is another paragraph. Click me 亲自试一试 在上面的例子,当按钮的点击事件被触发时会调用一个函数: $("button").click(function() {..some code... } ) 该方法隐藏所有 元素: $("p").hide(); 单独文件的函数 如果您的网站包含许多页面,并且您希望您的 jQuery 函数易于维护,那么请把您的 jQuery 函数放到独立的 .js 文件。 当我们在教程演示 jQuery 时,会将函数直接添加到 部分。不过,把它们放到一个单独的文件会更好,就像这样(通过 src 属性来引用文件): 实例 jQuery 名称冲突 jQuery 使用 $ 符号作为 jQuery 的简介方式。 某些其他 JavaScript 库的函数(比如 Prototype)同样使用 $ 符号。 jQuery 使用名为 noConflict() 的方法来解决该问题。 var jq=jQuery.noConflict(),帮助您使用自己的名称(比如 jq)来代替 $ 符号。 亲自试一试 结论 由于 jQuery 是为处理 HTML 事件而特别设计的,那么当您遵循以下原则时,您的代码会更恰当且更易维护: • 把所有 jQuery 代码置于事件处理函数 • 把所有事件处理函数置于文档就绪事件处理 • 把 jQuery 代码置于单独的 .js 文件 • 如果存在名称冲突,则重命名 jQuery 库 jQuery 事件 下面是 jQuery 事件方法的一些例子: Event 函数 绑定函数至 $(document).ready(function) 将函数绑定到文档的就绪事件(当文档完成加载时) $(selector).click(function) 触发或将函数绑定到被选元素的点击事件 $(selector).dblclick(function) 触发或将函数绑定到被选元素的双击事件 $(selector).focus(function) 触发或将函数绑定到被选元素的获得焦点事件 $(selector).mouseover(function) 触发或将函数绑定到被选元素的鼠标悬停事件 四. jQuery实例 jQuery hide() 演示简单的 jQuery hide() 函数。 $(document).ready(function(){ $("p").click(function(){ $(this).hide(); }); }); If you click on me, I will disappear. jQuery hide() 另一个 hide() 演示。如何隐藏部分文本。 $(document).ready(function(){ $(".ex .hide").click(function(){ $(this).parents(".ex").hide("slow"); }); }); div.ex { background-color:#e5eecc; padding:7px; border:solid 1px #c3c3c3; } Island Trading Hide me Contact: Helen Bennett Garden House Crowther Way London Paris Trading Hide me Contact: Marie Bertrand 265, Boulevard Charonne Paris jQuery slideToggle() 演示简单的 slide panel 效果 $(document).ready(function(){ $(".flip").click(function(){ $(".panel").slideToggle("slow"); }); }); div.panel,p.flip { margin:0px; padding:5px; text-align:center; background:#e5eecc; border:solid 1px #c3c3c3; } div.panel { height:120px; display:none; } W3School - 领先的 Web 技术教程站点 在 W3School,你可以找到你所需要的所有网站建设教程。 请点击这里 jQuery fadeTo() 演示简单的 jQuery fadeTo() 函数。 $(document).ready(function(){ $("button").click(function(){ $("div").fadeTo("slow",0.25); }); }); 点击这里查看淡出效果 jQuery animate() 演示简单的 jQuery animate() 函数。 $(document).ready(function(){ $("#start").click(function(){ $("#box").animate({height:300},"slow"); $("#box").animate({width:300},"slow"); $("#box").animate({height:100},"slow"); $("#box").animate({width:100},"slow"); }); }); Start Animation jQuery 隐藏和显示 通过 hide() 和 show() 两个函数,jQuery 支持对 HTML 元素的隐藏和显示: 实例 $("#hide").click(function(){ $("p").hide(); }); $("#show").click(function(){ $("p").show(); }); 亲自试一试 $(document).ready(function(){ $("#hide").click(function(){ $("p").hide(); }); $("#show").click(function(){ $("p").show(); }); }); 如果点击“隐藏”按钮,我就会消失。 隐藏 显示 hide() 和 show() 都可以设置两个可选参数:speed 和 callback。 语法: $(selector).hide(speed,callback) $(selector).show(speed,callback) speed 参数规定显示或隐藏的速度。可以设置这些值:"slow", "fast", "normal" 或毫秒。 callback 参数是在 hide 或 show 函数完成之后被执行的函数名称。您将在本教程下面的章节学习更多有关 callback 参数的知识。 实例 $("button").click(function(){ $("p").hide(1000); }); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").hide(1000); }); }); 隐藏 This is a paragraph with little content. This is another small paragraph. jQuery 切换 jQuery toggle() 函数使用 show() 或 hide() 函数来切换 HTML 元素的可见状态。 隐藏显示的元素,显示隐藏的元素。 语法: $(selector).toggle(speed,callback) speed 参数可以设置这些值:"slow", "fast", "normal" 或 毫秒。 实例 $("button").click(function(){ $("p").toggle(); }); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").toggle(); }); }); 切换 This is a paragraph with little content. This is another small paragraph. callback 参数是在该函数完成之后被执行的函数名称。您将在本教程下面的章节学习更多有关 callback 参数的知识。 jQuery 滑动函数 - slideDown, slideUp, slideToggle jQuery 拥有以下滑动函数: $(selector).slideDown(speed,callback) $(selector).slideUp(speed,callback) $(selector).slideToggle(speed,callback) speed 参数可以设置这些值:"slow", "fast", "normal" 或毫秒。 callback 参数是在该函数完成之后被执行的函数名称。您将在本教程下面的章节学习更多有关 callback 参数的知识。 slideDown() 实例 $(".flip").click(function(){ $(".panel").slideDown(); }); 亲自试一试 $(document).ready(function(){ $(".flip").click(function(){ $(".panel").slideDown("slow"); }); }); div.panel,p.flip { margin:0px; padding:5px; text-align:center; background:#e5eecc; border:solid 1px #c3c3c3; } div.panel { height:120px; display:none; } W3School - 领先的 Web 技术教程站点 在 W3School,你可以找到你所需要的所有网站建设教程。 请点击这里 slideUp() 实例 $(".flip").click(function(){ $(".panel").slideUp() }) 亲自试一试 $(document).ready(function(){ $(".flip").click(function(){ $(".panel").slideUp("slow"); }); }); div.panel,p.flip { margin:0px; padding:5px; text-align:center; background:#e5eecc; border:solid 1px #c3c3c3; } div.panel { height:120px; } W3School - 领先的 Web 技术教程站点 在 W3School,你可以找到你所需要的所有网站建设教程。 请点击这里 slideToggle() 实例 $(".flip").click(function(){ $(".panel").slideToggle(); }); 亲自试一试 $(document).ready(function(){ $(".flip").click(function(){ $(".panel").slideToggle("slow"); }); }); div.panel,p.flip { margin:0px; padding:5px; text-align:center; background:#e5eecc; border:solid 1px #c3c3c3; } div.panel { height:120px; display:none; } W3School - 领先的 Web 技术教程站点 在 W3School,你可以找到你所需要的所有网站建设教程。 请点击这里 jQuery Fade 函数 - fadeIn(), fadeOut(), fadeTo() jQuery 拥有以下 fade 函数: $(selector).fadeIn(speed,callback) $(selector).fadeOut(speed,callback) $(selector).fadeTo(speed,opacity,callback) speed 参数可以设置这些值:"slow", "fast", "normal" 或 毫秒。 fadeTo() 函数的 opacity 参数规定减弱到给定的不透明度。 callback 参数是在该函数完成之后被执行的函数名称。您将在本教程下面的章节学习更多有关 callback 参数的知识。 fadeTo() 实例 $("button").click(function(){ $("div").fadeTo("slow",0.25); }); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("div").fadeTo("slow",0.25); }); }); 点击这里查看淡出效果 fadeOut() 实例 $("button").click(function(){ $("div").fadeOut(4000); }); 亲自试一试 $(document).ready(function(){ $("#test").click(function(){ $(this).fadeOut(4000); }); }); CLICK ME AWAY! 如果您点击上面的框,它会淡出直到消失为止。 jQuery 自定义动画 jQuery 函数创建自定义动画的语法: $(selector).animate({params},[duration],[easing],[callback]) 关键的参数是 params。它定义产生动画的 CSS 属性。可以同时设置多个此类属性: animate({width:"70%",opacity:0.4,marginLeft:"0.6in",fontSize:"3em"}); 第二个参数是 duration。它定义用来应用到动画的时间。它设置的值是:"slow", "fast", "normal" 或毫秒。 实例 1 $(document).ready(function(){ $("#start").click(function(){ $("#box").animate({height:300},"slow"); $("#box").animate({width:300},"slow"); $("#box").animate({height:100},"slow"); $("#box").animate({width:100},"slow"); }); }); 亲自试一试 $(document).ready(function(){ $("#start").click(function(){ $("#box").animate({height:300},"slow"); $("#box").animate({width:300},"slow"); $("#box").animate({height:100},"slow"); $("#box").animate({width:100},"slow"); }); }); Start Animation 实例 2 $(document).ready(function(){ $("#start").click(function(){ $("#box").animate({left:"100px"},"slow"); $("#box").animate({fontSize:"3em"},"slow"); }); }); 亲自试一试 $(document).ready(function(){ $("#start").click(function(){ $("#box").animate({left:"100px"},"slow"); $("#box").animate({fontSize:"3em"},"slow"); }); }); Start Animation HELLO HTML 元素默认是静态定位,且无法移动。 如需使元素可以移动,请把 CSS 的 position 设置为 relative 或 absolute。 jQuery 效果 - 来自本页 函数 描述 $(selector).hide() 隐藏被选元素 $(selector).show() 显示被选元素 $(selector).toggle() 切换(在隐藏与显示之间)被选元素 $(selector).slideDown() 向下滑动(显示)被选元素 $(selector).slideUp() 向上滑动(隐藏)被选元素 $(selector).slideToggle() 对被选元素切换向上滑动和向下滑动 $(selector).fadeIn() 淡入被选元素 $(selector).fadeOut() 淡出被选元素 $(selector).fadeTo() 把被选元素淡出为给定的不透明度 $(selector).animate() 对被选元素执行自定义动画 五. JQuery Callback 函数 jQuery 动画的问题 许多 jQuery 函数涉及动画。这些函数也许会将 speed 或 duration 作为可选参数。 例子:$("p").hide("slow") speed 或 duration 参数可以设置许多不同的值,比如 "slow", "fast", "normal" 或毫秒。 实例 $("button").click(function(){ $("p").hide(1000); }); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").hide(1000); }); }); 隐藏 This is a paragraph with little content. This is another small paragraph. 由于 JavaScript 语句(指令)是逐一执行的 - 按照次序,动画之后的语句可能会产生错误或页面冲突,因为动画还没有完成。 为了避免这个情况,您可以以参数的形式添加 Callback 函数。 jQuery Callback 函数 当动画 100% 完成后,即调用 Callback 函数。 典型的语法: $(selector).hide(speed,callback) callback 参数是一个在 hide 操作完成后被执行的函数。 错误(没有 callback) $("p").hide(1000); alert("The paragraph is now hidden"); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").hide(2000); alert("The paragraph is now hidden"); }); }); Hide This is a paragraph with little content. 正确(有 callback) $("p").hide(1000,function(){ alert("The paragraph is now hidden"); }); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").hide(1000,function(){ alert("The paragraph is now hidden"); }); }); }); Hide This is a paragraph with little content. 六. jQuery 包含很多供改变和操作 HTML 的强大函数。 改变 HTML 内容 语法 $(selector).html(content) html() 函数改变所匹配的 HTML 元素的内容(innerHTML)。 实例 $("p").html("W3School"); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").html("W3School"); }); }); This is a heading This is a paragraph. This is another paragraph. 请点击这里 添加 HTML 内容 语法 $(selector).append(content) append() 函数向所匹配的 HTML 元素内部追加内容。 语法 $(selector).prepend(content) prepend() 函数向所匹配的 HTML 元素内部预置(Prepend)内容。 实例 $("p").append(" W3School"); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").append(" W3School."); }); }); This is a heading This is a paragraph. This is another paragraph. 请点击这里 语法 $(selector).after(content) after() 函数在所有匹配的元素之后插入 HTML 内容。 语法 $(selector).before(content) before() 函数在所有匹配的元素之前插入 HTML 内容。 实例 $("p").after(" W3School."); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").after(" W3School."); }); }); This is a heading This is a paragraph. This is another paragraph. 请点击这里 jQuery HTML 操作 - 来自本页 函数 描述 $(selector).html(content) 改变被选元素的(内部)HTML $(selector).append(content) 向被选元素的(内部)HTML 追加内容 $(selector).prepend(content) 向被选元素的(内部)HTML “预置”(Prepend)内容 $(selector).after(content) 在被选元素之后添加 HTML $(selector).before(content) 在被选元素之前添加 HTML 七. jQuery CSS 操作 jQuery 拥有三种用于 CSS 操作的重要函数: • $(selector).css(name,value) • $(selector).css({properties}) • $(selector).css(name) CSS 操作实例 函数 css(name,value) 为所有匹配元素的给定 CSS 属性设置值: 实例 $(selector).css(name,value) $("p").css("background-color","red"); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").css("background-color","red"); }); }); This is a heading This is a paragraph. This is another paragraph. Click me 函数 css({properties}) 同时为所有匹配元素的一系列 CSS 属性设置值: 实例 $(selector).css({properties}) $("p").css({"background-color":"red","font-size":"200%"}); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("p").css({"background-color":"red","font-size":"200%"}); }); }); This is a heading This is a paragraph. This is another paragraph. Click me 函数 css(name) 返回指定的 CSS 属性的值: 实例 $(selector).css(name) $(this).css("background-color"); 亲自试一试 $(document).ready(function(){ $("div").click(function(){ $("#result").html($(this).css("background-color")); }); }); Click in the box jQuery Size 操作 jQuery 拥有两种用于尺寸操作的重要函数: • $(selector).height(value) • $(selector).width(value) Size 操作实例 函数 height(value) 设置所有匹配元素的高度: 实例 $(selector).height(value) $("#id100").height("200px"); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("#id100").height("200px"); }); }); HELLO W3SCHOOL 请点击这里 函数 width(value) 设置所有匹配元素的宽度: 实例 $(selector).width(value) $("#id200").width("300px"); 亲自试一试 $(document).ready(function(){ $("button").click(function(){ $("#id200").width("300px"); }); }); HELLO W3SCHOOL 请点击这里 jQuery CSS 函数 - 来自本页 CSS 属性 描述 $(selector).css(name,value) 为匹配元素设置样式属性的值 $(selector).css({properties}) 为匹配元素设置多个样式属性 $(selector).css(name) 获得第一个匹配元素的样式属性值 $(selector).height(value) 设置匹配元素的高度 $(selector).width(value) 设置匹配元素的宽度 八. jQuery 参考手册 @ jQuery 选择器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id="lastname" 的元素 .class $(".intro") 所有 class="intro" 的元素 element $("p") 所有 元素 .class.class $(".intro.demo") 所有 class="intro" 且 class="demo" 的元素 :first $("p:first") 第一个 元素 :last $("p:last") 最后一个 元素 :even $("tr:even") 所有偶数 元素 :odd $("tr:odd") 所有奇数 元素 :eq(index) $("ul li:eq(3)") 列表的第四个元素(index 从 0 开始) :gt(no) $("ul li:gt(3)") 列出 index 大于 3 的元素 :lt(no) $("ul li:lt(3)") 列出 index 小于 3 的元素 :not(selector) $("input:not(:empty)") 所有不为空的 input 元素 :header $(":header") 所有标题元素 - :animated 所有动画元素 :contains(text) $(":contains('W3School')") 包含指定字符串的所有元素 :empty $(":empty") 无子(元素)节点的所有元素 :hidden $("p:hidden") 所有隐藏的 元素 :visible $("table:visible") 所有可见的表格 s1,s2,s3 $("th,td,.intro") 所有带有匹配选择的元素 [attribute] $("[href]") 所有带有 href 属性的元素 [attribute=value] $("[href='#']") 所有 href 属性的值等于 "#" 的元素 [attribute!=value] $("[href!='#']") 所有 href 属性的值不等于 "#" 的元素 [attribute$=value] $("[href$='.jpg']") 所有 href 属性的值包含 ".jpg" 的元素 :input $(":input") 所有 元素 :text $(":text") 所有 type="text" 的 元素 :password $(":password") 所有 type="password" 的 元素 :radio $(":radio") 所有 type="radio" 的 元素 :checkbox $(":checkbox") 所有 type="checkbox" 的 元素 :submit $(":submit") 所有 type="submit" 的 元素 :reset $(":reset") 所有 type="reset" 的 元素 :button $(":button") 所有 type="button" 的 元素 :image $(":image") 所有 type="image" 的 元素 :file $(":file") 所有 type="file" 的 元素 :enabled $(":enabled") 所有激活的 input 元素 :disabled $(":disabled") 所有禁用的 input 元素 :selected $(":selected") 所有被选取的 input 元素 :checked $(":checked") 所有被选的 input 元素 @ jQuery 事件方法 事件方法会触发匹配元素的事件,或将函数绑定到所有匹配元素的某个事件。 触发实例: $("button#demo").click() 上面的例子将触发 id="demo" 的 button 元素的 click 事件。 绑定实例: $("button#demo").click(function(){$("img").hide()}) 上面的例子会在点击 id="demo" 的按钮时隐藏所有图像。 方法 描述 bind() 向匹配元素附加一个或更多事件处理器 blur() 触发、或将函数绑定到指定元素的 blur 事件 change() 触发、或将函数绑定到指定元素的 change 事件 click() 触发、或将函数绑定到指定元素的 click 事件 dblclick() 触发、或将函数绑定到指定元素的 double click 事件 delegate() 向匹配元素的当前或未来的子元素附加一个或多个事件处理器 die() 移除所有通过 live() 函数添加的事件处理程序。 error() 触发、或将函数绑定到指定元素的 error 事件 event.isDefaultPrevented() 返回 event 对象上是否调用了 event.preventDefault()。 event.pageX 相对于文档左边缘的鼠标位置。 event.pageY 相对于文档上边缘的鼠标位置。 event.preventDefault() 阻止事件的默认动作。 event.result 包含由被指定事件触发的事件处理器返回的最后一个值。 event.target 触发事件的 DOM 元素。 event.timeStamp 该属性返回从 1970 年 1 月 1 日到事件发生时的毫秒数。 event.type 描述事件的类型。 event.which 指示按了哪个键或按钮。 focus() 触发、或将函数绑定到指定元素的 focus 事件 keydown() 触发、或将函数绑定到指定元素的 key down 事件 keypress() 触发、或将函数绑定到指定元素的 key press 事件 keyup() 触发、或将函数绑定到指定元素的 key up 事件 live() 触发、或将函数绑定到指定元素的 load 事件 load() 触发、或将函数绑定到指定元素的 load 事件 mousedown() 触发、或将函数绑定到指定元素的 mouse down 事件 mouseenter() 触发、或将函数绑定到指定元素的 mouse enter 事件 mouseleave() 触发、或将函数绑定到指定元素的 mouse leave 事件 mousemove() 触发、或将函数绑定到指定元素的 mouse move 事件 mouseout() 触发、或将函数绑定到指定元素的 mouse out 事件 mouseover() 触发、或将函数绑定到指定元素的 mouse over 事件 mouseup() 触发、或将函数绑定到指定元素的 mouse up 事件 one() 向匹配元素添加事件处理器。每个元素只能触发一次该处理器。 ready() 文档就绪事件(当 HTML 文档就绪可用时) resize() 触发、或将函数绑定到指定元素的 resize 事件 scroll() 触发、或将函数绑定到指定元素的 scroll 事件 select() 触发、或将函数绑定到指定元素的 select 事件 submit() 触发、或将函数绑定到指定元素的 submit 事件 toggle() 绑定两个或多个事件处理器函数,当发生轮流的 click 事件时执行。 trigger() 所有匹配元素的指定事件 triggerHandler() 第一个被匹配元素的指定事件 unbind() 从匹配元素移除一个被添加的事件处理器 undelegate() 从匹配元素移除一个被添加的事件处理器,现在或将来 unload() 触发、或将函数绑定到指定元素的 unload 事件 @ jQuery 效果函数 方法 描述 animate() 对被选元素应用“自定义”的动画 clearQueue() 对被选元素移除所有排队的函数(仍未运行的) delay() 对被选元素的所有排队函数(仍未运行)设置延迟 dequeue() 运行被选元素的下一个排队函数 fadeIn() 淡入被选元素至完全不透明 fadeOut() 淡出被选元素至完全不透明 fadeTo() 把被选元素减弱至给定的不透明度 hide() 隐藏被选的元素 queue() 显示被选元素的排队函数 show() 显示被选的元素 slideDown() 通过调整高度来滑动显示被选元素 slideToggle() 对被选元素进行滑动隐藏和滑动显示的切换 slideUp() 通过调整高度来滑动隐藏被选元素 stop() 停止在被选元素上运行动画 toggle() 对被选元素进行隐藏和显示的切换 @ jQuery 文档操作方法 这些方法对于 XML 文档和 HTML 文档均是适用的,除了:html()。 方法 描述 addClass() 向匹配的元素添加指定的类名。 after() 在匹配的元素之后插入内容。 append() 向匹配的元素内部追加内容。 appendTo() 向匹配的元素内部追加内容。 attr() 设置或返回匹配元素的属性和值。 before() 在每个匹配的元素之前插入内容。 clone() 创建匹配元素集合的副本。 detach() 从 DOM 移除匹配元素集合。 empty() 删除匹配的元素集合所有的子节点。 hasClass() 检查匹配的元素是否拥有指定的类。 html() 设置或返回匹配的元素集合的 HTML 内容。 insertAfter() 把匹配的元素插入到另一个指定的元素集合的后面。 insertBefore() 把匹配的元素插入到另一个指定的元素集合的前面。 prepend() 向每个匹配的元素内部前置内容。 prependTo() 向每个匹配的元素内部前置内容。 remove() 移除所有匹配的元素。 removeAttr() 从所有匹配的元素移除指定的属性。 removeClass() 从所有匹配的元素删除全部或者指定的类。 replaceAll() 用匹配的元素替换所有匹配到的元素。 replaceWith() 用新内容替换匹配的元素。 text() 设置或返回匹配元素的内容。 toggleClass() 从匹配的元素添加或删除一个类。 unwrap() 移除并替换指定元素的父元素。 val() 设置或返回匹配元素的值。 wrap() 把匹配的元素用指定的内容或元素包裹起来。 wrapAll() 把所有匹配的元素用指定的内容或元素包裹起来。 wrapinner() 将每一个匹配的元素的子内容用指定的内容或元素包裹起来。 @ jQuery 属性操作方法 下面列出的这些方法获得或设置元素的 DOM 属性。 这些方法对于 XML 文档和 HTML 文档均是适用的,除了:html()。 方法 描述 addClass() 向匹配的元素添加指定的类名。 attr() 设置或返回匹配元素的属性和值。 hasClass() 检查匹配的元素是否拥有指定的类。 html() 设置或返回匹配的元素集合的 HTML 内容。 removeAttr() 从所有匹配的元素移除指定的属性。 removeClass() 从所有匹配的元素删除全部或者指定的类。 toggleClass() 从匹配的元素添加或删除一个类。 val() 设置或返回匹配元素的值。 @ jQuery CSS 操作函数 下面列出的这些方法设置或返回元素的 CSS 相关属性。 CSS 属性 描述 css() 设置或返回匹配元素的样式属性。 height() 设置或返回匹配元素的高度。 offset() 返回第一个匹配元素相对于文档的位置。 offsetParent() 返回最近的定位祖先元素。 position() 返回第一个匹配元素相对于父元素的位置。 scrollLeft() 设置或返回匹配元素相对滚动条顶部的偏移。 scrollTop() 设置或返回匹配元素相对滚动条左侧的偏移。 width() 设置或返回匹配元素的宽度。 @jQuery Ajax 操作函数 jQuery 库拥有完整的 Ajax 兼容套件。其的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据。 函数 描述 jQuery.ajax() 执行异步 HTTP (Ajax) 请求。 .ajaxComplete() 当 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。 .ajaxError() 当 Ajax 请求完成且出现错误时注册要调用的处理程序。这是一个 Ajax 事件。 .ajaxSend() 在 Ajax 请求发送之前显示一条消息。 jQuery.ajaxSetup() 设置将来的 Ajax 请求的默认值。 .ajaxStart() 当首个 Ajax 请求完成开始时注册要调用的处理程序。这是一个 Ajax 事件。 .ajaxStop() 当所有 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。 .ajaxSuccess() 当 Ajax 请求成功完成时显示一条消息。 jQuery.get() 使用 HTTP GET 请求从服务器加载数据。 jQuery.getJSON() 使用 HTTP GET 请求从服务器加载 JSON 编码数据。 jQuery.getScript() 使用 HTTP GET 请求从服务器加载 JavaScript 文件,然后执行该文件。 .load() 从服务器加载数据,然后把返回到 HTML 放入匹配元素。 jQuery.param() 创建数组或对象的序列化表示,适合在 URL 查询字符串或 Ajax 请求使用。 jQuery.post() 使用 HTTP POST 请求从服务器加载数据。 .serialize() 将表单内容序列化为字符串。 .serializeArray() 序列化表单元素,返回 JSON 数据结构数据。 @ jQuery 遍历函数 jQuery 遍历函数包括了用于筛选、查找和串联元素的方法。 函数 描述 .add() 将元素添加到匹配元素的集合。 .andSelf() 把堆栈之前的元素集添加到当前集合。 .children() 获得匹配元素集合每个元素的所有子元素。 .closest() 从元素本身开始,逐级向上级元素匹配,并返回最先匹配的祖先元素。 .contents() 获得匹配元素集合每个元素的子元素,包括文本和注释节点。 .each() 对 jQuery 对象进行迭代,为每个匹配元素执行函数。 .end() 结束当前链最近的一次筛选操作,并将匹配元素集合返回到前一次的状态。 .eq() 将匹配元素集合缩减为位于指定索引的新元素。 .filter() 将匹配元素集合缩减为匹配选择器或匹配函数返回值的新元素。 .find() 获得当前匹配元素集合每个元素的后代,由选择器进行筛选。 .first() 将匹配元素集合缩减为集合的第一个元素。 .has() 将匹配元素集合缩减为包含特定元素的后代的集合。 .is() 根据选择器检查当前的匹配元素集合,如果存在至少一个匹配元素,则返回 true。 .last() 将匹配元素集合缩减为集合的最后一个元素。 .map() 把当前匹配集合的每个元素传递给一个函数,产生包含返回值的新的 jQuery 对象。 .next() 获得匹配元素集合每个元素紧邻的同辈元素。 .nextAll() 获得匹配元素集合每个元素之后的所有同辈元素,由选择器进行筛选(可选)。 .nextUntil() 获得每个元素之后所有的同辈元素,直到遇到匹配选择器的元素为止。 .not() 从匹配元素集合删除元素。 .offsetParent() 获得用于定位的第一个父元素。 .parent() 获得当前匹配元素集合每个元素的父元素,由选择器筛选(可选)。 .parentsUntil() 获得当前匹配元素集合每个元素的祖先元素,直到遇到匹配选择器的元素为止。 .prev() 获得匹配元素集合每个元素紧邻的前一个同辈元素,由选择器筛选(可选)。 .prevAll() 获得匹配元素集合每个元素之前的所有同辈元素,由选择器进行筛选(可选)。 .prevUntil() 获得每个元素之前所有的同辈元素,直到遇到匹配选择器的元素为止。 .siblings() 获得匹配元素集合所有元素的同辈元素,由选择器筛选(可选)。 .slice() 将匹配元素集合缩减为指定范围的子集。 @ jQuery 数据存储函数 这些方法允许我们将指定的 DOM 元素与任意数据相关联。 函数 描述 .data() 存储与匹配元素相关的任意数据。 jQuery.data() 存储与指定元素相关的任意数据。 .removeData() 移除之前存放的数据。 jQuery.removeData() 移除之前存放的数据。 @ jQuery 队列控制函数 函数 描述 .clearQueue() 从队列删除所有未运行的项目。 .dequeue() 从队列最前端移除一个队列函数,并执行它。 jQuery.dequeue() 从队列最前端移除一个队列函数,并执行它。 .queue() 显示或操作匹配元素所执行函数的队列。 jQuery.queue() 显示或操作匹配元素所执行函数的队列。 九. jQuery 核心函数 函数 描述 jQuery() 接受一个字符串,其包含了用于匹配元素集合的 CSS 选择器。 实例 找出所有属于 div 元素的子元素的 p 元素,然后设置其边框属性: $("div > p").css("border", "1px solid gray"); 亲自试一试 定义和用法 jQuery() 方法接受一个字符串,其包含了用于匹配元素集合的 CSS 选择器。 jQuery() 函数有三种语法: 语法 1 接受一个字符串,其包含了用于匹配元素集合的 CSS 选择器: jQuery(selector, [context]) 详细用法 语法 2 使用原始 HTML 的字符串来创建 DOM 元素: jQuery(html,[ownerDocument]) 详细用法 语法 3 绑定一个在 DOM 文档载入完成后执行的函数: jQuery( callback ) 详细用法 jQuery( selector, [ context ] ) 该语法有以下几种用法: 用法 1 :设置选择器环境 语法 jQuery(selector, [context]) 默认情况下,选择器从文档根部对 DOM 进行搜索。不过,可以为 $() 设置可选的 context 参数。 例如,如果我们希望在一个 callback 搜索一个元素,可以限定下面的搜索: 实例 $("div.foo").click(function() { $("span", this).addClass("bar"); }); 由于我们已经将 span 选择器限定到 this 这个环境,只有被点击元素的 span 会得到附加的 class。 在内部,选择器环境是通过 .find() 方法实现的,因此 $("span", this) 等价于 $(this).find("span")。 jQuery 的核心功能都是通过这个函数实现的。jQuery的一切都基于这个函数,或者说都是在以某种方式使用这个函数。这个函数最基本的用法就是向它传递一个表达式(通常由 CSS 选择器组成),然后根据这个表达式来查找所有匹配的元素。 默认情况下, 如果没有指定 context 参数,$() 将在当前的 HTML document 查找 DOM 元素;如果指定了 context 参数,如一个 DOM 元素集或 jQuery 对象,那就会在这个 context 查找。在 jQuery 1.3.2 以后,其返回的元素顺序等同于在 context 出现的先后顺序。 用法 2 :使用 DOM 元素 语法 jQuery(element) 该函数允许我们通过使用以其他方式找到的 DOM 元素来创建 jQuery 对象。该功能通常的用法是,对已经通过 this 关键字传递到 callback 函数的元素调用 jQuery 的方法: 实例 $("div.foo").click(function() { $(this).slideUp(); }); 此例会在元素被点击时使用滑动动画对其进行隐藏。由于处理程序接受的 this 关键词的被点击项目是纯的 DOM 元素,因此在对其调用 jQuery 的方法之前,必须用 jQuery 对象包装该元素。 这个函数也可以接收 XML 文档和 Window 对象(虽然它们不是 DOM 元素)作为有效的参数。 当 XML 数据从 Ajax 调用返回后,我们可以使用 $() 函数通过 jQuery 对象包装该数据。一旦完成,我们就可以使用 .find() 和其他 DOM 遍历方法来取回 XML 结构单个元素。 用法 3 :克隆 jQuery 对象 语法 jQuery(jQuery object) 当以参数的形式向 $() 函数传递 jQuery 对象后,会创建一个该对象的副本。与初始对象一样,新的 jQuery 对象引用相同的 DOM 元素。 用法 4 :返回空的集合 语法 jQuery() 对于 jQuery 1.4,调用无参数的 jQuery() 方法会返回空的 jQuery 集合。在之前版本的 jQuery ,这样会返回包含 document 节点的集合。 jQuery( html, [ ownerDocument ] ) 该语法有以下几种用法: 用法 1 :创建新的元素 语法 jQuery(html,[ownerDocument]) 你可以传递一个手写的 HTML 字符串,或者由某些模板引擎或插件创建的字符串,也可以是通过 AJAX 加载过来的字符串。但是在你创建 input 元素的时会有限制,可以参考第二个示例。 当然这个字符串可以包含斜杠 (比如一个图像地址),还有反斜杠。当你创建单个元素时,请使用闭合标签或 XHTML 格式。例如,创建一个 span ,可以用 $("") 或 $("") ,但不推荐 $("")。在 jQuery ,这个语法等同于 $(document.createElement("span"))。 如果以参数的形式将字符串传递给 $(),jQuery 会检查字符串是否是 HTML (比如,字符串某些位置存在标签)。如果不是,则把字符串解释为选择器表达式,请见上面的讲解。但如果字符串是 HTML 片段,则 jQuery 试图创建由该 HTML 片段描述的 DOM 元素。然后会创建并返回一个引用这些 DOM 元素的 jQuery 对象: 实例 $("My new text").appendTo("body"); 如果 HTML 片段比不含属性的简单标签更复杂,如同上面例子的 HTML,那么元素实际的创建过程是由浏览器的 innerHTML 机制完成的。具体地讲,jQuery 会创建新的 元素,然后为传入的 HTML 片段设置元素的 innerHTML 属性。当参数只是简单的标签,比如$("") 或 $(""),jQuery 会通过内生的 JavaScript createElement() 函数来创建元素。 要确保跨平台兼容性,片段的结构必须良好。能够包含其他元素的标签必须成对出现(带有关闭标签): $(""); 不过,jQuery 也允许类似 XML 的标签语法: $(""); 无法包含其他元素的标签可以关闭,也可以不关闭: $(""); $(""); 用法 2 :设置属性和事件 语法 jQuery(html,props) 对于 jQuery 1.4,我们可以向第二个参数传递一个属性映射。该参数接受能够传递给 .attr() 方法的属性的超集。此外,可以传递任意的事件类型,并可以调用下面的 jQuery 方法:val, css, html, text, data, width, height, or offset. 注意,Internet Explorer 不允许你创建 input 元素并改变其类型;您必须使用例如 "" 来规定类型。 实例 创建一个 元素,同时设定 type 属性、属性值,以及一些事件。 $("", { type: "text", val: "Test", focusin: function() { $(this).addClass("active"); }, focusout: function() { $(this).removeClass("active"); } }).appendTo("form"); jQuery( callback ) 允许你绑定一个在 DOM 文档载入完成后执行的函数。 该函数的作用如同 $(document).ready() 一样,只不过用这个函数时,需要把页面所有需要在 DOM 加载完成时执行的其他 $() 操作符都包装到其来。尽管从技术上来说,这个函数是可链接的,但真正以这种方式链接的情况并不多。 例子 当DOM加载完成后,执行其的函数: $(function(){ // 文档就绪 }); 函数 描述 jQuery.noConflict() 运行这个函数将变量 $ 的控制权让渡给第一个实现它的那个库。 定义和用法 noConflict() 方法让渡变量 $ 的 jQuery 控制权。 语法 jQuery.noConflict([removeAll]) 参数 描述 removeAll 布尔值。指示是否允许彻底将 jQuery 变量还原。 说明 许多 JavaScript 库使用 $ 作为函数或变量名,jQuery 也一样。在 jQuery ,$ 仅仅是 jQuery 的别名,因此即使不使用 $ 也能保证所有功能性。假如我们需要使用 jQuery 之外的另一 JavaScript 库,我们可以通过调用 $.noConflict() 向该库返回控制权: $.noConflict(); // 使用另一个库的 $ 的代码 可以与 .ready() 方法结合起来使用,来为 jQuery 对象起别名,这项技术非常有效: $.noConflict(); jQuery(document).ready(function($) { // 使用 jQuery $ 的代码 }); // 使用其他库的 $ 的代码 此外,通过向该方法传递参数 true,我们可以将 $ 和 jQuery 的控制权都交还给原来的库。用之前请考虑清楚! 这是相对于简单的 noConflict 方法更极端的版本,因为这将完全重新定义 jQuery。这通常用于一种极端的情况,比如你想要将 jQuery 嵌入一个高度冲突的环境。注意:调用此方法后极有可能导致插件失效。 实例 例子 1 将 $ 引用的对象映射回原始的对象: jQuery.noConflict(); jQuery("div p").hide(); // 使用 jQuery $("content").style.display = "none"; // 使用其他库的 $() 例子 2 恢复使用别名 $,然后创建并执行一个函数,在这个函数的作用域仍然将 $ 作为 jQuery 的别名来使用。在这个函数,原来的 $ 对象是无效的。这个函数对于大多数不依赖于其他库的插件都十分有效: jQuery.noConflict(); (function($) { $(function() { // 使用 $ 作为 jQuery 别名的代码 }); })(jQuery); ... // 其他用 $ 作为别名的库的代码 例子 3 可以将 jQuery.noConflict() 与简写的 ready 结合,使代码更紧凑: jQuery.noConflict()(function(){ // 使用 jQuery 的代码 }); ... // 其他库使用 $ 做别名的代码 例子 4 创建一个新的别名用以在接下来的库使用 jQuery 对象: var j = jQuery.noConflict(); j("div p").hide(); // 基于 jQuery 的代码 $("content").style.display = "none"; // 基于其他库的 $() 代码 例子 5 完全将 jQuery 移到一个新的命名空间: var dom = {}; dom.query = jQuery.noConflict(true); 结果: dom.query("div p").hide(); // 新 jQuery 的代码 $("content").style.display = "none"; // 另一个库 $() 的代码 jQuery("div > p").hide(); // 另一个版本 jQuery 的代码
独立打包,保证可解压,内含大量源码,网上搜集而来。一共10几包,每个包几十兆。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件文件夹属性操作、文件文件夹系统操作、系统控制操作、程序版权信息、系统软件信息、 系统硬件信息、存储设备管理、鼠标及键盘、声音和视频、图形和图像、网络、数据库) IOCP 完成端口编程 《远程控制编程技术》源代码 内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的数据库的各种操作(连接、删除、添加……等等) ATL开发指南源码 内部包含了atl控件的开发以及如何应用,演示了COM的包容与集合、自动化、事件和连接点、枚举器和集合以及线程管理等等。 ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一个网页游览的例子 C++自绘窗体的完整代码 注释非常详细,相信会帮助大家设计好自己的个性窗体。 C++_Primer_第4版_文+英文 原书源码+课后习题答案。 CameraController(云界面) 实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件管理和监测系统源码 它包括客户端和服务端,客户端软件主要作用是监测本主机的活动,并将监测到的信息定时发送给服务器。服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除"运行"的自动匹配历史记录、清除"文档"的历史记录、清除上次登陆用户记录、清除"查找文件"自动匹配历史记录、清除"查找计算机"自动匹配历史记录、清除网络联接历史记录、清除远程登录历史记录、清除浏览网址历史记录。实现的代码很简单。 CListCtrl 阙套其它控件 自绘了CListCtrl 控件,实现了其它控件阙套到List并自绘等。主要的实现在CListReport类。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其应用 如题。 CSkinSlier CSliderCtrl自绘 Cursor 生成图标,运行到鼠标图标。 cutscene win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页的元素 dshowplayer 媒体播放器的实现,实现了VMR7、VMR9、EVR方式。 DSoundManager 实现了声音管理。 Excel文件的导入和导出操作 主要的实现在CMyExcel类。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 FTP、HTTP 多线程断点续传下载文件 源码 gdiplus应用实例 gdiplus应用实例2 GetFileVersion 这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理单元的源码文件。完成端口通讯模块内存管理。 haisanidsV1.2-网络连接监控 IP实时数据。自绘了很多控件。自绘CTabCtrl、CToolBar、CMenu、CButton、CHtmlCtrl、CListCtrl。 hyperlink 自绘CStatic,实现超链接。 iconbutton_demo 演示了多种自绘Button。 IDocHostUIHandler Extended CHtmlView IM_毕业设计 聊天系统,操作了数据库,有服务端和客户端。 ini文件的类适合VC使用 Inline Hook(ring3) 简单源码 代码里用了备份dll的方法,因此在自定义的函数可以直接调用在内存备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 IP所在地查询器 jpeglib_demo 处理Jpeg图片。 KeyHook 键盘钩子,截获键盘信息。 Kugou7+UI 界面设计。学习界面的好实例,强烈推荐。 自绘button 自绘MENU 自绘tab 自绘Tree 自绘按钮button源代码 自绘编辑框 自绘窗体界面 自绘对话框 listbox-6 重载CListBox,演示了拖动功能。 Mail_Report 演示了发送邮箱的功能。 MD5算法 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 MFC+DLL的编写和调用示例 MFC换肤完全贴图实现 Smile简体版 Linux内核完全注释附 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC实现。 MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统底层! MiniPlayer 源代码 媒体播放实现。 MP3解码 代码 内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 MPEG4播放器源代码 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ整套聊天系统) 老版qq系统的实现。 MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+technology文档。 P2P视频技术源码(含开发文档) PcShare 内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow win32情况下实现媒体播放。 preemptivepopupkiller C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_Demo 自绘List控件的实例。 Smile 自绘List控件的实例。 SOCK登录SSL加密网站 调用ie接口。主要的代码在IEComCtrlSink。 sqlite3使用 引用了Splayer的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法。 tabcontrol_demo 自绘了CTabCtrl的实现。 To Create A COOL Desktop Lyrics Demo 歌词显示,效果非常好。对话框实现。 TopMost 自绘CListCtrl的实现。 Trace程序 演示了输出信息。 TransparentStatic 自绘CStatic控件。 TreeView控件 自绘CTreeView控件。 VC 创建向导模式 VC 精品源码打包下载(解) CatListBox_src.zip CatListBox_demo.zip 这个程序模仿Outlook建立分类列表框。 CClockST_src.zip CClockST_demo.zip 一个简单的数字时钟程序,其的date类派生于MFC CStatic 基类。 CIVStringSet_Demo.zip CIVStringSet_Source.zip 基于MFC和STL平台的字符串类,可以实现在快速字符串搜索。 enum_display_modes_demo.zip enum_display_modes_src.zip 列出所有的显示模式并列表出来,通过单击列表来改变显示分辨率。 iconbutton_demo.zip iconbutton_src.zip 创建一个按钮,并在上面显示图标。 jpeglib_demo.zip jpeglib_src.zip 利用Delphi的代码在VC显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框。 Undo_demo.zip undo_src.zip 在VC实现Undo和Redo功能。 VC 利用底层键盘钩子屏蔽任意按键MaskKey 动态链接库实现钩子,然后程序调用。 VC 透明窗口效果的电子标尺源代码 实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 知道的人不多,但提起国内的暴风影音,我想知道的人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本的使用。 VC++精仿QQ2008窗体及分类菜单 VC++卡通风格气泡提示源码 VC++实现任务管理器源码 任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 vc-ftp 多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 多任务多线程断点续传DLL 多线程文件下载 多线程查找文件(功能增强版) 自定义了一个文件搜索类。多线程实现。 多线程高速文件搜索程序源码 VC++视频聊天系统源代码 实例简单,有用户登录、传输文件、视频、画质调节、禁音检测、回音消除、自动增益、噪音抑制、视频控制等、 VC++搜索指定文件文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要操作在CFileSpltDlg。 vc++写的音乐播放器 VC++制作3D效果的旋转文字特效 VC++注册码加密源程序(含注册机、解密机) 压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框出现气球提示 调用系统自带的提示显示。 VC实现创建模态对话框 VC释放EXE资源文件 vc网络 网络系列使用教程。 VC星号密码探测显示程序 vc网络通信编程实用案例精选 局域网网络通信编程实例、IE编程实例、基本网络编程实例、网络通信协议编程、Modem /串口通信编程、代理服务器编程实例、高级网络通信编程实例。 Visual_C++网络高级编程 TCP/IP协议、Winsock网络编程接口、Visual C 与网络编程、基本网络编程技术、Telnet协议的实现、HTTP协议的实现、 FTP协议的实现、文件下载、UDP协议的实现、ICMP协议的实现、PPP协议的实现、代理服务器的实现、 ATL DCOM和ActiveX技术、网络安全。 vld-10-src 内存泄漏检测源码。 vmrplayer 简单播放器的实现,集成到了一个类。 ATL开发Gif的ActiveX控件 如题。使用控件显示gif文件。 weather(天气预报界面) 通过soso网站获得城市以及天气信息。 WebBrowser-Httprequest(http请求捕捉) Win32多线程程序设计 有文档以及源码。 Windows Media Player界面的实现 Windows Shell扩展 实现文件拷贝。 windows设计 源码 书本源码。1.VC++的基本使用 2.一个简单的HelloWorld程序 3.进程的创建 4.进程控制 5.控制其他进程 6.游戏内存修改器1 7.游戏内存修改器2 8.多线程 9.线程的优先级 10.线程同步 11.第一个窗口程序 WINDOWS网络编程技术-附源码 如题。内有文档以及源码。 WM调用DrectShow例子 wm播放器。 XFileDialog_demo xml文件操作。 xml 树控件的使用,以及ChtmlView或站点拦截调用等。 XML文件读取及管理工具VC++源码 重写了很多控件,重要功能源码集合到了CXML。 暴风压力测试2010(V7.0)源码 如题,演示了攻击服务端的源码,tcp多连接攻击、cc攻击等等……。 播放器 MM ARM_流媒体、暴风影音源码用于编解码分析。 超清晰播放器源代码 超旋的音乐播放器 含歌词……,效果看源码。 穿还原的下载者 C++源码 驱动程序可以穿透还原卡,并且可以修改系统文件,这里是通过修改系统文件userinit.exe来实现的。userinit.exe的功能很简单,就是启动explorer.exe。这里就是通过替换uerinit.exe,伪造一个userinit.exe。这个伪造的程序可以实现uerinit.exe的原始功能,并可以实现自定义的功能,比如下载执行,发送数据。 窗体透明、窗体上控件和DC绘图不透明 从dll动态装载类的源程序 大型多媒体视频会议服务器端和客户端源码VC 基于H323格式。 发一个界面库skin#全集合 SkinH_VC使用帮助(含源码)、Skinsharp V1.0.6.6各种语言全破解、vc全部函数各自独立的demo、制作皮肤工具。 仿360杀毒软件界面源码 MFC重载控件实现了360界面效果。 仿QQ、MSN信息提示窗口 重载CWnd实现了动画显示。 仿QQ2011界面的源码 仿QQ信息提示窗口 仿金山词霸界面 仿制金山毒霸专杀工具界面 重载CEdit实现自绘。 实现QQ界面绝对经典 用户界面多线程 多线程的使用。 搞基控件 List Ctrl 演示了List Ctrl控件的使用方法。 搞基控件 ListBox 演示了ListBox控件的使用方法。 搞基控件 Tab Ctrl 演示了Tab Ctrl控件的使用方法。 搞基控件 TreeCtrl 演示了TreeCtrl控件的使用方法。 带加密功能的SQLite3.3.6封装类 第12章+DLL开发与系统编程 创建导出浮点数四则运算函数的Win32 DLL、使用显式方式调用DLL实现浮点数的四则运算、使用隐式方式调用DLL实现浮点数的四则运算、创建Win32 DLL导出一个全局变量、调用DLL,获取其导出的全局变量值、创建Win32 DLL导出一个计算长方体表面积和体积的类、调用DLL,使用其导出类计算长方体的表面积和体积、创建MFC常规DLL,通过导出函数显示颜色信息对话框、调用MFC常规DLL,显示颜色信息对话框、创建MFC扩展DLL,实现圆形按钮类、调用MFC扩展DLL,创建圆形按钮、创建记录键盘动作的全局钩子DLL、调用键盘钩子DLL,实现监视系统的键盘操作、创建记录当前鼠标所在窗口标题信息的鼠标钩子DLL、调用鼠标钩子DLL,显示鼠标所在窗口的标题、获取当前操作系统的版本信息、获取系统CPU信息、获取系统内存的相关信息、获取当前系统所有安装的硬件设备、调用系统关机对话框、编码实现关闭和重启计算机、实现休眠计算机,并创建快捷键、显示并设置系统的显示属性、隐藏显示系统的任务条、改变系统的桌面壁纸。 对磁盘下任意目录的动作进行监控 创建线程不断的监视。 多功能小闹钟 不规则窗体效果显示,实现了多功能的小闹钟。 仿QQ和飞秋的局域网聊天程序(文件+语音) 这个程序用的协议是UDP,socket是CAsyncSocket,这是我在这个网站看到了qq也优先用UDP来连接服务器,连上服务器,能获得服务器上的人员列表,客户端的人员列表随用户上下线改变,服务器掉线了 也能收到通知,双击用户名字可以聊天,聊天窗口上有个文件传输,在我电脑上能传输一些小文件,但在别人电脑上就会使程序崩溃。 工具栏画到标题栏上 关联文件 自动恢复系统文件关联,以及文件关联操作的代码。使用注册表防止多次运行。 基于CDialogBar的IE多标签栏的实现 基于IE内核的多进程浏览器Raptor 基于WTL控件实现了多进程。 极速FTP客户端程序(VC++版) 截屏mfc和dll程序 进程防杀的实现 Hook TerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。 精美挂机锁源码 局域网视频监控 客户端和服务器 考虑到作为服务器的一端一般来说是固定的,所以当开启服务器后,一般服务器是不能停止的,所以在正式的软件里面,作为客户端让输入的服务器端IP的那一项是可以省略的,因为在制作安装程序的时候可以将服务器IP直接固定,但是这个作为简单的功能演示版本考虑到作为服务器的一端可以为任意电脑,所以在客户端设置了填写服务器IP。运行时:首先是运行Sever.exe服务器端,然后是“开启服务器”,“产生新的随机码” ,然后运行Client.exe客户端,输入用户名和密码,然后输入服务器端IP地址,然后登陆服务器,如果密码或者登陆号不正确会有提示,也可以选择试用版的软件。 快捷键 演示了快捷键设置的代码。 类似QQ截屏的屏幕取色器 主要功能在CColorPickerDlg。 两款拼音输入法源代码 拼音输入法、AboutWiz_src。 枚举进程 系统监视 有磁盘监视、系统目录监视,任务栏监视、端口监视、流量监视等等。 媒体播放器 如题。音乐播放器的实现,内有文档以及总结。 模仿QQ抖动 闹钟软件V1.0 (带VC++源码) 基于MFC窗体的闹钟。 能弹出复选框组合列表的combobox 屏幕放大镜源代码 屏幕监控+远程控制+mfc+vc 屏幕录像模块程序设计 屏幕录像源代码 屏幕小精灵 七彩泡泡屏保代码 轻松实现类VC界面 两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所需的界面。 全屏幕播放AVI文件的启动界面程序 全屏幕播放flash的动画启动界面 任务栏终级编程 三种方法来检索处理信息 获取CPU的信息,以及判断是否支持MMX SSE SSE2 3DNOW等等操作。 深入解剖远程管理软件编写 教程,如题。 深入解析ATL(第二版)源代码资源大小 附带书籍源码。 深入体验VC开发源码 附带书籍源码。 十进制、十六进制、二进制互相转换的VC++程序 实现DLL拦截 在windows下当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间。由于输入表是根据DLL名来进行查找,首先是查找当前目录下有没这文件,没有话在去查找系统目录C:\\Windows\\system32有没这文件,所以我们可以完全趁这个机会去劫持DLL,把他劫持下来后就可以在里面进行我们要做的事情。 实现DLL内存补丁,DLL劫持技术([Symanli原创]) 实现EDIT控件自绘 使用VC编写的文件加解密操作类 自定义封装了一个文件加解密类,对文件加解密。lzari.c提供了lzari压缩算法的实现。 视频+语音+播放器源代码(不断更新内容) H.323 开发包与源码、P2P视频技术源码、TopPlayerSrc、VOD核心源码、大型多媒体视频会议服务器端和客户端源码、屏幕截取制作avi的源代码、视频会议系统、视频聊天源代码、优秀的IP网络语音通讯软件Speak Fleely源代码。源码与上面的有些重复。 手机远控电脑源码 分两个模式:一个是短信模式,一个浏览器模式。只要你遵循数据包的格式发送数据就一定可以成功的。不过不是源码。 手写输入法源码 太简单的实例。有利于对输入法开发的入门和深入学习。 鼠标钩子 钩子的实现。如题。 完全自绘软件更换皮肤例子 完整源码 统计后台([源码信息] 梦者 绿色下载器 流量商必备 ) 本统计后台无须安装数据库。可直接使用。 可多用户登录,多用户统计,顶级防刷,一键扣量,等等强大功能。 网络电视软件源码 网络电台收听助手V3.0(VC源码) 文件(文件夹)加密解密工具源码 源码实现了主要功能:1 文件(夹)加密解密 2 文件夹伪装保护解除伪装 3 右键关联加密解密到系统菜单 4 开机最小化启动到托盘(气球提示) 5 支持文件(文件夹)拖动 6 支持WIN2000,XP,VISTA,WIN7。非常好的一个实例。 文件加密程序 自绘了很多控件,使用了多线程加密以及解密,支持换肤,非常好的一个实例。详细见源码啦。 文件夹加密小程序 简单的加密源码。 文件捆绑器源代码 文件操作的实例,主要功能在BindFileDlg。 文字图象识别OCR系统开发包 引用了第三方库OcrWencui.lib 来识别。 显示网络流量 监听了端口显示了网络流量,使用了绘图显示了出来。学习流量监控的好例子。是使用了自绘按钮实现的。 线程池的一种实现 相当不错的一个挂机锁 写日志log的类 封装了一个类Log,使用它输出信息。 循序渐进实现仿QQ界面 六个步骤实现了QQ类似界面、仿QQ界面上的各种自绘控件。 迅雷资源搜索 阳历阴历转换 封装了一个CLunar实现阳历阴历转换。 一个服务端只有7k大小的后门 RegOpenKeyEx和RegCreateKeyEx函数由于电脑经常会关闭,或者应用程序也会经常关闭,但有一些参数是经常需要保存。比如当你打开程序,并设置了窗口的大小,想每次打开时都设置窗口为上次打开的大小。这样就需要保存窗口的大小,那么窗口大小的参数保存到那里呢?其实在Windows里最方便的做法,就是保存到注册表里。又比如游戏登录时,总是想保存最后一个登录的用户,那么也需要保存这个用户到注册表里。其实注册表是Windows保存系统配置的数据库,比如不同的语言设置,不同的时区设置,不同的用户登录,不同的权限等等。下面就来学习怎么样使用函数RegOpenKeyEx来打开注册表里的键和用函数RegCreateKeyEx来创建新的键。 一个可以获取硬件信息源代码 一个轻量级网络通信开发库源码 音乐播放器 音频录入mfc源码 用C写的播放器,超强 引用了libmad库、ogg库、Zlib库等等,强烈推荐学习。 自绘右键菜单。 在ToolBar上添加控件 在工具栏上添加COMBOBOX,EditBox,ProgressCtrl,Slider控件,根据相同的道理您还可以添加其他控件复选框、单选按钮等等 注册表监控程序 该程序的作用是记录系统发生的注册表操作,(只记录成功的,忽略失败的) 自己动手写操作系统 自由更改文件对话框的外观 自绘对话框。 应用程序与驱动通信(DeviceIoControl ) VC++系统开发实例精粹 光驱控制程序、枚举当前所有窗体、硬件信息查看器、注册表操作程序、USB编程、目录浏览器、资源管理器、二进制浏览器、日历管理器、字体设置对话框、任意形状窗体、自动停靠窗体、带图像的下拉列表框、实时曲线显示、OutLooK风格界面、屏幕保护系统、MP3播放器、MIDI音乐演奏器、VFW视频捕捉系统、256色转换灰度图、对比度拉伸、二值化变换、反色、亮度增减、取对数、取指数、直方图均衡、灰度均衡、阈值变换、图像镜像、图像平移、图像缩放、图像旋转、高斯平滑、均值滤波、拉普拉斯边缘检测、梯度锐化、值滤波、离散余弦变换、傅立叶变换、Walsh变换、方块编码、图像细化、Canny算子提取边缘、Hough变换、逆滤波处理、维纳滤波处理、文字、图像特效显示、带预览的图像选择框、图像浏览器、聊天室、CRC循环冗余检测、ICMP系统、能够发送附件的邮件程序、获取多个IP地址、获取计算机基本网络设置、获取计算机安装的各种网络协议、远程监控系统、FTP客户端、类似MSN的即时通信工具、文件共享系统、考试成绩管理系统、学生管理信息系统、二进制数据库编程、多线程实例、动态链接库(DLL)实例、消息循环重载实例、进程查看程序、文件关联实例、剪贴板查看器、键盘发声系统、运行后自销毁的程序、文件查找系统 、屏幕拷贝实例、文件分割器、密码探测器、带微调和滑动条控件的工具栏、透明窗体实例、状态栏动画、圆盘式和数字式时钟实例、Windows XP风格菜单、 Office XP风格菜单、Windows XP风格标题栏、Windows XP风格对话框、Windows XP风格按钮和滚动条、基于DirectSound的声音播放器、AVI视频制作实例、电影播放器、仿Winamp多媒体播放器、BMP图片浏览器、小波算法的VC++实现、基因算法的VC++实现、细胞识别统计系统、基于神经网络的文字识别系统、车牌定位与识别系统、点对点文件传输、Sniff网络嗅探器、基于UDP的网段扫描器、网络流量监控系统、网络语音电话、HTTP服务器实例、数据库浏览器、数据库查询器、报表打印实例、课程管理信息系统、库存管理信息系统、医院管理信息系统。 VC++餐厅餐饮管理系统 这是一个毕业课程设计,含论文,简单明了,全部引用了MFC控件实现,主要是操作数据库的部分。 VC++开发的仓库管理系统设计文档和源码 如题,含论文,简单明了,全部引用了MFC控件实现,主要是操作数据库的部分。 VC++库存管理系统(毕业设计) 如题,含论文,简单明了,全部引用了MFC控件实现,主要是操作Access数据库的部分。 VC++图书管理系统完整版 一个简单的客户端操作数据库的程序。 餐饮管理系统(全程开发) 餐饮管理系统 超市进销存管理系统 基本功能:前台销售结帐、基本信息管理、基本信息查询、日结查询、超市小票打印。操作ORACLE数据库。 局域网监控系统 主要功能:系统采用人机交互的方式,界面美观友好、屏幕信息需要时时显示,网络延时不能大于1秒、服务器端可以随时运行,只要客户端运行,就能够显示屏幕信息、系统运行时占用内存不能大于10MB,以免影响系统性能、客户端运行时需要隐藏显示窗口,起其感觉不到在运行。 库存管理信息系统 在运行系统前,首先要安装SQL Server数据库,注意要设定用户名为“sa”,密码为空。 可以有两种方法创建该数据库:1.使用SQL server查询分析器运行Database目录下的sql.txt的sql语句,这样会创建stock数据库。2.使用SQL Server的企业管理器直接附加“附加数据文件”目录下的Stock.mdf文件。系统默认帐号:admin 密码:888888 企业办公管理系统 这个源码不错,自定义了很多类,适合学习。 企业电话语音录音管理系统 主要功能:采用人机对话的操作方式,界面设计美观友好、操作灵活、方便、快捷、准确、数据存储安全可靠。系统可以进行来电显示和来电接听等功能。提供电话拨出功能,可以通过程序拨出电话。提供客户管理功能,记录客户信息,并可以在拨出电话时以电话簿的形式显示客户信息。提供电话录音功能,当电话接通时开始录音,当电话挂断时结束录音。提供录音管理功能,可以通过程序修改录音文件的存储位置。系统最大限度地实现了易维护性和易操作性。系统运行稳定、安全可靠。适合学习。 企业短信群发管理系统 主要功能:电话簿管理。常用语管理。短信息发送。短信息接收。短信猫设置。不过使用了第三方库实现发送接受等功能。 人力资源管理系统 主要功能:系统界面设计美观、友好;智能化程度高、操作灵活、方便;系统运行稳定、安全可靠;反应快速、计算准确;实现新员工入职登记、查询修改及入职合同的录入、编辑;登记并可以浏览日常考勤信息;记录公司定期的员工考核成绩;实现部门用人申请的登记;实现应聘者信息备档;实现工资单自动录入及缺勤原因的扣资计算。 社区视频监控系统 本程序有三个实例,msado15(数据库)、Autodlg(操作文件)、Capture(主要的程序)。本实例是天敏VC4000监控卡,其使用了MPG4c32.dll、MediaTransmit.dll、MediaTransmit.lib、MediaTransmit.h、Sa7134Capture.dll、Sa7134Capture.lib和Sa7134Capture.h几个文件,在运行程序前,需要将这些文件添加到当前工程。程序没有提供这些文件
Navicat Premium用户指南操作手册 目录 入门9系统需求10注册10安装10维护或升级11最终用户许可协议12连接21常规设置22高级设置24SSL 设置28SSH 设置29HTTP 设置30服务器对象31MySQL 对象31MySQL 表31MySQL 表栏位31MySQL 表索引33MySQL 表外键34MySQL 表触发器35MySQL 表选项36MySQL 视图38MySQL 函数或过程39MySQL 事件40Oracle 对象41Oracle 数据泵(只限于完整版本)42Oracle 数据泵导出42Oracle 数据泵导入45Oracle 调试器(只限于完整版本)49Oracle 实体属性或默认存储特性50Oracle 表51Oracle 常规表51Oracle 表栏位51Oracle 表索引53Oracle 表外键54Oracle 表唯一键54Oracle 表检查55Oracle 表触发器55Oracle 表选项57Oracle 外部表57Oracle 外部表栏位58Oracle 外部表外部属性58 3Oracle 外部表访问参数59Oracle 索引组织表59Oracle 索引组织表选项59Oracle 视图60Oracle 函数或过程61Oracle 数据库链接62Oracle 索引63Oracle Java65Oracle 实体化视图66Oracle 实体化视图日志68Oracle 包69Oracle 序列70Oracle 同义词71Oracle 触发器71Oracle 类型74Oracle XML 模式75Oracle 回收站76Oracle 目录77Oracle 表空间77Oracle 公用数据库链接80Oracle 公用同义词80PostgreSQL 对象80PostgreSQL 模式81PostgreSQL 表81PostgreSQL 表栏位81PostgreSQL 表索引82PostgreSQL 表外键83PostgreSQL 表唯一键84PostgreSQL 表检查85PostgreSQL 表排除85PostgreSQL 表规则86PostgreSQL 表触发器87PostgreSQL 表选项88PostgreSQL 视图88PostgreSQL 函数90PostgreSQL 聚集92PostgreSQL 转换92PostgreSQL 域93PostgreSQL 索引94PostgreSQL 运算符95PostgreSQL 运算符类别97PostgreSQL 序列98 4PostgreSQL 触发器99PostgreSQL 触发函数100PostgreSQL 类型102PostgreSQL 表空间104PostgreSQL 编制105PostgreSQL 语言105SQLite 对象106SQLite 表106SQLite 表栏位107SQLite 表索引108SQLite 表外键109SQLite 表唯一键109SQLite 表检查111SQLite 表触发器111SQLite 表选项112SQLite 视图112SQLite 索引113SQLite 触发器114SQL Server 对象115SQL Server 备份或还原(只限于完整版本)120SQL Server 备份120SQL Server 还原122SQL Server 模式123SQL Server 表124SQL Server 表栏位124SQL Server 表索引126SQL Server 表外键126SQL Server 表唯一键127SQL Server 表检查128SQL Server 表触发器128SQL Server 表选项130SQL Server 表存储131SQL Server 视图131SQL Server 函数或过程132SQL Server 索引134SQL Server 同义词139SQL Server 触发器139SQL Server 备份设备141SQL Server 链接服务器141SQL Server 服务器触发器144SQL Server 程序集145SQL Server 数据库触发器145 5SQL Server 分区函数146SQL Server 分区方案147SQL 预览147维护147维护MySQL147维护Oracle148维护PostgreSQL152维护SQLite153维护SQL Server153表查看器155网格查看155使用导览栏155编辑记录156排序、查找或替换记录161筛选记录(只限于完整版本)162操作原始数据162设置表网格格式163表单查看(只限于完整版本)164辅助编辑器164筛选向导(只限于完整版本)165查询167查询创建工具(只限于完整版本)167查询编辑器169编辑器高级功能169查询结果172查询参数172调试Oracle 查询(只限于完整版本)173模型(只限于Navicat Premium 和企业版)174边栏面板174模型树窗格174图表树窗格175属性窗格175历史窗格177图表编辑器177创建表177创建层178创建笔记和标签179创建图像180创建关系181设置图表格式182预览和打印模型183逆向工程183 6脚本生成183导出SQL 的常规设置184导出SQL的高级设置184正向工程185选择同步类型185选择模式或表185选择目标连接185查看比对结果186模型提示和技巧187高级工具189导入向导189设置导入文件格式(步骤1)189设置源文件名(步骤2)189设置分隔符(步骤3)-TXT、XML190设置附加选项(步骤4)-TXT、XML、Excel、HTML191设置目标表(步骤5)191调整栏位结构及对应栏位(步骤6)192选择导入模式(步骤7)192保存及确认导入(步骤8)194导出向导194设置导出文件格式(步骤1)194设置目标文件名(步骤2)194选择要导出的栏位(步骤3)195设置附加选项(步骤4)195保存及确认导出(步骤5)196数据传输(只限于完整版本)197数据传输的常规设置197相同服务器类型数据传输的高级设置197跨服务器数据传输的高级设置(只限于Navicat Premium)199数据同步(只限于完整版本)201数据同步的常规设置201数据同步的高级设置202结构同步(只限于完整版本)202结构同步的常规设置202结构同步的结果204备份或还原(只限于完整版本)205备份205还原206提取SQL207批处理作业或计划(只限于完整版本)207批处理作业或计划的常规设置208批处理作业或计划的高级设置208 7批处理作业转换(只限于Navicat Premium)209转储SQL 文件或运行SQL 文件209打印数据库或模式或表结构(只限于完整版本)210命令列介面210报表(只限于Navicat Premium 和企业版)211报表数据211报表查询向导211报表查询设计器212报表设计213报表向导214报表设计工具栏214报表对话框222报表版面224报表预览226服务器安全性227MySQL 安全性227MySQL 用户设计器227Oracle 安全性228Oracle 用户设计器229Oracle 角色设计器230PostgreSQL 安全性231PostgreSQL 服务器7.3 至8.0231PostgreSQL 用户设计器231PostgreSQL 组设计器232PostgreSQL 服务器8.1 至9.2233PostgreSQL 角色设计器233SQL Server 安全性234SQL Server 登录设计器235SQL Server 服务器角色设计器238SQL Server 数据库用户设计器238SQL Server 数据库角色设计器239SQL Server 应用程序角色设计器240权限管理员241实用工具242列表或详细信息或ER 图表查看242对象信息243服务器监控(只限于完整版本)244虚拟组(只限于完整版本)245连接颜色245收藏夹(只限于完整版本)245在数据库或模式查找(只限于完整版本)246搜索筛选246 8选项247常规选项247外观选项248模型选项(只限于完整版本)253其他选项253命令(只限于完整版本)255快捷键259日志文件262
 数据的加密与解密  文件的加密与解密 第 章 加密与解密技术 第19章 加密与解密技术 829 19.1 数据的加密与解密 实例571 异或算法对数字进行加密与解密 光盘位置:光盘\MR\19\571 级 趣味指数: 实 例说明 在实现本实例之前先来简要了解一下加密的概念,加密是指通过 某种特殊的方法,更改已有信息的内容,使得未授权的用户即使得到 了加密信息,如果没有正确解密的方法,也无法得到信息的内容。谈 到加密的话题,一些读者一定非常感兴趣,而且会联想到复杂的加密 算法,本实例主要使用异或“^”运算符简单地实现了对数字加密的 功能。实例运行效果如图19.1 所示。 关 键技术 本实例实现时主要使用了“异或”运算符对数字进行“异或”运 算,以达到简单加密数字的目的,下面对其进行详细讲解。 “异或”运算符“^”用于比较两个二进制数的相应位。在执行按位“异或”运算时,如果两个二进制数的 相应位都为1 或两个二进制数的相应位都为0,则返回0;如果两个二进制数的相应位其一个为1 一个为0, 则返回1。 现在来了解一下使用“异或”加密或解密的执行过程,数值23 转换为二进制为10111,加密数字的数值15 转换为二进制为1111。对比两个二进制的值,从右向左按位对比,如果两个二进制数的相应位都为1 或两个二 进制数的相应位都为0,则返回0;如果两个二进制数的相应位一个为1 一个为0,则返回1,最后得到的结 果为二进制值11000,该值转换为十进制为24,所以得到的加密结果为24。而解密过程也很简单,只是将加密 结果24与加密数字15 进行“异或”运算,将24 转换为二进制值11000,将15 转换为二进制值1111,进行“异 或”运算后,得到结果为23,这样又还原了加密的数据。  说明:本实例只是简单地使用了“异或”运算符计算两个整型数值以达到加密的目的,所以本实例只可以 对整型数值进行加密运算,并不适合其他数据的加密。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加两个GroupBox 容器控件,其, 在第一个GroupBox 放入3 个TextBox 控件和一个Button 按钮,分别用于输入数字、输入加密数字、显示加 密后的数字和计算加密信息;在第二个GroupBox 放入一个TextBox 控件和一个Button 按钮,分别用于显示 解密后的信息和计算解密信息。 (3)程序主要代码如下: private void btn_Encrypt_Click(object sender, EventArgs e) { int P_int_Num, P_int_Key; //定义两个值类型变量 if (int.TryParse(txt_Num.Text, out P_int_Num) //判断输入是否是数值 && int.TryParse(txt_Key.Text, out P_int_Key)) { txt_Encrypt.Text = (P_int_Num ^ P_int_Key).ToString(); //加密数值 } else 图19.1 异或算法对数字进行加密与解密 C#开发实战1200 例(第II卷) 830 { MessageBox.Show("请输入数值", "出现错误!"); //提示输入信息不正确 } } private void btn_Revert_Click(object sender, EventArgs e) { int P_int_Key, P_int_Encrypt; //定义两个值类型变量 if (int.TryParse(txt_Encrypt.Text, out P_int_Key) //判断输入是否是数值 && int.TryParse(txt_Key.Text, out P_int_Encrypt)) { txt_Revert.Text = (P_int_Encrypt ^ P_int_Key).ToString(); //解密数值 } else { MessageBox.Show("请输入数值", "出现错误!"); //提示输入信息不正确 } } 秘 笈心法 心法领悟571:简述“异或”运算符。 本实例使用了“异或”运算符,但是在使用“异或”运算符之前,有必要了解“异或”运算符所做的“异 或”运算的机制,“异或”运算符“^”用于比较两个二进制数的相应位。在执行按位“异或”运算时,如果两 个二进制数的相应位都为1 或两个二进制数的相应位都为0,则返回0;如果两个二进制数的相应位一个为1 一个为0,则返回1。 实例572 使用MD5算法加密数据 光盘位置:光盘\MR\19\572 级 趣味指数: 实 例说明 MD5(Message-Digest Algorithm 5)是一种被广泛使用的“消息-摘要 算法”。“消息-摘要算法”实际上就是一个单项散列函数,数据块通过单 向散列函数得到一个固定长度的散列值,数据块的签名就是计算数据块的散 列值,MD5 算法的散列值为128 位。本实例演示如何使用MD5 算法对用户 输入的密码进行加密,实例运行效果如图19.2 所示。 关 键技术 本实例在实现时主要用到了MD5类的ComputeHash 方法,下面对其进行详细讲解。 MD5 类表示MD5 哈希算法的所有实现均从继承的抽象类,该类位于System.Security.Cryptography 命名 空间下,其ComputeHash 方法有3种重载形式,分别介绍如下。  计算指定字节数组的哈希值,语法格式如下: public byte[] ComputeHash(byte[] buffer) 参数说明  buffer:要计算其哈希代码的输入。  返回值:计算所得的哈希代码。  计算指定Stream 对象的哈希值,语法格式如下: public byte[] ComputeHash(Stream inputStream) 参数说明  inputStream:要计算其哈希代码的输入。  返回值:计算所得的哈希代码。 图19.2 使用MD5 算法加密数据 第19章 加密与解密技术 831  计算指定字节数组的指定区域的哈希值,语法格式如下: public byte[] ComputeHash(byte[] buffer,int offset,int count) ComputeHash 方法的参数及说明如表19.1 所示。 表19.1 ComputeHash方法的参数及说明 参 数 说 明 buffer 要计算其哈希代码的输入 offset 字节数组的偏移量,从该位置开始使用数据 count 数组用作数据的字节数 返回值 计算所得的哈希代码  说明:本实例用到了ComputeHash 方法的第一种重载形式。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为MD5Arithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加两个TextBox 控件,分别用来输入 要加密的数据和显示加密后的字符串;添加一个Button 控件,用来使用MD5算法对输入的数据进行加密。 (3)程序主要代码如下: public string Encrypt(string strPwd) { MD5 md5 = new MD5CryptoServiceProvider(); //创建MD5 对象 byte[] data = System.Text.Encoding.Default.GetBytes(strPwd); //将字符编码为一个字节序列 byte[] md5data = md5.ComputeHash(data); //计算data字节数组的哈希值 md5.Clear(); //清空MD5 对象 string str = ""; //定义一个变量,用来记录加密后的密码 for (int i = 0; i < md5data.Length - 1; i++) //遍历字节数组 { str += md5data[i].ToString("x").PadLeft(2, '0'); //对遍历到的字节进行加密 } return str; //返回得到的加密字符串 } private void button1_Click(object sender, EventArgs e) { string P_str_Code = textBox1.Text; //记录要加密的密码 textBox2.Text = Encrypt(P_str_Code); //显示加密后的字符串 } 秘 笈心法 心法领悟572:如何判断是否为数字? 开发程序时,经常需要判断输入的字符串是否为数字,如判断输入的电话号码、货币金额和邮编等。在程 序判断是否为数字的方法有很多种,可以使用正则表达式、int.Parse 方法和double.Parse 方法等。下面的代码 通过double.Parse 方法判断textBox1 文本框的输入是否为数字。 double.Parse(textBox1.Text); 实例573 使用ROT13算法加密解密数据 光盘位置:光盘\MR\19\573 级 趣味指数: 实 例说明 文件加密可以避免造成重要信息的泄漏,复杂的加密算法可以将信息加密得非常繁杂,但是对于一般的应 用,没有必要作类似于PGP、RSA 或DES 等复杂的加密算法。本实例介绍如何使用ROT13 算法加密和解密数 C#开发实战1200 例(第II卷) 832 据。实例运行效果如图19.3 所示。 图19.3 使用ROT13算法加密解密数据 关 键技术 本实例实现时,主要是用Convert 类的ToChar 方法来获取单个字符的Unicode 编码,然后将字母的前13 个和后13 个对调,从而实现加密的功能。下面对Convert类的ToChar 方法进行详细讲解。 ToChar 方法返回指定的Unicode字符值,并且不执行任何实际的转换,其语法格式如下: public static char ToChar (char value) 参数说明 value:一个Unicode 字符。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为ROT13Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加两个TextBox 控件,分别用来显示 原始数据和解密后的数据;添加两个Button 控件,分别用来实现利用ROT13算法加密和解密数据的功能。 (3)程序主要代码如下: public string ROT13Encode(string InputText) { char tem_Character; //存储临时字符 int UnicodeChar; //存储临时字符的字节值 string EncodedText = ""; //存储加密或解密后的字符串 for (int i = 0; i = 97 && UnicodeChar = 110 && UnicodeChar = 65 && UnicodeChar = 78 && UnicodeChar <= 90) //对字符进行解密 { UnicodeChar = UnicodeChar - 13; } EncodedText = EncodedText + (char)UnicodeChar; //得到加密或解密字符串 } return EncodedText; //返回加密或解密后的字符串 } 秘 笈心法 心法领悟573:如何在字符串查找指定字符? 在字符串查找指定字符时,可以先将字符串显示在richTextBox 控件,然后利用richTextBox 类的Find 方法在该控件查找指定字符。在字符串查找指定字符的代码如下: 第19章 加密与解密技术 833 M_int_index = richTextBox1.Find(textBox1.Text.Trim(), M_int_index, RichTextBoxFinds.MatchCase); if (M_int_index == -1) { MessageBox.Show("没有要查找的字符串", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); M_int_index = 0; } else M_int_index = M_int_index + textBox1.Text.Trim().Length; richTextBox1.Focus(); 实例574 使用恺撒密码算法加密密码 光盘位置:光盘\MR\19\574 级 趣味指数: 实 例说明 恺撒密码据传是古罗马恺撒大帝用来保护重要军情的加密系统,它 是一种置换密码,通过将字母顺序推后起到加密作用。例如,将字母顺 序推后3 位,字母A 将被推作为字母D,字母B 将被推作字母E。本实 例使用C#实现了恺撒加密的算法,实例运行效果如图19.4 所示。 关 键技术 本实例实现时主要用到了string 类的ToCharArray 方法和Convert 类的ToChar 方法,下面分别对它们进行 详细介绍。 (1)string类的ToCharArray 方法 string类的ToCharArray 方法用来将字符串的字符复制到Unicode 字符数组,该方法有两种重载形式,本 实例用到的它的重载形式如下: public char[] ToCharArray() 参数说明 返回值:元素为此字符串的各字符的Unicode 字符数组。如果此字符串是空字符串,则返回的数组为空且 长度为零。 (2)Convert 类的ToChar 方法 Convert 类的ToChar 方法用来将指定的值转换为Unicode 字符,该方法为可重载方法,本实例用到的它 的重载形式如下: public static char ToChar(int value) 参数说明  value:32 位有符号整数。  返回值:等效于value 的值的Unicode 字符。 设 计过程 (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为CaesarArithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加两个TextBox 控件,分别用来输入 要加密的数据和显示加密后的字符串;添加一个Button 控件,用来使用恺撒密码算法对输入的数据进行加密。 (3)程序主要代码如下: public int AscII(string str) //获取字符的ASCII 码 { byte[] array = new byte[1]; //创建字节数组 array = System.Text.Encoding.ASCII.GetBytes(str); //为字节数组赋值 int asciicode = (short)(array[0]); //获取字节数组的第一项 return asciicode; //返回字节数组的第一项 } 图19.4 使用恺撒密码算法加密密码 C#开发实战1200 例(第II卷) 834 public string Caesar(string str) //凯撒加密算法的实现 { char[] c = str.ToCharArray(); //创建字符数组 string strCaesar = ""; //定义一个变量,用来存储加密后的字符串 for (int i = 0; i < str.Length; i++) //遍历字符串的每一个字符串 { string ins = c[i].ToString(); //记录遍历到的字符 string outs = ""; //定义一个变量,用来记录加密后的字符串 bool isChar = "0123456789abcdefghijklmnopqrstuvwxyz".Contains(ins.ToLower()); //判断指定的字符串是否包含遍历到的字符 bool isToUpperChar = isChar && (ins.ToUpper() == ins); //判断遍历到的字符是否是大写 ins = ins.ToLower(); //将遍历到的字符转换为小写 if (isChar) //判断指定的字符串是否包含遍历到的字符 { int offset = (AscII(ins) + 5 - AscII("a")) % (AscII("z") - AscII("a") + 1); //获取字符的ASCII 码 outs = Convert.ToChar(offset + AscII("a")).ToString(); //转换为字符并记录 if (isToUpperChar) //判断是否大写 { outs = outs.ToUpper(); //全部转换为大写 } } else { outs = ins; //记录遍历的字符 } strCaesar += outs; //添加到加密字符串 } return strCaesar; //返回加密后的字符串 } 秘 笈心法 心法领悟574:如何将新字符串添加到已有字符串? 将新字符串添加到已有字符串时,可以先声明一个StringBuilder类对象,以指定已有字符串的长度可变, 然后利用该对象的Append方法在字符串添加指定字符串。将新字符串添加到已有字符串的代码如下: StringBuilder strbuilder = new StringBuilder(textBox1.Text.Trim()); strbuilder.Append(textBox2.Text.Trim()); textBox3.Text = strbuilder.ToString(); 实例575 对数据报进行加密保障通信安全 光盘位置:光盘\MR\19\575 高级 趣味指数: 实 例说明 网络传输数据时,有时候传输信息容易被不法分子截获而 用作其他用途。这样,如果传输的数据包含有重要秘密,将 会造成非常严重的后果。为了防止这种情况的发生,可以对网 络传输的数据进行加密,用户接收到数据后再进行解密查看, 这样可以更好地保障网络通信安全。运行本实例,首先设置端 口号,然后在窗体左下方的文本框输入聊天信息,单击“发 送”按钮,向局域网发送聊天信息,同时在右侧的“数据传 输信息”栏显示数据报的发送、接收及丢失情况。实例运行 效果如图19.5 所示。 关 键技术 本实例获取数据信息时主要用到IPGlobalProperties和UdpStatistics类,而在对数据报加密时用到DESCrypto 图19.5 对数据报进行加密保障通信安全 第19章 加密与解密技术 835 ServiceProvider 和CryptoStream 类,其DESCryptoServiceProvider 继承于DES 类。下面对本实例用到的关 键技术进行详细讲解。 (1)IPGlobalProperties 类 IPGlobalProperties 类提供有关本地计算机的网络连接的信息,本实例用到它的GetIPGlobalProperties 和 GetUdpIPv4Statistics 方法,下面分别进行介绍。 GetIPGlobalProperties 为静态方法,主要用来获取一个对象,该对象提供有关本地计算机的网络连接和通信 统计数据信息,其语法格式如下: public static IPGlobalProperties GetIPGlobalProperties() 参数说明 返回值:IPGlobalProperties 对象,该对象包含有关本地计算机的信息。 GetUdpIPv4Statistics 方法主要用来提供本地计算机的用户数据报协议/Internet 协议版本4 (UDP/IPv4)统 计数据,其语法格式如下: public abstract UdpStatistics GetUdpIPv4Statistics() 参数说明 返回值:UdpStatistics 对象,提供本地计算机的UDP/IPv4通信统计数据。 例如,本实例创建IPGlobalProperties 对象,及调用其GetUdpIPv4Statistics 方法创建UdpStatistics 对象的 代码如下: IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); UdpStatistics myUdpStat = null; myUdpStat = NetInfo.GetUdpIPv4Statistics(); (2)UdpStatistics类 UdpStatistics 类提供用户数据报协议(UDP)统计数据,本实例主要用到其DatagramsSent 属性、 DatagramsReceived属性和IncomingDatagramsDiscarded 属性,其,DatagramsSent 属性用来获取已发送的用户 数据报协议(UDP)数据报的数量,DatagramsReceived 属性用来获取已接收的用户数据报协议(UDP)数据报 的数量,IncomingDatagramsDiscarded 属性用来获取已收到但因端口错误而丢弃的用户数据报协议(UDP)数据 报的数量。 例如,本实例初始化已发送、已接收和丢失数据报的实现代码如下: SendNum1 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); //记录发送的数据报 ReceiveNum1 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); //记录接收的数据报 DisNum1 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); //记录丢失的数据报  说明:IPGlobalProperties 类和UdpStatistics 类位于System.Net.NetworkInformation 命名空间下。 (3)DES 类 DES 类表示所有DES 实现都必须从派生的数据加密标准(DES)算法的基类,其CreateEncryptor 方法和 CreateDecryptor 方法分别用来加密和解密。 CreateEncryptor 方法使用指定的Key属性和初始化向量(IV)创建对称加密器对象,其语法格式如下: public abstract ICryptoTransform CreateEncryptor(byte[] rgbKey,byte[] rgbIV) 参数说明  rgbKey:用于对称算法的密钥。  rgbIV:用于对称算法的初始化向量。  返回值:对称加密器对象。 CreateDecryptor 方法使用指定的Key属性和初始化向量(IV)创建对称解密器对象,其语法格式如下: public abstract ICryptoTransform CreateDecryptor(byte[] rgbKey,byte[] rgbIV) 参数说明  rgbKey:用于对称算法的密钥。  rgbIV:用于对称算法的初始化向量。  返回值:对称解密器对象。 C#开发实战1200 例(第II卷) 836 (4)CryptoStream 类 CryptoStream 类定义将数据流链接到加密转换的流,其构造函数的语法格式如下: public CryptoStream(Stream stream,ICryptoTransform transform,CryptoStreamMode mode) 参数说明  stream:对其执行加密转换的流。  transform:要对流执行的加密转换。  mode:CryptoStreamMode 枚举值之一,CryptoStreamMode 枚举值及说明如表19.2 所示。 表19.2 CryptoStreamMode枚举值及说明 枚 举 值 说 明 Read 对加密流的读访问 Write 对加密流的写访问 另外,在向加密或解密流写入数据时用到CryptoStream 类的Write 方法,该方法将一个字节序列写入当 前CryptoStream,并将流的当前位置提升写入的字节数,其语法格式如下: public override void Write(byte[] buffer,int offset,int count) 参数说明  buffer:字节数组,此方法将count 个字节从buffer 复制到当前流。  offset:buffer 的字节偏移量,从此偏移量开始将字节复制到当前流。  count:要写入当前流的字节数。  说明:DES 类和CryptoStream 类位于System.Security.Cryptography 命名空间下。 设 计过程 (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为EncryptDataReport。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加两个RichTextBox 控件,分别用来 输入聊天信息和显示聊天信息;添加4 个TextBox 控件,分别用来输入端口号和显示已发送数据报、已接收数 据报、丢失数据报;添加4 个Button 控件,分别用来执行设置端口号、发送聊天信息、清空聊天信息和关闭应 用程序操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码,首先创建程序所需要的.NET 对象及公共变量,代码如下: #region 定义全局对象及变量 private IPEndPoint Server; //服务器端 private IPEndPoint Client; //客户端 private Socket mySocket; //套接字 private EndPoint ClientIP; //IP地址 byte[] buffer, data; //接收缓存 bool blFlag = true; //标识是否第一次发送信息 bool ISPort = false; //判断端口打开 int SendNum1, ReceiveNum1, DisNum1; //记录窗体加载时的已发送\已接收\丢失的数据报 int SendNum2, ReceiveNum2, DisNum2; //记录当前已发送\已接收\丢失的数据报 int SendNum3, ReceiveNum3, DisNum3; //缓存已发送\已接收\丢失的数据报 int port; //端口号 #endregion Frm_Main 窗体加载时,初始化已发送、已接收和丢失的数据报,并使用全局变量记录,实现代码如下: //初始化已发送、已接收和丢失的数据报 private void Form1_Load(object sender, EventArgs e) { if (blFlag == true) { IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); //创建一个IPGlobalProperties 对象 UdpStatistics myUdpStat = null; //声明UdpStatistics 对象 myUdpStat = NetInfo.GetUdpIPv4Statistics(); //创建UdpStatistics 对象 第19章 加密与解密技术 837 SendNum1 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); //记录发送的数据报 ReceiveNum1 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); //记录接收的数据报 DisNum1 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); //记录丢失的数据报 } } 单击“设置”按钮,使用指定的端口号连接服务器端与客户端,并开始接收消息。“设置”按钮的Click 事件的代码如下: private void button4_Click(object sender, EventArgs e) //设置端口号 { try { port = Convert.ToInt32(textBox4.Text); //记录端口号 CheckForIllegalCrossThreadCalls = false; //指定线程可以调用窗体的控件对象 buffer = new byte[1024]; data = new byte[1024]; Server = new IPEndPoint(IPAddress.Any, port); //创建服务器端 Client = new IPEndPoint(IPAddress.Broadcast, port); //创建客户端 ClientIP = (EndPoint)Server; //获取服务器端IP 地址 //创建Socket 对象 mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //设置Socket 网络操作 mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); mySocket.Bind(Server); //绑定服务器端 //开始接收消息 mySocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ClientIP, new AsyncCallback(StartLister), null); ISPort = true; //打开指定端口号 } catch { } } 单击“发送”按钮,首先判断是否有打开的端口,如果没有,弹出提示信息,否则根据发送和接收的消息 计算已发送、已接收和丢失的数据报,并显示在相应的文本框,然后使用DES对要发送的消息进行加密发送。 “发送”按钮的Click事件的代码如下: //发送信息 private void button2_Click(object sender, EventArgs e) { if (ISPort == true) //判断是否有打开的端口号 { IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); UdpStatistics myUdpStat = null; myUdpStat = NetInfo.GetUdpIPv4Statistics(); try { if (blFlag == false) //非第一次发送 { SendNum2 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); ReceiveNum2 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); DisNum2 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); textBox1.Text = Convert.ToString(SendNum2 - SendNum3); textBox2.Text = Convert.ToString(ReceiveNum2 - ReceiveNum3); textBox3.Text = Convert.ToString(DisNum2 - DisNum3); } SendNum2 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); ReceiveNum2 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); DisNum2 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); SendNum3 = SendNum2; //记录本次的发送数据报 ReceiveNum3 = ReceiveNum2; //记录本次的接收数据报 DisNum3 = DisNum2; //记录本次的丢失数据报 if (blFlag == true) //第一次发送 { textBox1.Text = Convert.ToString(SendNum2 - SendNum1); textBox2.Text = Convert.ToString(ReceiveNum2 - ReceiveNum1); textBox3.Text = Convert.ToString(DisNum2 - DisNum1); blFlag = false; C#开发实战1200 例(第II卷) 838 } } catch (Exception ex) { MessageBox.Show(ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); } string str = EncryptDES(rtbSend.Text, "mrsoftxk"); //加密要发送的信息 data = Encoding.Unicode.GetBytes(str); mySocket.SendTo(data, data.Length, SocketFlags.None, Client); //发送消息 rtbSend.Text = ""; } else { MessageBox.Show("请首先打开端口!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); button4.Focus(); } } 上面的代码用到了EncryptDES 方法,该方法为自定义的、返回值类型为string 的方法,主要用来使用 DES 加密数据报,它有两个string 类型的参数,分别用来表示待加密的字符串和加密密钥,返回值为加密后的 字符串。EncryptDES 方法的实现代码如下: #region DES 加密字符串 /// ///DES 加密字符串 /// ///待加密的字符串 ///加密密钥,要求为8 位 ///加密成功返回加密后的字符串,失败返回源字符串 public string EncryptDES(string str, string key) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(key.Substring(0, 8)); //将加密密钥转换为字节数组 byte[] rgbIV = Keys; //记录原始密钥数组 byte[] inputByteArray = Encoding.UTF8.GetBytes(str); //将加密字符串转换为字节数组 DESCryptoServiceProvider myDES = new DESCryptoServiceProvider(); //创建加密对象 MemoryStream MStream = new MemoryStream(); //创建内存数据流 //创建加密流对象 CryptoStream CStream = new CryptoStream(MStream, myDES.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); CStream.Write(inputByteArray, 0, inputByteArray.Length); //向加密流写入数据 CStream.FlushFinalBlock(); //释放加密流对象 return Convert.ToBase64String(MStream.ToArray()); //返回内存流数据 } catch { return str; } } #endregion 秘 笈心法 心法领悟575:如何根据标点符号分行? 根据标点符号分行时,首先要使用string 类的Split 方法分割字符串,然后再通过“\n”回车换行符将分割 的字符串换行显示。根据标点符号分行的代码如下: string oldstr = textBox1.Text.Trim(); string[] newstr = oldstr.Split('。'); for (int i = 0; i < newstr.Length; i++) { if (richTextBox1.Text == "") richTextBox1.Text = newstr[i].ToString(); else richTextBox1.Text += "\n" + newstr[i].ToString(); } 第19章 加密与解密技术 839 实例576 使用one-time pad算法加密数据 光盘位置:光盘\MR\19\576 高级 趣味指数: 实 例说明 在密码学里,有一种理想的加密方案,叫做一次一密乱码本,即 one-time pad 算法,该算法是最安全的加密算法,双方一旦安全交换 了密钥,之后交换信息的过程就可以保证绝对安全。本实例使用C# 实现了one-time pad 加密算法,实例运行效果如图19.6 所示。  注意:程序使用one-time pad 算法时,一定要保证密钥和密文 的长度是一样的。 关 键技术 本实例在实现one-time pad 加密算法时,主要用到了Encoding 类的GetBytes 方法和GetString 方法,下面 分别对它们进行详细介绍。 (1)Encoding 类的GetBytes方法 Encoding 类表示字符编码,其GetBytes方法主要用来将一组字符编码为一个字节序列,该方法为可重载方 法,本实例用到的它的重载形式如下: public virtual byte[] GetBytes(string s) 参数说明  s:字符串。  返回值:一个字节数组,包含对指定的字符集进行编码的结果。  说明:Encoding 类位于System.Text 命名空间下。 (2)Encoding 类的GetString方法 Encoding 类的GetString方法主要用来将一个字节序列解码为一个字符串,该方法为可重载方法,本实例 用到的它的重载形式如下: public virtual string GetString(byte[] bytes) 参数说明  bytes:包含要解码的字节序列的字节数组。  返回值:包含指定字节序列解码结果的字符串。 设 计过程 (1) 打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为OneTimePadArithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加4 个TextBox 控件,分别用来输入 要加密的数据和密钥,以及显示加密后的数据和解密后的数据;添加两个Button控件,分别用来实现使用one-time pad 算法加密数据和解密数据的功能。 (3)程序主要代码如下。 在Frm_Main 窗体输入要加密的数据和密钥后,单击“加密”按钮,使用one-time pad 算法对输入的数据 进行加密,实现代码如下: private void button1_Click(object sender, EventArgs e) { textBox2.Text = ""; //清空文本框 Encoding encoding = Encoding.Default; //获取字符编码 byte[] btData = encoding.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 byte[] btKey = encoding.GetBytes(textBox4.Text); //将密钥转换为字节数组 图19.6 使用one-time pad 算法加密数据 C#开发实战1200 例(第II卷) 840 if (btData.Length == btKey.Length) //判断长度是否相等 { byte[] btEncrypt = Encrypt(btData, btKey); //加密数据 for (int i = 0; i < btEncrypt.Length; i++) //遍历加密后的字节数组 { textBox2.Text += btEncrypt[i]; //显示在文本框 } } } 上面的代码用到了Encrypt 方法,该方法为自定义的、返回值类型为byte[]的方法,主要用来对指定的数 据使用one-time pad 算法进行加密。Encrypt方法的实现代码如下: public static byte[] Encrypt(byte[] btData, byte[] btKey) { if (btKey.Length != btData.Length) //判断长度是否相等 { MessageBox.Show("请确保要加密数据的长度与密钥的长度一致!"); } byte[] btResult = new byte[btData.Length]; //声明一个字节数组,用来存储加密数据 for (int i = 0; i < btResult.Length; ++i) //遍历字节数组 { btResult[i] = (byte)(btKey[i] ^ btData[i]); //为字节数组赋值 } return btResult; //返回得到的加密数据 } 单击“解密”按钮,调用Encrypt 方法对加密过的数据进行逆向加密,并返回一个byte[]数组,然后使用 Encoding 类的GetString方法从该数组获取解密字符串。“解密”按钮的Click事件的代码如下: private void button2_Click(object sender, EventArgs e) { Encoding encoding = Encoding.Default; //获取字符编码 byte[] btData = encoding.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 byte[] btKey = encoding.GetBytes(textBox4.Text); //将密钥转换为字节数组 if (btData.Length == btKey.Length) //判断长度是否相等 { byte[] btDecrypt = Encrypt(Encrypt(btData, btKey), btKey); //解密数据 textBox3.Text = encoding.GetString(btDecrypt); //将解密后的字节数组转换为字符串并显示 } } 秘 笈心法 心法领悟576:如何在字符串添加多个空格? 开发程序时,有时会根据需要在字符串添加一些空格,这时可以使用string 类的Insert方法,该方法可以 在字符串的指定位置插入一个新的字符串(包括空格)。在字符串添加空格的代码如下: textBox3.Text = textBox1.Text.Insert(Convert.ToInt32(textBox2.Text.Trim()), " "); 实例577 使用伪随机数加密技术加密用户登录密码 光盘位置:光盘\MR\19\577 高级 趣味指数: 实 例说明 为了保障用户登录密码的安全,本实例使用伪随机数技术对用 户的登录密码进行加密,运行本实例,当用户在“登录密码”文本 框输入登录密码时,程序会自动将使用过伪随机数加密技术加密 过的登录密码显示在下面的“加密密码”文本框,单击“登录” 按钮,程序对“加密密码”文本框的加密数据进行解密,然后再 与用户输入的登录密码相比较,如果相同,则登录成功;否则,登 录失败。实例运行效果如图19.7 所示。 图19.7 使用伪随机数加密技术 加密用户登录密码 第19章 加密与解密技术 841 关 键技术 本实例对用户登录密码加密时用到伪随机数加密技术,伪随机数加密技术实质上就是通过伪随机数序列使 登录密码字符串的字节值发生变化而产生密文,由于相同的初值能得到相同的随机数序列,因此,可以采用同 样的伪随机数序列来对密文进行解密。产生伪随机数时主要用到Random 类,该类表示伪随机数生成器,它是 一种能够产生满足某些随机性统计要求的数字序列的设备,其Next方法用来返回随机数,语法格式如下: public virtual int Next(int maxValue) 参数说明  maxValue:要生成的随机数的上界(随机数不能取该上界值),maxValue 必须大于等于零。  返回值:大于等于零且小于maxValue 的32 位带符号整数,即返回值的范围通常包括零但不包括 maxValue;不过,如果maxValue 等于零,则返回maxValue。 设 计过程 (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为PRanDataEncrypt。 (2)更改默认窗体Form1 的Name属性为Frm_Main,在该窗体添加3 个TextBox 控件,分别用来输入 登录用户、登录密码和显示加密密码;添加两个Button 控件,分别用来执行用户登录和清空文本框操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码,首先定义加密用户密码所用的伪随机数,代码如下: //定义加密用户密码所用的伪随机数 private string randStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; 当在“登录密码”文本框输入登录密码时,实时将使用伪随机数加密过的登录密码显示在“加密密码” 文本框,实现代码如下: private void textBox2_TextChanged(object sender, EventArgs e) { textBox3.Text = EncryptPwd(textBox2.Text); //显示加密后的用户登录密码 } 上面的代码用到EncryptPwd 方法,该方法为自定义的、返回值类型为string 的方法,主要用来使用伪随 机数技术加密用户登录密码,它有一个参数,用来表示用户登录密码。EncryptPwd 方法的实现代码如下: /// /// 使用伪随机数加密用户登录密码 /// /// 用户登录密码 /// 加密后的用户登录密码 private string EncryptPwd(string str) { byte[] btData = Encoding.Default.GetBytes(str); //将登录密码转换为字节数组 int j, k, m; int len = randStr.Length; //记录伪随机数长度 StringBuilder sb = new StringBuilder(); //创建StringBuilder对象 Random rand = new Random(); //创建Random 对象 for (int i = 0; i < btData.Length; i++) { j = (byte)rand.Next(6); //产生伪随机数 btData[i] = (byte)((int)btData[i] ^ j); //使用伪随机数对密码字节数组进行移位 k = (int)btData[i] % len; m = (int)btData[i] / len; m = m * 8 + j; sb.Append(randStr.Substring(k, 1) + randStr.Substring(m, 1)); //组合加密字符串 } return sb.ToString(); //返回生成的加密字符串 } 单击“登录”按钮,判断“加密密码”文本框是否为空。如果不为空,调用DecryptPwd 方法解密“加密 密码”文本框的字符串;然后使用解密后的字符串与“登录密码”文本框的字符串相比较,如果相同,则 用户登录成功;否则,弹出提示信息。“登录”按钮的Click事件代码如下: C#开发实战1200 例(第II卷) 842 private void button1_Click(object sender, EventArgs e) { if (textBox3.Text != "") { if (DecryptPwd(textBox3.Text) == textBox2.Text) //对加密过的登录密码进行解密 MessageBox.Show("用户登录成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); else MessageBox.Show("用户密码错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 上面的代码用到了DecryptPwd 方法,该方法为自定义的、返回值类型为string 的方法,主要用来解密用 户登录密码,它有一个参数,主要用来表示经过加密的用户登录密码。DecryptPwd 方法的实现代码如下: /// /// 解密用户登录密码 /// /// 经过加密的用户登录密码 /// 解密后的用户登录密码 private string DecryptPwd(string str) { try { int j, k, m, n = 0; int len = randStr.Length; //获取伪随机数长度 byte[] btData = new byte[str.Length / 2]; //定义一个字节数组,并指定长度 for (int i = 0; i < str.Length; i += 2) //对登录密码进行解密 { k = randStr.IndexOf(str[i]); m = randStr.IndexOf(str[i + 1]); j = m / 8; m = m - j * 8; btData[n] = (byte)(j * len + k); btData[n] = (byte)((int)btData[n] ^ m); n++; } return Encoding.Default.GetString(btData); //返回解密后的登录密码 } catch { return ""; } } 秘 笈心法 心法领悟577:如何将字符串颠倒输出? 颠倒输出字符串时,可以先将要输出的字符串保存到一个char 类型的数组,然后使用Array 类的Reverse 方法。将字符串颠倒输出的代码如下: string str1 = textBox1.Text.Trim(); char[] charstr = str1.ToCharArray(); Array.Reverse(charstr); string str2 = new string(charstr); textBox2.Text = str2; 实例578 以XML格式导入导出密钥 光盘位置:光盘\MR\19\578 高级 趣味指数: 实 例说明 本实例主要实现以XML 格式导入导出密钥,从而实现对数据进行加密和解密的功能。运行本实例,首先 在窗体显示生成的公钥和私钥,然后输入明文数据,单击“加密”按钮,对输入的明文数据进行加密;单击 “解密”按钮,对加密后的数据进行解密。实例运行效果如图19.8 所示。 第19章 加密与解密技术 843 图19.8 以XML 格式导入导出密钥 关 键技术 本实例实现时主要用到了RSACryptoServiceProvider 类的ToXmlString方法、Encrypt 方法和Decrypt 方法, 下面对本实例用到的关键技术进行详细讲解。 (1)RSACryptoServiceProvider 类的ToXmlString方法 RSACryptoServiceProvider 类用来使用加密服务提供程序(CSP)提供的RSA 算法的实现执行不对称加密和 解密,其ToXmlString 方法主要用来创建并返回包含当前RSA 对象的密钥的XML 字符串,该方法的语法格式 如下: public override string ToXmlString(bool includePrivateParameters) 参数说明  includePrivateParameters:true 表示同时包含RSA公钥和私钥,false 表示仅包含公钥。  返回值:包含当前RSA对象的密钥的XML字符串。  说明:RSACryptoServiceProvider 类位于System.Security.Cryptography 命名空间下。 (2)RSACryptoServiceProvider 类的Encrypt方法 该方法主要使用RSA算法对数据进行加密,其语法格式如下: public byte[] Encrypt(byte[] rgb,bool fOAEP) 参数说明  rgb:要加密的数据。  fOAEP:如果为true,则使用OAEP 填充(仅在运行Microsoft Windows XP 或更高版本的计算机上可用) 执行直接的RSA 加密;如果为false,则使用PKCS#1 1.5 版填充。  返回值:字节数组,表示已加密的数据。 (3)RSACryptoServiceProvider 类的Decrypt方法 该方法主要使用RSA算法对数据进行解密,其语法格式如下: public byte[] Decrypt(byte[] rgb,bool fOAEP) 参数说明  rgb:要解密的数据。  fOAEP:如果为true,则使用OAEP 填充(仅在运行Microsoft Windows XP 或更高版本的计算机上可用) 执行直接的RSA 解密;如果为false,则使用PKCS#1 1.5 版填充。  返回值:字节数组,表示已解密的数据,它是加密前的原始纯文本。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为KeyToXML。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加5 个TextBox 控件,分别用来显示 C#开发实战1200 例(第II卷) 844 公钥、显示私钥、输入明文数据、显示加密后的数据和显示解密后的数据;添加两个Button 控件,分别用来执 行数据加密和解密操作。 (3)程序主要代码如下。 在Frm_Main 窗体的后台代码,首先创建RSACryptoServiceProvider 对象,并且定义一个字节数组,用来 存储临时数据,代码如下: RSACryptoServiceProvider RSACrypto = new RSACryptoServiceProvider(); //创建RSA 算法加密解密对象 byte[] M_bt_Data; //定义一个字节数组,用来存储临时数据 Frm_Main 窗体加载时,在文本框显示程序自动生成的公钥和私钥数据,代码如下: private void Frm_Main_Load(object sender, EventArgs e) { this.textBox1.Text = RSACrypto.ToXmlString(true); //显示生成的公钥 this.textBox2.Text = RSACrypto.ToXmlString(false); //显示生成的私钥 } 当用户输入明文数据之后,单击“加密”按钮,调用RSACryptoServiceProvider 类的Encrypt方法对数据进 行加密,并且使用Encoding 类的UTF8 编码方式的GetString 方法得到加密后的数据,显示在文本框。“加密” 按钮的Click事件代码如下: private void button1_Click(object sender, EventArgs e) { if (textBox3.Text != "") //判断是否输入了要加密的数据 { byte[] P_bt_Encrypt = Encoding.UTF8.GetBytes(textBox3.Text); //将要加密的数据转换为字节数组 M_bt_Data = RSACrypto.Encrypt(P_bt_Encrypt, false); //加密数据 textBox4.Text = Encoding.UTF8.GetString(M_bt_Data); //显示加密数据 } } 单击“解密”按钮,调用RSACryptoServiceProvider 类的Decrypt方法对加密过的数据进行解密,并且使用 Encoding 类的UTF8 编码方式的GetString 方法得到解密后的数据,显示在文本框。“解密”按钮的Click 事 件代码如下: private void button2_Click(object sender, EventArgs e) { if (textBox4.Text != "") //判断是否有加密过的数据 { byte[] P_bt_Decrypt = RSACrypto.Decrypt(M_bt_Data, false); //对数据进行解密 textBox5.Text = Encoding.UTF8.GetString(P_bt_Decrypt); //显示解密数据 } } 秘 笈心法 心法领悟578:如何判断字符串是否为日期格式? 判断字符串是否为日期格式时,可以使用正则表达式。验证日期格式的正则表达式主要有以下3 种: \b(?\d{2,4})/(?\d{1,2})/(?\d{1,2})\b 或 \b(?\d{2,4})-(?\d{1,2})-(?\d{1,2})\b 或 \b(?\d{2,4})年(?\d{1,2})月(?\d{1,2})日\b 实例579 以参数格式导入导出密钥 光盘位置:光盘\MR\19\579 高级 趣味指数: 实 例说明 本实例主要实现以参数格式导入导出密钥,从而实现对数据进行加密和解密的功能。运行本实例,在窗体 第19章 加密与解密技术 845 输入明文数据,单击“加密”按钮,对输入的明文数据进行加密;单击“解 密”按钮,对加密后的数据进行解密。实例运行效果如图19.9 所示。 关 键技术 本实例实现时主要用到了RSACryptoServiceProvider 类的ExportParameters 方法、ImportParameters 方法、Encrypt 方法和Decrypt 方法,下面对本实例 用到的关键技术进行详细讲解。 (1)RSACryptoServiceProvider 类的ExportParameters 方法 该方法主要用来导出RSAParameters标准参数,其语法格式如下: public override RSAParameters ExportParameters(bool includePrivateParameters) 参数说明  includePrivateParameters:如果要包括私有参数,则为true;否则为false。  返回值:RSA 算法的标准参数。 (2)RSACryptoServiceProvider 类的ImportParameters 方法 该方法主要用来导入指定的RSAParameters标准参数,其语法格式如下: public override void ImportParameters(RSAParameters parameters) 参数说明 parameters:RSA 算法的标准参数。  说明:关于RSACryptoServiceProvider 类的Encrypt 方法和Decrypt 方法的详细讲解,请参见实例578 的 关键技术。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为KeyToParameter。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加3 个TextBox 控件,分别用来输入 明文数据、显示加密后的数据和解密后的数据;添加两个Button 控件,分别用来执行数据加密和解密操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码,首先创建RSACryptoServiceProvider 对象和RSAParameters 标准参数对象, 并且定义一个字节数组,用来存储临时数据,代码如下: RSACryptoServiceProvider RSACrypto; //声明RSA 算法加密解密对象 RSAParameters RSAParame; //声明RSAParameters 参数对象 byte[] M_bt_Data; //定义一个字节数组,用来存储临时数据 在Frm_Main 窗体的构造函数,调用RSACryptoServiceProvider 类的ImportParameters 方法导入 RSAParameters标准参数,实现代码如下: public Frm_Main() { InitializeComponent(); RSACrypto = new RSACryptoServiceProvider(); //初始化RSA 算法加密解密对象 RSAParame = RSACrypto.ExportParameters(true); //初始化RSAParameters 参数 RSACrypto.Clear(); //清空RSACryptoServiceProvider 对象 RSACrypto = new RSACryptoServiceProvider(); //初始化RSA 算法加密解密对象 RSACrypto.ImportParameters(RSAParame); //导入密钥 } 当用户输入明文数据之后,单击“加密”按钮,调用RSACryptoServiceProvider 类的Encrypt方法对数据进 行加密,并且使用Encoding 类的UTF8 编码方式的GetString 方法得到加密后的数据,显示在文本框。“加密” 按钮的Click事件代码如下: private void button1_Click(object sender, EventArgs e) { if (textBox1.Text != "") //判断是否输入了要加密的数据 { 图19.9 以参数格式导入导出密钥 C#开发实战1200 例(第II卷) 846 byte[] P_bt_Encrypt = Encoding.UTF8.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 M_bt_Data = RSACrypto.Encrypt(P_bt_Encrypt, false); //加密数据 textBox2.Text = Encoding.UTF8.GetString(M_bt_Data); //显示加密数据 } } 单击“解密”按钮,调用RSACryptoServiceProvider 类的Decrypt方法对加密过的数据进行解密,并且使用 Encoding 类的UTF8 编码方式的GetString 方法得到解密后的数据,显示在文本框。“解密”按钮的Click 事 件代码如下: private void button2_Click(object sender, EventArgs e) { if (textBox2.Text != "") //判断是否有加密过的数据 { byte[] P_bt_Decrypt = RSACrypto.Decrypt(M_bt_Data, false); //对数据进行解密 textBox3.Text = Encoding.UTF8.GetString(P_bt_Decrypt); //显示解密数据 } } 秘 笈心法 心法领悟579:巧截字符串的数字。 截取字符串的数字时,可以先使用CharEnumerator 对象的MoveNext 方法循环访问字符串的每个字符, 并将字符用System.Text.Encoding 类ASCII 编码方式的GetBytes 方法进行编码,然后判断经过编码之后的字符 的ASCII码值是否介于48和57之间,如果是,则将其显示在textBox文本框。截取字符串数字的代码如下: CharEnumerator CEnumerator = textBox1.Text.GetEnumerator(); while (CEnumerator.MoveNext()) { byte[] array = new byte[1]; array = System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString()); int asciicode = (short)(array[0]); if (asciicode >= 48 && asciicode <= 57) { textBox2.Text += CEnumerator.Current.ToString(); } } 19.2 文件的加密与解密 实例580 文本文件加密与解密 光盘位置:光盘\MR\19\580 高级 趣味指数: 实 例说明 在本实例的窗体,首先选择要加密或解密的文本文件,然后单击“加 密”或“解密”按钮对文本文件进行加密或解密。实例运行效果如图19.10 所示。 关 键技术 本实例实现时主要用到了System.Security.Cryptography命名空间下的 RijndaelManaged 类的CreateDecryptor 方法、CreateEncryptor 方法和CryptoStream 类的Write 方法,下面对本实 例用到的关键技术进行详细讲解。 (1)RijndaelManaged 类 该类是访问System.Security.Cryptography.Rijndael 对称加密算法的托管版本,其语法格式如下: public sealed class RijndaelManaged : Rijndael 图19.10 文本文件加密与解密 第19章 加密与解密技术 847  注意:此算法支持128、192或256 位的密钥长度。 (2)CreateDecryptor 方法 该方法位于RijndaelManaged 类,使用指定的Key和初始化向量(IV)创建对称的Rijndael 解密器对象, 其语法格式如下: public override IcryptoTransform CreateDecryptor (byte[] rgbKey,byte[] rgbIV) 参数说明  rgbKey:用于对称算法的机密密钥。  rgbIV:用于对称算法的IV。  返回值:对称的Rijndael 解密器对象。 (3)CreateEncryptor 方法 该方法位于RijndaelManaged 类,使用指定的Key和初始化向量(IV)创建对称的Rijndael 加密器对象, 其语法格式如下: public override ICryptoTransform CreateEncryptor (byte[] rgbKey,byte[] rgbIV) 参数说明  rgbKey:用于对称算法的机密密钥。  rgbIV:用于对称算法的IV。  返回值:对称的Rijndael 加密器对象。  说明:关于CryptoStream 类的Write 方法的详细讲解,请参见实例575的关键技术。 设 计过程 (1) 打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为EncryptTextFileOne。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加一个TextBox 控件,用来显示文本 文件路径;添加一个OpenFileDialog 控件,用来选择要加密或解密的文本文件;添加3 个Button 控件,用来执 行选择文本文件、加密和解密操作。 (3)程序主要代码如下。 单击“加密”按钮实现对选择的文本文件进行加密,“加密”按钮的Click事件的代码如下: private void button2_Click(object sender, EventArgs e) { if (textBox1.Text == "") //若未选择要加密的文本文件 { MessageBox.Show("请选择要加密的文件"); } //如果没有选择则弹出提示 else { try{ string strPath = textBox1.Text; //加密文件的路径 int intLent=strPath.LastIndexOf("\\")+1; //设置截取的起始位置 int intLong = strPath.Length; //设置截取的长度 string strName = strPath.Substring(intLent,intLong-intLent); //要加密的文件名称 int intTxt = strName.LastIndexOf("."); //设置截取的起始位置 int intTextLeng = strName.Length; //设置截取的长度 string strTxt = strName.Substring(intTxt,intTextLeng-intTxt); //取出文件的扩展名 strName = strName.Substring(0,intTxt); //加密后的文件名及路径 string strOutName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + "Out" + strTxt; //加密文件密钥 byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 }; byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 }; RijndaelManaged myRijndael = new RijndaelManaged(); FileStream fsOut = File.Open(strOutName, FileMode.Create, FileAccess.Write); FileStream fsIn = File.Open(strPath, FileMode.Open, FileAccess.Read); //写入加密文本文件 CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateEncryptor(key, IV), CryptoStreamMode.Write); BinaryReader br = new BinaryReader(fsIn); //创建阅读器来读加密文本 csDecrypt.Write(br.ReadBytes((int)fsIn.Length), 0, (int)fsIn.Length); //将数据写入加密文本 C#开发实战1200 例(第II卷) 848 csDecrypt.FlushFinalBlock(); csDecrypt.Close(); //关闭CryptoStream 对象 fsIn.Close(); //关闭FileStream 对象 fsOut.Close(); //关闭FileStream 对象 if (MessageBox.Show("加密成功!加密后的文件名及路径为:\n" + strOutName + ",是否删除源文件", "信息提示", MessageBoxButtons. YesNo) == DialogResult.Yes) { File.Delete(strPath); //删除指定文件 textBox1.Text = ""; //清空文本框 }else { textBox1.Text = ""; } } catch (Exception ee) //如果出现异常 { MessageBox.Show(ee.Message); //输出异常信息 } } } 单击“解密”按钮实现对加密的文本文件进行解密,“解密”按钮的Click事件代码如下: private void button3_Click(object sender, EventArgs e) { if (textBox1.Text == "") //若未选择要解密的文件 { MessageBox.Show("请选择要解密的文件路径"); //如果没有选择则弹出提示 } else { string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; //设置截取字符串的起始位置 int intLong = strPath.Length; //设置截取长度 string strName = strPath.Substring(intLent, intLong - intLent); //要加密的文件名称 int intTxt = strName.LastIndexOf("."); //截取字符串的起始位置 int intTextLeng = strName.Length; //截取长度 strName = strName.Substring(0, intTxt); //获取扩展名 if (strName.LastIndexOf("Out") != -1) { strName = strName.Substring(0, strName.LastIndexOf("Out")); } else { strName = strName + "In"; } //加密后的文件名及路径 string strInName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + ".txt"; //解密文件密钥 byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 }; byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 }; RijndaelManaged myRijndael = new RijndaelManaged(); //创建RijndaelManaged 对象 //创建FileStream 对象 FileStream fsOut = File.Open(strPath, FileMode.Open, FileAccess.Read); CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key, IV), CryptoStreamMode.Read); StreamReader sr = new StreamReader(csDecrypt); //把文件读出来 StreamWriter sw = new StreamWriter(strInName); //解密后写入一个新文件 sw.Write(sr.ReadToEnd()); sw.Flush(); sw.Close(); sr.Close(); fsOut.Close(); if (MessageBox.Show("解密成功!解密后的文件名及路径为:"+strInName+",是否删除源文件", "信息提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { File.Delete(strPath); //删除指定文件 textBox1.Text = ""; //清空文本框 } else { 第19章 加密与解密技术 849 textBox1.Text = ""; } } } 秘 笈心法 心法领悟580:如何存储变长字符串? 在程序存储变长字符串时,需要使用StringBuilder对象。相对于string 对象来说,StringBuilder 对象是可 变的,不用生成间对象,因此,在连接的字符串较多或字符串长度较长时,通常都使用StringBuilder 对象。 实例581 利用图片加密文件 光盘位置:光盘\MR\19\581 高级 趣味指数: 实 例说明 本实例在加密时,使用指定的图片生成加密密钥,然后对文本文件进 行加密;在解密时,使用加密时的图片生成解密密钥,然后对加密的文本 文件进行解密。运行本实例,首先打开一张图片,用来生成加密或解密的 密钥,然后选择要加密或解密的文本文件,最后单击“加密”或“解密” 按钮,实现对文本文件的加密或解密。实例运行效果如图19.11 所示。 关 键技术 本实例实现时主要用到了RC2CryptoServiceProvider 类、BinaryWriter 类的Write 方法、File 类的Delete 方法和Copy 方法,下面对本实例用到 的关键技术进行详细讲解。 (1)RC2CryptoServiceProvider 类 该类定义访问RC2算法的加密服务提供程序(CSP)实现的包装对象,无法继承此类。 (2)BinaryWriter 类 该类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串,其构造器的语法格式如下: public BinaryWriter (Stream output) 参数说明 output:表示输出流。 (3)BinaryWriter 类的Write 方法 该方法将一个无符号字节写入当前流,并将流的位置提升一个字节,其语法格式如下: public virtual void Write (byte value) 参数说明 value:表示要写入的无符号字节。 (4)File 类的Delete 方法 File 类提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream 对象,该类是个 静态类,其Delete方法用于删除指定的文件,如果指定的文件不存在,则引发异常。该方法的语法格式如下: public static void Delete (string path) 参数说明 path:表示要删除的文件的名称。 (5)File 类的Copy 方法 该方法将现有文件复制到新文件,不允许改写同名的文件,其语法格式如下: public static void Copy (string sourceFileName,string destFileName) 图19.11 利用图片加密文件 C#开发实战1200 例(第II卷) 850 参数说明  sourceFileName:要复制的文件。  destFileName:目标文件的名称,不能是一个目录或现有文件。 设 计过程 (1) 打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为EncryptTextFileTwo。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加一个TextBox 控件,用来显示加密 或解密文件的路径;添加一个OpenFileDialog 控件,用来选择要加密或解密的文件和打开密钥的图片;添加4 个Button 控件,分别用来执行加密、解密、打开文件和打开图片操作;添加一个PictureBox 控件,用于显示密 钥图片。 (3)程序主要代码如下。 单击“加密”按钮,实现利用图片对文本文件进行加密的功能,“加密”按钮的Click 事件的代码如下: private void button3_Click(object sender, EventArgs e) { try { if (pictureBox1.ImageLocation==null) //判断是否选择了图片 { MessageBox.Show("请选择一幅图片用于加密"); return; } //如果没有选择则弹出提示 if (textBox1.Text == "") //若未选择需要加密的文件 { MessageBox.Show("请选择加密文件路径"); return; } //如果没有选择则弹出提示 //图片流 FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read); //加密文件流 FileStream fsText = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read); //初始化对称算法的密钥和向量 byte[] bykey = new byte[16]; //定义存储密钥的字节数组 byte[] byIv = new byte[8]; //定义存储向量的字节数组 fsPic.Read(bykey, 0, 16); //把图片流写入密钥缓冲区 fsPic.Read(byIv, 0, 8); //把图片流写入向量缓冲区 //临时加密文件 string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; int intLong = strPath.Length; string strName = strPath.Substring(intLent, intLong - intLent); //要加密的文件名称 string strLinPath = "C:\\" + strName; //临时加密文件路径 FileStream fsOut = File.Open(strLinPath, FileMode.Create, FileAccess.Write); //开始加密,首先创建RC2CryptoServiceProvider 对象 RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider(); BinaryReader br = new BinaryReader(fsText); //创建BinaryReader 对象 //创建CryptoStream 对象,用于写入临时加密文件 CryptoStream cs = new CryptoStream(fsOut, desc.CreateEncryptor(bykey, byIv), CryptoStreamMode.Write); cs.Write(br.ReadBytes((int)fsText.Length), 0, (int)fsText.Length); //写入加密流 cs.FlushFinalBlock(); cs.Flush(); cs.Close(); fsPic.Close(); fsText.Close(); fsOut.Close(); File.Delete(textBox1.Text.TrimEnd()); //删除原文件 File.Copy(strLinPath, textBox1.Text); //复制加密文件 File.Delete(strLinPath); //删除临时文件 MessageBox.Show("加密成功"); pictureBox1.ImageLocation = null; textBox1.Text = ""; } catch (Exception ee) { MessageBox.Show(ee.Message); } } 第19章 加密与解密技术 851 单击“解密”按钮,实现利用图片对加密的文本文件进行解密的功能,“解密”按钮的Click事件的代码如下: private void button4_Click(object sender, EventArgs e) { try { //图片流 FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read); //解密文件流 FileStream fsOut = File.Open(textBox1.Text, FileMode.Open, FileAccess.Read); //初始化对称算法的密钥和向量 byte[] bykey = new byte[16]; //定义存储密钥的字节数组 byte[] byIv = new byte[8]; //定义存储向量的字节数组 fsPic.Read(bykey, 0, 16); //把图片流写入密钥缓冲区 fsPic.Read(byIv, 0, 8); //把图片流写入向量缓冲区 //创建临时解密文件 string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; //获取不含文件名的路径长度 int intLong = strPath.Length; //获取含文件名的路径长度 //获取要解密文件的名称,即加密文件的名称 string strName = strPath.Substring(intLent, intLong - intLent); string strLinPath = "C:\\" + strName; //临时解密文件路径 FileStream fs = new FileStream(strLinPath, FileMode.Create, FileAccess.Write); //开始解密,首先创建RC2CryptoServiceProvider 对象 RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider(); //创建CryptoStream 对象,用于读取加密文件 CryptoStream csDecrypt = new CryptoStream(fsOut, desc.CreateDecryptor(bykey, byIv), CryptoStreamMode.Read); BinaryReader sr = new BinaryReader(csDecrypt); //创建BinaryReader 对象 BinaryWriter sw = new BinaryWriter(fs); //创建BinaryWriter 对象 sw.Write(sr.ReadBytes(Convert.ToInt32(fsOut.Length))); //写入解密流 sw.Flush(); sw.Close(); sr.Close(); fs.Close(); fsOut.Close(); fsPic.Close(); csDecrypt.Flush(); File.Delete(textBox1.Text.TrimEnd()); //删除原文件 File.Copy(strLinPath, textBox1.Text); //复制加密文件 File.Delete(strLinPath); //删除临时文件 MessageBox.Show("解密成功"); //弹出提示信息 pictureBox1.ImageLocation = null; //清空图片 textBox1.Text = ""; //清空文本框 } catch (Exception ee) //如果出现异常 { MessageBox.Show(ee.Message); //输出异常 } } 秘 笈心法 心法领悟581:如何去除字符串尾空格? 去除字符串尾空格需要使用string 类的Trim 方法,该方法用来从字符串的开始和末尾处移除空白字符的所 有匹配项。例如,下面的代码用来去掉textBox1 文本框字符串的尾空格,并将结果显示在textBox2 文本框: textBox2.Text = textBox1.Text.Trim(); 实例582 对文件进行加密保护 光盘位置:光盘\MR\19\582 高级 趣味指数: 实 例说明 随着计算机的普及,文件的安全越来越重要,本实例使用C#制作了一个对文件进行加密保护的实例。运行 C#开发实战1200 例(第II卷) 852 本实例,选择要加密或解密的文件,用程序来判断是否是加密过的文件, 如果不是,输入加密密码,单击“加密”按钮,加密已选择的文件;如果 是,输入解密密码,单击“解密”按钮,解密选择的加密文件。实例运行 效果如图19.12 所示。 关 键技术 本实例制作对文件进行加密保护程序时,首先选择要加密或解密的文 件,并输入加密或解密密码,然后启动一个新的线程,使用输入的密码对 指定的文件进行加密或解密操作。另外,如果对文件执行的是加密操作,则加密成功后删除原文件。具体实现 过程,主要用到了DES 类的CreateEncryptor 和CreateDecryptor 方法、CryptoStream 类的构造函数及其Write 方法。  说明:关于DES 类的CreateEncryptor 方法和CreateDecryptor 方法、CryptoStream 类的构造函数及其Write 方法的详细讲解,请参见实例575的关键技术。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为ProtectFile。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体添加一个OpenFileDialog 控件,用来显 示“打开”对话框;添加两个TextBox 控件,分别用来显示选择的文件路径和输入加密、解密密码;添加3 个 Button控件,分别用来执行选择加密或解密的文件、加密文件和解密文件操作;添加一个ProgressBar控件,用 来显示加密或解密的进度。 (3)程序主要代码如下。 Frm_Main 窗体加载时,首先将加密文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值