谢谢班主给了两分了啦,为了对的起这两分,把这两天改的发上来一起学习了!
这次发现了frame控件,加listbox控件就是多余的了,所以就单用了一个frame控件封装成一个假的listbox了.这次封装的是差不多了,唯有不完美的地方还是那个滚动条,因不能很好控制图片移动像素,导致经常移动滚动条后出现点选错误.
用了比较多的API和变量,写的代码也比较乱,可能看起来比较累.简单说一下思路:
1\用了双内存DC,memDC用于绘画场景,usermemoryDC用于生成图片对象的备用场景,创建好这两个DC后,首先在MemDC里绘画了,用textout函数画,(绘的画就是一个按数据前后排列的位图),将绘画好的位图用BitBlt函数复制到usermemoryDC中,现就可以通过usermemoryDC设备场景,用OleCreatePictureIndirect函数生成一个图片对象了,有了图片对象就可以赋值给frame.picture了,也就是相当于frame.picture=loadpicture("加载图片路径")的效果了.一个关键点为什么是双内存,因为OleCreatePictureIndirect函数要引用DC内存场景中的位图地址,引用它了就会破坏它与原来内存DC场景的关系(简单说就是破坏了位图).这样就很容易理解只创建一个内存DC生成一个图片对象后,就不能继续在这个内存DC中绘画了.而两个内存DC一个负责绘画,一个负责生产图片对象用.就能连续绘画了!
2\数据是放在一个叫colorlistarr动态数组里,操作很简单就是一个动态数组读数据,写数据的方法.只是在类里不支持对外数组的情况下用了一个技巧,就是在这个私有数组类里分别写一个读写私有数组的方法,当然这个方法是带X,Y参数为数组下标的,并可以加上别人什么参数,协助读取数组了.
3\就是那个滚动条了,留给自己吧或大家一起解决下吧,解决了应该算是一个自制控件了!还有一个缺点就是位图不能太大,不然就会卡了,不过一般的电脑数据在一万一下应该问题不大. |