摘要:
最近到年底了,比较忙,C# WinForm控件开发和美化 也好长时间没有更新了。这段时间主要是在尝试着做一套自己的Winform皮肤控件。现在看到的客户端程序中,我发现的皮肤做得最牛的是迅雷7(只是说皮肤),再就是QQ了。看着迅雷7的界面思考了半天(真正的半天),我决定放弃模仿迅雷7的念头,难度太大了。看着QQ的界面,觉得我做聊天软件的可能性不大,即使我把这个皮肤做出来了(当然难度也很大),在实际的项目中很难用到。后来有一天去机房的时候看到一个管理人员在用Foxmail,我看到这个软件的界面就眼前一亮:界面效果还可以,控件效果比较简单,做换肤的话应该比较容易实现。回来后赶紧下了一个Foxmai 阅读全文
摘要:
一直对.NET控件的美化比较感趣,自己也很喜欢开发一些控件,到目前为止也算是有了一些收获。 首先声明我学到的很多东西都来自网上,写这篇文章的目的只是对我以前的学习做一个总结和回顾,为下一步将这些东西做成一个真正的皮肤控件做准备。很多东西当初也记不得是在什么地方看到的, 如果没有注明出处的还请作者见谅。 在看过这篇系列文章后,如果您有什么好的意见和建议,请给我留言。 在这里我要特别感谢http://www.csharpwin.com/default.shtml这个网站,你会发现我写的很多东西在这个网站上都能找到。先看一下效果图:一、总览a、窗体的边框是半透明的,透明度可以自己设置。 没有实现的. 阅读全文
摘要:
做.NET WinForm的开发也有一段时间了,对.NET的界面设计也有了一定的了解。自认为自己学的这些东西都是网上看高手们的东西后总结出来的,第一次把这些东西写出来。不好的地方请大家多多指教。 大家先看一下做出来的效果吧!网上也看过很多做.NET窗体的例子,我只是把网上的这些东西综合了一下,主要有下面这些特点:1、边框是半透明的,透明度可根据需要自己更改;2、可以改变窗体的大小,改变后样式不变;3、窗体的边框是不规则的;4、重点解决了窗体会出现闪烁的问题,在窗体移动的时候也不会闪烁;5、使用方便,只要将AlphaFormPanel拖动到一般的窗体上就可以实现换肤;设计思路说明:一、.NET. 阅读全文
摘要:
滚动条换肤是C#WinForm中的难点,因为很多控件的滚动条是由系统来进行绘制的,所以滚动条的绘制就不得不使用大量的API函数来进行绘制。如果对API函数不熟悉的话,就很难达到自己想要的效果,而这部分本身就不是C#的强项,所以网上使用C++重绘滚动条的例子很多,但用C#写的确很少。 在看过这篇文章后,如果您有什么好的意见和建议,请在下面留言。 先看一下效果图: 上图实现的是一个仿FoxMail的换肤控件的截图,其中实现了TreeView、Panel、DataGridView和ListBox的滚动条的换肤,下面介绍一下滚动条换肤的原来。 在网上搜了一下,滚动条换肤一般有两种方法实现。第一种方式. 阅读全文
摘要:
今天介绍WinForm控件开发和美化系列的第一个控件Panel控件。这个控件本身比较简单,主要就是用到了一些GDI+的知识。作为这个系列的第一个控件,在这里也介绍一些控件开发和GDI+的内容。 在看过这篇系列文章后,如果您有什么好的意见和建议,请给我留言。一、效果图二、实现代码namespace Lt_WinControls{ [DefaultProperty("Visible"), DefaultEvent("Click")] [ToolboxItem(true)] [ToolboxBitmap(typeof(PanelEx), "Resou 阅读全文
摘要:
原文链接:http://www.csharpwin.com/csharpspace/11788r8743.shtml前两天使用oledb连接excel的办法为单位某部门从一个excel的多个sheet中作连选抽出需要的数据,程序非常简单,结果很快就出来,原来手工需要很长时间才能选出的结果现在几乎一点击就有了结果。使用人员非常满意,由于是多人使用,开始只是将结果显示在一个页面上。后来他们要求将结果写入该xls文件的另一个sheet中,我随便写了个语句以为可以立马搞掂,没想到居然出现了“操作必须使用一个可更新的查询”。因为读取结果正常,我开始以为是excel文件所处的文件夹没有写权限所致。增加了相 阅读全文
摘要:
原文链接:http://www.csharpwin.com/csharpspace/11952r6950.shtml在上一讲介绍了使用lock来实现线程之间的同步。实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类。先看看下面的C#源代码:[代码] 上面的代码通过lock语句使MyLock同步,这个方法被编译成IL后,代码如图1所示。 图1 从上图被标注的区域可以看到,一条lock语句被编译成了调用Monitor的Enter和Exit方法。Monitor在System.Threading命名空间中。lock的功能就相当于直接调用Monito 阅读全文
摘要:
原文链接:http://www.csharpwin.com/csharpspace/11951r9235.shtml虽然线程可以在一定程度上提高程序运行的效率,但也会产生一些副作用。让我们先看看如下的代码:[代码] 上面的程序的基本功能是使用Increment的Inc方法为n递增max,所不同的是,将在Main方法中启动30个线程同时执行Inc方法。在本例中max的值是10000(通过Increment的构造方法传入)。读者可以运行一下这个程序,正常的结果应该是300000,但通常不会得到这个结果,一般获得的结果都比300000小。其中的原因就是Inc方法中的n++上,虽然从表面上看,n++只 阅读全文
摘要:
原文链接:http://www.csharpwin.com/csharpspace/11950r7869.shtml如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一定程序上消耗服务器的资源。为此,一个最好的解决方法就是在服务器启动之前,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中获得线程对象,并处理请求。保存这些线程对象的结构就叫做线程池。 在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下,ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framewor 阅读全文
摘要:
原文链接http://www.csharpwin.com/csharpspace/11949r6176.shtml一、 Thread类的基本用法通过System.Threading.Thread类可以开始新的线程,并在线程堆栈中运行静态或实例方法。可以通过Thread类的的构造方法传递一个无参数,并且不返回值(返回void)的委托(ThreadStart),这个委托的定义如下:[ComVisibleAttribute(true)]public delegate void ThreadStart()我们可以通过如下的方法来建立并运行一个线程。[代码] 除了运行静态的方法,还可以在线程中运行实例方 阅读全文
摘要:
原文链接http://www.csharpwin.com/csharpspace/11948r7265.shtml一、线程概述在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行。这就需要在同一个进程中开启多个线程。我们使用C#编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开windows任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示。如果任务管理器没有“线程数”列,可以【查看】【选择列】来显示“线程计数”列。从上图可以看出,几乎所有的进程都拥有两个以上 阅读全文