![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c#桌面编程
文章平均质量分 87
均为本人原创,2012年左右写于百度空间
Bczheng1
来看看,web3,区块链爱好者。dapp是个很吸引人的东西。
展开
-
C# GDI+编程(五)
怎么样,效果不错吧,但一拖动窗口就原形毕露了,注意到苹果下方的阴影了么,就是为了实现这个效果才会带来一些问题,或者说麻烦了许多吧。这个问题留待以后解决吧,在这里声明时,都用了IntPtr代替,这是没有办法的事,因为C#没有指针这个概念,而我们通过查HDC,和HWND类型定义时发现,它们都是指针类型。(题外话:在vc++中,客户区与非客户区有着不同的重绘消息,WM_PAINT和WM_NCPAINT,这一点要注意了,在刷新非客户区的时候,别重绘客户区,虽说不会出什么问题,但影响了效率总是不好的,能避免就避免)原创 2024-01-13 10:21:53 · 866 阅读 · 0 评论 -
C# GDI+编程(四)
如果填10,10,50,50那就是窗口的0,0,50,50显示在位图的10,10,50,50矩形区域内,窗口起始位置是不是能指定的,只能从位置0,0开始。第一个参数和第二个参数,指明是从屏幕的哪里开始复制,而后面的0,0,就是把屏幕复制到窗口里了,从窗口哪里开始显示。可以看到,当鼠标移动的时候,左上角的矩形明显闪烁了,这是因为进行了三次绘制,填充矩形,画矩形,显示文本。设置了不规则窗口,就可以把那张PNG图片绘制到窗口里去了,但由于半透明的问题,得先用透明画刷填充窗口,然后再绘制。原创 2024-01-13 10:21:14 · 892 阅读 · 0 评论 -
C# 控件自绘
如果需要自绘按钮控件,就不能通过添加事件的方式了,因为这样虽然也可以参与绘制,但Button类默认也绘制了,这样就不可避免的会起冲突。但是我们在添加项的时候发现,comboBox1.Items.Add函数的参数都是Object类型,这样我们就可以自定义一个类,描述项的信息。button类里的Image属性成员可以指定按钮显示的图片,相比MFC,.net里的控件可设置的属性多了许多,这样一般不需要自绘就能使控件。所以我们不让能基类来处理某些事件,要怎么实现呢,重写基类的事件处理函数就可以了。原创 2024-01-13 10:20:32 · 999 阅读 · 0 评论 -
C# GDI+编程(三)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>来自API CombineRgn函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>CombineRgn API函数的最后一个参数nCombineMode指明如何合并两个区域,那么Region类里的合并也应该有类似的功能。另外说一下区域跟路径的关系,这样就可以更好的理解区域是怎么一回事了,区域跟路径的关系就像填充图形跟图形的关系,//用Xor函数合并区域,得到的是两个区域未重叠部分的区域。原创 2024-01-13 10:19:45 · 847 阅读 · 0 评论 -
C# GDI+编程(二)
这种用点构成的图形,是路径画刷直接创建的,没有通过GraphicsPath,也可以指定三个以上的点,路径画刷会自动把这些点连接起来(按顺序),构成一个图形的,然后再填充,但填充的范围只限于这些点构成的图形内。中心点的颜色是color_blend.Colors数组的最后一个,像多种颜色渐变,你可以把中心点,到路径上的每一个点,看做一条条直线,然后这条线的3分之2是什么颜色到什么颜色渐变,3分之一又是哪种颜色到哪种颜色渐变。对应着左上(0,0),右上(100,0),右下(100,100),原创 2024-01-13 10:19:00 · 1448 阅读 · 0 评论 -
C# GDI+编程(一)
LinearGradientBrush类有个InterpolationColors属性成员可以指定多种颜色渐变,这个成员是一个ColorBlend类型,像之前的渐变,都只能限于两种颜色的渐变,使用了InterpolationColors后,就可以使用多种,如从红到绿的渐变,然后绿到蓝。color_blend.Colors数组是指定有多少颜色渐变,比如上面就是红绿蓝,那么渐变应该是这样的,从红到绿渐变,然后从绿到蓝渐变。Form类中默认处理事件的方法,和你的添加的事件处理方法,这两者有什么关系。原创 2024-01-13 10:17:58 · 904 阅读 · 0 评论 -
C#文件操作
在删除文件之前,也可用File.Exists("d:\\test.txt")方法检查文件是否存在,返回false文件不存在。//每次读取4个字节,读取的是int32。原创 2024-01-13 10:15:06 · 886 阅读 · 0 评论 -
C#网络编程(三)
另外可以把加入组播组中的计算机(iep),保存在一个ArrayList数组里,然后每隔一段时间,调用client.Send发送数据给各个端,如果失败了。前面说过了,关键点在于广播地址,如何确定子网中的广播地址,子网中最大的一个IP地址,就是这个子网广播地址,比如上面举例中第一个子网的广播地址是192.168.1.255,第二个是192.168.255.255。真正应用到实际中来,是不行的,因为有些问题没处理,比如动态数组里的元素添加和访问,是在两个线程中进行的,这就牵扯到线程同步的问题了。原创 2024-01-13 10:11:32 · 751 阅读 · 0 评论 -
C#异常处理
catch(FileNotFoundException e)块里的语句才会被执行,如果是其它异常,则不会被执行,像上面那个例子,如果让test.txt文件存在,但把里面的内容改为“a12345”的话。其实我一直对这个异常机制不怎么重视,也是我不懂吧,有些想不明白,程序运行期间搞出个异常干什么,好像没什么作用,就给出个提示而已,在学C++的时候,我是这么想的。当然我知道它的存在就是有它的作用的。这个例子是正常的,不会发异常,接下来我来删除掉test.txt,再运行上面的例子就会产生异常,程序也会非正常结束。原创 2024-01-13 10:10:20 · 318 阅读 · 0 评论 -
C#网络编程(二)
AcceptTcpClient和BeginAcceptTcpClient的使命都是一样的,获得一个客户端连接,如果有一个客户端连接了,那么这个方法也就结束了。就像同步的一样,一个AcceptTcpClient对应着一个客户端,如果想连接第二个客户端,就得再次调用AcceptTcpClient。如果用异常处理的话,可以规定客户端按自己方式来处理,比如服务端没有开启的话,给用户一个选择,是否重新连接,或者做其它的事,这样也不致于让程序就结束了。上面的例子是在理想的状态下,先开启服务端,然后运行客户端。原创 2024-01-13 10:07:59 · 827 阅读 · 0 评论 -
C#多线程编程
是使线程休眠的方法,如果它的参数为System.Threading.Timeout.Infinite将会使线程无限期的休眠下去,直到其它线程调用Interrupt方法,比如在主函数中调用。为什么会有这个限制,看一下Monitor.Wait它的作用就知道了,Wait使当前线程放弃对象锁的拥有权,相当于临时解锁了(Monitor.Exit)。Monitor.Enter锁定一个对象,当对象被锁定后,别的线程,再调用Monitor.Enter锁定同样的对象,就会被阻塞,因为对象已经被锁定了。方法使另一个线程暂停。原创 2024-01-12 20:24:20 · 868 阅读 · 0 评论 -
C#网络编程(一)
服务端开始监听后,就可以调用 AcceptTcpClient方法来等待一个客户端连接了,这个方法返回一个TcpClient类对象(也就是连接上的客户端),这个对象记录着客户端的一些属性,比如客户端的IP地址,绑定的端口号。localhost也是本地IP地址的意思,这里填127.0.0.1也可以,当然,打个比方,如果服务端的IP地址是202.54.68.8,那么这里就得填。另外这里我说一下ASCII(单字节)和Unicode(双字节)的问题,在C#里默认的都是以双字符来存储字符串的,如String类型。原创 2024-01-12 20:21:36 · 999 阅读 · 0 评论 -
C#数据库编程
连接数据库的步骤都是一样的,只不过是用SqlDataAdapter代替了SqlCommand,也可以说是SqlDataAdapter包含了SqlCommand。上面是通过sqlReader[i](索引器)的方式获取具体数据的,还可以用GetString函数,如获取当前行第二列的数据就是。这一次执行SQL语句用的是ExecuteReader函数,这个函数返回一个SqlDataReader 类对象,这个对象就记录着所获取的表数据了。它的别名有:"Address","Addr","Serve"。原创 2024-01-11 19:38:30 · 1015 阅读 · 0 评论 -
C#窗口编程(五)
然后给ToolStripMenuItem类里的Text赋值,设置这个菜单项的文本,然后调用里面的DropDownItems.Add方法,这个Add函数跟Items.Add是一样的,也就是说如果子项还是下级菜单的话,添加的方法也是一样,再创建一个ToolStripMenuItem。ToolStrip.Items.Add可以添加项,这个Add方法跟菜单栏Add的方法是一样的(包括返回值是同一种类型的),所以给工具栏项添加,事件,图像什么的我就不说了。包括设置图像,添加事件处理,都是一样的。原创 2024-01-11 19:36:57 · 1213 阅读 · 0 评论 -
C#窗口编程(四)
Count记录树控件有多少根节点(没有父节点的节点),而treeView.Node[0]它的类型是TreeNode(索引返回值是TreeNode类型),这个是一个布尔类型,为true时,表示即使当前窗口不是激活状态(最前端窗口),鼠标停留在对应的控件时,依然会显示工具提示栏。比如,我可以设置Minimum为100,Maximum为200,那么Value设置为150的时候,进程条进度显示为一半。这个方法有一个布尔参数,false只获取同级子节点的数量,true获取一个节点下的所有节点。原创 2024-01-11 19:24:58 · 846 阅读 · 0 评论 -
C#窗口编程(三)
这些关系是有点绕,不过只要会用就行了,也就是知道imageListLarge.Images.Add这个是添加图片的,至于为什么不是imageListLarge.Add,那就是系统的事了,它就是这样用的。listBox1.SelectedItem是一个object类型的对象,面GetItemText函数的参数类型是object,这样当传进一个object类型的对象后,获取选中项文本的方法跟LargeIcon样式一样,如listView1.SelectedItems[0].Text,就是选中项的文本内容了,原创 2024-01-10 19:50:48 · 965 阅读 · 0 评论 -
C#窗口编程(二)
第一个参数传的是this,它对应的是object,这个是所有类的基类,如果你自定义类的时候,没有从哪个类派生,那么默认就是从object派生出的类。事件定义的委托,变量前有一个event关键字,这个是事件的标志,Click变量前也有,用event修饰后,Click不能直接赋值,只能用+=进行赋值。comboBox1.Items.Count存储项数量,Items下还有几个函数需要了解一下,comboBox1.Items.Clear()清除组框里所有的项,//窗口的大小,宽500,高450。原创 2024-01-09 20:15:56 · 991 阅读 · 0 评论 -
C#窗口编程(一)
Application是System.Windows.Forms命名空间里的一个公共类,而Run是Application类里的一个静态方法,这个方法的作用是使程序进入消息循环,Application类里有三个重载Run方法,其中一个的参数是Form类型的,上面用的就是这个Run方法。而Form则代表窗口类,它里面的成员负责描述窗口属性,如窗口的大小,窗口的背景色,还有各种各样应用于窗口的方法。在上面的程序,我们发现了,运行后,弹出的窗口,它的属性都是默认的,起始位置,窗口大小,窗口有无最大化按钮等。原创 2024-01-08 22:32:45 · 1109 阅读 · 0 评论 -
C#语法相关(三)
父类Fruit和子类Apple有一个相同的方法PutFruit,像我们知道,如果是父类对象调用PutFruit,那么就是父类的PutFruit方法被执行,子类对象调用,就是子类的PutFruit方法被执行。接口里不能有普通的成员变量(字段),但可以有属性成员(也就是set,get模式的变量),但在接口中,这些成员,方法,或者属性成员,都只是一个空壳,没有实际实现。另外这也是方法的重写。那么显式接口里面的方法是怎么样调用的呢,通过接口调用,也就是接口定义的对象通过继承它的类来实例化,再调用接口里的方法。原创 2024-01-08 22:29:57 · 815 阅读 · 0 评论 -
C#语法相关(二)
索引器可以使类对象像数组似的使用,比如我定义了个类对象Apple apple,那么如果Apple类里声明了索引器,并且是int类型的话,我就可以这样访问:apple[0],apple[1],apple[2]..等,那么从apple[0]里读取到的是什么呢,这就得看你自己怎么定义set和get函数了,因为你也可以把这些“数组元素“看作一个个变量,而“数组索引”就是它们的区别。上面说了这么多,如果不看代码的话,我想也很难理解,不过这也没关系,因为上面这些只是为了更好的理解下面的代码,代码看的懂就算是成功了。原创 2024-01-08 22:28:24 · 1318 阅读 · 0 评论 -
C#语法相关(一)
会发现Num的值没有改变,这一点跟C++一样,如果要值改变的话,C++的方法是用引用变量,C#也是用引用变量,只不过两者之间引用变量的定义有些区别,C++是int &Number,而C#则是ref int Number,并且在调用的时候变量前也要加上ref。String 是System命名空间里的一个类,专门用于处理字符串的,整型,浮点型,字符,想要转换成String,可以调用ToString方法,还有一个就是类里面静态方法,只能通过类名来调用,这一点不像C++,类名、对象都可以调用.原创 2024-01-07 22:34:29 · 832 阅读 · 1 评论