前言:编写一个Windows服务程序,定时从数据库中拿出记录发送邮件。 测试环境:Visual Studio 2005 SP1、Windows Server 2003 SP2 一、新建项目 打开VS2005,新建一个“Windows 服务”项目。 二、添加Timer 展开“工具箱”,在“组件”标签下找到“Timer”双击,这时就添加了一个Timer组件,修改“Name”属性为“timEmail”、“Enabled”为“false”、“Interval”为“60000”。 接下来要做一些修补工作,不知是VS2005的BUG还是我没找着地方,在VS2003下是不存在该问题的:刚从“组件”下添加的“Timer”按理说应该来自“System.Timers命名空间”,也只有“System.Timers.Timer”才能在Windows服务程序中正常工作,但是现在这个Timer却是属于“System.Windows.Forms.Timer”的。所以得稍作修改,打开“.Designer.cs”文件,修改如下: #region 组件设计器生成的代码//……..以上略/// <summary> /// 设计器支持所需的方法 – 不要/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){ this.components = new System.ComponentModel.Container(); //this.timEmail = new System.Windows.Forms.Timer(this.components);原 this.timEmail = new System.Timers.Timer();//改 this.timEmail.Interval = 60000; this.ServiceName = "Service1";}#endregion//private System.Windows.Forms.Timer timEmail;原private System.Timers.Timer timEmail;//改 三、添加配置文件 服务每次调用配置文件,获取一些基本参数,这样一些变更就可直接修改配置文件而不必修改代码。新建ServiceConfig.xml存放于项目“Bin\Debug\”下: <?xml version="1.0" encoding="utf-8" ?> <serviceConfig> <serviceItem name="sendEmail" enable="true" elapsed="60000" connectionString="your database connection…" smtp="smtp address" account="your email account…" password="your password…" > </serviceItem></serviceConfig>四、以下是实现代码 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.ServiceProcess;using System.Text;using System.Xml;//操作配置文件using System.IO;//写日志using System.Threading;//使用线程 namespace […]
View Details百科名片 WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。 目录 简介 Windows Presentation Foundation 选择理由 响应程度 服务和支持 前景分析 WPF 简介 WPF为Windows Presentation Foundation的缩写 ,其原来代号为“Avalon”,因“我佩服”拼音首字母组合一样,国内有人调侃地称之为“我佩服”。WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大改进了传统的2D界面,比如Vista中的半透明效果的窗体等都得益于WPF。 程序员在WPF的帮助下,要开发出媲美Mac程序的酷炫界面已不再是遥不可及的奢望。 WPF相对于Windows客户端的开发来说,向前跨出了巨大的一步,它提供了超丰富的.NET UI 框架,集成了矢量图形,丰富的流动文字支持flow text support,3D视觉效果和强大无比的控件模型框架。 Windows Presentation Foundation Windows Presentation Foundation(以前的代号为“Avalon”)是 Microsoft 用于 Windows 的统一显示子系统,它通过 WinFX 公开。它由显示引擎和托管代码框架组成。Windows Presentation Foundation 统一了 Windows 创建、显示和操作文档、媒体和用户界面 (UI) 的方式,使开发人员和设计人员可以创建更好的视觉效果、不同的用户体验。 Windows Presentation Foundation 发布后(计划在 2006 年),Windows XP、Windows Server 2003 和以后所有的 Windows 操作系统版本都可以使用它。 Windows Presentation Foundation Windows Presentation Foundation 由两个主要部分组成:引擎和编程框架。 1. Windows Presentation Foundation 引擎。Windows Presentation Foundation 引擎统一了开发人员和设计人员体验文档、媒体和 UI […]
View Details在winform中有一个控件可以显示html的内容,该控件就是webbrowser,设置它的DocumenText属性为HTML的内容即可。 在使用WebBrowser做UI的时候,我们有时不希望里面的链接被用户点击,更不希望弹出烦人的脚本错误提示框,也不希望用户能点出右键的IE菜单,要做到这些,其实都是很easy地…
1 |
<div><span style="color: #008000">//</span><span style="color: #008000">设置webBrowser </span><span style="color: #008000"><br /></span><span style="color: #000000">webBrowser1.ScriptErrorsSuppressed </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">禁用错误脚本提示 </span><span style="color: #008000"><br /></span><span style="color: #000000">webBrowser1.IsWebBrowserContextMenuEnabled </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">禁用右键菜单 </span><span style="color: #008000"><br /></span><span style="color: #000000">webBrowser1.WebBrowserShortcutsEnabled </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">禁用快捷键 </span><span style="color: #008000"><br /></span><span style="color: #000000">webBrowser1.AllowWebBrowserDrop </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">禁止拖拽</span><span style="color: #008000"><br /></span><span style="color: #000000">webBrowser1.ScrollBarsEnabled </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">禁止滚动条</span></div> |
禁用错误脚本提示 :将 WebBrowser控件的 ScriptErrorsSuppressed 设为 true 禁用右键菜单 :将 WebBrowser 的 IsWebBrowserContextMenuEnabled 设为 false 禁用快捷键 :将 WebBrowser 的 WebBrowserShortcutsEnabled 设为 false 禁用超链接 :超链接分为两种,一种是 当前窗口直接转向, 一种是 在新窗口中打开 当然窗口直接转向:将 WebBrowser 的 AllowNavigation 设为 false 禁用新窗口打开,需要处理 WebBrowser 的 NewWindow 事件
1 |
<div><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> webBrowser1_NewWindow(</span><span style="color: #0000ff">object</span><span style="color: #000000"> sender, CancelEventArgs e) <br />{ <br /> e.Cancel </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000">; <br />} </span></div> |
做完上面的工作,基本就完工了,还有最后一点需要注意,那就是 Drag-And-Drop 。记得将 WebBrowser 的 AllowWebBrowserDrop 设为 false
View Details新的 DataGridView 是 .NET 2.0 中的一个新控件,是针对 .NET 1.x 中功能较差的标准 DataGrid 控件而设计的。Matthew MacDonald 在本文中论述了许多改进,包括:DataGridView 支持大量自定义和细致的格式设置、灵活的大小调整和选择、更好的性能以及更丰富的事件模型。 .NET Framework 的前两个版本(.NET 1.0 和 .NET 1.1)在数据绑定方面留下了明显的空白。尽管开发人员拥有一个灵活的可配置模型,可以将几乎所有的控件链接到几乎所有的数据源,但却没有一种有效的方法来显示完整的信息表。可以实现此目的的唯一工具就是 DataGrid 控件,这种控件非常适合于处理简单的演示,但是不太适合实际代码。 填补这项空白是 .NET 2.0 的主要目标之一,并且 Microsoft 已经用全新的网格控件 DataGridView 来实现此目标。DataGridView 有两个指导原则。首先,其目标是支持常见任务(如主控/详细列表、验证和数据格式设置),而不需要您编写许多代码。更重要的是,设计过程中始终考虑了扩展性,因此您可以集成所需的专用功能,而不必采用低级别的复杂编程。 本页内容 基本数据绑定 美化 DataGridView 使用 DataGridView 选择单元格 DataGridView 对象 DataGridView 样式 自定义单元格格式 按钮列 图像列 编辑 DataGridView 处理错误 验证输入 使用列表列约束选择 小结 基本数据绑定 熟悉 DataGridView 的最佳方法就是实际尝试一下,无需配置任何属性。就像 DataGrid 一样,您可以使用 DataSource 属性来绑定 DataTable 对象(或从 DataTable 派生的对象)。
1 |
Dim ds As DataSet = GetDataSet()DataGridView1.DataSource = ds.Tables("Customers") |
与 DataGrid 不同的是,DataGridView 一次只能显示一个表。如果绑定整个 DataSet,则不会显示任何数据,除非您使用要显示的表名设置了 DataMember 属性。
1 |
DataGridView1.DataSource = dsDataGridView1.DataMember = "Customers" |
基本的 […]
View Details什么是robots.txt? robots.txt是 搜索引擎 中访问网站的时候要查看的第一个文件。Robots.txt文件告诉 蜘蛛程序 在服务器上什么文件是可以被查看的。 当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。 robots.txt必须放置在一个站点的 根目录 下,而且文件名必须全部小写。 语法:最简单的 robots.txt 文件使用两条规则: · User-Agent : 适用下列规则的漫游器 · Disallow: 要拦截的网页 编辑本段robots.txt使用误区 误区一:我网站上所有的文件都需要被蜘蛛抓取,那我就没必要添加robots.txt文件了。反正如果该文件不存在,所有的搜索蜘蛛将默认能够访问网站上所有没有被口令保护的页面。 每当用户试图访问某个不存在的 URL 时,服务器都会在日志中记录 404错误 文件(无法找到文件)。每当搜索蜘蛛来寻找并不存在的robots.txt文件时,服务器也将在日志中记录一条404错误文件,所以你应该在网站中添加一个robots.txt。 误区二:在robots.txt文件中设置所有的文件都可以被搜索蜘蛛抓取,这样可以增加网站的收录率。 网站中的 脚本程序 、样式表等文件即使被蜘蛛收录,也不会增加网站的收录率,还只会占用服务器存储空间。因此必须在robots.txt文件里设置不要让搜索蜘蛛索引脚本程序、样式表等文件,具体哪些文件需要排除,在robots.txt使用技巧一文中有详细介绍。 误区三:搜索蜘蛛抓取网页太浪费服务器资源,在robots.txt文件中设置所有的搜索蜘蛛都不能抓取全部的网页。 如果这样的话,会导致整个网站不能被 搜索引擎收录 。 编辑本段robots.txt使用技巧 1. 每当用户试图访问某个不存在的URL时,服务器都会在日志中记录404错误(无法找到文件)。每当搜索蜘蛛来寻找并不存在的robots.txt文件时,服务器也将在日志中记录一条404错误,所以你应该在网站中添加一个robots.txt。 2. 网站管理员必须使蜘蛛程序远离某些服务器上的目录——保证服务器性能。比如:大多数网站服务器都有程序储存在“cgi-bin”目录下,因此在 robots.txt文件中加入“Disallow: /cgi-bin”是个好主意,这样能够避免将所有程序文件被蜘蛛索引,可以节省服务器资源。一般网站中不需要蜘蛛抓取的文件有:后台管理文件、程序脚 本、附件、 数据库文件 、编码文件、样式表文件、模板文件、导航图片和背景图片等等。 下面是 VeryCMS 里的robots.txt文件: User-agent: * Disallow: /admin/ 后台管理文件 Disallow: /require/ 程序文件 Disallow: /attachment/ 附件 Disallow: /images/ 图片 Disallow: /data/ 数据库文件 Disallow: /template/ 模板文件 Disallow: /css/ 样式表文件 Disallow: /lang/ 编码文件 Disallow: /script/ 脚本文件 3. 如果你的网站是 动态网页 ,并且你为这些动态网页创建了静态副本,以供搜索蜘蛛更容易抓取。那么你需要在robots.txt文件里设置避免动态网页被蜘蛛索引,以保证这些网页不会被视为含重复内容。 4. robots.txt文件里还可以直接包括在 sitemap 文件的链接。就像这样: Sitemap: http://www.***.com/sitemap.xml (此处请填写完整URL,如果按习惯填写Sitemap: /sitemap.xml,提交后会提示:检测到无效的 Sitemap 网址;语法错误) 目前对此表示支持的搜索引擎公司有 Google , Yahoo, Ask and MSN。而中文搜索引擎公司,显然不在这个圈子内。这样做的好处就是,站长不用到每个搜索引擎的 站长工具 或者相似的站长部分,去提交自己的sitemap文件,搜索引擎的蜘蛛自己就会抓取robots.txt文件,读取其中的sitemap路径,接着抓取其中相链接的网页。 5. 合理使用robots.txt文件还能避免访问时出错。比如,不能让搜索者直接进入购物车页面。因为没有理由使购物车被收录,所以你可以在robots.txt文件里设置来阻止搜索者直接进入购物车页面。 robots.txt文件的格式 "robots.txt"文件包含一条或更多的记录,这些记录通过空行分开(以CR,CR/NL, or NL作为结束符),每一条记录的格式如下所示: "<field>:<optionalspace><value><optionalspace>"。 在该文件中可以使用#进行注解,具体使用方法和UNIX中的惯例一样。该文件中的记录通常以一行或多行User-agent开始,后面加上若干Disallow和Allow行,详细情况如下: User-agent: 该项的值用于描述搜索引擎 robot 的 名字。在"robots.txt"文件中,如果有多条User-agent记录说明有多个robot会受到"robots.txt"的限制,对该文件来 说,至少要有一条User-agent记录。如果该项的值设为*,则对任何robot均有效,在"robots.txt"文件中,"User- agent:*"这样的记录只能有一条。如果在"robots.txt"文件中,加入"User-agent:SomeBot"和若干Disallow、 Allow行,那么名为"SomeBot"只受到"User-agent:SomeBot"后面的Disallow和Allow行的限制。 Disallow: 该项的值用于描述不希望被访问的一组URL,这个值可以是一条完整的路径,也可以是路径的非空 前缀,以Disallow项的值开头的URL不会被robot访问。例如"Disallow:/help"禁止robot访问/help.html、 /helpabc.html、/help/index.html,而"allow:/help/"则允许robot访问/help.html、 /helpabc.html,不能访问/help/index.html。"Disallow:"说明允许robot访问该网站的所有url,在" /robots.txt"文件中,至少要有一条Disallow记录。如果"/robots.txt"不存在或者为空文件,则对于所有的搜索引擎 robot,该网站都是开放的。 Allow: 该项的值用于描述希望被访问的一组URL,与Disallow项相似,这个值可以是一条完整的 路径,也可以是路径的前缀,以Allow项的值开头的URL是允许robot访问的。例如"Allow:/hibaidu"允许robot访问 /hibaidu.htm、/hibaiducom.html、/hibaidu/com.html。一个网站的所有URL默认是Allow的,所以 Allow通常与Disallow搭配使用,实现允许访问一部分网页同时禁止访问其它所有URL的功能。 需要特别注意的是Disallow与Allow行的顺序是有意义的,robot会根据第一个匹配成功的Allow或Disallow行确定是否访问某个URL。 使用"*"和"$": Baiduspider支持使用通配符"*"和"$"来模糊匹配url。 "$" 匹配行结束符。 "*" 匹配0或多个任意字符。 robots.txt文件用法举例 例1.禁止所有搜索引擎访问网站的任何部分 User-agent: * Disallow: / 例2.允许所有的robot访问 (或者也可以建一个空文件 "/robots.txt") User-agent: * Allow: / 另一种写法是 User-agent: * Disallow: 例3. 仅禁止Baiduspider访问您的网站 User-agent: Baiduspider Disallow: / 例4. 仅允许Baiduspider访问您的网站 User-agent: Baiduspider Allow: / 例5. 禁止spider访问特定目录 在这个例子中,该网站有三个目录对搜索引擎的访问做了限制,即robot不会访问这三个目录。需要注意的是对每一个目录必须分开声明,而不能写成 "Disallow: /cgi-bin/ /tmp/"。 User-agent: * Disallow: /cgi-bin/ Disallow: /tmp/ Disallow: /~joe/ 例6. 允许访问特定目录中的部分url User-agent: * Allow: /cgi-bin/see Allow: /tmp/hi Allow: /~joe/look 例7. 使用"*"限制访问url 禁止访问/cgi-bin/目录下的所有以".htm"为后缀的URL(包含子目录)。 User-agent: * Disallow: /cgi-bin/*.htm 例8. 使用"$"限制访问url 仅允许访问以".htm"为后缀的URL。 User-agent: * Allow: .htm$ 例9. 禁止访问网站中所有的动态页面 User-agent: * Disallow: /*?* 例10. 禁止Baiduspider抓取网站上所有图片 仅允许抓取网页,禁止抓取任何图片。 User-agent: Baiduspider Disallow: .jpg$ Disallow: .jpeg$ Disallow: .gif$ Disallow: .png$ Disallow: .bmp$ 例11. 仅允许Baiduspider抓取网页和.gif格式图片 允许抓取网页和gif格式图片,不允许抓取其他格式图片 User-agent: Baiduspider Allow: .gif$ Disallow: .jpg$ Disallow: .jpeg$ Disallow: .png$ Disallow: .bmp$ 例12. 仅禁止Baiduspider抓取.jpg格式图片 User-agent: Baiduspider Disallow: .jpg$
View DetailsDataGridView 密码列(显示为*号)的设置 代码
1 |
<div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080"> 1</span> <span style="color: #000000"> </span><span style="color: #808080">///</span><span style="color: #008000"> </span><span style="color: #808080"><summary></span><span style="color: #008000"><br /></span><span style="color: #008080"> 2</span> <span style="color: #008000"> </span><span style="color: #808080">///</span><span style="color: #008000"> 单元格显示格式事件<br /></span><span style="color: #008080"> 3</span> <span style="color: #008000"> </span><span style="color: #808080">///</span><span style="color: #008000"> </span><span style="color: #808080"></summary></span><span style="color: #008000"><br /></span><span style="color: #008080"> 4</span> <span style="color: #008000"> </span><span style="color: #808080">///</span><span style="color: #008000"> </span><span style="color: #808080"><param name="sender"></param></span><span style="color: #008000"><br /></span><span style="color: #008080"> 5</span> <span style="color: #008000"> </span><span style="color: #808080">///</span><span style="color: #008000"> </span><span style="color: #808080"><param name="e"></param></span><span style="color: #808080"><br /></span><span style="color: #008080"> 6</span> <span style="color: #808080"> </span><span style="color: #000000"> </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> dataGridView1_CellFormatting(</span><span style="color: #0000ff">object</span><span style="color: #000000"> sender, DataGridViewCellFormattingEventArgs e)<br /></span><span style="color: #008080"> 7</span> <span style="color: #000000"> {<br /></span><span style="color: #008080"> 8</span> <span style="color: #000000"> </span><span style="color: #008000">//</span><span style="color: #008000"> 把第4列显示*号,*号的个数和实际数据的长度相同</span><span style="color: #008000"><br /></span><span style="color: #008080"> 9</span> <span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000"> (e.ColumnIndex </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #800080">3</span><span style="color: #000000">)<br /></span><span style="color: #008080">10</span> <span style="color: #000000"> {<br /></span><span style="color: #008080">11</span> <span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000"> (e.Value </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">&&</span><span style="color: #000000"> e.Value.ToString().Length </span><span style="color: #000000">></span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">)<br /></span><span style="color: #008080">12</span> <span style="color: #000000"> {<br /></span><span style="color: #008080">13</span> <span style="color: #000000"> e.Value </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #800000">'</span><span style="color: #800000">*</span><span style="color: #800000">'</span><span style="color: #000000">,e.Value.ToString().Length);<br /></span><span style="color: #008080">14</span> <span style="color: #000000"> }<br /></span><span style="color: #008080">15</span> <span style="color: #000000"> }<br /></span><span style="color: #008080">16</span> <span style="color: #000000"> }<br /></span><span style="color: #008080">17</span> <span style="color: #000000"><br /></span><span style="color: #008080">18</span> <span style="color: #000000"> </span><span style="color: #808080">///</span><span style="color: #008000"> </span><span style="color: #808080"><summary></span><span style="color: #008000"><br /></span><span style="color: #008080">19</span> <span style="color: #008000"> </span><span style="color: #808080">///</span><span style="color: #008000"> 编辑单元格控件事件<br /></span><span style="color: #008080">20</span> <span style="color: #008000"> </span><span style="color: #808080">///</span><span style="color: #008000"> </span><span style="color: #808080"></summary></span><span style="color: #008000"><br /></span><span style="color: #008080">21</span> <span style="color: #008000"> </span><span style="color: #808080">///</span><span style="color: #008000"> </span><span style="color: #808080"><param name="sender"></param></span><span style="color: #008000"><br /></span><span style="color: #008080">22</span> <span style="color: #008000"> </span><span style="color: #808080">///</span><span style="color: #008000"> </span><span style="color: #808080"><param name="e"></param></span><span style="color: #808080"><br /></span><span style="color: #008080">23</span> <span style="color: #000000"> </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> dataGridView1_EditingControlShowing(</span><span style="color: #0000ff">object</span><span style="color: #000000"> sender, DataGridViewEditingControlShowingEventArgs e)<br /></span><span style="color: #008080">24</span> <span style="color: #000000"> {<br /></span><span style="color: #008080">25</span> <span style="color: #000000"> </span><span style="color: #008000">//</span><span style="color: #008000"> 编辑第4列时,把第4列显示为*号</span><span style="color: #008000"><br /></span><span style="color: #008080">26</span> <span style="color: #000000"> TextBox t </span><span style="color: #000000">=</span><span style="color: #000000"> e.Control </span><span style="color: #0000ff">as</span><span style="color: #000000"> TextBox;<br /></span><span style="color: #008080">27</span> <span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000"> (t </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">)<br /></span><span style="color: #008080">28</span> <span style="color: #000000"> {<br /></span><span style="color: #008080">29</span> <span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">this</span><span style="color: #000000">.dataGridView1.CurrentCell.ColumnIndex </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #800080">3</span><span style="color: #000000">)<br /></span><span style="color: #008080">30</span> <span style="color: #000000"> t.PasswordChar </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800000">'</span><span style="color: #800000">*</span><span style="color: #800000">'</span><span style="color: #000000">;<br /></span><span style="color: #008080">31</span> <span style="color: #000000"> </span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">32</span> <span style="color: #000000"> t.PasswordChar </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">char</span><span style="color: #000000">();<br /></span><span style="color: #008080">33</span> <span style="color: #000000"> }<br /></span><span style="color: #008080">34</span> <span style="color: #000000"> }</span></div> |
1 |
|
1 |
|
一:Win Form登录机制的实现Main窗体为应用程式主窗体,Login为登录窗体.两种实现方式如下:1、应用程式入口放在Login窗体,在Login窗体实现登录机制,验证通过则创建Main窗体的实例,并将自身隐藏.具体实现: ///Step1:验证登录///Step2:通过this.hide( );oMain.Show( );虽然可以实现登录机制,但是Login窗体并没有释放掉,而是被隐藏掉,内存资源未有效利用.这种方式其实是不可取的.2、应用程式入口放在Main窗体,在Main函数中创建Login窗体的实例,Login窗体完成登录验证,返回Main窗体,程式继续执行.需要注意的是Login窗体只有验证通过时返回值才为DialogResult.OK,其余时返回DialogResult.None.这样在Main窗体就可以根据返回值判断是否创建Main窗体的实例./// <summary>/// 应用程序的主入口点./// </summary>[STAThread]static void Main( ){ frmLogin login = new frmLogin( ); login.ShowDialog( ); if( login.DialogResult.Equals( DialogResult.OK ) ) { login.Close( ); Application.Run( new frmMain( ) ); }} 二:利用ImageList作为Resource的载体Win Form的程式,外部文件是比较烦人的事情,这里采用Resource将外部图片文件加载到程式中.而ImageList是一个不错的选择,使用简单.具体实现: ///Step1:将图片在可是模式下加载到ImageList中. ///Step2:程式中可以采用this.imgLstResource.Images[index]的方式获取其中的Image对象.
View Details通知区域中的图标是一些进程的快捷方式,这些进程在计算机后台运行,如防病毒程序或音量控制。这些进程不会具有自己的用户界面。NotifyIcon 类提供了编写此功能的方法。Icon属性定义显示在通知区域中的图标。图标的弹出菜单由 ContextMenu属性确定。Text属性分配工具提示文本。要在通知区域中显示图标,必须将 Visible属性设置为 true。 具体使用方法: (1)新创建一个项目Form1,text属性修改为托盘演示;(2)向Form1窗口中添加一个NotifyIcon控件,修改其Name属性为 MyNotifyIcon。修改其Text属性为 托盘演示,与应用程序的标题相同。这是因为NotifyIcon显示在系统托盘中时,Text属性中保存的 文本为鼠标移动到程序图标上时的提示信息。修改Icon属性,为NotifyIcon添加一个图标;(3)在Form1的属性窗口上,把Icon属性也选择为与NotifyIcon相同的图标。修改ShowInTaskBar属性值为 False,这样,应用程序在运行时就不会出现在任务栏中;(4)添加双击NotifyIcon时的事件处理代码(DoubleClick) private void MynotifyIcon_DoubleClick(object sender, System.EventArgs e) { if(this.Visible) { this.Hide(); }else { this.Show(); } }(5)在使用NotifyIcon控件时,经常需要用到快捷菜单(ContextMenu控件)。使用方法为,向Form1中添加contextmenu控件,添加两个功能,一个为打开主界面,一个为退出。在NotifyIcon的ContextMenu属性中选择刚刚添加的ContextMenu控件。这样在图标上可以通过快捷菜单执行程序的各种功能。 在功能的单击事件中代码如下: private void 打开主界面ToolStripMenuItem_Click(object sender, EventArgs e) { if (this.Visible) { this.Hide(); } else { this.Show(); } } private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } 这篇文章继续介绍系统托盘NotifyIcon的使用,项目实现效果为:最小化窗体时,在系统托盘区域显示程序图标,并有气球提示,时间为30秒。效果如图,具体实现如下: 1、创建一个新的项目From1;修改其Text属性为“系统托盘演示”,修改其ShowInTaskbar属性为False,为其添加一个图标。 2、添加一个NotifyIcon控件NotifyIcon1,修改其Text属性为“系统托盘演示”,为其添加一个图标,与From1图标相同。 3、添加一个ContextMenuStrip控件ContextMenuStrip1,添加两个MenuItem,Text属性分别为打开,退出。 并在NotifyIcon控制中的ContextMenuStrip属性中选择刚刚创建的ContextMenuStrip1控件。 4、下面将处理具体事件: (1)Form1_SizeChanged事件,效果为最小化窗体时,在系统托盘区域显示程序图标及气球提示: private void Form1_SizeChanged(object sender, EventArgs e) { if (WindowState == FormWindowState.Minimized) { this.Hide(); this.notifyIcon1.Visible = true; this.notifyIcon1.ShowBalloonTip(30, "注意", "大家好,这是一个事例", ToolTipIcon.Info); } […]
View Details在启动一个程序时,我们希望窗口显示的位置处于屏幕的正中心,可以如下设置: MainForm mainForm = new MainForm(); mainForm.StartPosition = FormStartPosition.CenterScreen;mainForm.Show();如果在允许操作主窗口之前,必须先登录,则弹出登录窗口。此时主窗口出现在登录窗口后面,无法进行操作。 MainForm mainForm = new MainForm(); LoginForm dlg=new LoginForm(); dlg.ShowDialog(); 这里ShowDialog方法表示你必须先操作完dlg窗口,才能操作后面的主窗体。 如果要登录窗口显示在主窗口的中心,则在显示之前设置如下 dlg.StartPosition = FormStartPosition.CenterParent; dlg.ShowDialog(); 能够这样做的前提是主窗体必须先定义和显示。否则登录窗体可能无法找到父窗体。 除此之外,也可以手动设置窗口显示的位置,即窗口坐标。 首先必须把窗体的显示位置设置为手动。 dlg.StartPosition=FormStartPosition.Manual; 随后获取屏幕的分辨率,也就是显示器屏幕的大小。 int xWidth = SystemInformation.PrimaryMonitorSize.Width;//获取显示器屏幕宽度 int yHeight = SystemInformation.PrimaryMonitorSize.Height;//高度 然后定义窗口位置,以主窗体为例 mainForm.Location = new Point(xWidth/2, yHeight/2);//这里需要再减去窗体本身的宽度和高度的一半 mainForm.Show(); 这样三步之后,一个准确定位在屏幕位置上的窗体就显示出来了。 用Point类时,必须先把它包含进来,在程序最前面写上: using System.Drawing;
View Details